Spaces:
Sleeping
Sleeping
File size: 4,610 Bytes
0083f4e 18db9b3 0083f4e fd666bc 0083f4e fd666bc 0083f4e fd666bc 0083f4e d0796d1 18db9b3 d0796d1 0083f4e d0796d1 fd666bc d0796d1 18db9b3 f3582d6 18db9b3 d0796d1 0083f4e 18db9b3 0083f4e d0796d1 0083f4e fd666bc 18db9b3 fd666bc 18db9b3 0083f4e 18db9b3 0083f4e | 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 | 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
@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)
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)
|