Spaces:
Restarting
Restarting
| import os | |
| import requests | |
| 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") | |
| 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 | |
| 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) | |
| messages = [] | |
| # 1. सिस्टम प्रॉम्प्ट | |
| if system_prompt.strip(): | |
| messages.append({"role": "system", "content": system_prompt}) | |
| # 2. पुरानी हिस्ट्री लोड करना (Safe format में) | |
| for msg in history: | |
| role = "assistant" if msg.get("role") == "bot" else "user" | |
| content = msg.get("content", "") | |
| if content: | |
| messages.append({"role": role, "content": str(content)}) | |
| # 3. मल्टीमोडल इनपुट (करंट मैसेज) - ओरिजिनल लॉजिक | |
| if attachments: | |
| # अगर इमेज या फाइल है, तो लिस्ट वाला फॉर्मेट इस्तेमाल होगा | |
| 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"}}) | |
| messages.append({"role": "user", "content": content_payload}) | |
| else: | |
| # अगर कोई फाइल नहीं है, तो सिंपल टेक्स्ट भेजा जाएगा (यही API क्रैश को रोकेगा) | |
| safe_text = user_message.strip() if user_message.strip() else "Hello" | |
| messages.append({"role": "user", "content": safe_text}) | |
| headers = { | |
| "Authorization": f"Bearer {API_KEY}", | |
| "Accept": "text/event-stream", | |
| "Content-Type": "application/json" | |
| } | |
| 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) | |
| # अगर API से कोई एरर आता है, तो वह डॉकर (Hugging Face) के लॉग्स में प्रिंट हो जाएगा | |
| if response.status_code != 200: | |
| print(f"API Error ({response.status_code}): {response.text}", flush=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: | |
| print(f"Backend Exception: {str(e)}", flush=True) | |
| return Response("Internal Error: Unable to process request.", status=500) | |
| if __name__ == '__main__': | |
| # डॉकर स्पेस के लिए पोर्ट 7860 | |
| app.run(host='0.0.0.0', port=7860) | |