Spaces:
Sleeping
Sleeping
| import os | |
| import requests | |
| from bs4 import BeautifulSoup | |
| from flask import Flask, request, Response, stream_with_context, render_template_string | |
| 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 | |
| # 🌐 --- 100% BULLETPROOF WEB SCRAPER --- 🌐 | |
| def web_search_scraper(query, num_results=4): | |
| """ | |
| यह कस्टम स्क्रैपर DuckDuckGo के HTML वर्ज़न का उपयोग करता है। | |
| यह Hugging Face पर कभी ब्लॉक नहीं होता और इसके लिए किसी API Key या एक्स्ट्रा पैकेज की जरूरत नहीं है। | |
| """ | |
| 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/120.0.0.0 Safari/537.36", | |
| "Content-Type": "application/x-www-form-urlencoded" | |
| } | |
| data = {"q": query} # सर्च क्वेरी को POST डेटा की तरह भेजना | |
| try: | |
| response = requests.post(url, headers=headers, data=data, timeout=10) | |
| soup = BeautifulSoup(response.text, 'html.parser') | |
| results = [] | |
| for a in soup.find_all('a', class_='result__snippet'): | |
| snippet = a.text.strip() | |
| link = a.get('href', '') | |
| title_elem = a.find_previous('h2', class_='result__title') | |
| title = title_elem.text.strip() if title_elem else "Search Result" | |
| results.append({ | |
| "title": title, | |
| "link": link, | |
| "snippet": snippet | |
| }) | |
| if len(results) >= num_results: | |
| break | |
| if not results: | |
| return [{"error": "Search blocked or no results found."}] | |
| return results | |
| except Exception as e: | |
| return [{"error": str(e)}] | |
| # ---------------------------------------------------- | |
| 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)}" | |
| 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: You are CODE VED. The user has requested a web search. Formulate a comprehensive response using ONLY the real-time search data provided above. Do not mention that you used a scraper. Just answer confidently and cite the links.]" | |
| 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) | |