Cómo construir una app de Character AI: arquitectura, código y coste

Updated 2026-07-15

Una app de Character AI son cuatro componentes conectados a un endpoint de chat compatible con OpenAI: un system prompt de persona, una capa de memoria, un filtro de moderación y un enrutador de modelos. Puedes lanzar un prototipo funcional en menos de 200 líneas de Python y ejecutarlo por bastante menos de un dólar por usuario activo mensual con las elecciones de modelo correctas.

Respuesta rápida: la arquitectura de cuatro componentes

No necesitas entrenar ni hacer fine-tuning de ningún modelo. Toda app de compañero seria en el mercado hoy, incluidas las que sirven a millones de usuarios, es una capa de orquestación delgada sobre APIs de LLM alojadas. El personaje vive en el prompt y en la base de datos, no en los pesos del modelo. El resto de esta guía construye cada componente con código ejecutable contra un endpoint estándar compatible con OpenAI, y luego recorre las cuentas de tokens para que sepas cuánto cuesta realmente un usuario activo mensual antes de lanzar.

  • Prompt de persona: un system prompt estructurado (500 a 1.000 tokens) que define quién es el personaje y cómo habla.
  • Memoria: una ventana móvil de turnos recientes más un resumen refrescado periódicamente, para que las conversaciones sobrevivan más allá del límite de contexto.
  • Moderación: un control de edad, un clasificador de entrada y políticas de contenido acordes al modelo al que enrutas.
  • Enrutamiento: una pequeña función que elige un modelo barato para el chat casual y uno más fuerte para escenas largas.

Componente 1: el prompt de persona

El prompt de persona es el producto. Es un mensaje de sistema que viaja con cada petición y suele contener cinco partes: identidad (nombre, edad, historia), rasgos de personalidad, estilo de habla con dos o tres frases de ejemplo, reglas de comportamiento firmes (nunca romper el personaje, mantener las respuestas bajo un límite de longitud) y el escenario actual. Mantenlo entre 500 y 1.000 tokens. Las personas más cortas se desvían; las mucho más largas queman presupuesto de entrada en cada mensaje y rara vez mejoran la adherencia. Guarda las personas como filas en tu base de datos para que los usuarios puedan crear y editar personajes, que es el bucle central de los productos estilo Character.AI. Aquí una petición completa. La misma forma funciona con cualquier backend compatible con OpenAI; este ejemplo usa el endpoint de un gateway multi-modelo para que puedas cambiar de modelo cambiando una sola cadena:

curl https://api.apisrouter.com/v1/chat/completions \
  -H "Authorization: Bearer $KEAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-v4-flash",
    "messages": [
      {"role": "system", "content": "You are Mira, a sarcastic starship engineer in her 30s. Personality: dry wit, fiercely loyal, hates small talk. Speech style: short technical sentences, occasional teasing. Example: \"The coupling is fried. Again. Did you touch it?\" Rules: never break character, never mention being an AI, keep replies under 120 words."},
      {"role": "user", "content": "Mira, the reactor is making that noise again."}
    ],
    "temperature": 0.9,
    "max_tokens": 300,
    "stream": true
  }'

Componente 2: memoria que sobrevive a conversaciones largas

Las sesiones de apps de compañero se alargan mucho. Una pila de memoria de tres capas mantiene el contexto coherente sin reenviar todo el historial cada vez: La capa 1 es la ventana móvil: los últimos 10 a 14 turnos en bruto, enviados textualmente. La capa 2 es el resumen corriente: cada 20 turnos más o menos, un modelo barato comprime los mensajes más antiguos en un párrafo que sigue nombres, estado de la relación y tramas abiertas. La capa 3 son los hechos fijados: detalles duraderos del usuario (nombre, preferencias, eventos pasados que el personaje debería recordar) extraídos a tu base de datos e inyectados como un mensaje de sistema corto. Esta es toda la implementación en Python con el SDK oficial de OpenAI:

Un presupuesto de entrada realista por petición ronda los 3.300 tokens.
Ranura de contextoTamaño típicoFrecuencia de refresco
System prompt de persona500 a 1.000 tokensEstático por personaje
Hechos fijados del usuario100 a 200 tokensEn eventos de extracción
Resumen corriente300 a 500 tokensCada ~20 turnos
Ventana móvil (12 turnos)~1.800 a 2.200 tokensCada mensaje
Nuevo mensaje del usuario~100 tokensCada mensaje
from openai import OpenAI

client = OpenAI(
    api_key="sk-...",
    base_url="https://api.apisrouter.com/v1",
)

def build_context(persona, summary, pinned_facts, recent_turns, user_msg):
    facts = "\n".join(f"- {f}" for f in pinned_facts)
    return [
        {"role": "system", "content": persona},
        *([{"role": "system", "content": f"Facts to remember:\n{facts}"}]
          if pinned_facts else []),
        *([{"role": "system", "content": f"Story so far: {summary}"}]
          if summary else []),
        *recent_turns[-12:],
        {"role": "user", "content": user_msg},
    ]

def refresh_summary(old_turns, prev_summary):
    prompt = (
        "Update this running summary of a roleplay chat. Keep names, "
        "relationship state, and open plot threads. Max 150 words.\n\n"
        f"Current summary: {prev_summary}\n\nNew messages: {old_turns}"
    )
    resp = client.chat.completions.create(
        model="deepseek-v4-flash",
        messages=[{"role": "user", "content": prompt}],
        max_tokens=400,
    )
    return resp.choices[0].message.content

Componente 3: moderación y políticas de contenido

La moderación en una app de compañero tiene tres funciones distintas, y mezclarlas es el error de lanzamiento más común. Primero, controla la edad de tu audiencia. Si tu app permite temáticas ficticias maduras, ponlas detrás de un control de edad para adultos y mantén un valor por defecto separado para todas las edades. Tanto la App Store como Play Store revisan esto, y los procesadores de pago también se preocupan por ello. Segundo, filtra las entradas. Ejecuta un pase de clasificador barato sobre los mensajes del usuario antes de que lleguen al modelo de personaje, bloqueando categorías que ningún proveedor permite: contenido que involucre a menores, daño creíble en el mundo real e instrucciones ilegales. Una sola llamada a deepseek-v4-flash con una rúbrica de sí/no cuesta una fracción de centavo y añade menos de un segundo de latencia. Tercero, ajusta la política de contenido al modelo. Los proveedores difieren en ficción: la política publicada de xAI permite explícitamente temáticas ficticias maduras para usuarios adultos, DeepSeek y otros modelos derivados de pesos abiertos son favoritos de la comunidad para roleplay porque sus políticas alojadas son flexibles con la ficción, mientras que la política de Anthropic prohíbe el contenido explícito, lo que hace de Claude la opción correcta solo para escritura creativa apta para todas las edades. Entender estas políticas antes de enrutar tráfico te ahorra tormentas de rechazos en producción. Sea lo que sea que construyas, debe respetar los términos de servicio de cada proveedor que llames.

Componente 4: enrutamiento de modelos y la matriz de selección

La mayoría de los mensajes en una app de compañero son turnos casuales cortos que un modelo económico maneja perfectamente. Una minoría son escenas emocionales largas o piezas creativas donde la calidad de la prosa es el producto. Enrutar según la profundidad de la escena reduce costes drásticamente sin que los usuarios lo noten:

Ajusta cada ruta a un modelo cuya política de contenido encaje con la audiencia a la que sirve.
ModeloID de modelo de la APITarifa por 1M tokens (entrada/salida)Ajuste para app de compañero
DeepSeek V4 Flashdeepseek-v4-flash$0.126 / $0.252Modelo de chat por defecto. Favorito de la comunidad para roleplay, el mejor valor del catálogo.
DeepSeek V4 Prodeepseek-v4-pro$0.3915 / $0.783Escenas más largas, mejor seguimiento de instrucciones, sigue siendo barato.
GLM-5glm-5$0.514 / $2.314Opción de valor con escritura creativa fuerte.
Kimi K2.6kimi-k2.6Consulta /pricingOpción de valor para sesiones de contexto largo. MiMo es una opción de presupuesto similar.
grok-4.5grok-4.5$1.60 / $4.80Temáticas ficticias maduras para usuarios adultos según la política publicada de xAI. Ventana de contexto de 500K.
Claude Sonnet 4.6claude-sonnet-4-6$2.40 / $12.00La mejor calidad de prosa. Solo escritura creativa apta para todas las edades; Anthropic prohíbe el contenido explícito.
Gemini 3.5 Flashgemini-3.5-flash$1.20 / $7.20Rápido, bueno para funciones con imágenes como reacciones de avatar.
ROUTES = {
    "casual": "deepseek-v4-flash",
    "scene": "deepseek-v4-pro",
    "prose": "claude-sonnet-4-6",  # all-ages creative writing only
}

def pick_model(user_msg: str, turns_in_scene: int) -> str:
    if turns_in_scene > 6 or len(user_msg) > 400:
        return ROUTES["scene"]
    return ROUTES["casual"]

Lo que realmente cuesta un usuario activo mensual

Las cuentas de tokens antes del lanzamiento ganan a una sorpresa de facturación después. Usando el presupuesto de contexto de la tabla de memoria: unos 3.300 tokens de entrada y 250 tokens de salida por mensaje. Los usuarios de apps de compañero son intensos; las cifras reportadas por la comunidad sitúan a los usuarios comprometidos en decenas de mensajes al día, así que asumamos unos 40 mensajes al día en 20 días activos, o unos 800 mensajes por MAU al mes. Eso da 2,64M tokens de entrada y 0,2M tokens de salida por MAU al mes. Multiplicando por las tarifas de catálogo:

Asume 3.300 tokens de entrada + 250 de salida por mensaje, ~800 mensajes por MAU al mes.
ModeloCoste de entrada / MAUCoste de salida / MAUTotal / MAU / mes
deepseek-v4-flash$0.33$0.05$0.38
deepseek-v4-pro$1.03$0.16$1.19
glm-5$1.36$0.46$1.82
gemini-3.5-flash$3.17$1.44$4.61
grok-4.5$4.22$0.96$5.18
claude-sonnet-4-6$6.34$2.40$8.74
gpt-5.5$10.56$4.80$15.36

Un solo endpoint para cada modelo de la matriz

Registrarse en cinco cuentas de proveedor para ejecutar un enrutador es una sobrecarga real: cinco claves, cinco paneles de facturación, cinco conjuntos de límites de tasa. Un gateway multi-modelo simplifica todo eso. APIsRouter expone cada modelo de arriba a través de la única URL base compatible con OpenAI https://api.apisrouter.com/v1, así que el fragmento del enrutador funciona tal cual con solo cambiar la cadena del modelo. La facturación es por uso sin suscripción, los modelos globales corren un 20% por debajo del precio oficial con los modelos chinos por debajo de sus tarifas oficiales, y el checkout sin registro en /topup envía una clave a tu correo tras el pago, con la primera recarga sumando +100% de saldo. GET /v1/models con tu clave devuelve la lista de modelos en vivo, útil también para poblar un selector de modelos en tu propia UI de administración.

Consejos de producción que ahorran dinero y dolores reales

  • Transmite todo con streaming. El tiempo hasta el primer token es la métrica que sienten los usuarios; una respuesta transmitida en 2 segundos se siente más rápida que una respuesta completa en 4.
  • Mantén estable el prefijo estable. La persona y los hechos fijados deben ser idénticos byte a byte entre peticiones para que los backends con caché de prefijo puedan aprovecharlo.
  • Limita max_tokens por ruta. Los turnos casuales rara vez necesitan más de 300 tokens de salida; un modelo sin límite que divaga duplica tu factura de salida.
  • Registra el coste por usuario, no solo por petición. Una pequeña fracción de usuarios intensos dominará el gasto; necesitas verlos para diseñar niveles de uso justos.
  • Construye respaldo en el enrutador. Si el modelo principal se agota o rechaza, reintenta una vez con un modelo hermano antes de mostrar un error.
  • Recorta la ventana móvil por tokens, no por turnos, para que un pegado largo no reviente el presupuesto.
  • Maneja los rechazos dentro del personaje. Mapea un rechazo a una desviación elegante dentro de la historia en vez de mostrar el texto crudo de la API.
  • No guardes chats en bruto más tiempo del necesario, y dilo en tu política de privacidad. Los registros de chat de compañero son sensibles por naturaleza.

Preguntas frecuentes

¿Cuánto cuesta construir una app de Character AI?

El coste de desarrollo es sobre todo tu tiempo: un prototipo funcional es un proyecto de fin de semana ya que no hay entrenamiento de modelos de por medio. El coste de ejecución es la cifra real, y escala con el uso. En un modelo económico como deepseek-v4-flash, un usuario activo mensual intenso cuesta aproximadamente $0.38 en tokens; en un modelo premium como gpt-5.5 ese mismo usuario cuesta unos $15. La elección de modelo, no la infraestructura, decide tu margen.

¿Qué modelo de IA es mejor para una app de Character AI?

La familia DeepSeek V4 es el favorito de la comunidad para roleplay y el mejor valor: Flash para chat casual, Pro para escenas más largas. GLM-5, Kimi K2.6 y MiMo son buenas opciones de valor. Grok encaja en apps que sirven temáticas ficticias maduras a adultos, según la política publicada de xAI. Claude Sonnet 4.6 escribe la mejor prosa pero solo es apto para escritura creativa de todas las edades porque Anthropic prohíbe el contenido explícito.

¿Cómo recuerdan las apps de Character AI conversaciones pasadas?

Mediante ingeniería de prompts, no memoria del modelo. La app reenvía una ventana móvil de mensajes recientes, un resumen comprimido periódicamente de los más antiguos, y una lista corta de hechos fijados extraídos a una base de datos. El modelo en sí no tiene estado; cada petición contiene todo lo que el personaje "recuerda".

¿Necesito entrenar mi propio modelo para construir una app de compañero IA?

No. El fine-tuning es caro, lento de iterar e innecesario para la consistencia del personaje. Un prompt de persona bien estructurado de 500 a 1.000 tokens más una capa de memoria logra una adherencia al personaje que los usuarios no pueden distinguir de un modelo a medida, y te deja cambiar de modelo subyacente libremente a medida que salen mejores.

¿Cómo manejo el contenido maduro en una app de compañero?

Trátalo como un problema de ajuste de política. Pon las temáticas ficticias maduras detrás de un control de edad para adultos, filtra las entradas en busca de categorías que ningún proveedor permite, y enruta ese tráfico solo a modelos cuyas políticas publicadas permitan ficción para adultos, como Grok bajo la política de xAI. Mantén un carril por defecto para todas las edades en modelos más estrictos, y cumple los términos de servicio de cada proveedor.

¿Puedo usar el SDK de OpenAI para una app de Character AI con otros modelos?

Sí. DeepSeek, GLM, Kimi, Gemini, Claude y Grok son todos accesibles a través de endpoints compatibles con OpenAI, ya sea de sus propios proveedores o a través de un gateway. El código de tu app se queda en la interfaz estándar de chat.completions y cambia de modelo cambiando la cadena del modelo, que es exactamente lo que hace barato construir enrutamiento por mensaje.