File size: 2,558 Bytes
910140e
6272795
910140e
 
 
6272795
 
 
 
910140e
 
 
2b1d596
910140e
6272795
 
 
 
 
 
 
 
 
 
 
 
 
910140e
 
6272795
 
910140e
6272795
910140e
 
6272795
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
910140e
6272795
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6bc2eb0
 
 
6272795
 
 
 
 
 
 
 
 
 
 
6bc2eb0
6272795
6bc2eb0
6272795
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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