Spaces:
Sleeping
Sleeping
File size: 4,758 Bytes
fde25ce 8477739 fde25ce 98209a7 fde25ce 98209a7 8477739 fde25ce 8477739 98209a7 8477739 fde25ce 98209a7 fde25ce 8477739 fde25ce 98209a7 8477739 fde25ce 98209a7 fde25ce 98209a7 92e336a 98209a7 92e336a 98209a7 fde25ce 98209a7 fde25ce 8477739 98209a7 fde25ce 8477739 98209a7 8477739 92e336a 8477739 98209a7 92e336a 98209a7 8477739 fde25ce 98209a7 8477739 98209a7 8477739 98209a7 8477739 fde25ce 8477739 fde25ce 98209a7 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
import os
import gradio as gr
import asyncio
from typing import Optional
from PIL import Image
import base64
import io
import requests
# --- Configuración de claves ---
class Config:
def __init__(self):
self.SAMBANOVA_API_KEY = os.getenv("SAMBANOVA_API_KEY")
self.BRIA_API_TOKEN = os.getenv("BRIA_API_TOKEN")
self.validate()
def validate(self):
print("🔍 Verificando claves de API...")
if self.SAMBANOVA_API_KEY:
print("✅ SAMBANOVA_API_KEY configurada")
else:
print("❌ SAMBANOVA_API_KEY no encontrada")
if self.BRIA_API_TOKEN:
print("✅ BRIA_API_TOKEN configurado")
else:
print("⚠️ BRIA_API_TOKEN no configurado → generación de imágenes desactivada")
config = Config()
# --- Cliente SambaNova (usando SDK oficial) ---
SambaNova = None
sn_client = None
try:
from sambanova import SambaNova
if config.SAMBANOVA_API_KEY:
sn_client = SambaNova(api_key=config.SAMBANOVA_API_KEY)
print("✅ Cliente SambaNova inicializado")
except Exception as e:
print(f"❌ Error al inicializar SambaNova: {e}")
sn_client = None
# --- Herramientas ---
class AI_Tools:
def __init__(self):
self.sn_client = sn_client
def generate_text(self, prompt: str) -> str:
if not self.sn_client:
return "❌ SambaNova no disponible. Verifica tu clave API."
try:
# ⚠️ Usa un modelo REAL de tu cuenta en SambaNova Cloud
# Ejemplos comunes: "Meta-Llama-3.1-8B-Instruct", "Llama-3.2-3B-Instruct"
# Reemplaza "Maverick" por un modelo válido que veas en tu dashboard
response = self.sn_client.chat.completions.create(
model="Meta-Llama-3.1-8B-Instruct", # ✅ CAMBIA ESTO si usas otro modelo
messages=[{"role": "user", "content": prompt}],
temperature=0.7,
max_tokens=500
)
return response.choices[0].message.content.strip()
except Exception as e:
return f"❌ Error en SambaNova: {e}"
def generate_image(self, prompt: str) -> Optional[Image.Image]:
if not config.BRIA_API_TOKEN:
return None
try:
url = "https://api.bria.ai/v1/generate" # ✅ sin espacio
headers = {"Authorization": f"Bearer {config.BRIA_API_TOKEN}"}
json_data = {"prompt": prompt, "options": {"resolution": "512x512"}}
response = requests.post(url, headers=headers, json=json_data, timeout=30)
if response.status_code == 200:
img_b64 = response.json().get("image_base64")
if img_b64:
img_bytes = base64.b64decode(img_b64)
return Image.open(io.BytesIO(img_bytes))
except Exception as e:
print(f"⚠️ Error en Bria: {e}")
return None
tools = AI_Tools()
# --- Procesamiento (síncrono para Gradio) ---
def process_input(message: str, history: list) -> list:
msg_lower = message.lower()
# Generar imagen
if any(kw in msg_lower for kw in ["imagen", "foto", "genera imagen", "dibuja"]):
img = tools.generate_image(message)
if img:
return history + [(message, ("", img))]
return history + [(message, "❌ No se pudo generar la imagen. ¿Tienes BRIA_API_TOKEN?")]
# Generar texto con SambaNova
response = tools.generate_text(message)
return history + [(message, response)]
# --- Interfaz Gradio ---
with gr.Blocks(title="AI Assistant", theme=gr.themes.Soft()) as app:
gr.Markdown("# 🤖 AI Assistant (SambaNova + Bria)")
samba_status = "✅ SambaNova activo" if tools.sn_client else "❌ SambaNova inactivo"
bria_status = "✅ Bria activo" if config.BRIA_API_TOKEN else "❌ Bria inactivo"
gr.Markdown(f"**Estado**: {samba_status} | {bria_status}")
chatbot = gr.Chatbot(height=450)
msg = gr.Textbox(
label="Escribe tu mensaje",
placeholder="Ej: 'Explica la relatividad' o 'Genera una imagen de un dragón en Marte'",
lines=2
)
gr.Examples([
"¿Qué es el aprendizaje automático?",
"Genera una imagen de un bosque encantado al atardecer",
"Escribe un breve cuento sobre un robot solitario"
], inputs=msg)
def clear(): return []
gr.Button("Limpiar chat").click(clear, outputs=chatbot)
# Con queue=True, evita bloqueos
msg.submit(process_input, [msg, chatbot], chatbot, queue=True)
gr.Button("Enviar").click(process_input, [msg, chatbot], chatbot, queue=True)
# --- Ejecución ---
if __name__ == "__main__":
app.queue().launch(server_name="0.0.0.0", server_port=7860) |