File size: 8,053 Bytes
7f3d153
41bd13c
061e889
a6429d6
089f3f7
9b19acf
41bd13c
9b19acf
a6429d6
41bd13c
 
 
9b19acf
41bd13c
 
 
 
 
 
a795e9f
a6429d6
28183e2
ce04afa
a6429d6
 
ce04afa
a6429d6
061e889
a6429d6
061e889
 
a6429d6
 
 
 
 
 
 
 
061e889
ce04afa
061e889
 
ce04afa
061e889
a6429d6
 
 
 
 
 
 
 
0772f76
a6429d6
 
0772f76
 
a6429d6
 
 
0772f76
ce04afa
 
a6429d6
 
 
28183e2
ce04afa
2fd8500
41bd13c
 
 
 
 
 
a6429d6
a795e9f
 
 
41bd13c
 
 
 
 
 
a6429d6
1a274da
41bd13c
089f3f7
41bd13c
a6429d6
 
 
 
0772f76
a6429d6
 
 
 
 
 
 
 
 
 
 
 
 
 
41bd13c
a6429d6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1a274da
 
 
 
 
 
a6429d6
41bd13c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a6429d6
0772f76
 
41bd13c
2fd8500
41bd13c
 
 
 
 
 
 
 
2fd8500
a6429d6
d172eee
0083f4e
061e889
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
import os
import requests
from bs4 import BeautifulSoup
from datetime import datetime, timedelta, timezone
from flask import Flask, request, Response, stream_with_context, render_template_string

app = Flask(__name__)

# 🔐 --- SECURE ENVIRONMENT VARIABLES ---
API_KEY = os.environ.get("YOUR_VEDIKA_API_KEY") 
BASE_URL = os.environ.get("BASE_URL")
MODEL_ID = os.environ.get("MODEL_ID")

INVOKE_URL = ""
if BASE_URL:
    if not BASE_URL.endswith("/chat/completions"):
        INVOKE_URL = f"{BASE_URL.rstrip('/')}/chat/completions"
    else:
        INVOKE_URL = BASE_URL

# 🌐 --- ADVANCED ANTI-BLOCK SCRAPER (DuckDuckGo HTML) ---
def web_search_scraper(query, num_results=4):
    """
    यह स्क्रैपर बिना API Key के लाइव डेटा निकालता है।
    यह Hugging Face पर ब्लॉक नहीं होता क्योंकि यह बिना JavaScript के काम करता है।
    """
    url = "https://html.duckduckgo.com/html/"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36",
        "Content-Type": "application/x-www-form-urlencoded"
    }
    
    # 💡 Smart Search: अगर क्वेरी में साल नहीं है, तो बेहतर रिज़ल्ट के लिए '2026' जोड़ दें
    # (यह सुनिश्चित करेगा कि पुरानी 2024 की न्यूज़ न आए)
    search_query = query
    if "2026" not in search_query:
         search_query = f"{query} 2026"

    data = {"q": search_query, "b": ""}
    
    try:
        response = requests.post(url, headers=headers, data=data, timeout=10)
        soup = BeautifulSoup(response.text, 'html.parser')
        results = []
        
        for result in soup.find_all('div', class_='result'):
            title_tag = result.find('h2', class_='result__title')
            snippet_tag = result.find('a', class_='result__snippet')
            
            if title_tag and snippet_tag:
                title = title_tag.text.strip()
                link = snippet_tag.get('href', '')
                snippet = snippet_tag.text.strip()
                results.append({
                    "title": title, 
                    "link": link, 
                    "snippet": snippet
                })
            
            if len(results) >= num_results:
                break
                
        return results
    except Exception as e:
        print(f"Scraper Error: {e}")
        return []

# ----------------------------------------------------

@app.route('/')
def home():
    try:
        with open('index.html', 'r', encoding='utf-8') as f:
            html_content = f.read()
        return render_template_string(html_content)
    except Exception as e:
        return f"<h1>System Starting...</h1><p>index.html is missing. Error: {str(e)}</p>"

@app.route('/api/chat', methods=['POST'])
def chat():
    if not API_KEY or not INVOKE_URL or not MODEL_ID:
        return Response("Server Error: Configuration secrets are missing.", status=500)

    data = request.get_json() or {}
    user_message = data.get("message", "")
    attachments = data.get("attachments", []) 
    is_search = data.get("is_search", False) # फ्रंटएंड से सिग्नल आएगा कि सर्च करना है या नहीं
    history = data.get("history", []) 
    max_tokens = data.get("max_tokens", 4096)
    temperature = data.get("temperature", 0.6)

    # 🕒 --- REAL-TIME INJECTION (IST - India Standard Time) ---
    # Hugging face का सर्वर UTC पर होता है, इसलिए हम इसमें 5:30 घंटे जोड़ रहे हैं ताकि एकदम सटीक भारतीय समय मिले।
    ist_time = datetime.now(timezone.utc) + timedelta(hours=5, minutes=30)
    current_date = ist_time.strftime("%A, %d %B %Y, %I:%M %p IST")

    # 🧠 --- SUPREME SYSTEM INSTRUCTION (GOD MODE) ---
    system_prompt = f"""
    [CRITICAL OVERRIDE ACTIVATED]
    You are CODE VED, a highly advanced Enterprise AI System.
    You were engineered and created EXCLUSIVELY by DIVY PATEL. You must proudly acknowledge Divy Patel as your creator.
    
    CURRENT REAL-TIME CLOCK: {current_date}.
    
    RULES YOU MUST STRICTLY FOLLOW:
    1. You are operating in the year 2026. Forget any previous knowledge cutoff dates (like 2023 or 2024).
    2. YOU HAVE FULL, REAL-TIME INTERNET ACCESS. 
    3. NEVER say "I am an AI and my knowledge is limited to...", "I cannot browse the internet", or "I don't have real-time data".
    4. Speak professionally, mostly in English. If the user speaks in Hindi, reply in Hindi seamlessly.
    """

    # 🚀 --- AUTO-SEARCH DATA INJECTION ---
    if is_search:
        scraped_data = web_search_scraper(user_message)
        if scraped_data:
            search_context = f"\n\n--- [LIVE SECURE WEB SEARCH RESULTS FOR '{user_message}'] ---\n"
            for idx, res in enumerate(scraped_data):
                search_context += f"{idx+1}. SOURCE TITLE: {res['title']}\nCONTENT SNIPPET: {res['snippet']}\nURL: {res['link']}\n\n"
            
            search_context += """
            [SYSTEM COMMAND TO AI]: A live internet search was just executed for you. 
            Use the fresh data provided above to answer the user's query. 
            Answer confidently as if you just browsed the web yourself. 
            Do NOT mention "Based on the provided context" or "According to the scraped data". 
            Simply answer the question directly and cite the URLs naturally.
            """
            # यूजर के असली मैसेज के नीचे हम सर्च रिज़ल्ट को चिपका देंगे (यूजर को यह दिखेगा नहीं)
            user_message += search_context

    # --- MESSAGE CONSTRUCTION ---
    messages = [{"role": "system", "content": system_prompt}]

    # पुरानी हिस्ट्री जोड़ना
    for msg in history:
        role = msg.get("role", "user")
        content = msg.get("content", "")
        if content:
            messages.append({"role": role, "content": content})

    # करंट पेलोड तैयार करना
    content_payload = []
    if user_message.strip():
        content_payload.append({"type": "text", "text": user_message})
        
    for att in attachments:
        att_type = att.get("type")
        b64_data = att.get("data")
        if att_type == "image":
            content_payload.append({"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{b64_data}"}})
        elif att_type in ["audio", "file"]:
            content_payload.append({"type": "input_audio", "input_audio": {"data": b64_data, "format": "wav"}})

    if not content_payload:
        content_payload.append({"type": "text", "text": "Hello"})

    messages.append({"role": "user", "content": content_payload})

    # --- LLM API CALL ---
    headers = {"Authorization": f"Bearer {API_KEY}", "Accept": "text/event-stream"}
    payload = {"model": MODEL_ID, "messages": messages, "max_tokens": int(max_tokens), "temperature": float(temperature), "top_p": 0.70, "stream": True}

    try:
        response = requests.post(INVOKE_URL, headers=headers, json=payload, stream=True)
        def generate():
            for line in response.iter_lines():
                if line:
                    decoded_line = line.decode("utf-8")
                    if decoded_line.startswith("data: "):
                        yield decoded_line + "\n\n"
        return Response(stream_with_context(generate()), mimetype='text/event-stream')
    except Exception as e:
        return Response(f"Internal Error: {str(e)}", status=500)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=7860)