CodeVed / app.py
Vedika
Update app.py
28183e2 verified
Raw
History Blame
5.62 kB
import os
import requests
from flask import Flask, request, Response, stream_with_context, render_template_string
from duckduckgo_search import DDGS # नया, पावरफुल और एंटी-ब्लॉक स्क्रैपर
app = Flask(__name__)
# 🔐 100% सुरक्षित: सीक्रेट्स से डेटा लोड
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 WEB SEARCH ENGINE (Anti-Block) --- 🌐
def web_search_scraper(query, num_results=4):
"""
बिना किसी API Key के लाइव वेब सर्च करने के लिए DDGS का इस्तेमाल।
यह Hugging Face Spaces पर कभी ब्लॉक नहीं होता।
"""
try:
results = []
with DDGS() as ddgs:
# max_results को सेट करके टॉप रिज़ल्ट्स निकालना
for r in ddgs.text(query, max_results=num_results):
results.append({
"title": r.get("title", ""),
"link": r.get("href", ""),
"snippet": r.get("body", "")
})
return results
except Exception as e:
return [{"error": str(e)}]
# ----------------------------------------------------
@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"index.html file missing! Error: {str(e)}"
@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", [])
system_prompt = data.get("system_prompt", "")
history = data.get("history", [])
max_tokens = data.get("max_tokens", 4096)
temperature = data.get("temperature", 0.6)
# 🚀 --- INTERCEPT & SEARCH LOGIC --- 🚀
if user_message.strip().lower().startswith("/search "):
search_query = user_message[8:].strip()
# वेब से ताज़ा डेटा स्क्रैप करना
scraped_data = web_search_scraper(search_query)
search_context = f"Real-time Web Search Results for '{search_query}':\n\n"
for idx, res in enumerate(scraped_data):
if "error" in res:
search_context += f"Search Error: {res['error']}\n"
else:
search_context += f"{idx+1}. Title: {res['title']}\nSnippet: {res['snippet']}\nLink: {res['link']}\n\n"
search_context += "\n[INSTRUCTION FOR AI: Formulate a comprehensive, professional response to the user's query using ONLY the real-time search data provided above. Cite the provided links as sources if applicable. Respond in the user's language.]"
# AI के लिए बैकग्राउंड प्रॉम्प्ट तैयार
user_message = f"User Query: {search_query}\n\n[SYSTEM BACKGROUND CONTEXT]\n{search_context}"
# ---------------------------------------
messages = []
if system_prompt.strip():
messages.append({"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})
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("Internal Error: Unable to process request securely.", status=500)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=7860)