Tarot / app.py
RedSparkie's picture
Update app.py
43d1339 verified
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("# <center>🔮 Vidente del Alma 🔮</center>")
with gr.Row(variant="panel"):
gr.Image("mystic_banner.png", label="Madame Esmeralda", width=200)
with gr.Column():
spread_btn = gr.Radio(
choices=["Oráculo Rápido", "Tríada del Destino", "Cruz Mística", "Círculo Zodiacal"],
label="Selección del Oráculo",
elem_classes="mystic-radio"
)
draw_btn = gr.Button("🌌 Invocar Cartas 🌌", variant="primary")
with gr.Row():
gallery = gr.Gallery(
label="Cartas Invocadas",
columns=6,
height=300,
object_fit="cover"
)
cards_text = gr.Textbox(
label="Energías Reveladas",
interactive=False,
elem_classes="mystic-text"
)
reading_btn = gr.Button("🧿 Revelar Profecía 🧿", variant="primary")
reading_output = gr.Markdown("### Que los astros guíen tu camino...", elem_id="prophecy-box")
draw_btn.click(
process_spread,
inputs=spread_btn,
outputs=[gallery, cards_text]
)
reading_btn.click(
full_reading,
inputs=[spread_btn, cards_text],
outputs=reading_output
)
if __name__ == "__main__":
demo.launch(
css=".mystic-radio {color: #4a148c} .mystic-text {font-family: 'Papyrus'} #prophecy-box {background: #f3e5f5}"
)