Regras comuns
- Normativa
- Rascunho 1.0
- Atualizado em
- Ver como Markdown
9.1 Versões e extensões
Cada requisição LMSP PODE carregar estes cabeçalhos:
LMSP-Version: 1.0
LMSP-Client: example-client/1.2.0
LMSP-Version é a versão do protocolo que o cliente tem como alvo. LMSP-Client identifica o software cliente para fins de diagnóstico, como name/version. Um serviço NÃO DEVE alterar o comportamento do protocolo com base nele.
Regras:
- O
v1no caminho denota a versão principal. - Uma requisição que nomeia uma versão principal desconhecida é respondida com
426 Upgrade Requirede o código de errounsupported_protocol_version. - Novos campos opcionais NÃO DEVEM quebrar a compatibilidade da 1.x.
- Serviços e clientes DEVEM ignorar os campos que não conhecem.
- As extensões privadas ficam em um objeto
extensionse são nomeadas em notação de domínio reverso:
{
"extensions": {
"com.example.cache": {
"enabled": true
}
}
}
9.2 Idempotência
As requisições que criam algo, como criar uma resposta, criar uma tarefa ou carregar um modelo, aceitam uma chave de idempotência:
Idempotency-Key: <client-generated-unique-value>
O serviço armazena a chave junto com um digest do corpo da requisição e o resultado:
- A mesma chave com o mesmo corpo retorna o resultado original.
- A mesma chave com um corpo diferente é respondida com
409 Conflicteidempotency_conflict.
Uma chave tem como escopo o cliente e o endpoint. Ela DEVERIA ser um valor único de no máximo 255 caracteres, como um ULID ou um UUID. Um serviço DEVERIA guardar as chaves por pelo menos 24 horas.
Um serviço PODE ignorar a chave em requisições em streaming. Um cliente que precisa de novas tentativas seguras usa uma tarefa.
9.3 Erros
Todo erro na interface 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 | Obrigatório | Significado |
|---|---|---|
type |
Sim | URI que identifica o tipo de erro. O LMSP usa urn:lmsp:error: seguido do código com hifens no lugar de sublinhados. |
title |
Sim | Resumo curto e legível por pessoas. |
status |
Sim | O código de status HTTP. |
code |
Sim | Código de erro legível por máquina, da lista abaixo. |
detail |
Não | Explicação legível por pessoas desta ocorrência. Ela NÃO DEVE conter segredos, prompts nem conteúdo gerado. |
request_id |
Não | Identificador da requisição, para correlação com os logs do serviço. |
retryable |
Sim | Se repetir a requisição mais tarde pode dar certo. |
Códigos de erro comuns:
| Código | Status HTTP | Repetível | Significado |
|---|---|---|---|
invalid_request |
400 | Não | A requisição está malformada ou tem parâmetros inválidos. |
unauthorized |
401 | Não | O token está ausente, é inválido, expirou ou foi revogado, ou um código de pareamento está errado. |
forbidden |
403 | Não | O token não tem o escopo exigido, ou a verificação de Origin ou Host falhou. |
model_not_found |
404 | Não | Nenhum modelo local tem este ID. |
model_not_ready |
409 | Sim | O modelo não está carregado e não é carregado sob demanda. |
model_load_failed |
500 | Sim | O carregamento do modelo falhou. |
context_length_exceeded |
400 | Não | A entrada não cabe na janela de contexto do modelo. |
unsupported_capability |
400 ou 501 | Não | O modelo ou o serviço não suporta o que a requisição exige. Um endpoint opcional não implementado responde 501. |
unsupported_protocol_version |
426 | Não | O serviço não suporta a versão principal solicitada. |
response_not_found |
404 | Não | Nenhuma resposta armazenada tem este ID. |
task_not_found |
404 | Não | Nenhuma tarefa tem este ID. |
task_not_cancelable |
409 | Não | A tarefa já foi concluída com sucesso ou falhou. |
idempotency_conflict |
409 | Não | A chave de idempotência já foi usada com outro corpo de requisição. |
event_history_expired |
410 | Não | Os eventos solicitados são mais antigos que o período de retenção. |
rate_limited |
429 | Sim | Requisições demais. |
resource_exhausted |
503 | Sim | O dispositivo ficou sem memória ou sem outro recurso. |
backend_unavailable |
503 | Sim | Não é possível alcançar o ambiente de execução do modelo. |
server_restarted |
503 | Sim | O serviço foi reiniciado enquanto a tarefa estava inacabada. |
internal_error |
500 | Varia | Uma falha inesperada dentro do serviço. |
O campo retryable é a referência definitiva. A coluna acima mostra o valor usual. Um serviço PODE definir outros códigos. Um cliente DEVE tratar um código que não conhece pelo seu status HTTP e pelo seu campo retryable.
9.4 Verificação de integridade
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 ou stopping. |
service_id |
O ID do serviço da descrição do serviço. |
uptime_seconds |
Segundos desde que o serviço foi iniciado. |
loaded_models |
Número de modelos no estado ready. |
active_tasks |
Número de tarefas que estão queued, loading, running ou cancelling. |
storage |
ok ou error. |
O status HTTP é 200 OK quando status é ready ou degraded, e 503 Service Unavailable nos demais casos.
O endpoint de integridade retorna apenas o status operacional. Ele NÃO DEVE retornar caminhos de modelos, prompts, tokens de acesso nem outras informações sensíveis.