import sqlite3, os, bcrypt, cohere, gradio as gr from huggingface_hub import InferenceClient from duckduckgo_search import DDGS # --- CONFIGURACIÓN DE APIS --- HF_TOKEN = os.getenv("HF_TOKEN") COHERE_KEY = os.getenv("COHERE_API_KEY") hf = InferenceClient(token=HF_TOKEN) if HF_TOKEN else None co = cohere.Client(api_key=COHERE_KEY) if COHERE_KEY else None # --- BASE DE DATOS (NUEVA VERSIÓN) --- DB_NAME = "chaty_v8.db" def init_db(): with sqlite3.connect(DB_NAME) as conn: conn.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, user TEXT UNIQUE, pass TEXT)") init_db() def auth_handler(u, p, mode): if not u or not p: return "⚠️ Datos incompletos" try: with sqlite3.connect(DB_NAME) as conn: if mode == "Reg": h = bcrypt.hashpw(p.encode(), bcrypt.gensalt()).decode() try: conn.execute("INSERT INTO users (user, pass) VALUES (?, ?)", (u, h)) return "✅ Registro exitoso. ¡Entra ahora!" except: return "❌ El usuario ya existe." else: row = conn.execute("SELECT id, pass FROM users WHERE user = ?", (u,)).fetchone() if row and bcrypt.checkpw(p.encode(), row[1].encode()): return row[0] return None except: return "❌ Error de conexión con la base de datos." # --- MOTOR DE INTELIGENCIA --- def ai_logic(msg, hist, uid): if uid is None: return hist, None, "⚠️ Por favor, inicia sesión primero." hist = hist or [] m = msg.lower() try: # Modo Dibujo if any(w in m for w in ["dibuja", "imagen", "foto"]): img = hf.text_to_image(msg, model="stabilityai/stable-diffusion-xl-base-1.0") path = f"img_{uid}.png" img.save(path) hist.append((msg, "🎨 ¡Hecho! Aquí tienes tu dibujo:")) return hist, path, "" # Modo Búsqueda if any(w in m for w in ["busca", "noticias", "quien", "precio"]): with DDGS() as ddgs: res = list(ddgs.text(msg, max_results=3)) info = "🌐 **Última hora:**\n" + "\n".join([f"- {r['title']}" for r in res]) hist.append((msg, info)) return hist, None, "" # Modo Chat Normal res = co.chat(message=msg, model="command-r").text hist.append((msg, res)) return hist, None, "" except Exception as e: return hist, None, f"❌ Error de red: {str(e)[:50]}" # --- INTERFAZ DE USUARIO --- with gr.Blocks(theme=gr.themes.Soft(primary_hue="red"), css=".gradio-container {background-color: #050505}") as demo: gr.HTML("

🔴 CHATY PRO v8.0

") user_id = gr.State(None) with gr.Tabs() as main_tabs: # PESTAÑA 1: LOGIN with gr.Tab("🔑 ACCESO", id="tab_login"): with gr.Column(variant="panel"): u_txt = gr.Textbox(label="Usuario") p_txt = gr.Textbox(label="Contraseña", type="password") with gr.Row(): btn_reg = gr.Button("REGISTRAR") btn_log = gr.Button("ENTRAR", variant="primary") info_msg = gr.Markdown("Bienvenido. Registra un usuario o entra con el tuyo.") # PESTAÑA 2: PANEL DE CONTROL with gr.Tab("💬 CHAT & IA", id="tab_chat"): with gr.Row(): with gr.Column(scale=3): chat_bot = gr.Chatbot(height=400, label="Chaty Intelligence") msg_in = gr.Textbox(placeholder="Pide un dibujo, una noticia o solo charla...", label="Tu mensaje") with gr.Column(scale=2): res_img = gr.Image(label="Resultado Visual") btn_go = gr.Button("EJECUTAR ACCIÓN", variant="primary") # --- EVENTOS --- def start_session(u, p): res = auth_handler(u, p, "Log") if isinstance(res, int): return res, "✅ Acceso correcto", gr.Tabs(selected="tab_chat") return None, "❌ Usuario o clave incorrectos", gr.Tabs(selected="tab_login") # Registro de eventos con nombres de API simplificados btn_log.click(start_session, [u_txt, p_txt], [user_id, info_msg, main_tabs], api_name="do_login") btn_reg.click(lambda u,p: auth_handler(u,p,"Reg"), [u_txt, p_txt], info_msg, api_name="do_reg") # Ejecución de Chat btn_go.click(ai_logic, [msg_in, chat_bot, user_id], [chat_bot, res_img, msg_in], api_name="do_chat") msg_in.submit(ai_logic, [msg_in, chat_bot, user_id], [chat_bot, res_img, msg_in], api_name="do_submit") if __name__ == "__main__": demo.queue().launch(show_api=False)