Compartir comentarios
Las respuestas se generan en base a la documentación.

API REST de DMR

Una vez habilitado Model Runner, nuevos endpoints de la API estarán disponibles. Puedes usar estos endpoints para interactuar con un modelo de forma programática. Docker Model Runner proporciona compatibilidad con los formatos de API de OpenAI, Anthropic y Ollama.

Determinar la URL base

La URL base para interactuar con los endpoints depende de cómo ejecutes Docker y de qué formato de API estés utilizando.

Acceso desdeURL base
Contenedoreshttp://model-runner.docker.internal
Procesos del host (TCP)http://localhost:12434
Note

El acceso TCP desde el host debe estar habilitado. Consulta Habilitar Docker Model Runner.

Acceso desdeURL base
Contenedoreshttp://172.17.0.1:12434
Procesos del hosthttp://localhost:12434
Note

Es posible que la interfaz 172.17.0.1 no esté disponible por defecto para los contenedores dentro de un proyecto de Compose. En este caso, añade una directiva extra_hosts al YAML de tu servicio de Compose:

extra_hosts:
  - "model-runner.docker.internal:host-gateway"

De este modo, podrás acceder a las API de Docker Model Runner en http://model-runner.docker.internal:12434/

URL base para herramientas de terceros

Al configurar herramientas de terceros que esperan API compatibles con OpenAI, utiliza estas URL base:

Tipo de herramientaFormato de URL base
SDK / clientes de OpenAIhttp://localhost:12434/engines/v1
SDK / clientes de Anthropichttp://localhost:12434
Clientes compatibles con Ollamahttp://localhost:12434

Consulta Integraciones de IDE y herramientas para ver ejemplos de configuración específicos.

API compatibles

Docker Model Runner admite múltiples formatos de API:

APIDescripciónCaso de uso
API de OpenAICompletados de chat y embeddings compatibles con OpenAILa mayoría de frameworks y herramientas de IA
API de AnthropicEndpoint de mensajes compatible con AnthropicHerramientas creadas para Claude
API de OllamaEndpoints compatibles con OllamaHerramientas creadas para Ollama
API de generación de imágenesGeneración de imágenes basada en DiffusersGeneración de imágenes a partir de prompts de texto
API de DMREndpoints nativos de Docker Model RunnerGestión de modelos

API compatible con OpenAI

DMR implementa la especificación de la API de OpenAI para lograr la máxima compatibilidad con las herramientas y frameworks existentes.

Endpoints

EndpointMétodoDescripción
/engines/v1/modelsGETListar modelos
/engines/v1/models/{namespace}/{name}GETObtener modelo
/engines/v1/chat/completionsPOSTCrear completado de chat
/engines/v1/completionsPOSTCrear completado
/engines/v1/embeddingsPOSTCrear embeddings
Note

Opcionalmente, puedes incluir el nombre del motor en la ruta: /engines/llama.cpp/v1/chat/completions. Esto es útil cuando se ejecutan varios motores de inferencia.

Formato del nombre del modelo

Al especificar un modelo en las solicitudes de la API, utiliza el identificador de modelo completo, incluyendo el espacio de nombres:

{
  "model": "ai/smollm2",
  "messages": [...]
}

Formatos comunes de nombres de modelos:

  • Modelos de Docker Hub: ai/smollm2, ai/llama3.2, ai/qwen2.5-coder
  • Versiones con etiquetas: ai/smollm2:360M-Q4_K_M
  • Modelos personalizados: miorg/mimodel

Parámetros admitidos

Se admiten los siguientes parámetros de la API de OpenAI:

ParámetroTipoDescripción
modelstringRequerido. El identificador del modelo.
messagesarrayRequerido para completados de chat. El historial de la conversación.
promptstringRequerido para completados. El texto del prompt.
max_tokensintegerCantidad máxima de tokens a generar.
temperaturefloatTemperatura de muestreo (0.0-2.0).
top_pfloatParámetro de muestreo nucleus (0.0-1.0).
streamBooleanHabilitar respuestas en streaming.
stopstring/arraySecuencias de parada.
presence_penaltyfloatPenalización de presencia (-2.0 a 2.0).
frequency_penaltyfloatPenalización de frecuencia (-2.0 a 2.0).

Limitaciones y diferencias con OpenAI

Ten en cuenta estas diferencias al utilizar la API compatible con OpenAI de DMR:

CaracterísticaComportamiento de DMR
Clave de APINo requerida. DMR ignora la cabecera Authorization.
Llamada a funcionesAdmitida con llama.cpp para modelos compatibles.
VisiónAdmitida para modelos multimodales (por ejemplo, LLaVA).
Modo JSONAdmitido mediante response_format: {"type": "json_object"}.
LogprobsAdmitido.
Conteo de tokensUtiliza el codificador de tokens nativo del modelo, el cual puede diferir del de OpenAI.

API compatible con Anthropic

DMR proporciona compatibilidad con la API de mensajes de Anthropic para herramientas y frameworks creados para Claude.

Endpoints

EndpointMétodoDescripción
/anthropic/v1/messagesPOSTCrear un mensaje
/anthropic/v1/messages/count_tokensPOSTContar tokens

Parámetros admitidos

Se admiten los siguientes parámetros de la API de Anthropic:

ParámetroTipoDescripción
modelstringRequerido. El identificador del modelo.
messagesarrayRequerido. Los mensajes de la conversación.
max_tokensintegerCantidad máxima de tokens a generar.
temperaturefloatTemperatura de muestreo (0.0-1.0).
top_pfloatParámetro de muestreo nucleus.
top_kintegerParámetro de muestreo top-k.
streamBooleanHabilitar respuestas en streaming.
stop_sequencesarraySecuencias de parada personalizadas.
systemstringPrompt del sistema.

Ejemplo: Chat con la API de Anthropic

curl http://localhost:12434/v1/messages \
  -H "Content-Type: application/json" \
  -d '{
    "model": "ai/smollm2",
    "max_tokens": 1024,
    "messages": [
      {"role": "user", "content": "Hello!"}
    ]
  }'

Ejemplo: Respuesta en streaming

curl http://localhost:12434/v1/messages \
  -H "Content-Type: application/json" \
  -d '{
    "model": "ai/smollm2",
    "max_tokens": 1024,
    "stream": true,
    "messages": [
      {"role": "user", "content": "Count from 1 to 10"}
    ]
  }'

API compatible con Ollama

DMR también proporciona endpoints compatibles con Ollama para herramientas y frameworks creados para Ollama.

Endpoints

EndpointMétodoDescripción
/api/tagsGETListar modelos disponibles
/api/showPOSTMostrar información del modelo
/api/chatPOSTCrear completado de chat
/api/generatePOSTCrear completado
/api/embeddingsPOSTGenerar embeddings

Ejemplo: Chat con la API de Ollama

curl http://localhost:12434/api/chat \
  -H "Content-Type: application/json" \
  -d '{
    "model": "ai/smollm2",
    "messages": [
      {"role": "user", "content": "Hello!"}
    ]
  }'

Ejemplo: Listar modelos

curl http://localhost:12434/api/tags

API de generación de imágenes (Diffusers)

DMR admite la generación de imágenes a través del backend de Diffusers, lo que te permite generar imágenes a partir de prompts de texto utilizando modelos como Stable Diffusion.

Note

El backend de Diffusers requiere una GPU NVIDIA con soporte para CUDA y solo está disponible en Linux (x86_64 y ARM64). Consulta Motores de inferencia para obtener instrucciones de configuración.

Endpoint

EndpointMétodoDescripción
/engines/diffusers/v1/images/generationsPOSTGenerar una imagen a partir de un prompt de texto

Parámetros admitidos

ParámetroTipoDescripción
modelstringRequerido. El identificador del modelo (por ejemplo, stable-diffusion:Q4).
promptstringRequerido. La descripción en texto de la imagen a generar.
sizestringDimensiones de la imagen en formato ANCHO_POR_ALTO (por ejemplo, 512x512).

Formato de respuesta

El API devuelve una respuesta JSON con la imagen generada codificada en base64:

{
  "data": [
    {
      "b64_json": "<base64-encoded-image-data>"
    }
  ]
}

Ejemplo: Generar una imagen

curl -s -X POST http://localhost:12434/engines/diffusers/v1/images/generations \
  -H "Content-Type: application/json" \
  -d '{
    "model": "stable-diffusion:Q4",
    "prompt": "A picture of a nice cat",
    "size": "512x512"
  }' | jq -r '.data[0].b64_json' | base64 -d > image.png

Este comando:

  1. Envía una solicitud POST al endpoint de generación de imágenes de Diffusers.
  2. Especifica el modelo, el prompt y el tamaño de la imagen de salida.
  3. Extrae la imagen codificada en base64 de la respuesta utilizando jq.
  4. Decodifica los datos en base64 y los guarda como image.png.

Endpoints nativos de DMR

Estos endpoints son específicos de Docker Model Runner para la gestión de modelos:

EndpointMétodoDescripción
/models/createPOSTDescargar/crear un modelo
/modelsGETListar modelos locales
/models/{namespace}/{name}GETObtener detalles del modelo
/models/{namespace}/{name}DELETEEliminar un modelo local

Ejemplos de API REST

Solicitud desde el interior de un contenedor

Para llamar al endpoint de OpenAI chat/completions desde el interior de otro contenedor utilizando curl:

#!/bin/sh

curl http://model-runner.docker.internal/engines/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "ai/smollm2",
        "messages": [
            {
                "role": "system",
                "content": "You are a helpful assistant."
            },
            {
                "role": "user",
                "content": "Please write 500 words about the fall of Rome."
            }
        ]
    }'

Solicitud desde el host utilizando TCP

Para llamar al endpoint de OpenAI chat/completions desde el host a través de TCP:

  1. Habilita el soporte de TCP en el lado del host desde la interfaz de usuario de Docker Desktop, o a través de la CLI de Docker Desktop. Por ejemplo: docker desktop enable model-runner --tcp <port>.

    Si estás ejecutando en Windows, habilita también la inferencia respaldada por GPU. Consulta Habilitar Docker Model Runner.

  2. Interactúa con él como se documenta en la sección anterior utilizando localhost y el puerto correcto.

#!/bin/sh

curl http://localhost:12434/engines/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
      "model": "ai/smollm2",
      "messages": [
          {
              "role": "system",
              "content": "You are a helpful assistant."
          },
          {
              "role": "user",
              "content": "Please write 500 words about the fall of Rome."
          }
      ]
  }'

Solicitud desde el host utilizando un socket Unix

Para llamar al endpoint de OpenAI chat/completions a través del socket de Docker desde el host utilizando curl:

#!/bin/sh

curl --unix-socket $HOME/.docker/run/docker.sock \
    localhost/exp/vDD4.40/engines/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "ai/smollm2",
        "messages": [
            {
                "role": "system",
                "content": "You are a helpful assistant."
            },
            {
                "role": "user",
                "content": "Please write 500 words about the fall of Rome."
            }
        ]
    }'

Respuestas en streaming

Para recibir respuestas en streaming, establece stream: true:

curl http://localhost:12434/engines/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
      "model": "ai/smollm2",
      "stream": true,
      "messages": [
          {"role": "user", "content": "Count from 1 to 10"}
      ]
  }'

Uso con SDK de OpenAI

Python

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:12434/engines/v1",
    api_key="not-needed"  # DMR no requiere una clave de API
)

response = client.chat.completions.create(
    model="ai/smollm2",
    messages=[
        {"role": "user", "content": "Hello!"}
    ]
)

print(response.choices[0].message.content)

Node.js

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "http://localhost:12434/engines/v1",
  apiKey: "not-needed",
});

const response = await client.chat.completions.create({
  model: "ai/smollm2",
  messages: [{ role: "user", content: "Hello!" }],
});

console.log(response.choices[0].message.content);

Qué sigue