Desarrolladores

Una API compatible con OpenAI, que pagas en Fuel.

Apunta a Dulus el SDK openai que ya usas: una clave, todos los modelos alojados. Cada llamada reserva su Fuel por adelantado, se liquida según los tokens que realmente usó y te entrega el cargo exacto en un header.

URL base https://control.dulus.ai/v1
  • Formato de solicitud de OpenAI
  • Claves guardadas como hashes SHA-256
  • Reembolso total si una llamada falla
app.py openai
import os
from openai import OpenAI
 
client = OpenAI(
    base_url="https://control.dulus.ai/v1",
    api_key=os.environ["DULUS_API_KEY"],
)
 
reply = client.chat.completions.create(
    model="dulus-b-27b",
    messages=[{"role": "user", "content": "Hello"}],
)
200 OK X-Dulus-Model: dulus-b-27b X-Dulus-Fuel-Charged
Solo las líneas doradas son de Dulus. El resto es el SDK openai, tal cual.

Inicio rápido

Tu primera llamada, en tres pasos.

Una cuenta gratis de Dulus, una clave y algo de Fuel. Con eso listo, es la misma solicitud de OpenAI que ya conoces.

  1. Genera una clave

    Inicia sesión en la app de escritorio de Dulus, abre API Keys y haz clic en Create key. Copia la clave secreta enseguida: se muestra una sola vez y se guarda únicamente como un hash SHA-256, así que se puede revocar, pero nunca recuperar.

    • Límite de solicitudes opcional por clave: de 1 a 10,000 por minuto.
    • Vencimiento opcional: de 1 a 3,650 días. Sin vencimiento, la clave funciona hasta que la revoques.
    • Mantenla fuera de tu código: export DULUS_API_KEY=dulus_sk_live_…
  2. Recarga Fuel

    Los modelos alojados se pagan por token en Fuel, y 1 Fuel = 1 $DULUS. Deposita $DULUS por la red Solana en la dirección de depósito personal que aparece en la vista Fuel de la app; se acredita en tu saldo de Fuel con un bono del 1%.

    Cómo funciona Fuel
  3. Haz la llamada

    Cambia la URL base y pon tu clave; todo lo demás es la solicitud de OpenAI de siempre. Elige curl, Python o Node, y cópiala.

curl

curl https://control.dulus.ai/v1/chat/completions \
  -H "Authorization: Bearer $DULUS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "dulus-b-27b",
    "messages": [
      {"role": "user", "content": "Hello from Dulus"}
    ]
  }'

Endpoints

Dos endpoints, al estilo OpenAI.

Las mismas rutas y formatos de solicitud de OpenAI, bajo una sola URL base: https://control.dulus.ai/v1.

POST /v1/chat/completions

Requiere clave

Chat, como en OpenAI. Envía el cuerpo de solicitud que le mandarías a OpenAI; la respuesta vuelve con el mismo formato.

model
El id de un modelo alojado, como dulus-b-27b. Con un id desconocido, recibes un 404.
messages
Mensajes al estilo OpenAI, de 1 a 512 por solicitud.
tools, …
Los campos extra como estos pasan directo al modelo.

El recorrido de cada llamada

  1. Reserva

    Se reserva, de forma atómica, el máximo de Fuel que la llamada podría costar. ¿No te alcanza el Fuel? La llamada se detiene aquí con un 402, antes de que corra ningún modelo.

  2. Ejecución

    El modelo responde a tu solicitud.

  3. Liquidación

    El cargo se calcula con los tokens de entrada, de salida y de razonamiento. Los tokens en caché son gratis.

  4. Devolución

    Lo que sobra de la reserva vuelve de inmediato a tu saldo. Una llamada fallida se reembolsa por completo.

GET /v1/models

Público, sin clave

El id de cada modelo alojado, en el formato de lista de OpenAI. Los del nivel gratis vienen marcados con dulus_free_tier, así un cliente puede etiquetarlos sin tener que adivinar por el nombre.

curl https://control.dulus.ai/v1/models
Respuesta 200 OK
{
  "object": "list",
  "data": [
    {
      "id": "dulus-a-9b",
      "object": "model",
      "created": 0,
      "owned_by": "dulus"
    },
    { "id": "dulus-b-27b", … },
    …
    {
      "id": "dulus-free-9b", …
      "dulus_free_tier": true,
      "dulus_free_daily_limit": 40
    }
  ]
}

Headers

Cada respuesta trae su recibo.

Autentícate con una clave bearer, ponle nombre a la solicitud si quieres y lee el cargo exacto en la respuesta.

Lo que envías

Authorization: Bearer dulus_sk_live_…
Obligatorio en las solicitudes de chat. Si la clave falta, fue revocada o venció, recibes un 401.
Idempotency-Key opcional
Tu id para esta llamada, de hasta 128 caracteres. Cada id se acepta una sola vez por cuenta: si repites una llamada ya cobrada, se rechaza con un 409 en lugar de cobrarse dos veces.
X-Request-ID opcional
Hace lo mismo. Si envías los dos, gana Idempotency-Key.

Lo que recibes

X-Dulus-Fuel-Charged
El Fuel exacto con el que se liquidó esta llamada, como un entero en millonésimas de Fuel. 0 en los modelos del nivel gratis.
X-Dulus-Request-ID
El id con el que se cobró la llamada: el tuyo, o uno que generó Dulus.
X-Dulus-Model
El id del modelo alojado que respondió.
Solicitud POST /v1/chat/completions
Authorization: Bearer dulus_sk_live_…
Content-Type: application/json
Idempotency-Key: invoice-2291-summary

{ "model": "dulus-b-27b", "messages": [ … ] }
Respuesta 200 OK
Content-Type: application/json
X-Dulus-Request-ID: invoice-2291-summary
X-Dulus-Model: dulus-b-27b
X-Dulus-Fuel-Charged: <fuel>
Cache-Control: no-store

{
  "id": "chatcmpl-…",
  "object": "chat.completion",
  "model": "dulus-b-27b",
  "choices": [{
    "index": 0,
    "message": {
      "role": "assistant",
      "content": "Hello! What are we building?"
    },
    "finish_reason": "stop"
  }],
  "usage": {
    "prompt_tokens": 12,
    "completion_tokens": 9,
    "total_tokens": 21
  }
}

<fuel> representa el entero con el que se liquidó tu llamada. Los nombres de los headers no distinguen mayúsculas de minúsculas.

Errores y límites

Cuando dice que no, te dice por qué.

Los errores llegan como JSON con un string detail, y una llamada rechazada o fallida nunca cuesta Fuel.

402 { "detail": "insufficient Fuel for this request" }
Estatus Cuándo Qué hacer
401 La clave falta, fue revocada o venció. Revisa el header Authorization: Bearer o genera una clave nueva en la app.
402 No hay Fuel suficiente para reservar la llamada. En un modelo del nivel gratis: tienes menos de 1,000,000 $DULUS como Fuel. Recarga Fuel y vuelve a enviar la solicitud.
404 Dulus no aloja ningún modelo con ese id. Elige un id de GET /v1/models.
409 Ese id de solicitud ya se usó en una llamada cobrada de tu cuenta. Para una llamada nueva, envía un Idempotency-Key nuevo. La primera respuesta no se vuelve a enviar.
429 Superaste tu límite de solicitudes (por defecto, 60 por minuto por cuenta) o los 40 mensajes cada 24 horas del nivel gratis. Espera los segundos que indica el header Retry-After.
502 503 El modelo upstream falló o no está disponible en este momento. Reintenta con un id de solicitud nuevo. La llamada fallida ya se reembolsó por completo.
  • 60/ min

    Límite de solicitudes por cuenta, por defecto. Cada clave puede tener el suyo, de 1 a 10,000 por minuto.

  • 512mensajes

    El máximo que admite una sola solicitud de chat. Hace falta al menos uno.

  • 40/ 24 h

    Mensajes del nivel gratis, de hasta 2,048 tokens de salida cada uno, mientras tengas al menos 1,000,000 $DULUS como Fuel.

  • por diseño

    Una clave de API no puede leer tu saldo de Fuel ni generar otras claves. Para eso hace falta la app de Dulus con tu sesión iniciada.

Modelos

Rápido, equilibrado o el grandote.

Las tarifas son relativas, por token: un modelo 2× gasta Fuel el doble de rápido que uno 1×. Para la lista en vivo, consulta GET /v1/models.

Copia el id del modelo.

  1. 1×

  2. 2×

  3. 3×

  4. 4×

  5. 0×

    Nivel gratis para holders. Mantén al menos 1,000,000 $DULUS como Fuel en tu saldo de Dulus y recibe 40 mensajes gratis cada 24 horas, de hasta 2,048 tokens de salida cada uno. El saldo se mantiene, nunca se gasta.

Haz clic en un id para copiarlo.

Compara todos los modelos

Automatiza el agente

Automatiza el propio agente.

La API te da los modelos. La CLI dulus te da el agente completo, con sus herramientas, su memoria y sus permisos, desde cualquier script de shell.

Modo print

Entra un prompt, trabaja el agente entero, sale la respuesta. Y ahí termina.

$ dulus -p "summarize the open TODOs in this repo"

Un flujo de eventos JSONL

Con --output json, stdout solo lleva eventos JSONL (step_start, text, step_finish, error) y todo lo que es para humanos se va a stderr. Si el turno falla, el código de salida es 1.

--accept-all se salta todas las solicitudes de permiso. Resérvalo para prompts en los que confíes.

$ dulus -p --accept-all --output json -- "add a test"
{"type": "step_start"}
{"type": "text", "part": {"text": "Added a test. It passes."}}
{"type": "step_finish", "part": {"reason": "stop", …}}

Comandos slash

Ejecuta un comando slash y termina, sin abrir el REPL. En el ejemplo, /status.

$ dulus -c "/status"

Extiéndelo

  • Servidores MCP

    Conecta servidores por stdio, SSE o HTTP. El MCP Market de la app busca entre miles y te ofrece una revisión de seguridad antes de cada instalación.

  • Skills

    Agent Skills (SKILL.md) del marketplace oficial de Anthropic, skills.sh y más. El Skills Market de la app busca entre decenas de miles.

  • Plugins

    /plugin install name@git_url agrega herramientas, skills y configuraciones de MCP, con recarga en caliente.

Genera una clave. Haz la llamada.

Descarga Dulus, abre API Keys y apunta tu cliente a control.dulus.ai/v1. Tu primera respuesta está a unas pocas líneas.

esc

Acciones