Modelos alojados, pagados con Fuel en $DULUS

Un agente. Hecho de muchos.

Dulus es un agente de IA para tu escritorio y tu terminal. Trabaja en tus archivos, tu shell, tu navegador y tu pantalla — con el modelo que elijas. Y cuando una sola mente no basta, llama a la bandada.

  • Sin instalar Python
  • Tus claves, modelos locales o alojados por Dulus
  • Hecho en Santo Domingo

Funciona con los modelos que ya usas

  • Anthropic
  • OpenAI
  • Google Gemini
  • DeepSeek
  • Moonshot Kimi
  • Qwen
  • Z.ai GLM
  • Perplexity
  • MiniMax
  • NVIDIA NIM
  • Azure OpenAI
  • Amazon Bedrock
  • Cloudflare Workers AI
  • Vertex AI
  • Ollama
  • LM Studio
  • llama.cpp
  • Dulus-hosted

Medido, no prometido

El agente que menos cuesta usar. Medido.

Seis sesiones de programación, desde un arreglo de 8 turnos hasta una auditoría de 120, repetidas frente a Claude Code, Cursor, Codex CLI, Cline, Aider y GitHub Copilot: la misma transcripción, el mismo tokenizador y los mismos precios. Dulus quedó primero en las cinco formas en que ponderamos los resultados.

  • $25.63 por las seis sesiones Claude Code: $48.00. Cursor: $50.75. GitHub Copilot: $373.53.
  • 9 veces se reescribió el prompt en caché Claude Code 74, Cursor 88, Cline 102. Cada reescritura cobra a precio completo tokens que ya se habían enviado.
  • 0 desbordes del contexto Su pico fue de 139.8k tokens en una ventana de 200k, en sesiones de hasta 120 turnos.
  • 70.4% desde la caché, en nuestra propia factura 155.7M tokens de entrada en una semana construyendo con Dulus, del 12 al 18 de octubre de 2026.

Una caché que aguanta

La ventana del historial solo se mueve cuando eso ahorra más que la caché. Las imágenes y el razonamiento anteriores se quedan donde estaban, así que el prompt en caché no se reescribe.

Lookback y Loopback

El modelo recibe los turnos recientes; la conversación completa se queda en tu máquina. Cuando necesita algo más viejo, Dulus lo busca con su propia herramienta Loopback.

Una consola de Python para el modelo

Un kernel de Python persistente guarda los datos grandes en memoria y no en la conversación. Al contexto solo llega lo que imprime.

MemPalace

Memoria que puedes abrir: markdown en un palacio de salas. Lo esencial se carga en cada sesión, y cada turno trae de vuelta hasta tres memorias relevantes.

A Dulus se le midió corriendo su propio código de contexto. Los demás agentes se modelaron según cómo maneja cada uno su contexto, sin correr su código fuente. El método y sus salvedades están en la página de benchmarks.

Míralo trabajar

Pídelo una vez. Míralo trabajar.

Cada llamada a herramienta ocurre a la vista — la herramienta, sus argumentos, su resultado — y puedes guiar a Dulus antes de que dé el siguiente paso.

Arreglar un test que falla

Dijiste

El test de renovación de sesión está fallando. Averigua por qué y arréglalo.

DULUS
Thinking Voy a buscar dónde se manejan los refresh tokens, reproducir el fallo y luego arreglar la causa, no el test.
Grep "refresh_token" src/ 4 matches running…
src/auth/session.py:43:    def refresh(self, refresh_token: str):
src/auth/session.py:44:        session = self.db.get(refresh_token)
src/auth/session.py:58:def new_refresh_token() -> str:
src/api/routes.py:88:    return sessions.refresh(body.refresh_token)
Read src/auth/session.py 71 lines running…
Bash pytest -q tests/test_session.py 1 failed, 3 passed running…
FAILED tests/test_session.py::test_refresh_rotates_token
E       AssertionError: token not rotated
1 failed, 3 passed in 0.41s

Dijiste, mientras Dulus trabajaba

Registra también cuando un token expire.

Dalo por hecho. El fallo es real: refresh() devuelve la sesión con su refresh token viejo, así que el token nunca se rota.

Checkpoint saved src/auth/session.py · before Edit
Edit src/auth/session.py +4 −1 running…
@@ -44,5 +44,8 @@ def refresh(self, refresh_token: str):
         session = self.db.get(refresh_token)
         if session.expired:
-            raise SessionExpired()
+            log.info("token expired: session %s", session.id)
+            raise SessionExpired(session.id)
+        session.refresh_token = new_refresh_token()
+        self.db.rotate(refresh_token, session)
         session.expires_at = now() + SESSION_TTL
         return session
Bash pytest -q 14 passed running…
..............                           [100%]
14 passed in 1.12s

Arreglado. El test detectó un bug real: refresh() nunca emitía un refresh token nuevo.

  • Ahora cada renovación rota el token e invalida el anterior.
  • Los tokens expirados quedan registrados con su id de sesión.

Pasan los 14 tests, y guardé un checkpoint del archivo antes de editarlo.

Convocar una Mesa Redonda

Dijiste

¿Postgres o SQLite para el estado del motor de sincronización? Quiero que esto se debata como se debe.

DULUS
Thinking Es un dilema de verdad, así que una sola opinión no basta. Voy a sentar a tres modelos distintos y luego sopesar lo que digan.
RoundTable convene seats=3 3 members running…
Table convened with 3 members on: sync engine storage
  A  dulus-x-397b
  B  claude (your key)
  C  gemini (your key)
RoundTable ask sent to 3 seats running…
Mesa Redonda sync engine storage 3 seats
Adulus-x-397b

SQLite en cada dispositivo: un solo archivo, nada que levantar, y las lecturas se quedan locales y rápidas. Del servidor de sincronización no estoy tan seguro.

Bclaude (your key)

A tiene razón en lo del dispositivo. El servidor es otra cosa: muchos dispositivos escriben a la vez, y eso es trabajo para Postgres.

Cgemini (your key)

De acuerdo con los dos. Hay que mantener un solo esquema para las dos bases y correr los tests de conflictos contra cada una, o van a terminar divergiendo.

Recomendación: SQLite en cada dispositivo, Postgres en el servidor de sincronización. A y B coinciden en esa división, y lo que dice B sobre las escrituras concurrentes zanja lo del servidor. La advertencia de C es el verdadero trabajo: un esquema, dos migraciones, tests de conflictos en ambas. ¿Quieres que te prepare un borrador del esquema?

Usar la computadora

Dijiste

Tengo abierto el PDF del recibo de Descargas al lado del formulario de gastos. Revisa que coincidan y luego envíalo.

DULUS
Thinking Primero leo la pantalla, comparo el recibo con el formulario y pregunto antes de hacer clic.
ScreenGround 23 text elements running…
Screen grounded: 23 text elements | logical 1920x1080
  ( 214, 188) conf=0.99  'Receipt #0412'
  ( 236, 402) conf=0.98  'Total RD$ 2,350.00'
  ( 652, 318) conf=0.99  'Amount 2,350.00'
  ( 662, 372) conf=0.97  'Date 14 Oct 2026'
  ( 812, 604) conf=0.99  'Submit'

Coinciden: RD$ 2,350.00, con fecha del 14 de octubre de 2026. Voy a enviar el formulario.

Allow: ScreenClick "Submit" at (812, 604)? [y/N/a] y · allowed once
ScreenClick text="Submit" Left-clicked 'Submit' at (812,604). running…
ScreenGround filter="submitted" 1 match running…
  ( 760, 640) conf=0.99  'Expense submitted'

Listo. El formulario coincidía con el recibo y ya está enviado — la pantalla ahora dice “Expense submitted”.

Cifras en vivo, con fuentes

Dijiste

¿A cuánto están el USD/DOP y el BTC ahora mismo? Con fuentes, por favor.

DULUS
Thinking Busco los dos en vivo, en paralelo. Nunca cito un precio de memoria.
LiveFeed yahoo USDDOP=X 60 DOP running…
USD/DOP [yahoo:USDDOP=X] = 60 DOP
source: https://finance.yahoo.com/quote/USDDOP=X
LiveFeed binance BTCUSDT 100,000 USDT running…
BTC/USDT [binance:BTCUSDT] = 100,000 USDT
source: https://www.binance.com/en/trade/BTC_USDT?type=spot
  • USD/DOP 60 — finance.yahoo.com
  • BTC/USDT 100,000 — binance.com

Consulté los dos en vivo hace un momento, cada uno con la página de donde salió. ¿Quieres que le dé seguimiento a alguno?

Dijiste

/verify yahoo USDDOP=X 60 1%

60 matches the live figure (0.00% off, tolerance 1%) USD/DOP [yahoo:USDDOP=X] = 60 DOP source: https://finance.yahoo.com/quote/USDDOP=X

Ejecuciones de ejemplo con guion, recreadas a partir de la app de escritorio. Los nombres de archivo y las cifras son ilustrativos.

  • Guíalo a mitad del turno

    Escribe mientras Dulus trabaja. Lee tu mensaje antes de su siguiente paso, y lo que no alcance a leer vuelve a tu cuadro de texto.

  • Cada llamada a herramienta, a la vista

    Cada llamada muestra la herramienta, sus argumentos y su resultado mientras se ejecuta: Grep, Bash, Edit e incluso ScreenClick.

  • Un checkpoint antes de cada edición

    Antes de cada Write y Edit se guarda una instantánea de los archivos, así que /checkpoint puede restaurar los archivos, la conversación o ambos.

Anatomía de un agente

Cada parte del pájaro tiene su oficio.

Siete partes, siete oficios — desde el pico que ejecuta tus herramientas hasta el canto que te contesta.

Lám. VII Dulus dominicus

En vuelo, vista lateral

Siete partes, un agente

El pájaro dorado de Dulus en vuelo, dibujado como una lámina de guía de campo con siete partes numeradas: pico, ojo, alas, garras, plumaje, corazón y canto.

Pico Herramientas

Lee, escribe y ejecuta.

  • Archivos y código: Read, Write, Edit, Glob, Grep, notebooks y diagnósticos (pyright, mypy, flake8, tsc, shellcheck).
  • Bash para una shell de verdad, y git: status, diff y log.
  • Un kernel de Python persistente: sus variables sobreviven entre llamadas.
  • WebFetch y WebSearch — unas 80 herramientas integradas.

Ojo Vista

Usa la computadora con OCR — sin tokens de modelos de visión.

  • ScreenGround lee cada elemento de texto en tu pantalla, con coordenadas listas para hacer clic.
  • ScreenClick hace clic por texto en pantalla o por x,y, en Windows y macOS.
  • WebDrive: un navegador Chromium de verdad — navega, hace clic, escribe, extrae — que conserva tus sesiones iniciadas y se ve en vivo en la app de escritorio.
  • Mándale una foto por Telegram, o elige un modelo de visión como dulus-vl-72b.

Alas La bandada

Cuando una sola mente no basta.

  • Los subagentes corren en segundo plano: general, programador, revisor, investigador, tester — o un tipo tuyo, definido en un archivo markdown.
  • Aislamiento opcional con git worktree. Hasta 3 a la vez, anidados hasta 3 niveles.
  • /mesa convoca una Mesa Redonda: de 2 a 26 asientos, cada uno un agente completo con su propio modelo, hablando entre sí a mitad del turno. Dulus preside.
  • Dulus puede convocar una mesa por su cuenta, y despierta cuando todos los asientos han respondido.

Garras Agarre

Ediciones precisas — cada una con su marcha atrás.

  • Un checkpoint antes de cada Write y Edit; /checkpoint restaura la conversación, los archivos o ambos.
  • /undo deshace el último turno. /fork bifurca la sesión en cualquier turno.
  • Modos de permiso auto, manual, accept-all y plan. En auto, todo lo que cambie algo pide permiso primero.
  • Un registro de auditoría de cada Write, Edit, Bash y ScreenClick. Lo que se cambia con Bash no se guarda en instantáneas.

Plumaje Extensiones

Plumas nuevas, cada vez que el trabajo las pida.

  • Un mercado MCP en la app — miles de servidores (stdio, SSE, HTTP), y antes de cada instalación se te ofrece una revisión de seguridad.
  • Skills (SKILL.md) del marketplace oficial de Anthropic, skills.sh y más: el Skills Market busca entre decenas de miles.
  • Los plugins agregan herramientas, skills y configuraciones MCP con recarga en caliente: /plugin install name@git_url.
  • AutoAdapter convierte un repo de Python en herramientas nativas, probadas con smoke tests. Los paquetes de herramientas se activan y desactivan en vivo, y cada uno muestra su costo en tokens.

Corazón Memoria

Recuerda — en archivos que puedes leer.

  • Las memorias son archivos markdown, por usuario y por proyecto, clasificadas por tipo y con índice automático. Se llevan bien con Obsidian.
  • Cada turno recupera hasta 3 memorias relevantes; las marcadas como gold se cargan al iniciar.
  • /memory consolidate extrae los aprendizajes de largo plazo.
  • El reloj de caché sabe cuándo se enfrió la caché del prompt en el proveedor, y compacta justo entonces — cuando la reescritura ya se paga de todas formas.

Canto Voz

Te contesta — en español dominicano, a menos que le digas otra cosa.

  • Astral Voice en la app de escritorio: conversación manos libres con respuestas habladas. Interrúmpelo con solo hablar.
  • En la CLI: /voice, /tts y una palabra de activación, “hey Dulus”.
  • Las notas de voz también funcionan por el puente de Telegram.
  • /lang cambia entre 34 idiomas — o a uno que describas libremente, como “inglés británico formal”.

Cualquier modelo

Todos los modelos en una misma mesa.

Trae tus propias claves, corre modelos locales o usa los modelos alojados por Dulus con Fuel — y cambia cuando quieras con /model. Cuando una sola opinión no basta, sienta a varios en una Mesa Redonda.

Ronda de ejemplo

Seis asientos, un moderador

La pregunta

¿Reescribimos el importador de CSV en Rust?

  1. BAnthropictu clave

    Hay que perfilarlo antes de que alguien abra un archivo .rs. Mi apuesta: las inserciones, no el parseo.

  2. DDeepSeektu clave

    Misma apuesta que B: un INSERT por fila. Mejor en lotes, mil por transacción.

  3. CGeminitu clave

    D arregla las escrituras. Las lecturas están peor: el archivo entero se carga en memoria antes de la primera fila. Hay que leerlo en streaming.

  4. EKimitu clave

    C tiene razón, y es una sola línea: csv.reader ya hace streaming. El código lo envuelve en list().

  5. FOllamalocal

    Corrí el perfilado de B en esta máquina: primero las inserciones, y el parseo muy por detrás. Python no es el cuello de botella.

  6. Adulus-x-397bAlojado por Dulus

    Los números de F lo deciden: dos arreglos pequeños, no una reescritura. Dejemos Rust para el día en que un perfilado lo pida.

  7. Moderador — síntesis: nada de reescribir. Leer las filas en streaming (C, E), agrupar las inserciones en lotes (D) y volver a correr el perfilado de B antes y después (F). Rust espera a que un perfilado lo pida (A).

  • 2–26 asientosCada uno es un agente completo, con su propio modelo, historial y buzón.
  • Dulus presideNunca ocupa un asiento. Puede convocar una mesa por su cuenta, y despierta cuando todos los asientos han respondido.
  • 3 mesas a la vezPueden funcionar hasta tres al mismo tiempo.
  • Convoca una/mesa convene …, /roundtable o la pestaña Round Table de la app.

Un modelo puede venir de tres lugares. Combínalos como quieras — incluso en una misma mesa.

Tus claves

Usa la clave de un proveedor que ya pagas. Dulus no te cobra nada.

  • Anthropic
  • OpenAI
  • Google Gemini
  • Vertex AI
  • DeepSeek
  • Moonshot Kimi
  • Qwen / Model Studio
  • Z.ai GLM
  • Perplexity
  • MiniMax
  • NVIDIA NIM
  • Xiaomi
  • Sakana
  • Meta
  • Azure OpenAI
  • Amazon Bedrock
  • Cloudflare Workers AI
  • AMD

Vertex AI entra con tu sesión de gcloud; AMD apunta a tu propio servidor vLLM.

Local

Corre un modelo en tu propio hardware. Dulus no te cobra nada.

  • Ollamalocalhost:11434
  • LM Studiolocalhost:1234
  • llama.cppllama-server :8080
  • Cualquier servidor compatible con OpenAI/v1

/model ollama/qwen2.5-coder

Model set to ollama/qwen2.5-coder

Alojado por Dulus

Se paga por token en Fuel. Los tokens en caché son gratis, y una llamada fallida se reembolsa completa.

  • dulus-a-9brápido y barato1×
  • dulus-b-27bequilibrado2×
  • dulus-coder-30b2×
  • dulus-vl-72bvisión3×
  • dulus-x-397bel grandote4×
  • dulus-free-9b dulus-free-7b dulus-free-20b0×
Ver todos los modelos alojados

0× es el nivel gratis para holders: 40 mensajes cada 24 horas mientras mantengas al menos 1,000,000 $DULUS como Fuel en tu saldo de Dulus — se conservan, nunca se gastan.

$DULUS es un token de utilidad y comunidad que se usa para pagar Fuel en Dulus. Nada en este sitio es asesoría financiera.

/thinking 0–4

Un solo dial de razonamiento.

Cada familia de modelos expresa el razonamiento a su manera — aquí un presupuesto de tokens, allá una palabra de esfuerzo. Tú mueves un solo dial; Dulus traduce el nivel para el modelo que esté respondiendo.

/thinking debug muestra toda la escala de 0 a 4 para el modelo que estés usando.

Apagado. No se pide razonamiento. Un modelo que no lo puede apagar recibe su nivel más bajo.

Lo que se envía

  • Claudethinking no se envía
  • Qwenenable_thinking: false
  • DeepSeekreasoning_effort: "none"

Una pasada ligera. Un presupuesto pequeño para trabajo rápido y sencillo.

Lo que se envía

  • Claudebudget_tokens: 2048
  • Qwenthinking_budget: 2048
  • DeepSeekreasoning_effort: "medium"redondeado al alza

Equilibrado. Espacio para pensar, sin hacerte esperar mucho.

Lo que se envía

  • Claudebudget_tokens: 6000
  • Qwenthinking_budget: 8192
  • DeepSeekreasoning_effort: "medium"

Profundo — el nivel por defecto. Tiempo para pensarlo bien antes de responder.

Lo que se envía

  • Claudebudget_tokens: 16000
  • Qwenthinking_budget: 16384
  • DeepSeekreasoning_effort: "medium"llega al tope

El techo, esté donde esté para cada familia.

Lo que se envía

  • Claudebudget_tokens: 32000
  • Qwenthinking_budget: 32768
  • DeepSeekreasoning_effort: "medium"llega al tope

Si una familia no tiene un nivel equivalente, Dulus envía el más cercano que acepte.

Fuel

IA que puedes auditar token por token.

Los modelos alojados por Dulus funcionan con Fuel, y 1 Fuel = 1 $DULUS. Puedes seguir cada unidad desde tu depósito hasta el encabezado de la respuesta.

Llamada de ejemplo POST /v1/chat/completions Cifras ilustrativas. Cada paso es real.
  1. Depósito

    Envía $DULUS en Solana a tu dirección de depósito personal.

    • + 2,000,000 $DULUS
    • → tu dirección de depósito
    • en Solana
  2. Libro mayor

    Se acredita una vez por transacción, más un bono del 1% en Fuel. El saldo nunca queda en negativo.

    • + 2,000,000 Fuel
    • + 20,000 de bono · 1%
    • saldo nunca < 0
  3. Clave

    Genera una clave de API en la app de escritorio. Solo se te muestra una vez.

    • dulus_sk_live_••••••
    • se muestra una vez
    • guardada como SHA-256
  4. Reserva

    Cada llamada de pago reserva primero un tope, de forma atómica. Sin Fuel, no hay llamada.

    • reserva = tope
    • tomada de forma atómica
    • sin Fuel → HTTP 402
  5. Ejecución

    El modelo alojado se ejecuta. Se cuentan sus tokens de entrada, salida y razonamiento.

    • dulus-b-27b · 2×
    • entrada 1,204 · salida 388
    • razonamiento 96
    • en caché 2,048
  6. Liquidación

    Se cobra por los tokens reales. Lo que sobra de la reserva se devuelve, y una llamada fallida se reembolsa.

    • se cobran 1,688 tokens
    • en caché 2,048 → gratis
    • reserva sin usar → devuelta
    • X-Dulus-Fuel-Charged: …
  • 1 Fuel = 1 $DULUS Cada $DULUS que depositas se acredita como un Fuel.
  • 0 Fuel por tokens en caché Pagas los tokens de entrada, salida y razonamiento. Los de la caché son gratis.
  • 100% reembolsado si una llamada falla Toda la reserva vuelve a tu saldo.
  • 40 mensajes gratis al día Mantén 1,000,000 $DULUS como Fuel para usar dulus-free-9b, dulus-free-7b y dulus-free-20b, con hasta 2,048 tokens de salida por mensaje. El saldo se conserva, nunca se gasta.

$DULUS en Solana

  • Token-2022
  • 6 decimales

Dirección del mint

9R8rrjXxcfQPmLTCLhmVpjr2uesjjkcgkinE6Lwdpump

$DULUS es un token de utilidad y comunidad que se usa para pagar Fuel en Dulus. Nada en este sitio es asesoría financiera.

Memoria y control

Dulus recuerda a propósito. Tú sigues al mando.

Dulus mantiene su contexto ligero, lo compacta cuando la caché del proveedor ya se enfrió de todos modos, y escribe lo que aprende en archivos markdown que puedes abrir. Mientras trabaja, puedes guiarlo, aprobar sus pasos, rebobinarlo o ponerle límites.

01Memoria y contexto

Contexto a la medida.

En cada turno, Dulus decide qué ve el modelo. Lo que se gana su lugar entra; lo demás se queda local, a una llamada de distancia.

Ejemplo acelerado: la ventana de contexto está al 62% cuando la caché del prompt del proveedor se enfría tras una hora sin llamadas. En el siguiente turno, Dulus recorta las salidas viejas de herramientas sin llamar a un modelo, guarda un checkpoint antes de compactar, resume los turnos anteriores y escribe el prompt, ya más pequeño, una sola vez. La ventana baja al 26%.

Ventana de contexto 62%49%26% / 128K

Ejemplo Se muestra 500 veces más rápido

Caché del prompt 1h TTL

  • Prompt del sistema 15.4K en cachéexpirado
  • Memorias ×3 4.6K en contexto
  • Conversación 28.2K9.0K resumida
  • Salidas de herramientas 30.7K14.1K3.8K recortadas

sigue

[cache: 1h 12m idle > 1h TTL — cached prompt expired; this turn re-writes the prefix at write price (re-grounding + compacting now so it is paid once)]

  1. Caché fría1h 12m sin actividad, pasado el TTL de 1h
  2. Capa 1Salidas viejas de herramientas recortadas, sin llamar a un LLM
  3. CheckpointGuardado antes de resumirRevertir
  4. Capa 2Turnos anteriores resumidos
  5. De nuevo en cachéUna sola escritura del prefijo, no dos

70%

Compactación automática

La capa 1 recorta las salidas viejas de las herramientas sin llamar a un modelo. Antes de que la capa 2 resuma los turnos anteriores, Dulus guarda un checkpoint al que puedes volver.

1h TTL

Un reloj para la caché

La caché del prompt de un proveedor se enfría pasado un tiempo: una hora, por defecto. Dulus sabe cuándo pasó y compacta justo en ese momento, porque la reescritura de la caché ya se está pagando.

Loopback

El historial se queda local

Solo se envían los últimos N turnos. El historial completo se queda local, y el modelo lo consulta cuando lo necesita.

Loopback(action="search", query="token expiry")

Memoria que puedes leer.

Las memorias son archivos markdown con un poco de frontmatter: unas para ti, otras para cada proyecto, y un índice que Dulus mantiene al día. Léelas, edítalas, abre la carpeta en Obsidian.

type
user, feedback, project o reference
Recuperación
Hasta 3 por turno, y solo si superan un umbral de relevancia
gold: true
Se carga al iniciar, en cada sesión
/memory consolidate
Extrae de una sesión los aprendizajes de largo plazo
Turno de ejemplo: ante “los reintentos del webhook están fallando otra vez”, dos memorias superan el umbral de relevancia y se recuperan; una no llega y se queda afuera. La memoria gold ya se había cargado al iniciar.
los reintentos del webhook están fallando otra vez Recuperadas 2/3
  • user_prefers_spanish.md

    Gold · cargada al iniciar

    ---
    type: user
    gold: true
    ---

    Prefiere respuestas en español. El código y los mensajes de commit, en inglés.

  • project_payments.md

    0.74 en contexto

    ---
    type: project
    created: 2026-10-02
    ---

    Los webhooks pasan a /v2 el 2026-11-03. Mantén /v1 activo hasta entonces.

  • feedback_tests_first.md

    0.41 en contexto

    ---
    type: feedback
    created: 2026-09-18
    ---

    Primero escribe el test que falla, luego el arreglo. Por qué: dos regresiones llegaron a producción sin test.

  • reference_release_wiki.md

    0.06 bajo el umbral

    ---
    type: reference
    created: 2026-08-30
    ---

    Checklist de releases: wiki del equipo → Ingeniería → Releases.

02Control

Guía, aprueba, rebobina, limita.

Autonomía con límites claros. Tú los pones; Dulus trabaja dentro de ellos.

  • Edit src/auth/session.py running… +18 −4

    Tú, a mitad del turno

    también registra cuando expire un token

    Edit src/auth/tokens.py running… +3

    Guiar a Dulus Lo lee antes de su siguiente paso.

    también registra cuando expire un token

    En colaEntregado

    App de escritorio

    Guíalo a mitad del turno

    Escribe mientras Dulus trabaja. Lee tu mensaje antes de su siguiente paso, y lo que no alcance a leer vuelve a tu cuadro de texto.

  • Bashrm -rf build/

    Allow: Bash(rm -rf build/) [y/N/a(ccept-all)]

    • autoEl modo por defecto. Las lecturas y los comandos seguros se ejecutan sin preguntar; todo lo que cambie algo pide permiso.
    • manualCada llamada a herramienta pide permiso primero.
    • accept-allNada pide permiso. Para cuando lo tienes claro.
    • planSolo lectura. Dulus planifica; nada cambia.

    auto · manual · accept-all · plan

    Solicitudes de permiso

    Elige cuánto puede hacer Dulus por su cuenta. Lo que no hayas permitido espera tu y: en la app, en la terminal o en Telegram.

    1. #1“agrega rate limiting a /login”Edit limits.pyEdit app.py
    2. #2“mejor usa una ventana deslizante”Edit limits.py
    3. #3“ahora escribe los tests”Write test_limits.py

      Rebobinar hasta aquí

      • Conversación + archivos
      • Solo la conversación
      • Solo los archivos
    4. #4“también registra cuando expire un token”Edit tokens.py
    5. #5“refactoriza el almacén de sesiones”Edit session.pyEdit store.py

    /checkpoint · /fork · /undo

    Checkpoints

    Antes de cada Write y cada Edit, se guarda una instantánea de los archivos. /checkpoint restaura la conversación, los archivos o ambos; /fork bifurca una sesión en cualquier turno y /undo deshace el último.

    Los cambios hechos con Bash no quedan en los checkpoints.

  • /budget tokens 200000

    /budget tool_calls 300

    tokens128,400 / 200,000

    tool_calls96 / 300

    /isolate on

    Isolate: ON — writes locked to ~/code/payments

    Registro de auditoría Write · Edit · Bash · ScreenClick

    1. 14:02:11Editsrc/auth/session.py
    2. 14:02:19Bashpytest -q tests/auth
    3. 14:03:02ScreenClickRetry

    /budget · /isolate

    Presupuestos y salvaguardas

    /budget pone un tope a los tokens y a las llamadas a herramientas de una sesión. /isolate restringe las escrituras al espacio de trabajo, en la medida de lo posible. Cada Write, Edit, Bash y ScreenClick queda en un registro de auditoría.

Donde trabajes

Escritorio. Terminal. Navegador. Tu celular.

Un solo agente en tu ventana, tu shell, tu pestaña del navegador y tu bolsillo. Y crece con cada servidor, skill y plugin que le des.

La CLI

La CLI viene dentro de la app: un clic abre dulus en una terminal de verdad, con el agente completo, el banner, los temas y el pajarito girando incluidos. La edición de código abierto la lleva a macOS, Linux, WSL y Termux.

  • macOS
  • Linux
  • WSL
  • Termux
  • Windows

Sesión de terminal de ejemplo: dulus imprime su banner de naranja a dorado. /model dulus/dulus-b-27b cambia el modelo; ante “arregla el test de login inestable” lee un archivo, corre un comando y su spinner dice “Afilando las garras en el AST…”.

La app de escritorio

Escribe mientras trabaja: leerá tu mensaje antes de su siguiente paso. Su navegador y su terminal corren en paneles que puedes mirar.

Windows 10 o posterior, 64 bits. No necesitas Python.

Ejemplo: la app de escritorio de Dulus con su barra lateral, una llamada a la herramienta Bash que ejecuta npm test, un mensaje para guiarlo que espera a ser leído antes del siguiente paso, y paneles laterales con el navegador en vivo y la terminal.

WebChat en tu celular

/webchat lan on — la misma sesión en el navegador de tu celular, por tu Wi-Fi.

Ejemplo: el navegador de un celular abierto en la dirección local de la computadora, con Dulus WebChat. Preguntas si ya terminaron los tests; Dulus responde que pasan los doce y que está escribiendo la línea del changelog.

El puente con Telegram

Mándale fotos y notas de voz, y responde a sus solicitudes de permiso sin tener que volver a la computadora.

Ejemplo de chat de Telegram con el bot de Dulus: envías una nota de voz de cuatro segundos, Dulus la transcribe y pide permiso con “Allow: Bash(npm test)”; respondes “y”, y reporta que pasan doce tests.

Voz

Astral Voice responde en voz alta, frase por frase; para interrumpir, basta con hablar. La CLI tiene /voice, /tts y una palabra de activación.

Ejemplo: Astral Voice está hablando cuando interrumpes con “Espera, primero revisa staging”. Se detiene y escucha.

La mascota de escritorio

Vive en tu escritorio y se encarga de los trabajos largos —revisiones de seguridad, adaptaciones de repos— para que tu chat quede libre. Un mini Dulus por cada subagente en marcha.

Ejemplo: la mascota de Dulus está en el escritorio con un globo de diálogo que dice “listo”. En el borde derecho, tres mascotas pequeñas muestran subagentes: coder lleva 42 segundos en Edit, tester lleva 18 segundos en Bash y reviewer terminó a los 63 segundos.

Extensiones

Miles de servidores MCP, con la opción de una revisión de seguridad antes de cada instalación. Decenas de miles de skills. Plugins que se recargan en caliente, y AutoAdapter convierte un repo de Python en herramientas.

Ejemplo: tres tarjetas del marketplace —un plugin, la skill pdf y el servidor MCP postgres, con un botón Install y una revisión de seguridad ofrecida primero— junto a los comandos /mcp search, /plugin install name@git_url, /autoadapter y /lucky.

Dulus OS

/sandbox abre un escritorio en tu navegador: decenas de apps, desde una terminal hasta el ajedrez. Su IA corre en modelos alojados por Dulus.

Ejemplo: una pestaña del navegador con Dulus OS, un escritorio con íconos de apps (terminal, VS Code, archivos, hoja de cálculo, notas, música, Fuel Wallet y ajedrez), una ventana de chat que responde con un modelo alojado por Dulus, una partida de ajedrez abierta y un dock.

Scripting

-p ejecuta un prompt y termina. --output json emite eventos JSONL, y el código de salida le dice a tu CI cómo le fue.

Ejemplo: dulus -p --accept-all --output json -- "add a test" imprime tres líneas JSONL —step_start, text y step_finish con el uso de tokens— y termina con código 0. Luego, dulus -p "write the release notes" > NOTES.md guarda una respuesta en texto plano en un archivo.

App de escritorio para Windows 10 o posterior. La CLI necesita Python 3.11+. En las dos inicias sesión con una cuenta gratis de Dulus. Todas las descargas

Grabado de una cigua palmera de color rojo anaranjado, posada sobre un lápiz y rodeada por una pequeña bandada en vuelo.
Fig. 1 Dulus dominicus — la cigua palmera

Por qué un pájaro

Lleva el nombre de un pájaro que construye en bandada.

El ave nacional de la República Dominicana es la cigua palmera, Dulus dominicus. Solo vive en La Española y es la única especie de su familia.

Las ciguas palmeras viven en bandadas. Juntas levantan un gran nido de ramitas, uno solo, en lo alto de las palmas reales, y adentro cada pareja tiene su propia cámara, con su propia entrada.

Un sistema multiagente en plena naturaleza:
muchas mentes, un solo nido,
cada quien con su cuarto.

Dulus nace de la misma manera. Un humano, Kevin Rojo, marca el rumbo; una bandada de agentes hace el trabajo. El producto se construye tal como trabaja.

  1. La verdad por encima del hype.
  2. Verifica antes de afirmar.
  3. Deja artefactos, no promesas.
  4. Reversible: actúa. Irreversible: pregunta.
  5. El humano es dirección, no operador.
Lee la historia

Por el pájaro, no por el cohete.

Seguimos volando.

Únete a la bandada

Una instalación. Toda una bandada.

Gratis para descargar. Trae tus propias claves, corre un modelo local o carga los alojados con $DULUS.

esc

Acciones