Aura Gen
Update app.py
4b046d5 verified
import os
import logging
import requests
import json
from flask import Flask, request, jsonify, Response, stream_with_context, send_file
from flask_cors import CORS
from openai import OpenAI
# ---------------------------------------------------------
# लॉगिंग सेटअप
# ---------------------------------------------------------
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - [Vedika Space] - %(message)s'
)
logger = logging.getLogger(__name__)
app = Flask(__name__)
CORS(app, resources={r"/*": {"origins": "*"}})
# ---------------------------------------------------------
# Secrets और Configuration
# ---------------------------------------------------------
API_KEY = os.getenv("API_KEY")
MODEL_ID = os.getenv("MODEL_ID")
GAS_BACKEND_URL = os.getenv("GAS_BACKEND_URL")
# OpenAI क्लाइंट इनिशियलाइज़ेशन (NVIDIA बेस यूआरएल के साथ)
client = OpenAI(
base_url="https://integrate.api.nvidia.com/v1",
api_key=API_KEY
)
# ---------------------------------------------------------
# सिक्योरिटी: Google Apps Script टोकन वैलिडेशन
# ---------------------------------------------------------
def validate_token_with_gas(token):
if not token:
return False
try:
response = requests.post(GAS_BACKEND_URL, json={"action": "validate", "token": token}, timeout=5)
if response.status_code == 200:
return response.json().get("valid") == True
return False
except requests.exceptions.RequestException as e:
logger.error(f"GAS validation error: {e}")
return False
# ---------------------------------------------------------
# फ्रंटएंड रेंडरिंग
# ---------------------------------------------------------
@app.route('/')
def index():
return send_file('index.html')
# ---------------------------------------------------------
# बैकएंड API (अपडेटेड OpenAI SDK के साथ)
# ---------------------------------------------------------
@app.route('/chat', methods=['POST', 'OPTIONS'])
def chat_endpoint():
# CORS प्री-फ्लाइट रिक्वेस्ट
if request.method == 'OPTIONS':
return Response(status=204)
# ऑथेंटिकेशन
auth_header = request.headers.get("Authorization")
if not auth_header or not auth_header.startswith("Bearer "):
return jsonify({"error": "Unauthorized: Missing Token"}), 401
token = auth_header.split("Bearer ")[1].strip()
if not validate_token_with_gas(token):
return jsonify({"error": "Forbidden: Invalid Token"}), 403
try:
data = request.json
mode = data.get('mode', 'FLASH')
messages = data.get('messages', [])
if not messages:
return jsonify({"error": "Messages empty"}), 400
except Exception:
return jsonify({"error": "Invalid JSON"}), 400
# सिस्टम प्रॉम्प्ट सेट करना
system_prompt = os.getenv(mode.upper())
if not system_prompt:
return jsonify({"error": f"Mode {mode} missing in Secrets."}), 500
messages.insert(0, {"role": "system", "content": system_prompt})
# स्ट्रीमिंग जेनरेटर फंक्शन
def generate_stream():
try:
# आपके द्वारा दिए गए OpenAI SDK कोड का सीधा उपयोग
completion = client.chat.completions.create(
model=MODEL_ID,
messages=messages,
temperature=0.7,
top_p=0.8,
max_tokens=1024,
stream=True
)
for chunk in completion:
if chunk.choices and chunk.choices[0].delta.content is not None:
# Frontend (index.html) को बिल्कुल वही JSON स्ट्रक्चर चाहिए जो NVIDIA देता था
# chunk.model_dump_json() इसे एकदम सही फॉर्मेट में बदल देता है
chunk_data = chunk.model_dump_json()
yield f"data: {chunk_data}\n\n"
except Exception as e:
logger.error(f"OpenAI API Error: {str(e)}")
yield f"data: {{\"error\": \"AI Provider Error: {str(e)}\"}}\n\n"
return Response(stream_with_context(generate_stream()), mimetype='text/event-stream')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=7860, debug=False)