Documentació d'Asset Core

Documentació del motor d'estat del món determinista i referències de l'API.

Decision Gate docs

Error Model

Asset Core utilitza codis d’estat HTTP estàndard amb respostes d’error de detalls del problema RFC 9457. Aquesta referència descriu el model d’error i les condicions d’error comunes. Està dissenyada per ser estable perquè els clients puguin construir una lògica de reintents i remediació previsible.

Visió general

Els errors es retornen com a càrregues application/problem+json amb una taxonomia estable, codis llegibles per màquina i orientació opcional per a reintents. El codi d’estat HTTP indica la categoria d’error, mentre que el cos proporciona detalls específics. Tracteu el camp code com l’identificador canònic llegible per màquina.

Estructura

Resposta d’Error de Lectura/Escriptura (Detalls del Problema)

{
  "type": "urn:assetcore:error:CONTAINER_NOT_FOUND",
  "title": "NotFoundError",
  "status": 404,
  "detail": "Container 1001 not found",
  "code": "CONTAINER_NOT_FOUND",
  "retryable": false,
  "hint": "Verify the container ID",
  "server_correlation_id": "wr-0000000000000001-0000000000000042",
  "client_correlation_id": "client-req-2026-01-15",
  "details": {
    "container_id": 1001
  }
}

Camps de Detall d’Error

CampTipusDescripció
typecadenaURI de tipus RFC 9457 (Asset Core utilitza urn:assetcore:error:\CODE“)
titlecadenaNom curt de la classe d’error (ValidationError, NotFoundError)
statusenterCodi d’estat HTTP
detailcadenaExplicació llegible per humans
codecadenaIdentificador d’error llegible per màquina (SCREAMING_SNAKE_CASE)
retryablebooleàSi els clients han de tornar a intentar
retry_after_msenterSuggeriment opcional de tornar a intentar després en mil·lisegons (429/503)
hintcadenaSuggeriment opcional de remediació
auth_reasoncadenaMotiu opcional de denegació d’autenticació (només quan la divulgació és reason_code)
server_correlation_idcadenaID de correlació assignat pel servidor opcional
client_correlation_idcadenaID de correlació proporcionat pel client opcional
detailsobjecteDetalls estructurats opcionals
core_errorobjecteCàrrega d’error central serialitzada opcional (només per al daemon d’escriptura)

Campanyes

Codi d’estat HTTP

EstatSignificatQuan s’utilitza
200 OKÈxitSol·licitud completada amb èxit
400 Bad RequestSol·licitud invàlidaJSON malformat, camps mancants
401 UnauthorizedNo autenticatToken de portador mancant o invàlid
403 ForbiddenNo permèsEl principal no té permís o accés a l’espai de noms
404 Not FoundRecurso no trobatEl contenidor o la classe no existeix
409 ConflictConflicte d’estatCol·lisió de la clau d’idempotència, ja existeix
422 Unprocessable EntityValidació fallidaCondicions prèvies de l’operació no complertes
425 Too EarlyLectura obsoletaSeqüència mínima del món no assolida (punts finals de lectura)
429 Too Many RequestsLimitat per taxaQuota o límits de taxa d’autenticació
500 Internal Server ErrorError del servidorFallades inesperades
503 Service UnavailableTemporalment no disponibleSobrecàrrega, apagant-se

Codi d’Error Comú

Errors de contenidor

CodiEstatDescripció
CONTAINER_NOT_FOUND404El contenidor especificat no existeix
CONTAINER_ALREADY_EXISTS409L’ID del contenidor ja està en ús
WRONG_CONTAINER_KIND422Operació no suportada per aquest tipus de contenidor

Errors de Balance

CodiEstatDescripció
INVALID_QUANTITY422La quantitat ha de ser superior a zero
INSUFFICIENT_BALANCE422No hi ha prou saldo per a l’operació
INVALID_OPERATION422L’operació causaria un desbordament o és invàlida

Errors d’Instància

CodiEstatDescripció
INSTANCE_NOT_FOUND404La instància especificada no existeix
ALREADY_ATTACHED409La instància ja té un pare
NOT_ATTACHED422La instància no té cap pare del qual desconnectar-se
HAS_CHILDREN422Cal desconnectar els fills abans de cremar
WOULD_CREATE_CYCLE422L’adjunció crearia un cicle

Errors de Slot

CodiEstatDescripció
SLOT_OUT_OF_BOUNDS422L’índex del slot excedeix la capacitat del contenidor
SLOT_OCCUPIED409El slot ja conté una instància
SLOT_EMPTY422El slot no conté cap instància

Errors d’Esquema

CodiEstatDescripció
UNREGISTERED_CLASS404La classe especificada no està registrada
CLASS_ALREADY_EXISTS409L’ID de classe ja està registrat
SHAPE_ALREADY_REGISTERED409La forma ja existeix per a aquesta classe
UNREGISTERED_CLASS_SHAPE422Forma requerida però no registrada

Errors del sistema

CodiEstatDescripció
INVALID_REQUEST400JSON malformat o paràmetres invàlids
PAYLOAD_TOO_LARGE413El cos de la sol·licitud supera els límits configurats
UNSUPPORTED_MEDIA_TYPE415Content-Type no és JSON
INTEGER_OVERFLOW500Desbordament numèric (error)
SERVICE_UNAVAILABLE503El sistema està sobrecarregat o s’està apagant

Exemples

Sol·licitud incorrecta (400)

JSON invàlid:

{
  "type": "urn:assetcore:error:INVALID_REQUEST",
  "title": "ValidationError",
  "status": 400,
  "detail": "Failed to parse JSON body",
  "code": "INVALID_REQUEST",
  "retryable": false,
  "details": {
    "position": 42,
    "expected": "string"
  }
}

No Trobat (404)

El contenidor no existeix:

{
  "type": "urn:assetcore:error:CONTAINER_NOT_FOUND",
  "title": "NotFoundError",
  "status": 404,
  "detail": "Container 1001 does not exist",
  "code": "CONTAINER_NOT_FOUND",
  "retryable": false,
  "details": {
    "container_id": 1001
  }
}

Conflicte (409)

La clau d’idempotència ja s’ha utilitzat amb contingut diferent:

{
  "type": "urn:assetcore:error:IDEMPOTENCY_CONFLICT",
  "title": "ConflictError",
  "status": 409,
  "detail": "Idempotency key 'create-1001' was used with different request content",
  "code": "IDEMPOTENCY_CONFLICT",
  "retryable": false,
  "details": {
    "idempotency_key": "create-1001"
  }
}

Entitat No Processable (422)

Saldo insuficient:

{
  "type": "urn:assetcore:error:INSUFFICIENT_BALANCE",
  "title": "ValidationError",
  "status": 422,
  "detail": "Insufficient balance: requested 500, available 100",
  "code": "INSUFFICIENT_BALANCE",
  "retryable": false,
  "details": {
    "container_id": 1001,
    "class_id": 100,
    "key": 1,
    "requested": 500,
    "available": 100
  }
}

Servei No Disponible (503)

Sistema sobrecarregat:

{
  "type": "urn:assetcore:error:SERVICE_UNAVAILABLE",
  "title": "UnavailableError",
  "status": 503,
  "detail": "System is at capacity, please retry later",
  "code": "SERVICE_UNAVAILABLE",
  "retryable": true,
  "retry_after_ms": 100,
  "details": {
    "queue_depth": 1000
  }
}