Spaces:
Sleeping
Sleeping
| import os | |
| import time | |
| import json | |
| import logging | |
| import requests | |
| import traceback | |
| from typing import Dict, Any, List, Generator | |
| from flask import Flask, request, Response, stream_with_context, jsonify | |
| # --- सेटअप: लॉगिंग और कॉन्फिग --- | |
| logging.basicConfig(level=logging.INFO, format='%(asctime)s - ARJUN-CORE-V3 - %(levelname)s - %(message)s') | |
| logger = logging.getLogger("ArjunCoreV3") | |
| app = Flask(__name__) | |
| # कॉन्फ़िगरेशन मैनेजमेंट (बिना किसी हार्डकोडिंग के) | |
| class Config: | |
| API_KEY = os.environ.get("YOUR_VEDIKA_API_KEY") | |
| ENDPOINT = os.environ.get("BASE_URL") | |
| MODEL_ID = os.environ.get("MODEL_ID") | |
| def is_ready(cls): | |
| return all([cls.API_KEY, cls.ENDPOINT, cls.MODEL_ID]) | |
| # --- पेलोड बिल्डर: मॉडल की ज़रूरत के अनुसार डेटा बनाना --- | |
| class PayloadBuilder: | |
| def construct(user_msg: str, history: List[Dict], system_prompt: str, attachments: List[Dict]): | |
| messages = [{"role": "system", "content": system_prompt or "You are a helpful assistant."}] | |
| # हिस्ट्री जोड़ना | |
| for h in history: | |
| messages.append({"role": h.get("role", "user"), "content": h.get("content", "")}) | |
| # मल्टीमॉडल या टेक्स्ट पेलोड का चयन | |
| if attachments: | |
| content = [{"type": "text", "text": user_msg}] | |
| for att in attachments: | |
| if att.get("type") == "image": | |
| content.append({"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{att.get('data')}"}}) | |
| messages.append({"role": "user", "content": content}) | |
| else: | |
| messages.append({"role": "user", "content": user_msg}) | |
| return messages | |
| # --- स्ट्रीम हैंडलर: LLM से रिस्पॉन्स लाना --- | |
| def stream_llm_response(payload: Dict): | |
| headers = {"Authorization": f"Bearer {Config.API_KEY}", "Content-Type": "application/json"} | |
| try: | |
| with requests.post(Config.ENDPOINT, headers=headers, json=payload, stream=True, timeout=60) as r: | |
| if r.status_code != 200: | |
| yield f"data: {json.dumps({'error': 'API Error', 'code': r.status_code})}\n\n" | |
| return | |
| for line in r.iter_lines(): | |
| if line: | |
| yield line.decode('utf-8') + "\n\n" | |
| except Exception as e: | |
| logger.error(f"Stream Error: {e}") | |
| yield f"data: {json.dumps({'error': 'Connection Lost'})}\n\n" | |
| # --- API रूट्स --- | |
| def chat(): | |
| if not Config.is_ready(): | |
| return jsonify({"error": "Server not configured"}), 500 | |
| data = request.json | |
| messages = PayloadBuilder.construct( | |
| data.get("message", ""), | |
| data.get("history", []), | |
| data.get("system_prompt", ""), | |
| data.get("attachments", []) | |
| ) | |
| payload = { | |
| "model": Config.MODEL_ID, | |
| "messages": messages, | |
| "stream": True, | |
| "temperature": data.get("temperature", 0.7) | |
| } | |
| return Response(stream_with_context(stream_llm_response(payload)), mimetype='text/event-stream') | |
| def health(): | |
| return jsonify({"status": "Arjun Core V3 Online", "timestamp": time.time()}) | |
| if __name__ == '__main__': | |
| port = int(os.environ.get("PORT", 7860)) | |
| logger.info(f"Arjun Core V3 starting on port {port}...") | |
| app.run(host='0.0.0.0', port=port, threaded=True) |