import gradio as gr import random import re from pathlib import Path from huggingface_hub import InferenceClient, snapshot_download from datasets import load_dataset import shutil # Descargar y preparar dataset de tarot def prepare_tarot_dataset(): dataset_path = Path("tarot_dataset") image_dir = dataset_path / "images" image_dir.mkdir(parents=True, exist_ok=True) # Descargar dataset dataset = load_dataset("multimodalart/1920-raider-waite-tarot-public-domain", split="train") # Procesar metadatos y organizar imágenes card_map = {} pattern = re.compile(r'"([^"]+)"$') # Para extraer el nombre de la carta for item in dataset: text = item["text"] match = pattern.search(text) if match: card_name = match.group(1).lower() src_path = Path(item["file_name"]) dest_path = image_dir / f"{card_name.replace(' ', '_')}.jpg" if not dest_path.exists(): try: # Copiar imagen desde el dataset descargado shutil.copy(src_path, dest_path) except: continue card_map[card_name] = str(dest_path) return card_map # Preparar dataset y obtener mapeo de cartas CARD_MAP = prepare_tarot_dataset() CARDS = list(CARD_MAP.keys()) # System Prompt mejorado TAROTIST_PROMPT = """ Eres Madame Esmeralda, vidente tercera generación con dones psíquicos. Tu estilo: 🔮 Combinas simbolismo cabalístico, astrología y quiromancia 🌙 Usas un lenguaje poético con rimas sutiles 💫 Incluye predicciones a 3 plazos (corto, medio y largo) 🌿 Relaciona las cartas con elementos naturales ✨ Termina con un presagio y recomendación mágica Técnica de lectura: 1. Analiza posición cósmica actual 2. Desentraña relaciones kármicas 3. Revela desafíos ocultos 4. Señala oportunidades místicas 5. Ofrece protección espiritual Formato respuesta: 📜 **Profecía Celestial** (emoji relacionado) Verso poético de 4 líneas 🌌 **Desglose Arcano**: - Influencia planetaria - Elemento dominante - Chakras afectados 🗝️ **Clave del Destino**: Consejo práctico con hierba/color/cristal """ client = InferenceClient(provider="hf-inference", api_key="hf_xxxxxxxxxxxxxxxxxxxxxxxx") def get_reading(cards): messages = [ {"role": "system", "content": TAROTIST_PROMPT}, {"role": "user", "content": f"Realiza lectura completa para: {', '.join(cards)}. Incluye predicciones temporales."} ] completion = client.chat.completions.create( model="meta-llama/Llama-3.3-70B-Instruct", messages=messages, max_tokens=700, ) return completion.choices[0].message.content def draw_cards(spread_type): spreads = { "Oráculo Rápido": 1, "Tríada del Destino": 3, "Cruz Mística": 5, "Círculo Zodiacal": 12 } num_cards = spreads.get(spread_type, 3) drawn = random.sample(CARDS, num_cards) images = [CARD_MAP[card] for card in drawn if card in CARD_MAP] return images, drawn def process_spread(spread_type): images, cards = draw_cards(spread_type) return images, "\n".join(f"🔮 {c.capitalize()}" for c in cards) def full_reading(_, cards_text): cards = [line.replace("🔮 ", "").lower() for line in cards_text.split("\n")] reading = get_reading(cards) return f"## 📜 Lectura Mística 📜\n\n{reading}" with gr.Blocks(theme=gr.themes.Soft(primary_hue="purple")) as demo: gr.Markdown("#