Spaces:
Restarting
Restarting
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)
|