syedkhizarrayaz/BM-AI-Analysis-And-Alert-Prioritization-Agent
0
1#!/usr/bin/env python32"""3Direct HTTP Server for True Local LLM AML Analysis4Bypasses FastAPI overhead for optimal performance with true LLM5"""6 7import json8import time9import threading10from http.server import HTTPServer, BaseHTTPRequestHandler11from urllib.parse import urlparse, parse_qs12import psutil13from optimized_true_local_llm_aml import get_optimized_true_local_llm_system14 15 16class DirectTrueLLMHandler(BaseHTTPRequestHandler):17 """Direct HTTP handler for true local LLM AML analysis"""18 19 def __init__(self, *args, **kwargs):20 self.llm_system = get_optimized_true_local_llm_system()21 super().__init__(*args, **kwargs)22 23 def do_POST(self):24 """Handle POST requests"""25 start_time = time.time()26 27 try:28 # Parse URL29 parsed_url = urlparse(self.path)30 31 if parsed_url.path == '/api/ai-service/generateanalysisjsontruellm':32 self._handle_true_llm_analysis()33 elif parsed_url.path == '/api/ai-service/generateanalysisjsontruellmstreaming':34 self._handle_true_llm_streaming()35 else:36 self._send_error_response(404, "Endpoint not found")37 38 except Exception as e:39 self._send_error_response(500, f"Internal server error: {str(e)}")40 41 end_time = time.time()42 total_time = (end_time - start_time) * 100043 print(f"⚡ Direct request time: {total_time:.2f}ms")44 45 def _handle_true_llm_analysis(self):46 """Handle true local LLM analysis request"""47 try:48 # Read request body49 content_length = int(self.headers['Content-Length'])50 post_data = self.rfile.read(content_length)51 52 # Parse JSON53 request_data = json.loads(post_data.decode('utf-8'))54 55 # Generate true local LLM analysis56 analysis_start = time.time()57 result = self.llm_system.analyze_with_optimized_llm(request_data)58 analysis_end = time.time()59 60 # Prepare response61 response_data = {62 "status": 200,63 "message": "Success",64 "data": [{65 "AlertID": result["AlertID"],66 "FocusColumnValue": result["FocusColumnValue"],67 "analysis": result["analysis"],68 "response_time_seconds": result["response_time_seconds"],69 "method": result["method"],70 "model": result.get("model", "qwen2.5:1.5b"),71 "prompt_length": result.get("prompt_length", 0)72 }]73 }74 75 # Send response76 self._send_json_response(response_data)77 78 analysis_time = (analysis_end - analysis_start) * 100079 print(f"⚡ True LLM analysis: {analysis_time:.2f}ms")80 81 except Exception as e:82 self._send_error_response(500, f"Analysis error: {str(e)}")83 84 def _handle_true_llm_streaming(self):85 """Handle true local LLM streaming request"""86 try:87 # Read request body88 content_length = int(self.headers['Content-Length'])89 post_data = self.rfile.read(content_length)90 91 # Parse JSON92 request_data = json.loads(post_data.decode('utf-8'))93 94 # Generate true local LLM analysis95 result = self.llm_system.analyze_with_optimized_llm(request_data)96 97 # Prepare streaming response98 response_data = {99 "AlertID": result["AlertID"],100 "FocusColumnValue": result["FocusColumnValue"],101 "analysis": result["analysis"],102 "response_time_seconds": result["response_time_seconds"],103 "method": result["method"],104 "model": result.get("model", "qwen2.5:1.5b"),105 "prompt_length": result.get("prompt_length", 0)106 }107 108 # Send streaming response109 self._send_streaming_response(response_data)110 111 except Exception as e:112 self._send_error_response(500, f"Streaming error: {str(e)}")113 114 def _send_json_response(self, data):115 """Send JSON response"""116 response_json = json.dumps(data)117 118 self.send_response(200)119 self.send_header('Content-Type', 'application/json')120 self.send_header('Content-Length', str(len(response_json)))121 self.send_header('Access-Control-Allow-Origin', '*')122 self.send_header('Access-Control-Allow-Methods', 'POST, OPTIONS')123 self.send_header('Access-Control-Allow-Headers', 'Content-Type')124 self.end_headers()125 126 self.wfile.write(response_json.encode('utf-8'))127 128 def _send_streaming_response(self, data):129 """Send streaming response"""130 response_json = json.dumps(data)131 streaming_data = f"data: {response_json}\n\n"132 133 self.send_response(200)134 self.send_header('Content-Type', 'text/plain')135 self.send_header('Content-Length', str(len(streaming_data)))136 self.send_header('Cache-Control', 'no-cache')137 self.send_header('Connection', 'keep-alive')138 self.send_header('Access-Control-Allow-Origin', '*')139 self.end_headers()140 141 self.wfile.write(streaming_data.encode('utf-8'))142 143 def _send_error_response(self, status_code, message):144 """Send error response"""145 error_data = {146 "status": "error",147 "message": message148 }149 150 response_json = json.dumps(error_data)151 152 self.send_response(status_code)153 self.send_header('Content-Type', 'application/json')154 self.send_header('Content-Length', str(len(response_json)))155 self.end_headers()156 157 self.wfile.write(response_json.encode('utf-8'))158 159 def do_OPTIONS(self):160 """Handle CORS preflight requests"""161 self.send_response(200)162 self.send_header('Access-Control-Allow-Origin', '*')163 self.send_header('Access-Control-Allow-Methods', 'POST, OPTIONS')164 self.send_header('Access-Control-Allow-Headers', 'Content-Type')165 self.end_headers()166 167 def log_message(self, format, *args):168 """Override to reduce logging overhead"""169 pass # Disable logging for maximum performance170 171 172class DirectTrueLLMServer:173 """Direct HTTP server for true local LLM AML analysis"""174 175 def __init__(self, host='localhost', port=8002):176 self.host = host177 self.port = port178 self.server = None179 self.server_thread = None180 181 def start(self):182 """Start the direct server"""183 try:184 self.server = HTTPServer((self.host, self.port), DirectTrueLLMHandler)185 self.server_thread = threading.Thread(target=self.server.serve_forever)186 self.server_thread.daemon = True187 self.server_thread.start()188 189 print(f"🚀 Direct True LLM Server started on {self.host}:{self.port}")190 print(f"⚡ Endpoints:")191 print(f" POST /api/ai-service/generateanalysisjsontruellm")192 print(f" POST /api/ai-service/generateanalysisjsontruellmstreaming")193 194 except Exception as e:195 print(f"❌ Failed to start server: {e}")196 197 def stop(self):198 """Stop the server"""199 if self.server:200 self.server.shutdown()201 self.server.server_close()202 print("🛑 Direct True LLM Server stopped")203 204 205def optimize_system_for_true_llm():206 """Optimize system for true local LLM performance"""207 import os208 209 # Set high priority for Python process210 try:211 import psutil212 current_process = psutil.Process()213 current_process.nice(psutil.HIGH_PRIORITY_CLASS)214 print("✅ Set high priority for Python process")215 except:216 print("⚠️ Could not set high priority")217 218 # Optimize Python settings219 os.environ['PYTHONUNBUFFERED'] = '1'220 os.environ['PYTHONDONTWRITEBYTECODE'] = '1'221 222 print("✅ System optimized for true local LLM performance")223 224 225if __name__ == "__main__":226 print("🏁 Starting Direct True Local LLM AML Analysis Server")227 print("=" * 60)228 229 # Optimize system230 optimize_system_for_true_llm()231 232 # Monitor resources233 memory = psutil.virtual_memory()234 cpu_count = psutil.cpu_count()235 print(f"💻 System Resources:")236 print(f" CPU Cores: {cpu_count}")237 print(f" RAM: {memory.total / (1024**3):.1f}GB")238 print(f" RAM Usage: {memory.percent}%")239 240 # Start server241 server = DirectTrueLLMServer()242 server.start()243 244 try:245 print("\n🔄 Server running... Press Ctrl+C to stop")246 while True:247 time.sleep(1)248 except KeyboardInterrupt:249 print("\n🛑 Shutting down...")250 server.stop()251 