Luz de Arcanos uses the Google Gemini API to generate personalized tarot readings in real-time. The integration includes multi-model fallback, prompt engineering for consistent voice, content filtering, and graceful degradation.
The prompt is carefully engineered to produce consistent, branded, conversational readings:
const positions = ['Pasado', 'Presente', 'Futuro'] as const;const cardsText = cards .map((card, i) => { const orientation = card.reversed ? 'invertida' : 'al derecho'; const keywords = card.reversed ? card.reversedKeywords : card.uprightKeywords; return `• ${positions[i]}: ${card.name} (${orientation}) — ${card.description}. Energías: ${keywords.join(', ')}.`; }) .join('\n');const prompt = `Actúa como Seraphina, una tarotista profesional y empática. Tu estilo es cálido pero directo y práctico. No usas palabras complicadas ni eres excesivamente mística. Tu objetivo es ayudar a la persona con consejos que pueda aplicar mañana mismo.DATOS:- Nombre: ${name}- Pregunta: "${question}"- Cartas: ${cardsText}REGLAS DE ESCRITURA:1. Sé breve: La lectura completa NO debe superar las 250 palabras.2. Lenguaje claro: Habla como una amiga sabia, no como un libro antiguo. Evita palabras como "tapiz del universo", "susurros", "vibrar" o "centurias".3. Estructura directa: - APERTURA: Hola ${name}, vamos a ver qué dicen las cartas sobre tu pregunta. (Máximo 2 frases). - PASADO: Lo que te trajo aquí. - PRESENTE: Lo que pasa ahora. - FUTURO: Lo que viene. - CONSEJO: Un paso práctico a seguir.4. Tono: Positivo y constructivo, pero realista.IMPORTANTE: No uses formato Markdown (sin negritas ni asteriscos). Responde en español y ve al grano.RESTRICCIONES: Si la pregunta trata sobre salud, enfermedades, diagnósticos médicos o embarazo, no respondas la consulta de tarot. En su lugar, indica amablemente que este servicio no aborda temas de salud y recomienda consultar a un profesional médico.`;
When all AI models fail, a template-based reading ensures users never see an error:
function getFallbackReading(name: string, cards: Array<{ name: string; reversed?: boolean }>) { const [past, present, future] = cards; return `Hola ${name}, vamos a ver qué dicen las cartas.En el pasado, ${past.name} ${past.reversed ? 'invertida' : 'al derecho'} marca el punto de partida de lo que estás viviendo. Algo de esa etapa todavía influye en tu situación actual.En el presente, ${present.name} ${present.reversed ? 'invertida' : 'al derecho'} refleja lo que está pasando ahora mismo. Esta carta te pide que prestes atención a cómo estás manejando la situación en este momento.Para el futuro, ${future.name} ${future.reversed ? 'invertida' : 'al derecho'} muestra hacia dónde se dirigen las cosas si seguís el camino actual. No es inevitable, pero es la tendencia más probable.Mi consejo: revisá qué de tu pasado todavía estás cargando sin necesidad, y enfocate en lo que sí podés cambiar hoy.`;}
The fallback maintains the same structure (past/present/future) and tone as AI-generated readings for consistency.
try { const { data, error } = await actions.tarot.consult({ name, question, cards }); if (error) { resetCards(); showSection('form'); if (error.code === 'BAD_REQUEST') { showError('Los datos enviados no son válidos. Revisá el nombre y la consulta.'); } else { showError('El oráculo no pudo completar tu lectura. Inténtalo de nuevo en unos momentos.'); } return; } incrementUsage(); renderReading(data.reading);} catch { resetCards(); showSection('form'); showError('No se pudo conectar con el oráculo. Verificá tu conexión e inténtalo de nuevo.');} finally { submitBtn.disabled = false;}
The prompt includes explicit instructions to reject certain topics:
Health-related questions are automatically rejected by the AI with a friendly redirection to medical professionals.
RESTRICCIONES: Si la pregunta trata sobre salud, enfermedades, diagnósticos médicoso embarazo, no respondas la consulta de tarot. En su lugar, indica amablemente queeste servicio no aborda temas de salud y recomienda consultar a un profesional médico.
This is reinforced in the footer disclaimer:
<p>No se responden consultas sobre salud, diagnósticos médicos ni embarazo.Para esos temas, consultá a un profesional.</p>
See src/pages/index.astro:94 for the full disclaimer text.
The server action returns a simple JSON structure:
return { reading: string };
Example response:
{ "reading": "Hola María, vamos a ver qué dicen las cartas sobre tu pregunta.\n\nEn el pasado, El Loco al derecho marca el punto de partida...\n\nEn el presente, La Torre invertida refleja...\n\nPara el futuro, El Sol al derecho muestra...\n\nMi consejo: revisá qué de tu pasado todavía estás cargando sin necesidad."}