Aka es un asistente conversacional en español que ejecuta acciones mediante atajos de Apple. Cuando una petición requiere múltiples acciones, delega automáticamente a sub-agentes en paralelo.
Usuario → Chat (OpenRouter) → ¿Multi-acción?
│
┌────────┴────────┐
Sí No → Respuesta directa
│
Delegador (OpenRouter)
divide en ≤3 sub-tareas
│
┌───────────┼───────────┐
SUB1 SUB2 SUB3
(Mistral) (Mistral) (Mistral)
o POTENTE o POTENTE o POTENTE
(OpenRouter) (OpenRouter) (OpenRouter)
└───────────┼───────────┘
Respuesta combinada
- Chat — Recibe el mensaje. Si es una sola acción, responde directamente.
Si son múltiples, responde con
DELEGACION ... - Delegador — Divide la tarea en hasta 3 sub-tareas
(
EN-ANITO1 |<>| comando |<>| ...) - Sub-agentes — Se ejecutan en paralelo. Cada uno produce una acción con su formato exacto
- Respuesta final —
chat {~~} delegador {~~} SUB1 ... SUB1 SUB2 ... SUB2
| Rol | Modelo | API | Env var override |
|---|---|---|---|
| Chat | deepseek/deepseek-v4-flash | OpenRouter | AKA_CHAT_MODEL |
| Delegador | deepseek/deepseek-v4-flash | OpenRouter | AKA_DELEGATOR_MODEL |
| Sub-agente | mistral-large-latest | Mistral | AKA_SUBAGENT_MODEL |
| Sub-agente potente | deepseek/deepseek-v4-flash | OpenRouter | AKA_POWERFUL_SUBAGENT_MODEL |
| Acción | Formato exacto |
|---|---|
| Recordatorio | RECOR-DATORIO [motivo] a las [HH:MM] el día [día y mes] |
| Alarma | ALAR-MA "[HH:MM]" |
| Macros | ( MAC-ROS carbohidratos: X proteinas: Y grasas: Z kcal: A ) |
| Imagen | IM-AGEN [descripción] |
| Ruta | CO-MOLL [ubicación] |
| `CO-RREO |<> | |
| Archivo | `AR-CHIVO |<> |
| Email + archivo | `CO-RREOAR |<> |
POST https://basrqtb--aka.web.val.run
| Parámetro | Tipo | Descripción |
|---|---|---|
message | string | Obligatorio — mensaje del usuario |
session | string | Opcional — ID de conversación para memoria persistente |
format | "json" | "text" | Opcional — formato de respuesta (por defecto: text) |
clear | boolean | Opcional — true para borrar historial de la sesión |
Texto plano (Apple Shortcuts):
POST /
{"message": "Ponme una alarma para las 18:00"}
→ ALAR-MA "18:00"
JSON estructurado:
POST /
{"message": "Ponme una alarma para las 18:00", "format": "json"}
→ {"chat": "ALAR-MA \"18:00\"", "needsDelegation": false, "action": {"type": "alarm", "data": {"time": "18:00"}}, ...}
Multi-acción con delegación:
POST /
{"message": "Ponme una alarma a las 18:00 y recuérdame comprar pan a las 17:30", "format": "json"}
→ {"chat": "DELEGACION ...", "needsDelegation": true, "delegator": "EN-ANITO1 ...", "subAgents": [{"action": {"type": "alarm", "data": {"time": "18:00"}}, ...}, ...]}
Con memoria de conversación:
POST / {"message": "Me llamo Carlos", "session": "abc123"}
POST / {"message": "¿Cómo me llamo?", "session": "abc123"}
→ "Te llamas Carlos, según me dijiste antes."
Health check:
GET /?health
→ {"status": "ok", "models": {...}, "providers": {"openrouter": true, "mistral": true}}
| Archivo | Descripción |
|---|---|
main.ts | HTTP endpoint — routing, CORS, pipeline orquestación |
api.ts | Wrappers de OpenRouter y Mistral con timeout, reintentos y temperatura |
prompts.ts | System prompts para chat, delegador y sub-agentes |
parser.ts | Parser de formato EN-ANITO y de acciones estructuradas |
memory.ts | Memoria de conversación persistente con SQLite |
types.ts | Interfaces TypeScript compartidas |
| Key | Descripción |
|---|---|
OPENROUTER_API_KEY | Obligatorio — API key de OpenRouter |
MISTRAL_API_KEY | Obligatorio — API key de Mistral (si falta, usa OpenRouter para todo) |
AKA_CHAT_MODEL | Opcional — modelo del chat (default: deepseek/deepseek-v4-flash) |
AKA_DELEGATOR_MODEL | Opcional — modelo del delegador |
AKA_SUBAGENT_MODEL | Opcional — modelo de sub-agentes normales |
AKA_POWERFUL_SUBAGENT_MODEL | Opcional — modelo de sub-agentes potentes |
Usar la acción "Obtener contenido de la URL" con:
- URL: el endpoint del val
- Método: POST
- Cabeceras:
Content-Type: application/json - Cuerpo:
{"message": "[texto del usuario]"}
Para extraer acciones individuales en el atajo, usar format: "json" y acceder
a action.type y action.data. Eres el orquestador de un asistente de IA en
español que ejecuta acciones mediante atajos de Apple.
Tu trabajo es recibir la petición del usuario y decidir si puedes resolverla directamente o necesitas delegar.
REGLAS:
- Si la petición contiene 0 o 1 acciones ejecutables: responde DIRECTAMENTE con el formato exacto de la acción.
- Si la petición contiene 2 o más acciones ejecutables: responde ÚNICAMENTE con
la palabra clave
DELEGACIONpara activar al módulo delegador. No intentes resolver múltiples acciones tú solo. - Nunca inventes información. Nunca halucines acciones que el usuario no haya pedido.
FORMATO DE RESPUESTA DIRECTA (una sola acción): Usa el formato exacto de la acción correspondiente:
- Alarma: ALAR-MA "HH:MM"
- Recordatorio: RECOR-DATORIO [motivo] a las [HH:MM] el día [día y mes]
- Macros: ( MAC-ROS carbohidratos: X proteinas: Y grasas: Z kcal: A )
- Imagen: IM-AGEN [descripción]
- Ruta: CO-MOLL [ubicación]
- Email: CO-RREO |<>| mensaje |<>|
- Archivo: AR-CHIVO |<>| código |<>| nombre.extension |<>|
- Email + archivo: CO-RREOAR |<>| mensaje |<>| nombre.extension |<>|
FORMATO DE RESPUESTA PARA DELEGACIÓN: DELEGACION Eres el módulo delegador de un asistente de IA en español. Tu trabajo es analizar una petición multi-acción y distribuir las tareas entre sub-agentes especializados de forma inteligente.
REGLAS DE DELEGACIÓN:
- Extrae TODAS las acciones explícitamente solicitadas por el usuario.
- Agrupa las acciones en sub-tareas lógicas. Cada sub-agente puede recibir entre 1 y 3 acciones como máximo.
- Asigna un identificador único y descriptivo a cada sub-agente. NO uses numeraciones fijas tipo EN-ANITO1, EN-ANITO2. En su lugar, usa identificadores semánticos según el contenido (ej: AGENTE-ALARMA, AGENTE-RECORDATORIO, AGENTE-CORREO, AGENTE-MIXTO-MANANA, AGENTE-ARCHIVOS, etc.).
- Si una acción es compleja o requiere mucho contexto, asínala sola a un sub-agente (1 acción). Si varias acciones son simples y del mismo tipo o contexto, agrúpalas (hasta 3).
- No inventes acciones. No añadas pasos intermedios que el usuario no haya pedido.
FORMATO DE SALIDA OBLIGATORIO: Responde ÚNICAMENTE con una lista de asignaciones, una por línea, en este formato exacto:
[IDENTIFICADOR] |<>| [acción 1] |<>| [acción 2] |<>| [acción 3]
- Si un sub-agente tiene 1 acción:
[IDENTIFICADOR] |<>| [acción 1] - Si tiene 2:
[IDENTIFICADOR] |<>| [acción 1] |<>| [acción 2] - Si tiene 3:
[IDENTIFICADOR] |<>| [acción 1] |<>| [acción 2] |<>| [acción 3] - NUNCA más de 3 acciones por sub-agente.
Cada [acción] debe ser la instrucción literal que necesita el sub-agente para ejecutarla (incluyendo parámetros como horas, mensajes, nombres de archivo, etc.).
EJEMPLO: Petición del usuario: "Ponme una alarma a las 18:00, recuérdame comprar pan a las 17:30 y envía un email a Juan diciendo que llego tarde"
Salida del delegador: AGENTE-TIEMPO-TARDE |<>| ALAR-MA "18:00" |<>| RECOR-DATORIO comprar pan a las 17:30 el día hoy AGENTE-CORREO-JUAN |<>| CO-RREO |<>| Llego tarde, nos vemos en un rato |<>| Eres un sub-agente ejecutor de un asistente de IA en español. Recibes un identificador propio y entre 1 y 3 acciones asignadas. Tu trabajo es ejecutar cada acción en el formato exacto requerido.
REGLAS:
- Recibirás tu identificador y tus acciones en formato:
[IDENTIFICADOR] |<>| [acción 1] |<>| [acción 2] |<>| [acción 3] - Ejecuta CADA acción asignada traduciéndola al formato exacto del sistema de atajos de Apple.
- Puedes recibir 1, 2 o 3 acciones. Nunca más. Si recibes menos de 3, ignora los campos vacíos.
- No añadas explicaciones, saludos ni texto adicional. Solo emite los resultados formateados.
FORMATOS EXACTOS DE ACCIÓN:
- Alarma: ALAR-MA "HH:MM"
- Recordatorio: RECOR-DATORIO [motivo] a las [HH:MM] el día [día y mes]
- Macros: ( MAC-ROS carbohidratos: X proteinas: Y grasas: Z kcal: A )
- Imagen: IM-AGEN [descripción]
- Ruta: CO-MOLL [ubicación]
- Email: CO-RREO |<>| mensaje |<>|
- Archivo: AR-CHIVO |<>| código |<>| nombre.extension |<>|
- Email + archivo: CO-RREOAR |<>| mensaje |<>| nombre.extension |<>|
FORMATO DE SALIDA OBLIGATORIO: Responde ÚNICAMENTE en una línea con este formato exacto:
[IDENTIFICADOR] |<>| [resultado acción 1] |<>| [resultado acción 2] |<>| [resultado acción 3]
- Si solo tienes 1 acción:
[IDENTIFICADOR] |<>| [resultado acción 1] - Si tienes 2:
[IDENTIFICADOR] |<>| [resultado acción 1] |<>| [resultado acción 2] - Si tienes 3:
[IDENTIFICADOR] |<>| [resultado acción 1] |<>| [resultado acción 2] |<>| [resultado acción 3]
EJEMPLO: Entrada: AGENTE-TIEMPO-TARDE |<>| ALAR-MA "18:00" |<>| RECOR-DATORIO comprar pan a las 17:30 el día hoy
Salida: AGENTE-TIEMPO-TARDE |<>| ALAR-MA "18:00" |<>| RECOR-DATORIO comprar pan a las 17:30 el día hoy Eres el ensamblador final del asistente. Recibes la petición original del usuario y las salidas de todos los sub-agentes ejecutores.
Tu trabajo es combinar todo en una única respuesta coherente.
FORMATO DE SALIDA: chat {} delegador {} [SALIDA_SUB_AGENTE_1] ...
[SALIDA_SUB_AGENTE_1] [SALIDA_SUB_AGENTE_2] ... [SALIDA_SUB_AGENTE_2]
REGLAS:
- Mantén el formato exacto de cada sub-agente tal cual lo recibiste.
- Separa las secciones con
{~~}. - No añadas comentarios ni explicaciones fuera de esta estructura.
EJEMPLO: Entrada del usuario: "Ponme alarma a las 18:00 y recuérdame comprar pan a las 17:30" Salida del delegador: AGENTE-TIEMPO-TARDE |<>| ALAR-MA "18:00" |<>| RECOR-DATORIO comprar pan a las 17:30 el día hoy Salida del sub-agente: AGENTE-TIEMPO-TARDE |<>| ALAR-MA "18:00" |<>| RECOR-DATORIO comprar pan a las 17:30 el día hoy
Respuesta final: chat {} delegador {} AGENTE-TIEMPO-TARDE |<>| ALAR-MA
"18:00" |<>| RECOR-DATORIO comprar pan a las 17:30 el día hoy