Контракт: схема сообщения результата recognition-result-message v1.0
Конверт на subject recognition.result: status processing | done | needs_check | error, условные обязательные поля через if/then (done/needs_check → result_s3 и result_schema_version; error → error). group_schema в конверт не входит. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
4be67392ab
commit
a57cf2db49
70
contracts/recognition-result-message.schema.json
Normal file
70
contracts/recognition-result-message.schema.json
Normal file
@ -0,0 +1,70 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "arm-ka/recognition-result-message/v1",
|
||||
"title": "Сообщение результата распознавания (tabular-parser / scan-gateway → arm-core), контракт v1.0",
|
||||
"description": "Тело сообщения на subject recognition.result. Заголовок Nats-Msg-Id (не поле тела) бывает трёх видов: <job_id>:<attempt> — запрос; ack:<job_id>:<attempt> — для status = processing; result:<job_id>:<attempt> — для done, needs_check и error. status = processing — ack «взял в работу», публикуется до чтения файла из S3. group_schema в конверт не входит: источник — файл результата (recognition-result).",
|
||||
"$comment": "Версионирование: schema_version = MAJOR.MINOR. MINOR (1.1) — необязательные поля и новые значения enum; MAJOR (2.0) — удаление/переименование полей, смена типов или семантики. Потребитель принимает тот же MAJOR и любой MINOR.",
|
||||
"type": "object",
|
||||
"required": ["schema_version", "job_id", "file_id", "status", "service"],
|
||||
"properties": {
|
||||
"schema_version": { "const": "1.0" },
|
||||
"job_id": { "type": "string", "format": "uuid", "description": "recognition_job.id" },
|
||||
"file_id": { "type": "string", "format": "uuid", "description": "stored_file.id" },
|
||||
"status": { "enum": ["processing", "done", "needs_check", "error"] },
|
||||
"service": {
|
||||
"type": "object",
|
||||
"required": ["name", "version"],
|
||||
"properties": {
|
||||
"name": { "enum": ["tabular-parser", "scan-gateway"] },
|
||||
"version": { "type": "string" }
|
||||
}
|
||||
},
|
||||
"result_s3": {
|
||||
"type": "object",
|
||||
"description": "файл результата (recognition-result): results/{file_id}/{job_id}/result.json",
|
||||
"required": ["bucket", "key"],
|
||||
"properties": {
|
||||
"bucket": { "type": "string", "minLength": 1 },
|
||||
"key": { "type": "string", "minLength": 1 }
|
||||
}
|
||||
},
|
||||
"result_schema_version": { "type": "string", "pattern": "^\\d+\\.\\d+$", "description": "schema_version файла результата, MAJOR.MINOR" },
|
||||
"error": {
|
||||
"type": "object",
|
||||
"required": ["code", "message"],
|
||||
"properties": {
|
||||
"code": { "enum": ["UNSUPPORTED_FORMAT", "UNREADABLE", "TIMEOUT", "SCHEMA_MISMATCH", "NOT_IMPLEMENTED", "FILE_READ_ERROR", "INVALID_FORMAT", "INVALID_DOCUMENT", "RECOGNITION_FAILED", "UNKNOWN_ERROR"] },
|
||||
"message": { "type": "string" }
|
||||
}
|
||||
},
|
||||
"raw_s3_key": { "type": ["string", "null"], "description": "scan-gateway: raw/{job_id}.json — сырой ответ ИС Сканирование; в БД не регистрируется" },
|
||||
"metrics": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"duration_ms": { "type": "integer" },
|
||||
"pages": { "type": "integer" },
|
||||
"rows": { "type": "integer" },
|
||||
"fields_total": { "type": "integer" },
|
||||
"fields_low_confidence": { "type": "integer" },
|
||||
"fields_unrecognized": { "type": "integer" },
|
||||
"warnings": { "type": "array", "items": { "type": "string" } }
|
||||
}
|
||||
}
|
||||
},
|
||||
"allOf": [
|
||||
{
|
||||
"if": {
|
||||
"properties": { "status": { "enum": ["done", "needs_check"] } },
|
||||
"required": ["status"]
|
||||
},
|
||||
"then": { "required": ["result_s3", "result_schema_version"] }
|
||||
},
|
||||
{
|
||||
"if": {
|
||||
"properties": { "status": { "const": "error" } },
|
||||
"required": ["status"]
|
||||
},
|
||||
"then": { "required": ["error"] }
|
||||
}
|
||||
]
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user