#!/usr/bin/env python3 # api.py - Fixed API Calls berdasarkan CupidHelper import time import requests import random from datetime import datetime class APIManager: def __init__(self): self.apis = { "groq": { "name": "Groq", "key": "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", "url": "https://api.groq.com/openai/v1/chat/completions", "model": "llama-3.1-8b-instant", # 🆕 Model yang betul "active": True, "last_used": None }, "deepseek": { "name": "DeepSeek", "key": "sk-018cc05d3a574de68947e669673fdf65", "url": "https://api.deepseek.com/chat/completions", # 🆕 URL yang betul "model": "deepseek-chat", "active": True, "last_used": None }, "gemini": { "name": "Gemini", "key": "AIzaSyDVoBSniv6CtvNZDPxvPNRPfRXWvj3304M", "url": "https://generativelanguage.googleapis.com/v1/models/gemini-2.0-flash:generateContent", # 🆕 URL yang betul "active": True, "last_used": None } } self.request_history = [] self.fallback_order = ["groq", "deepseek", "gemini"] # 🆕 Order berdasarkan CupidHelper def get_ai_response(self, prompt, bot_name="www", max_retries=2): """Get AI response dengan fallback - FIXED""" print(f"🤖 [{bot_name}] Requesting AI response...") for attempt in range(max_retries): for api_name in self.fallback_order: if self.apis[api_name]["active"]: try: response = self._call_api(api_name, prompt) if response and len(response.strip()) > 3: return response except Exception as e: print(f"❌ {api_name} failed: {e}") self.apis[api_name]["active"] = False if attempt < max_retries - 1: print(f"🔄 Attempt {attempt + 1} failed, retrying...") time.sleep(1) return "Maaf, semua API sedang sibuk. Cuba sebentar lagi." def _call_api(self, api_name, prompt): """Call specific API - FIXED berdasarkan CupidHelper""" api_config = self.apis[api_name] try: if api_name == "groq": return self._call_groq(prompt, api_config) elif api_name == "deepseek": return self._call_deepseek(prompt, api_config) elif api_name == "gemini": return self._call_gemini(prompt, api_config) except Exception as e: print(f"❌ {api_name} error: {e}") raise def _call_groq(self, prompt, config): """Call Groq API - FIXED""" headers = { "Authorization": f"Bearer {config['key']}", "Content-Type": "application/json" } data = { "model": config["model"], # 🆕 Gunakan model yang betul "messages": [ { "role": "user", "content": prompt } ], "temperature": 0.7, "max_tokens": 150 } response = requests.post(config["url"], headers=headers, json=data, timeout=10) if response.status_code != 200: raise Exception(f"HTTP {response.status_code}: {response.text}") result = response.json() content = result["choices"][0]["message"]["content"].strip() config["last_used"] = time.time() self._log_request("groq", True, len(content)) return self._trim_response(content) def _call_deepseek(self, prompt, config): """Call DeepSeek API - FIXED""" headers = { "Authorization": f"Bearer {config['key']}", "Content-Type": "application/json" } data = { "model": config["model"], "messages": [ { "role": "user", "content": prompt } ], "temperature": 0.7, "max_tokens": 150 } response = requests.post(config["url"], headers=headers, json=data, timeout=10) if response.status_code != 200: raise Exception(f"HTTP {response.status_code}: {response.text}") result = response.json() content = result["choices"][0]["message"]["content"].strip() config["last_used"] = time.time() self._log_request("deepseek", True, len(content)) return self._trim_response(content) def _call_gemini(self, prompt, config): """Call Gemini API - FIXED""" url = f"{config['url']}?key={config['key']}" data = { "contents": [ { "parts": [ {"text": prompt} ] } ], "generationConfig": { "maxOutputTokens": 150, "temperature": 0.7 } } response = requests.post(url, json=data, timeout=10) if response.status_code != 200: raise Exception(f"HTTP {response.status_code}: {response.text}") result = response.json() content = result["candidates"][0]["content"]["parts"][0]["text"].strip() config["last_used"] = time.time() self._log_request("gemini", True, len(content)) return self._trim_response(content) def _trim_response(self, text, max_length=200): """Trim response to max length""" if len(text) > max_length: text = text[:max_length-3] + "..." return text def _log_request(self, api_name, success, response_length): """Log API requests""" log_entry = { "timestamp": datetime.now(), "api": api_name, "success": success, "response_length": response_length } self.request_history.append(log_entry) if len(self.request_history) > 50: self.request_history.pop(0) def get_api_status(self): """Get status of all APIs""" status = {} for api_name, config in self.apis.items(): status[api_name] = { "active": config["active"], "last_used": config["last_used"], "requests_count": len([r for r in self.request_history if r["api"] == api_name]) } return status # Global instance api_manager = APIManager()