Cambio dinámico de personalidad de IA
Crea algunos botones que cambien la personalidad, estilo de habla o idioma de la IA con un solo clic. Usa "Tell AI" y "Stop Telling AI" para cambiar dinámicamente el prompt del sistema de la IA — no es necesario reiniciar la sesión, cambia sin interrupciones a mitad de la conversación.
Lo que vas a construir
Un cambiador de personalidad integrado en el chat:
- Tres modos — Narrador Normal, Modo Comedia, Modo Terror
- Cambio con un clic — toca un botón para cambiar el estilo de habla de la IA, efectivo de inmediato
- Retroalimentación visual — el botón del modo actualmente activo se resalta para que el jugador siempre sepa en qué modo está
- Transiciones sin interrupciones — el cambio no interrumpe la conversación; la próxima respuesta de la IA usa el nuevo estilo
Cómo funciona
El sistema de comportamientos de Yumina tiene dos acciones poderosas: "Tell AI" y "Stop Telling AI".
- Tell AI (
inject-directive) — Inyecta una directiva en el prompt del sistema de la IA. Mientras la directiva esté presente, la IA la ve y la sigue en cada respuesta. Puedes especificar dónde aparece en el prompt, si es permanente, y cuántos turnos antes de que expire automáticamente. - Stop Telling AI (
remove-directive) — Elimina una directiva previamente inyectada por su ID. Una vez eliminada, la IA ya no ve esa directiva.
Usando estas dos acciones juntas, podemos hacer esto:
El jugador hace clic en el botón "Modo Comedia"
→ El comportamiento se dispara: primero elimina la directiva de personalidad antigua (si la hay)
→ Luego inyecta la nueva directiva de estilo comedia
→ El prompt del sistema de la IA ahora incluye: "Narrate everything in a humorous, funny tone..."
→ La próxima respuesta de la IA cambia a estilo comedia¿En qué se diferencia esto de las entradas del lorebook? Las entradas del lorebook (enable entry / disable entry) son geniales para grandes bloques de texto de worldbuilding. Las directivas inyectadas mediante "Tell AI" son más ligeras y flexibles — no son entradas, sino pequeños fragmentos de texto insertados directamente en el prompt del sistema. Perfectas para instrucciones de estilo cortas, reglas temporales o pistas puntuales. Puedes usar ambas juntas.
Paso a paso
Paso 1: Crea una variable
Necesitamos una variable para seguir qué modo está actualmente activo. El Root Component la lee para decidir qué botón resaltar.
Editor → barra lateral → pestaña Variables → haz clic en "Add Variable"
| Campo | Valor | Por qué |
|---|---|---|
| Nombre visible | Modo actual | Para tu propia referencia |
| ID | current_mode | Los comportamientos y el Root Component leen/escriben usando este ID |
| Tipo | String | Porque los valores son texto ("normal", "comedy", "horror") |
| Valor por defecto | normal | Las nuevas sesiones empiezan en modo normal |
| Categoría | Custom | Categoría dedicada al sistema de personalidad |
| Reglas de comportamiento | No modifiques esta variable. Está controlada por los botones de la UI del jugador. | Le dice a la IA que no cambie esto por su cuenta — solo los botones del jugador pueden |
Paso 2: Crea comportamientos
Necesitamos 3 comportamientos — uno por modo. La lógica de cada comportamiento es: eliminar directiva antigua → inyectar nueva directiva → actualizar variable → notificar al jugador.
Editor → pestaña Behaviors → añade comportamientos uno por uno
Comportamiento 1: Cambiar a Modo Comedia
WHEN (disparador):
| Campo | Valor | Por qué |
|---|---|---|
| Trigger Type | Action | Se dispara cuando el código llama a executeAction("mode-comedy") |
| Action ID | mode-comedy | El botón en el Root Component llama a este ID |
DO (acciones):
Añade las siguientes acciones en orden:
| # | Tipo de acción | Configuración | Propósito |
|---|---|---|---|
| 1 | Stop Telling AI | Directive ID: personality-override | Elimina la directiva de personalidad anterior (si la hay). Si no existe ninguna, no pasa nada — sin error |
| 2 | Tell AI | Directive ID: personality-override, contenido a continuación, posición: After Character | Inyecta la directiva de estilo comedia |
| 3 | Modificar variable | current_mode set a comedy | Actualiza la variable para que el Root Component sepa el modo actual |
| 4 | Mostrar notificación | Mensaje: Cambiado a Modo Comedia, estilo: info | Da retroalimentación visual al jugador |
Contenido de la directiva "Tell AI":
[Estilo de narración: Modo Comedia]
De ahora en adelante, narra todo con un tono humorístico y cómico. Puedes:
- Usar metáforas exageradas y analogías absurdas
- Romper ocasionalmente la cuarta pared y susurrar comentarios al lector
- Hacer que los NPCs suelten frases hilarantemente inoportunas
- Describir escenas serias con una voz ligera para conseguir contraste cómico
Mantén la historia avanzando — no te limites a contar chistes. El humor debe entretejerse en la narración, no reemplazarla.¿Por qué "Stop Telling AI" antes de "Tell AI"? Porque ambas directivas usan el mismo ID (
personality-override). Si el jugador cambia de Terror a Comedia, no eliminar la directiva antigua primero dependería de queinjectDirectivereemplace automáticamente el mismo ID — lo cual hace — pero eliminar explícitamente y luego reinjectar es un mejor hábito. La lógica es más clara y evita posibles casos límite.
Comportamiento 2: Cambiar a Modo Terror
WHEN:
| Campo | Valor |
|---|---|
| Trigger Type | Action |
| Action ID | mode-horror |
DO:
| # | Tipo de acción | Configuración | Propósito |
|---|---|---|---|
| 1 | Stop Telling AI | Directive ID: personality-override | Elimina la antigua directiva de personalidad |
| 2 | Tell AI | Directive ID: personality-override, contenido a continuación, posición: After Character | Inyecta la directiva de estilo terror |
| 3 | Modificar variable | current_mode set a horror | Actualiza la variable |
| 4 | Mostrar notificación | Mensaje: Cambiado a Modo Terror, estilo: danger | Usa una notificación de estilo peligro — el rojo encaja con el ambiente de terror |
Contenido de la directiva "Tell AI":
[Estilo de narración: Modo Terror]
De ahora en adelante, narra todo con una atmósfera oscura e inquietante. Deberías:
- Usar un ritmo lento y opresivo para las descripciones de escena, centrándote en detalles sensoriales (sonidos, olores, texturas)
- Insinuar que algo observa al personaje desde las sombras, pero nunca revelarlo directamente
- Haz que el propio entorno se sienta extraño — puertas que se cierran solas, sombras que se mueven al revés, reflejos en los espejos que se retrasan medio compás
- Da a los NPCs diálogos con una sutil sensación de "algo va mal", como si supieran algo que no deberían
- Usa ocasionalmente la segunda persona para describir las reacciones fisiológicas del personaje (vellos del cuello erizándose, latidos acelerándose, pupilas dilatándose)
Construye una tensión sostenida, pero no metas un monstruo en cada párrafo. El verdadero terror vive en lo desconocido.Comportamiento 3: Volver al Modo Normal
WHEN:
| Campo | Valor |
|---|---|
| Trigger Type | Action |
| Action ID | mode-normal |
DO:
| # | Tipo de acción | Configuración | Propósito |
|---|---|---|---|
| 1 | Stop Telling AI | Directive ID: personality-override | Elimina la directiva de personalidad personalizada. Una vez eliminada, el prompt del sistema ya no tiene una sobrescritura de estilo — la IA vuelve a su estilo de narración predeterminado |
| 2 | Modificar variable | current_mode set a normal | Actualiza la variable |
| 3 | Mostrar notificación | Mensaje: Restored Normal Mode, estilo: info | Retroalimentación |
Nota: El modo normal no inyecta ninguna directiva. Solo eliminar la sobrescritura anterior es suficiente — la IA vuelve a cualquier estilo predeterminado que hayas definido en tus entradas de personaje e instrucciones del sistema.
Paso 3: Entiende la posición y persistencia de las directivas
Al configurar una acción "Tell AI", verás dos configuraciones importantes: posición y persistencia / duración de turnos. Esto es lo que significan.
Posición de la directiva
La posición controla dónde aparece la directiva inyectada en el prompt del sistema.
| Posición | Etiqueta | Descripción | Cuándo usar |
|---|---|---|---|
auto | Auto | El motor elige el mejor lugar (normalmente después de la definición del personaje) | Suficientemente bueno para la mayoría de los casos |
top | Top | Al principio del prompt del sistema, mayor prioridad | Reglas globales urgentes (por ejemplo, "From now on reply only in English") |
before_char | Before Character | Antes de la definición del personaje | Configuraciones globales que afectan cómo la IA interpreta al personaje |
after_char | After Character | Después de la definición del personaje | Directivas de estilo, ajustes de tono (esta receta usa esta) |
bottom | Bottom | Al final del prompt del sistema | Recordatorios de última hora, instrucciones de estilo "jailbreak" |
depth | Depth | Insertado por profundidad (antes del N-ésimo mensaje más reciente) | Directivas que necesitan aparecer a mitad de conversación en lugar de en el prompt del sistema |
¿Por qué esta receta usa "After Character"? Porque las directivas de cambio de personalidad son sobrescrituras de estilo para la narración. Colocadas después de la definición del personaje, la IA lee primero "quién soy" (personaje), luego "cómo debería hablar" (directiva de estilo). El orden se siente natural y produce los mejores resultados.
Directivas persistentes vs. temporales
| Configuración | Descripción | Uso |
|---|---|---|
| Persistente (predeterminado) | La directiva permanece en el prompt del sistema hasta que se elimina explícitamente con "Stop Telling AI" | Esta receta usa esto — el modo permanece activo hasta que el jugador cambie de nuevo |
| Temporal (establecer duración de turnos) | La directiva expira automáticamente tras el número de turnos especificado | Bueno para efectos puntuales, por ejemplo, "Durante los próximos 3 turnos, el personaje está borracho y arrastra las palabras" |
Ejemplo: Si estableces la duración de turnos a 3 en la acción "Tell AI", la directiva desaparece automáticamente al final del 3er turno tras la inyección — no se necesita eliminación manual.
Paso 4: Añade botones de cambio de modo al Root Component
Muestra tres botones de modo debajo del último mensaje del chat. El botón del modo actualmente activo está resaltado.
Editor → sección Custom UI → abre index.tsx → pega lo siguiente (reemplaza el predeterminado return <Chat />):
export default function MyWorld() {
const api = useYumina();
// ---- Lee el modo actual ----
const currentMode = String(api.variables.current_mode || "normal");
// ---- Configuraciones de los tres modos ----
const modes = [
{
id: "normal",
label: "Normal",
actionId: "mode-normal",
color: "#94a3b8",
activeColor: "#e2e8f0",
activeBg: "rgba(148,163,184,0.2)",
border: "#475569",
activeBorder: "#94a3b8",
},
{
id: "comedy",
label: "Comedy",
actionId: "mode-comedy",
color: "#fbbf24",
activeColor: "#fef3c7",
activeBg: "rgba(251,191,36,0.2)",
border: "#a16207",
activeBorder: "#fbbf24",
},
{
id: "horror",
label: "Horror",
actionId: "mode-horror",
color: "#f87171",
activeColor: "#fecaca",
activeBg: "rgba(248,113,113,0.2)",
border: "#991b1b",
activeBorder: "#f87171",
},
];
// ---- Lista de mensajes, usada para encontrar el último ----
const msgs = api.messages || [];
return (
<Chat renderBubble={(msg) => {
const isLastMsg = msg.messageIndex === msgs.length - 1;
return (
<div>
{/* Renderiza el texto del mensaje normalmente (la plataforma ya produjo HTML — solo usa contentHtml) */}
<div
style={{ color: "#e2e8f0", lineHeight: 1.7 }}
dangerouslySetInnerHTML={{ __html: msg.contentHtml }}
/>
{/* Botones de cambio de modo — solo en el último mensaje */}
{isLastMsg && (
<div style={{
display: "flex",
gap: "8px",
marginTop: "16px",
flexWrap: "wrap",
}}>
{modes.map((mode) => {
const isActive = currentMode === mode.id;
return (
<button
key={mode.id}
onClick={() => {
if (!isActive) {
api.executeAction(mode.actionId);
}
}}
style={{
padding: "8px 16px",
background: isActive ? mode.activeBg : "transparent",
border: `2px solid ${isActive ? mode.activeBorder : mode.border}`,
borderRadius: "8px",
color: isActive ? mode.activeColor : mode.color,
fontSize: "13px",
fontWeight: isActive ? "700" : "500",
cursor: isActive ? "default" : "pointer",
opacity: isActive ? 1 : 0.7,
transition: "all 0.2s ease",
}}
>
{isActive ? "● " : ""}{mode.label}
</button>
);
})}
</div>
)}
</div>
);
}} />
);
}Desglose línea por línea:
api.variables.current_mode— lee el valor de la variable del modo actualmodes— un array que define el ID de cada modo, etiqueta de visualización, action ID del comportamiento correspondiente y configuraciones de colorisActive— comprueba si el modo actual coincide con el modo de este botón. Si coincide, el botón se resalta; de lo contrario, queda en gris y semitransparenteapi.executeAction(mode.actionId)— dispara el comportamiento que creamos en el Paso 2. Nota que solo se dispara cuando!isActive— si ya estás en este modo, hacer clic no hace nada"● "— el botón activo obtiene un pequeño prefijo de punto como indicador visualtransition: "all 0.2s ease"— animación suave cuando cambia el estado del botón
¿No quieres escribir código tú mismo? Usa Studio AI
Barra superior del editor → haz clic en "Enter Studio" → panel AI Assistant → describe en lenguaje natural lo que quieres, y la IA generará el código por ti.
Paso 5: Guarda y prueba
- Haz clic en Save en la parte superior del editor
- Haz clic en Start Game o vuelve a la página de inicio e inicia una nueva sesión
- Chatea normalmente con la IA durante algunos turnos — estás en modo Normal
- Haz clic en el botón Comedy — el botón se resalta en dorado, una notificación dice "Switched to Comedy Mode"
- Envía un mensaje — la respuesta de la IA debería volverse humorística, exagerada, y podría romper la cuarta pared
- Haz clic en el botón Horror — el botón se vuelve rojo resaltado
- Envía otro mensaje — la respuesta de la IA se vuelve oscura, tensa y llena de pistas inquietantes
- Haz clic en el botón Normal — vuelve al estilo predeterminado
- Envía un mensaje más — confirma que la IA ha vuelto a la narración normal
Si algo sale mal:
| Síntoma | Causa probable | Solución |
|---|---|---|
| No puedo ver los botones de modo | El código del Root Component no se guardó o tiene un error de sintaxis | Comprueba el estado de compilación en la parte inferior del panel Custom UI — debería mostrar "OK" verde |
| Hacer clic en un botón no hace nada | El action ID del comportamiento no coincide con el código | Confirma que los action IDs del comportamiento son mode-comedy, mode-horror, mode-normal, coincidiendo con los parámetros executeAction() en el código |
| El estado del botón no cambia | La variable no se está actualizando por el comportamiento | Comprueba que la acción "Modify Variable" de cada comportamiento establezca correctamente current_mode |
| El estilo de la IA no cambia tras cambiar | El contenido de la directiva está vacío o la posición es incorrecta | Comprueba que la acción "Tell AI" tenga el contenido de la directiva rellenado, y la posición esté establecida en "After Character" |
| El estilo persiste tras volver a Normal | El ID de la directiva "Stop Telling AI" no coincide | Confirma que los tres comportamientos usan el mismo ID de directiva: personality-override |
Uso avanzado
Añadir más modos
¿Quieres añadir un "Modo Poético"? Solo:
- Añade una entrada al array
modes(ID, etiqueta, colores) - Crea un nuevo comportamiento con action ID
mode-poetic, mismo patrón de acción que comedia/terror (eliminar directiva antigua → inyectar nueva directiva → actualizar variable → notificar) - Hecho. El botón aparece automáticamente en el Root Component
"Estallidos de personalidad" temporales con directivas limitadas por turnos
Digamos que quieres un "Botón Borracho" — haz clic y la IA habla en estupor borracho durante 3 turnos, luego revierte automáticamente:
En la acción "Tell AI", establece la duración de turnos a 3. La directiva expira automáticamente tras 3 turnos — no es necesario que el jugador haga clic de nuevo para cancelar.
Cambio de idioma
El mismo patrón funciona para cambiar el idioma de respuesta de la IA. Cambia el contenido de la directiva a "From now on reply entirely in English" o "From now on reply in Japanese" y tienes un cambiador de idioma.
Referencia rápida
| Qué quieres | Cómo hacerlo |
|---|---|
| Modificar dinámicamente el prompt del sistema de la IA | Usa "Tell AI" (inject-directive) en una acción de comportamiento — rellena ID de directiva, contenido y posición |
| Eliminar una directiva previamente inyectada | Usa "Stop Telling AI" (remove-directive) — rellena el ID de la directiva a eliminar |
| Hacer expirar automáticamente una directiva tras N turnos | Establece la duración de turnos en "Tell AI" |
| Mantener una directiva permanentemente (hasta eliminación manual) | No establezcas una duración de turnos en "Tell AI" (comportamiento predeterminado) |
| Colocar una directiva de estilo después de la definición del personaje | Establece la posición a "After Character" (after_char) |
| Poner una sobrescritura de regla urgente arriba | Establece la posición a "Top" (top) |
| Poner un recordatorio de última hora al final | Establece la posición a "Bottom" (bottom) |
| Eliminar directiva antigua antes de cambiar | Usa el mismo ID de directiva — "Stop Telling AI" primero, luego "Tell AI" |
| Resaltar el botón activo | Lee la variable dentro del Root Component y usa estilos condicionales (isActive) para controlar el resaltado |
Pruébalo tú mismo — mundo demo importable
Descarga este JSON e impórtalo como un nuevo mundo para ver todo en acción:
Cómo importar:
- Ve a Yumina → My Worlds → Create New World
- En el editor, haz clic en More Actions → Import Package
- Selecciona el archivo
.jsondescargado - Se crea un nuevo mundo con todas las variables, comportamientos y el Root Component preconfigurados
- Inicia una nueva sesión y pruébalo
Qué incluye:
- 1 variable (
current_modesiguiendo el modo de personalidad activo) - 3 comportamientos (cambiar a Comedia / cambiar a Terror / restaurar Normal)
- Un Root Component (tres botones de cambio de modo con indicadores de resaltado)
Esta es la Receta #11
Esta receta demuestra el uso central de "Tell AI" / "Stop Telling AI" — inyectar y eliminar dinámicamente directivas en el prompt del sistema. El mismo patrón se puede usar para cambio de idioma, ajuste de dificultad, alternancia de perspectiva narrativa (primera persona / tercera persona), o incluso "deriva gradual de personalidad de IA" (inyectando automáticamente directivas de intensidad variable cada pocos turnos).
