import os import sys import threading from flask import Flask, request, Response, stream_with_context, jsonify, render_template_string from flask_cors import CORS from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer, BitsAndBytesConfig import torch print("LOG: Iniciando Motor Hydra 3.0 (Docker API - Hydra Software)...") sys.stdout.flush() app = Flask(__name__) CORS(app) model_id = "Mution/Hydra-AI-3B-Coder-Pro" token = os.getenv("HF_TOKEN") VALID_API_KEYS = { "hydra-sk-master-9928374": "Master_Admin", "hydra-sk-root-1122334": "Root_System", "hydra-sk-dev-5566778": "Developer_Terminal", "hydra-sk-bot-alpha-1029384": "Discord_Bot_Alpha", "hydra-sk-bot-beta-2039485": "Discord_Bot_Beta", "hydra-sk-bot-gamma-3049586": "Telegram_Bot", "hydra-sk-bot-delta-4059687": "Twitch_Bot", "hydra-sk-panel-main-5647382": "Web_Panel_Main", "hydra-sk-panel-sec-6758493": "Web_Panel_Secundario", "hydra-sk-panel-event-7869504": "Event_Dashboard", "hydra-sk-vip-001-8970615": "VIP_User_1", "hydra-sk-vip-002-9081726": "VIP_User_2", "hydra-sk-vip-003-0192837": "VIP_User_3", "hydra-sk-test-1203948": "Testing_Key_A", "hydra-sk-test-2314059": "Testing_Key_B", "hydra-sk-node-001-110022": "Node_Server_1", "hydra-sk-node-002-334455": "Node_Server_2", "hydra-sk-node-003-667788": "Node_Server_3", "hydra-sk-node-004-990011": "Node_Server_4", "hydra-sk-node-005-223344": "Node_Server_5", "hydra-sk-app-mobile-1010": "Mobile_App_iOS", "hydra-sk-app-mobile-2020": "Mobile_App_Android", "hydra-sk-app-desktop-3030": "Desktop_App_Electron", "hydra-sk-app-web-4040": "Web_Client_App", "hydra-sk-service-auth-01": "Auth_Service", "hydra-sk-service-db-02": "Database_Worker", "hydra-sk-service-cache-03": "Redis_Cache_Worker", "hydra-sk-service-queue-04": "RabbitMQ_Worker", "hydra-sk-service-cron-05": "Cron_Task_Manager", "hydra-sk-client-pro-1001": "Client_Pro_Tier_1", "hydra-sk-client-pro-1002": "Client_Pro_Tier_2", "hydra-sk-client-pro-1003": "Client_Pro_Tier_3", "hydra-sk-client-pro-1004": "Client_Pro_Tier_4", "hydra-sk-client-pro-1005": "Client_Pro_Tier_5", "hydra-sk-client-enterprise-2001": "Enterprise_Client_A", "hydra-sk-client-enterprise-2002": "Enterprise_Client_B", "hydra-sk-client-enterprise-2003": "Enterprise_Client_C", "hydra-sk-internal-tool-01": "Internal_Dev_Tool_1", "hydra-sk-internal-tool-02": "Internal_Dev_Tool_2", "hydra-sk-internal-tool-03": "Internal_Dev_Tool_3", "hydra-sk-bot-v2-01": "Discord_Bot_v2_1", "hydra-sk-bot-v2-02": "Discord_Bot_v2_2", "hydra-sk-bot-v2-03": "Discord_Bot_v2_3", "hydra-sk-bot-v2-04": "Discord_Bot_v2_4", "hydra-sk-bot-v2-05": "Discord_Bot_v2_5", "hydra-sk-integration-gh-01": "GitHub_Actions_Integration", "hydra-sk-integration-gl-02": "GitLab_CI_Integration", "hydra-sk-integration-docker-03": "Docker_Hub_Integration", "hydra-sk-integration-aws-04": "AWS_Lambda_Integration", "hydra-sk-integration-gcf-05": "GCP_Cloud_Functions", "hydra-sk-vip-004-1234567": "VIP_User_4", "hydra-sk-vip-005-2345678": "VIP_User_5", "hydra-sk-vip-006-3456789": "VIP_User_6", "hydra-sk-vip-007-4567890": "VIP_User_7", "hydra-sk-vip-008-5678901": "VIP_User_8", "hydra-sk-vip-009-6789012": "VIP_User_9", "hydra-sk-vip-010-7890123": "VIP_User_10", "hydra-sk-sec-audit-01": "Security_Audit_Tool_A", "hydra-sk-sec-audit-02": "Security_Audit_Tool_B", "hydra-sk-monitoring-01": "Prometheus_Monitoring", "hydra-sk-monitoring-02": "Grafana_Dashboard_Agent", "hydra-sk-ext-partner-01": "External_Partner_Alpha", "hydra-sk-ext-partner-02": "External_Partner_Beta", "hydra-sk-ext-partner-03": "External_Partner_Gamma", "hydra-sk-sandbox-01": "Sandbox_Environment_1", "hydra-sk-sandbox-02": "Sandbox_Environment_2", "hydra-sk-sandbox-03": "Sandbox_Environment_3", "hydra-sk-cluster-east-01": "Cluster_US_East_1", "hydra-sk-cluster-east-02": "Cluster_US_East_2", "hydra-sk-cluster-west-01": "Cluster_US_West_1", "hydra-sk-cluster-eu-01": "Cluster_EU_Central_1", "hydra-sk-cluster-sa-01": "Cluster_SA_East_1", "hydra-sk-backup-01": "Backup_Worker_Node_1", "hydra-sk-backup-02": "Backup_Worker_Node_2", "hydra-sk-legacy-01": "Legacy_System_Adapter_1", "hydra-sk-legacy-02": "Legacy_System_Adapter_2", "hydra-sk-agent-ai-01": "AI_Agent_Code_Reviewer", "hydra-sk-agent-ai-02": "AI_Agent_Bug_Fixer", "hydra-sk-agent-ai-03": "AI_Agent_Refactorer", "hydra-sk-agent-ai-04": "AI_Agent_Doc_Generator", "hydra-sk-agent-ai-05": "AI_Agent_Unit_Tester", "hydra-sk-gateway-01": "API_Gateway_Primary", "hydra-sk-gateway-02": "API_Gateway_Secondary", "hydra-sk-gateway-03": "API_Gateway_Failover", "hydra-sk-custom-9001": "Custom_Deployment_Key_1", "hydra-sk-custom-9002": "Custom_Deployment_Key_2", "hydra-sk-custom-9003": "Custom_Deployment_Key_3", "hydra-sk-custom-9004": "Custom_Deployment_Key_4", "hydra-sk-custom-9005": "Custom_Deployment_Key_5", "hydra-sk-custom-9006": "Custom_Deployment_Key_6", "hydra-sk-custom-9007": "Custom_Deployment_Key_7", "hydra-sk-custom-9008": "Custom_Deployment_Key_8", "hydra-sk-custom-9009": "Custom_Deployment_Key_9", "hydra-sk-custom-9010": "Custom_Deployment_Key_10" } try: print("LOG: Cargando Tokenizador Hydra 3B...") tokenizer = AutoTokenizer.from_pretrained(model_id, token=token) print("LOG: Configurando cuantización 4-bit...") bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_compute_dtype=torch.float16, llm_int8_enable_fp32_cpu_offload=True ) print("LOG: Cargando modelo fusionado Hydra 3B...") model = AutoModelForCausalLM.from_pretrained( model_id, token=token, quantization_config=bnb_config, device_map="auto", torch_dtype=torch.float16, low_cpu_mem_usage=True, offload_folder="offload_dir" ) print("LOG: IA cargada y lista.") except Exception as e: print(f"LOG CRÍTICO: Error al cargar el modelo: {e}") sys.exit(1) HTML_PAGE = """ Hydra AI 3B - Private Console
HYDRA AI 3B ONLINE
Consola privada activa. Ingrese su API Key en la parte superior para consultar al motor de IA.
""" @app.route('/ask', methods=['POST']) def ask(): api_key = request.headers.get("x-api-key") if not api_key or api_key not in VALID_API_KEYS: return jsonify({"error": "Acceso denegado. Llave invalida o inexistente."}), 401 try: data = request.json user_prompt = data.get("prompt", "") prompt = f"<|im_start|>system\nEres Hydra 3.0, el motor de inteligencia artificial de Hydra Software. Eres un experto absoluto en programación y desarrollo de sistemas backend, bots y paneles web.<|im_end|>\n<|im_start|>user\n{user_prompt}<|im_end|>\n<|im_start|>assistant\n" inputs = tokenizer(prompt, return_tensors="pt").to(model.device) streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True) def generate_task(): with torch.no_grad(): model.generate( **inputs, max_new_tokens=4096, do_sample=True, temperature=0.7, top_p=0.9, repetition_penalty=1.15, streamer=streamer ) thread = threading.Thread(target=generate_task) thread.start() def generate_stream(): for text in streamer: yield text return Response(stream_with_context(generate_stream()), mimetype='text/plain') except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/', methods=['GET']) def health(): return render_template_string(HTML_PAGE) if __name__ == '__main__': print("LOG: Iniciando servidor Flask en 0.0.0.0:7860") app.run(host='0.0.0.0', port=7860, threaded=True)