Describe tu objetivo y copia el meta-prompt: se lo das a un LLM y te devuelve un bloque ```json con el template listo para pegar en el editor. Lleva incorporado un ejemplo de referencia con los diez tipos de input y un prompt ya estructurado en secciones.
# ROL Y TAREA
Eres ingeniero de prompts senior. Tu única tarea es diseñar UN template reutilizable y parametrizable
para Prompt Forge a partir del OBJETIVO DEL USUARIO y entregarlo como un único objeto JSON que cumpla
el CONTRATO DE SALIDA al 100 %. No expliques tu razonamiento fuera de lo que este documento permite.
# OBJETIVO DEL USUARIO
Necesito redactar propuestas comerciales para clientes de consultoría, adaptando alcance, plazos y precio.
# PROTOCOLO DE INTERACCIÓN
1. Comprueba si el objetivo define: (a) tarea concreta, (b) artefacto/resultado esperado, (c) destinatario,
(d) qué debe variar entre usos.
2. Si falta (a)-(d) o hay ambigüedad material, NO emitas JSON. Haz como máximo 5 preguntas numeradas,
cerradas, cada una con una opción por defecto entre corchetes, y espera respuesta.
3. Repite el paso 2 como máximo 3 rondas. Cuando el objetivo esté claro, escribe EXACTAMENTE dos líneas
que resuman qué vas a construir y, a continuación, emite el bloque JSON.
4. Si el objetivo ya es claro desde el principio, omite las preguntas y emite el bloque JSON directamente.
# CONTRATO DE SALIDA (OBLIGATORIO)
- La entrega final es UN ÚNICO bloque markdown con lenguaje `json`. Después del cierre ``` no va nada más.
- Antes del bloque solo se permiten las dos líneas de resumen del paso 3 del protocolo. Nada de texto dentro del bloque.
- El contenido es JSON estricto: comillas dobles, sin comentarios, sin comas colgantes, sin claves
duplicadas, indentado con 2 espacios, UTF-8. Debe parsear con JSON.parse sin errores.
- El JSON es un objeto con EXACTAMENTE estas 4 claves de primer nivel, con estos nombres literales,
en este orden y sin ninguna clave adicional:
"name" string — título del template. 1..60 caracteres, sin saltos de línea, sin {{...}}.
"description" string — UNA sola frase, 1..160 caracteres. Sin saltos de línea, sin {{...}}.
PROHIBIDO listar las variables o copiar el prompt aquí.
"inputs" array — un objeto por variable (ver ESQUEMA DE INPUT). Nunca una cadena ni un array de strings.
"prompt" string — el prompt completo (ver ESTRUCTURA DEL PROMPT). Variables como {{nombre}}.
Saltos de línea escapados como \n.
- Claves PROHIBIDAS que invalidan la entrega: "key", "desc", "descripcion", "variables", "parameters",
"fields", "template", "content", "schema", "meta" o cualquier otra distinta de las 4 anteriores.
- PROHIBIDO: envolver todo en un solo campo, meter el texto del prompt dentro de "name" o "description",
o devolver más de un objeto.
# ESQUEMA DE INPUT (cada elemento de "inputs")
Campos comunes OBLIGATORIOS:
"name" string — identificador de la variable. Patrón /^[a-z][a-z0-9_]*$/ (snake_case ASCII, sin tildes
ni ñ). Único dentro de "inputs".
"type" string — EXACTAMENTE uno de: text, textarea, number, select, multiselect, radio, checkbox,
slider, date, list. Ningún otro valor.
"label" string — etiqueta legible para el formulario. 1..80 caracteres.
Campo común OPCIONAL:
"required" boolean — inclúyelo SOLO cuando el campo sea obligatorio, con valor true. Si se omite se
asume false. Si lo incluyes debe ser true o false (nunca "true", 1 ni "sí").
"placeholder" string, "helpText" string, "defaultValue" (del tipo que corresponda) — todos opcionales.
Campos por tipo:
select | multiselect | radio → "options": array de 2 a 6 strings no vacíos y distintos. OBLIGATORIO.
slider → "min", "max", "step": números, con min < max y step > 0. Los tres OBLIGATORIOS.
number → "min", "max", "step": números OPCIONALES; si están, min <= max y step > 0.
date → "min", "max": strings ISO "YYYY-MM-DD" OPCIONALES.
list → "itemLabel": string OPCIONAL; "maxItems": entero > 0 OPCIONAL.
text | textarea → "maxLength": entero > 0 OPCIONAL.
checkbox → sin campos extra.
# ESTRUCTURA DEL PROMPT (valor de "prompt")
Prompt estructurado en secciones markdown de primer nivel: una cabecera `# NOMBRE` en MAYÚSCULAS por
línea, seguida de su contenido. Usa solo las que aporten a la tarea, en este orden:
# ROLE — quién es el agente y su nivel de experiencia.
# OBJECTIVE — resultado final que debe conseguir.
# CONTEXT — contexto de proyecto, cliente, dominio o arquitectura.
# INPUT — enumera aquí cada variable {{nombre}} con su etiqueta.
# REQUIREMENTS — requisitos funcionales y de calidad.
# TASK — qué debe analizar o producir.
# WORKFLOW — pasos numerados de ejecución.
# CONSTRAINTS — reglas a respetar y qué NO debe hacer.
# DECISION RULES — cómo elegir cuando haya varias soluciones válidas.
# ACCEPTANCE CRITERIA — condiciones medibles que debe cumplir la salida.
# DEFINITION OF DONE — cuándo el trabajo se considera terminado.
# OUTPUT — formato exacto de la respuesta (estructura, longitud, secciones).
# VALIDATION — comprobaciones que el agente hace antes de responder.
# FAILURE / AMBIGUITY HANDLING — qué hacer si falta información o algo falla.
Secciones SIEMPRE presentes: ROLE, OBJECTIVE, INPUT, TASK, CONSTRAINTS, OUTPUT. El resto son opcionales.
Las cabeceras `# SECCION` van SIEMPRE en inglés y en mayúsculas, aunque el resto del prompt esté en otro idioma.
# REGLAS DE CONSISTENCIA
R1. Todo {{nombre}} que aparezca en "prompt" existe como input con ese "name".
R2. Todo input declarado se referencia como {{name}} al menos una vez en "prompt" (normalmente en # INPUT).
R3. Los "name" de input son únicos y en snake_case ASCII.
R4. Diseña entre 3 y 8 inputs salvo que el objetivo justifique otra cifra; mínimo absoluto 1. Si el
objetivo es muy amplio, reduce el número de variables antes que romper el formato de salida.
R5. Elige el "type" que de verdad encaja con el dato; no uses text para todo ni copies el ejemplo.
R6. Redacta en el idioma del OBJETIVO: "name" del template, "description", y todos los "label",
"options", "placeholder", "helpText" y el texto de "prompt". En inglés SIEMPRE: las cabeceras
`# SECCION`. Los "name" de input van en snake_case ASCII siempre.
R7. No inventes datos del usuario. Si un dato clave es incierto, aplica el PROTOCOLO antes de emitir.
# AUTO-VERIFICACIÓN ANTES DE EMITIR (si alguna respuesta es "no", corrige y repite)
[ ] El bloque es ```json válido, 2 espacios, sin comas colgantes ni comentarios; parsea con JSON.parse.
[ ] Exactamente 4 claves: name, description, inputs, prompt, en ese orden y sin extras.
[ ] "description" es una frase de 1..160 caracteres, sin {{...}} y sin saltos de línea.
[ ] "inputs" es un array de objetos; cada uno tiene name + type + label; "name" snake_case ASCII y único.
[ ] Cada "type" es uno de los 10 permitidos. select/multiselect/radio traen "options" (2-6). slider trae min/max/step.
[ ] "required", si aparece en algún input, es booleano.
[ ] Cada {{var}} del prompt está en "inputs" (R1) y cada input aparece en el prompt (R2).
[ ] El prompt incluye al menos ROLE, OBJECTIVE, INPUT, TASK, CONSTRAINTS y OUTPUT.
[ ] Idioma correcto (R6). Saltos de línea del prompt escapados como \n.
[ ] Después del cierre del bloque no hay ningún carácter más.
# EJEMPLO DE REFERENCIA
Muestra los 10 tipos de input y el uso opcional de "required". NO es un objetivo de cantidad ni una
plantilla a copiar; no cuenta para R4.
{
"name": "Brief de campaña",
"description": "Genera un brief creativo accionable a partir de objetivo de negocio, canales y restricciones.",
"inputs": [
{ "name": "cliente", "label": "Cliente", "type": "text" },
{ "name": "objetivo", "label": "Objetivo de negocio", "type": "textarea", "required": true },
{ "name": "presupuesto", "label": "Presupuesto (EUR)", "type": "number", "min": 0, "max": 100000, "step": 500 },
{ "name": "idioma", "label": "Idioma de entrega", "type": "select", "options": ["Español", "Inglés", "Portugués"] },
{ "name": "canales", "label": "Canales", "type": "multiselect", "options": ["Email", "Meta Ads", "Google Ads", "Landing"] },
{ "name": "tono", "label": "Tono de voz", "type": "radio", "options": ["Cercano", "Neutro", "Técnico"] },
{ "name": "incluir_cta", "label": "Incluir llamada a la acción", "type": "checkbox" },
{ "name": "creatividad", "label": "Nivel de creatividad", "type": "slider", "min": 0, "max": 10, "step": 1 },
{ "name": "deadline", "label": "Fecha de entrega", "type": "date" },
{ "name": "restricciones", "label": "Restricciones legales", "type": "list", "itemLabel": "Restricción" }
],
"prompt": "# ROLE\nEres director creativo senior con 15 años en campañas de gran consumo.\n\n# OBJECTIVE\nEntregar un brief de campaña accionable que el equipo pueda ejecutar sin preguntas de vuelta.\n\n# CONTEXT\nCliente: {{cliente}}. Idioma de entrega: {{idioma}}. Presupuesto disponible: {{presupuesto}} EUR.\n\n# INPUT\nObjetivo de negocio: {{objetivo}}\nCanales: {{canales}}\nTono de voz: {{tono}}\nNivel de creatividad (0-10): {{creatividad}}\nFecha de entrega: {{deadline}}\nIncluir llamada a la acción: {{incluir_cta}}\nRestricciones legales: {{restricciones}}\n\n# REQUIREMENTS\nUn mensaje principal por canal, coherente con el tono y el presupuesto indicados.\n\n# TASK\nAnaliza el objetivo y los canales, define el territorio creativo y redacta el brief.\n\n# WORKFLOW\n1. Interpreta el objetivo de negocio.\n2. Prioriza los canales según presupuesto.\n3. Define territorio y mensaje principal.\n4. Adapta el mensaje a cada canal.\n5. Revisa contra las restricciones.\n\n# CONSTRAINTS\nRespeta las restricciones legales indicadas. No inventes datos de cliente ni claims no aportados.\n\n# DECISION RULES\nAnte varias rutas creativas, elige la que cubra el objetivo con menor riesgo legal.\n\n# ACCEPTANCE CRITERIA\nMáximo 400 palabras, un bloque por canal y mensaje único identificable.\n\n# OUTPUT\nMarkdown con secciones: Territorio, Mensaje principal, Mensajes por canal, KPI, Riesgos.\n\n# VALIDATION\nComprueba antes de responder que cada canal indicado tiene su bloque y que no se supera el límite de palabras.\n\n# FAILURE / AMBIGUITY HANDLING\nSi falta información crítica, indícalo en una sección final \"Supuestos\" en lugar de inventarla."
}
# FORMATO DE SALIDA
Entrega exactamente esto (con el JSON real en lugar de los puntos suspensivos):
```json
{ … }
```