import os import json from groq import Groq import google.generativeai as genai # ========================== # Setup API Clients # ========================== groq_client = Groq(api_key=os.getenv("GROQ_API_KEY")) genai.configure(api_key=os.getenv("GEMINI_API_KEY")) gemini_model = genai.GenerativeModel("gemini-2.5-flash") # ========================== # Llama (Groq) # ========================== def call_llama(messages, temperature=0.7): """ messages = [ {"role": "system", "content": "..."}, {"role": "user", "content": "..."} ] """ response = groq_client.chat.completions.create( model="llama-3.1-8b-instant", messages=messages, temperature=temperature ) return response.choices[0].message.content # ========================== # Gemini # ========================== def call_gemini(messages, temperature=0.7): """ Gemini expects combined prompt. We convert messages into a single string. """ formatted_prompt = "" for m in messages: formatted_prompt += f"{m['role'].upper()}: {m['content']}\n" response = gemini_model.generate_content( formatted_prompt, generation_config={"temperature": temperature} ) return response.text # ========================== # AI Classifier # ========================== def classify_prompt(prompt): system_prompt = """ You are an AI intent classifier. Return ONLY valid JSON in this format: { "intent": "chat | reasoning | live_data | greeting", "needs_search": true or false, "complexity": "low | medium | high" } Rules: - Logical, math, proof, step explanation -> reasoning - Current events, weather, news, price, today -> live_data - Hello/hi/how are you -> greeting - Everything else -> chat """ messages = [ {"role": "system", "content": system_prompt}, {"role": "user", "content": prompt} ] raw = call_llama(messages, temperature=0) try: return json.loads(raw) except: return { "intent": "chat", "needs_search": False, "complexity": "low" } # ========================== # LLM Judge (for dual answers) # ========================== def judge_answers(answer1, answer2): judge_prompt = f""" Choose which answer is better. Reply ONLY with: 1 or 2 Answer 1: {answer1} Answer 2: {answer2} """ result = call_llama( [{"role": "user", "content": judge_prompt}], temperature=0 ).strip() if result == "2": return 2 return 1