import os import requests import urllib.parse from bs4 import BeautifulSoup from flask import Flask, request, Response, stream_with_context, render_template_string app = Flask(__name__) # ЁЯФР 100% рд╕реБрд░рдХреНрд╖рд┐рдд: рд╕рдм рдХреБрдЫ рдХреЗрд╡рд▓ 'Secrets' рд╕реЗ рдХреЙрд▓ рд╣реЛрдЧрд╛, рдХреЛрдИ рд╣рд╛рд░реНрдбрдХреЛрдбреЗрдб рдбреЗрдЯрд╛ рдирд╣реАрдВред API_KEY = os.environ.get("YOUR_VEDIKA_API_KEY") BASE_URL = os.environ.get("BASE_URL") MODEL_ID = os.environ.get("MODEL_ID") # URL рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдирд╛ рддрд╛рдХрд┐ рдХреЛрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓рд┐рдВрдХ рди рджрд┐рдЦреЗ 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 # ЁЯМР --- GOOGLE SEARCH SCRAPER ENGINE --- ЁЯМР def google_search_scraper(query, num_results=4): """ рдпрд╣ рдлрдВрдХреНрд╢рди Google рд╕рд░реНрдЪ рд╕реЗ рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ AI рдХреЗ рд╕рдордЭрдиреЗ рд▓рд╛рдпрдХ рдмрдирд╛рддрд╛ рд╣реИред """ # Google рдХреЛ рдзреЛрдЦрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рд▓реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ User-Agent 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" } url = f"https://www.google.com/search?q={urllib.parse.quote(query)}&hl=en" try: response = requests.get(url, headers=headers, timeout=10) soup = BeautifulSoup(response.text, 'html.parser') results = [] # Google рдХреЗ рд╕рд░реНрдЪ рд░рд┐рдЬрд▓реНрдЯреНрд╕ 'div.g' рдХреЗ рдЕрдВрджрд░ рд╣реЛрддреЗ рд╣реИрдВ for g in soup.find_all('div', class_='g'): title_elem = g.find('h3') link_elem = g.find('a') if title_elem and link_elem: title = title_elem.text link = link_elem.get('href', '') # Snippet (рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрд╢рди) рдирд┐рдХрд╛рд▓рдирд╛ snippet = "" snippet_box = g.find('div', class_='VwiC3b') if snippet_box: snippet = snippet_box.text results.append({ "title": title, "link": link, "snippet": snippet }) if len(results) >= num_results: break 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 --- ЁЯЪА # рдЕрдЧрд░ рдпреВрдЬрд░ рдХреЗ рдореИрд╕реЗрдЬ рдореЗрдВ /search рдпрд╛ /google рд╣реИ, рддреЛ рд╕реНрдХреНрд░реИрдкрд░ рдЪрд╛рд▓реВ рдХрд░реЗрдВ if user_message.strip().lower().startswith("/search "): search_query = user_message[8:].strip() scraped_data = google_search_scraper(search_query) search_context = f"Real-time Google 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 sources if applicable.]" # рдПрдЖрдИ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдореНрдкреНрдЯ рдХреЛ рдореЙрдбрд┐рдлрд╛рдИ рдХрд░рдирд╛ (рдпреВрдЬрд░ рдХреЛ рдпрд╣ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдбреЗрдЯрд╛ рдирд╣реАрдВ рджрд┐рдЦреЗрдЧрд╛) user_message = f"User Query: {search_query}\n\n[SYSTEM BACKGROUND CONTEXT]\n{search_context}" # --------------------------------------- messages = [] # 1. рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЙрдореНрдкреНрдЯ if system_prompt.strip(): messages.append({"role": "system", "content": system_prompt}) # 2. рдкреБрд░рд╛рдиреА рд╣рд┐рд╕реНрдЯреНрд░реА рдХреЛ рдореЙрдбрд▓ рдХреЗ рдкреЗрд▓реЛрдб рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ for msg in history: role = msg.get("role", "user") content = msg.get("content", "") if content: messages.append({"role": role, "content": content}) # 3. рдорд▓реНрдЯреАрдореЛрдбрд▓ рдЗрдирдкреБрдЯ (рдХрд░реЗрдВрдЯ рдореИрд╕реЗрдЬ) 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)