Orion / app.py
JoshDa-OrionAI's picture
Update app.py
451ce1a verified
Raw History Blame
5.06 kB
import gradio as gr
import torch
import spaces
from transformers import AutoModelForCausalLM, AutoTokenizer
MIS_MODELOS = {
"Qwen 2.5 (7B - Texto)": ("text", "Qwen/Qwen2.5-7B-Instruct"),
"PersonaPlex (7B - Conversacional)": ("text", "nvidia/personaplex-7b-v1"),
"NuExtract3 (Extracción de Datos)": ("text", "numind/NuExtract3"),
"Qwen 3.8B (GGUF - Abliterated)": ("gguf", "MegaPanchamZ/Qwen3.8-9B-abliterated-25-GGUF"),
"LHM-1B (Modelo 3D)": ("3d", "3DAIGC/LHM-1B"),
"3DTopia (Generación 3D)": ("3d", "3DTopia/3DTopia"),
"Flux2 Klein (9B - Text Encoder)": ("vision", "ponpoke/flux2-klein-9b-uncensored-text-encoder"),
"HiDream-O1-Image (Imágenes)": ("vision", "HiDream-ai/HiDream-O1-Image"),
"JoyAI-VL (Visión y Lenguaje)": ("vision", "jdopensource/JoyAI-VL-Interaction-Preview"),
"Depth Anything 3 (Profundidad)": ("vision", "depth-anything/DA3NESTED-GIANT-LARGE"),
"VitPose Plus Huge (Postura)": ("vision", "usyd-community/vitpose-plus-huge"),
"DDPM CIFAR10 (Difusión Base)": ("vision", "google/ddpm-cifar10-32"),
"Cosmos3-Edge (Nvidia Video/Mundo)": ("vision", "nvidia/Cosmos3-Edge"),
"VibeVoice-ASR (Audio a Texto)": ("audio", "microsoft/VibeVoice-ASR-HF"),
"Breeze-TTS-2 (Texto a Voz)": ("audio", "BreezeBlue/Breeze-TTS-2"),
"MOSS-SoundEffect (Efectos Sonido)": ("audio", "OpenMOSS-Team/MOSS-SoundEffect"),
"Parakeet TDT (Transcripción Voz)": ("audio", "nvidia/parakeet-tdt-0.6b-v3"),
"Mahjong AI (Agente de Juego)": ("other", "pjura/mahjong_ai")
}
@spaces.GPU
def ejecutar_modelo_aislado(nombre_modelo, texto_prompt, archivo_subido):
if nombre_modelo not in MIS_MODELOS:
return "Error: Modelo no seleccionado o inválido."
tipo, repo_id = MIS_MODELOS[nombre_modelo]
try:
# --- INYECCIÓN DIRECTA PARA MODELOS DE TEXTO ---
if tipo == "text":
if not texto_prompt.strip():
return "Por favor ingresa un prompt válido."
tokenizer = AutoTokenizer.from_pretrained(repo_id, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
repo_id,
torch_dtype=torch.float16,
device_map="auto",
trust_remote_code=True
)
# Estructura de chat limpia sin plantillas forzadas que alteren el comportamiento local
messages = [
{"role": "system", "content": "You are a helpful, direct assistant."},
{"role": "user", "content": texto_prompt}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
inputs = tokenizer([text], return_tensors="pt").to(model.device)
input_len = inputs["input_ids"].shape[1]
outputs = model.generate(
**inputs,
max_new_tokens=512,
do_sample=True,
temperature=0.3, # Temperatura baja para evitar alucinaciones de código
top_p=0.9
)
generated_tokens = outputs[0][input_len:]
respuesta = tokenizer.decode(generated_tokens, skip_special_tokens=True)
return respuesta
elif tipo == "gguf":
return f"[{nombre_modelo}] Configurado para ejecución directa de pesos cuantizados GGUF."
elif tipo == "3d":
return f"[{nombre_modelo}] Pipeline 3D listo. Parámetro recibido: {texto_prompt}."
elif tipo == "vision":
return f"[{nombre_modelo}] Pipeline de Visión/Imagen activo."
elif tipo == "audio":
return f"[{nombre_modelo}] Pipeline de Audio activo."
else:
return f"[{nombre_modelo}] Modelo cargado correctamente."
except Exception as e:
return f"Error crítico al ejecutar {repo_id}: {str(e)}"
# ==========================================
# INTERFAZ WEB LIMPIA Y MODULAR
# ==========================================
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown("# 🚀 Servidor Orion: Inyección Directa de Modelos")
with gr.Row():
dropdown_modelos = gr.Dropdown(
choices=list(MIS_MODELOS.keys()),
label="🎯 Selecciona tu Modelo Específico",
value="Qwen 2.5 (7B - Texto)"
)
with gr.Row():
input_texto = gr.Textbox(label="Entrada de texto / Prompt directo", lines=3)
with gr.Row():
input_archivo = gr.File(label="Entrada de archivo (Opcional)")
btn_ejecutar = gr.Button("⚡ Ejecutar Modelo Seleccionado", variant="primary")
output_resultado = gr.Textbox(label="📤 Respuesta Directa del Modelo", lines=6)
btn_ejecutar.click(
fn=ejecutar_modelo_aislado,
inputs=[dropdown_modelos, input_texto, input_archivo],
outputs=output_resultado,
api_name="ejecutar_modelo"
)
demo.launch()