Razona
Un modelo abierto (nemotron-3-nano:30b) vía Ollama Cloud planifica y decide. El sistema de tools es propio: definiciones declarativas con Zod, serializadas a JSON Schema. Nada de SDKs de agentes entre tu prompt y el modelo.
Aki es un agente de IA autónomo: escucha por Telegram, razona con un modelo abierto vía Ollama Cloud y ejecuta comandos reales dentro de un sandbox Docker aislado. Sin SDKs de agentes — cada decisión es suya.
$ git clone https://github.com/beresiartejuan/aki-assistant-ai.git
Tres responsabilidades bien separadas, orquestadas sin frameworks: lo que razona no ejecuta, lo que ejecuta no recuerda, y lo que recuerda no sale de tu equipo.
Un modelo abierto (nemotron-3-nano:30b) vía Ollama Cloud planifica y decide. El sistema de tools es propio: definiciones declarativas con Zod, serializadas a JSON Schema. Nada de SDKs de agentes entre tu prompt y el modelo.
Cada run_command cae en un contenedor Docker endurecido: rootfs de solo lectura, sin capabilities, límite de 2 GB de RAM y usuario sin privilegios. Los archivos solo llegan a tu chat si Aki los marca con deliver_file.
Entre tareas consolida aprendizajes en memoria semántica: embeddings locales y vectores en LanceDB, dedupe por similitud coseno ≥ 0,90 y TTL de 30 días. Los hechos clave se versionan — nunca se pisan sin rastro.
El razonamiento viaja; tus datos no. La ejecución, los archivos, los episodios y la memoria viven en tu máquina — el LLM remoto solo lee el prompt y el contexto que tú le envías.
Requisitos: Node.js ≥ 22.5 (usa node:sqlite nativo), pnpm ≥ 10, Docker, Ollama local para embeddings, y un bot creado con @BotFather.
Monorepo con pnpm workspaces: gateway, agente, sandbox y paquete reservado.
$ git clone https://github.com/beresiartejuan/aki-assistant-ai.git $ cd aki-assistant-ai $ pnpm install
Cada paquete carga su propio .env. Las cuatro variables imprescindibles están en la tabla de abajo.
$ touch packages/agent-core/.env $ touch packages/executor/.env $ touch packages/telegram-gateway/.env
Contenedor Ubuntu minimal desde donde Aki ejecuta comandos por tarea, sin tocar tu host.
$ docker build -f packages/executor/docker/sandbox.Dockerfile \ -t aki-sandbox:latest packages/executor/docker/
La memoria semántica se vectoriza con Ollama local — ese cómputo nunca se delega a la nube. Requiere Ollama instalado y corriendo en 127.0.0.1:11434.
$ ollama pull qwen3-embedding:0.6b
En tres terminales separadas, en este orden: sandbox → cerebro → gateway.
# terminal 1 — sandbox de ejecución $ pnpm --filter @aki/executor dev #:3100 # terminal 2 — cerebro del agente $ pnpm --filter @aki/agent-core dev #:3000 # terminal 3 — gateway de Telegram $ pnpm --filter @aki/telegram-gateway dev #:3200 ✓ Escribile al bot por Telegram — Aki responde desde tu máquina.
Los tres .env del paso 02 usan las mismas variables en cada paquete. Hay muchas más (timeouts, límites, modelo), pero estas cuatro son obligatorias.
| Variable | Archivo | Cómo obtenerla |
|---|---|---|
| §OLLAMA_API_KEY | agent-core/.env | API key de Ollama Cloud — ollama.com/settings/keys |
| §TELEGRAM_BOT_TOKEN | telegram-gateway/.env | Token que te da @BotFather al crear el bot |
| §ALLOWED_TELEGRAM_USER_IDS | telegram-gateway/.env | Tu ID numérico de Telegram — consultalo con @userinfobot |
| §INTERNAL_API_KEY | los tres /.env | Shared secret de auth inter-servicios — generalo una sola vez (ver al lado) |
Los tres servicios se autentican entre sí con este valor (header x-internal-key). Generá uno fuerte:
$ openssl rand -hex 32 # pega el mismo valor en los tres .env
Si no definís ALLOWED_TELEGRAM_USER_IDS, el bot procesa mensajes de cualquier usuario de Telegram. En producción, configurá siempre tu ID.
Monorepo con pnpm workspaces. Cada pieza es un servicio HTTP propio en 127.0.0.1, autenticado por x-internal-key. Lo que conecta a cada una con la siguiente es lo importante:
Bot grammY con cola persistente y checkpoint de update_id. Allowlist de usuarios y entrega de resultados + archivos al chat.
puerto :3200Loop agéntico con continuación automática (hasta 3 segmentos × 15 rondas de tools). Sistema de tools propio, memoria en capas y consolidación de aprendizajes.
puerto :3000Sandbox Docker endurecido: un workspace por tarea, artifacts vía HTTP, límites de RAM/PIDs/tiempo. El host queda intacto.
puerto :3100Reservado para contratos compartidos entre gateway y agente. Hoy: vacío a propósito.
reservadoReglas inmutables inyectadas al system prompt. Solo lectura para el agente.
Notas efímeras por tarea, se reinyectan al continuar a otro segmento.
Historial append-only en SQLite: acciones y observaciones de cada tarea.
Instrucciones generales vectorizadas en LanceDB. Dedupe coseno ≥ 0,90, TTL 30 días.
Preferencias y datos clave, versionados: nunca se pisa un valor sin rastro.