import gradio as gr import random import re import json from pathlib import Path from huggingface_hub import InferenceClient, snapshot_download import shutil def prepare_tarot_dataset(): repo_id = "multimodalart/1920-raider-waite-tarot-public-domain" dataset_path = Path("tarot_dataset") image_dir = dataset_path / "images" image_dir.mkdir(parents=True, exist_ok=True) # Descargar repositorio completo repo_path = snapshot_download(repo_id=repo_id, repo_type="dataset") # Procesar archivo JSONL manualmente jsonl_path = Path(repo_path) / "output_file.jsonl" card_map = {} pattern = re.compile(r'"([^"]+)"$') with open(jsonl_path, "r") as f: for line in f: try: data = json.loads(line) text = data["text"] file_name = data["file_name"] # Extraer nombre de la carta match = pattern.search(text) if match: card_name = match.group(1).lower().replace('"', '') src_image = Path(repo_path) / file_name dest_image = image_dir / f"{card_name.replace(' ', '_')}.jpg" if not dest_image.exists(): shutil.copy(src_image, dest_image) card_map[card_name] = str(dest_image) except (KeyError, json.JSONDecodeError) as e: print(f"Error procesando línea: {e}") continue 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("#