Val Town is a collaborative website to build and scale JavaScript apps.
Deploy APIs, crons, & store data – all from the browser, and deployed in milliseconds.
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.