Reglas comunes
- Normativa
- Borrador 1.0
- Actualizado
- Ver como Markdown
9.1 Versiones y extensiones
Cada solicitud LMSP PUEDE llevar estas cabeceras:
LMSP-Version: 1.0
LMSP-Client: example-client/1.2.0
LMSP-Version es la versión del protocolo a la que se dirige el cliente. LMSP-Client identifica el software cliente con fines de diagnóstico, como name/version. Un servicio NO DEBE cambiar el comportamiento del protocolo en función de esta última.
Reglas:
- La
v1de la ruta indica la versión mayor. - Una solicitud que nombra una versión mayor desconocida se responde con
426 Upgrade Requiredy el código de errorunsupported_protocol_version. - Los nuevos campos opcionales NO DEBEN romper la compatibilidad 1.x.
- Los servicios y los clientes DEBEN ignorar los campos que no conocen.
- Las extensiones privadas van en un objeto
extensionsy se nombran con notación de dominio inverso:
{
"extensions": {
"com.example.cache": {
"enabled": true
}
}
}
9.2 Idempotencia
Las solicitudes que crean algo, como crear una respuesta, crear una tarea o cargar un modelo, aceptan una clave de idempotencia:
Idempotency-Key: <client-generated-unique-value>
El servicio almacena la clave junto con un resumen criptográfico del cuerpo de la solicitud y el resultado:
- La misma clave con el mismo cuerpo devuelve el resultado original.
- La misma clave con un cuerpo distinto se responde con
409 Conflictyidempotency_conflict.
Una clave se limita al cliente y al endpoint. DEBERÍA ser un valor único de como máximo 255 caracteres, como un ULID o un UUID. Un servicio DEBERÍA conservar las claves al menos 24 horas.
Un servicio PUEDE ignorar la clave en las solicitudes en streaming. Un cliente que necesita reintentos seguros usa una tarea.
9.3 Errores
Todo error de la interfaz LMSP usa application/problem+json (RFC 9457):
{
"type": "urn:lmsp:error:model-not-found",
"title": "Model not found",
"status": 404,
"code": "model_not_found",
"detail": "No local model with id 'qwen3:14b-q4_k_m'",
"request_id": "req_01J8M9S6Y4W8C3P5R1V7Z2A0DH",
"retryable": false
}
| Campo | Obligatorio | Significado |
|---|---|---|
type |
Sí | URI que identifica el tipo de error. LMSP usa urn:lmsp:error: seguido del código con guiones en lugar de guiones bajos. |
title |
Sí | Resumen breve y legible. |
status |
Sí | El código de estado HTTP. |
code |
Sí | Código de error legible por máquina, de la lista siguiente. |
detail |
No | Explicación legible de esta ocurrencia. NO DEBE contener secretos, prompts ni contenido generado. |
request_id |
No | Identificador de la solicitud, para correlacionarla con los registros del servicio. |
retryable |
Sí | Si repetir la solicitud más tarde puede tener éxito. |
Códigos de error habituales:
| Código | Estado HTTP | Reintentable | Significado |
|---|---|---|---|
invalid_request |
400 | No | La solicitud está mal formada o tiene parámetros no válidos. |
unauthorized |
401 | No | Falta el token, no es válido, ha caducado o se ha revocado, o un código de emparejamiento es incorrecto. |
forbidden |
403 | No | El token no tiene el ámbito necesario, o falló la comprobación de Origin o Host. |
model_not_found |
404 | No | Ningún modelo local tiene este id. |
model_not_ready |
409 | Sí | El modelo no está cargado y no se carga bajo demanda. |
model_load_failed |
500 | Sí | Falló la carga del modelo. |
context_length_exceeded |
400 | No | La entrada no cabe en la ventana de contexto del modelo. |
unsupported_capability |
400 o 501 | No | El modelo o el servicio no admite lo que necesita la solicitud. Un endpoint opcional no implementado responde 501. |
unsupported_protocol_version |
426 | No | El servicio no admite la versión mayor solicitada. |
response_not_found |
404 | No | Ninguna respuesta almacenada tiene este id. |
task_not_found |
404 | No | Ninguna tarea tiene este id. |
task_not_cancelable |
409 | No | La tarea ya ha terminado correctamente o con un fallo. |
idempotency_conflict |
409 | No | La clave de idempotencia ya se usó con un cuerpo de solicitud distinto. |
event_history_expired |
410 | No | Los eventos solicitados son anteriores al período de retención. |
rate_limited |
429 | Sí | Demasiadas solicitudes. |
resource_exhausted |
503 | Sí | Al dispositivo se le acabó la memoria u otro recurso. |
backend_unavailable |
503 | Sí | No se puede acceder al entorno de ejecución del modelo. |
server_restarted |
503 | Sí | El servicio se reinició mientras la tarea estaba sin terminar. |
internal_error |
500 | Varía | Un fallo inesperado dentro del servicio. |
El campo retryable es el que prevalece. La columna anterior muestra el valor habitual. Un servicio PUEDE definir más códigos. Un cliente DEBE tratar un código que no conoce según su estado HTTP y su campo retryable.
9.4 Comprobación de estado
GET /lmsp/v1/health
{
"status": "ready",
"service_id": "svc_01J8M4Y8K6M5E6K6Z7Z0Y8W3M2",
"uptime_seconds": 86420,
"loaded_models": 1,
"active_tasks": 2,
"storage": "ok"
}
| Campo | Significado |
|---|---|
status |
starting, ready, degraded o stopping. |
service_id |
El id del servicio de la descripción del servicio. |
uptime_seconds |
Segundos desde que se inició el servicio. |
loaded_models |
Número de modelos en estado ready. |
active_tasks |
Número de tareas que están queued, loading, running o cancelling. |
storage |
ok o error. |
El estado HTTP es 200 OK cuando status es ready o degraded, y 503 Service Unavailable en caso contrario.
El endpoint de estado devuelve solo el estado operativo. NO DEBE devolver rutas de modelos, prompts, tokens de acceso ni otra información sensible.