{"openapi": "3.1.0", "info": {"title": "Contextra Analytics API", "version": "1.1.0"}, "paths": {"/live": {"get": {"summary": "Live", "description": "FastAPI \ud504\ub85c\uc138\uc2a4\uac00 \uc694\uccad\uc5d0 \uc751\ub2f5 \uac00\ub2a5\ud55c\uc9c0 \ud655\uc778\ud55c\ub2e4.", "operationId": "live_live_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/health": {"get": {"summary": "Health", "description": "\ud544\uc218 Runtime dependency\uc758 \uc0c1\uc138 \uc0c1\ud0dc\ub97c \ubc18\ud658\ud55c\ub2e4.", "operationId": "health_health_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/ready": {"get": {"summary": "Ready", "description": "Triton model, PostgreSQL\uacfc Redis \uc900\ube44 \uc0c1\ud0dc\ub97c \ud310\uc815\ud55c\ub2e4.", "operationId": "ready_ready_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/models/{model_name}": {"get": {"summary": "Get Model Info", "description": "Triton \ubaa8\ub378 \uba54\ud0c0\ub370\uc774\ud130 \uc870\ud68c (\uc785\ub825/\ucd9c\ub825 shape \ud3ec\ud568)", "operationId": "get_model_info_models__model_name__get", "parameters": [{"name": "model_name", "in": "path", "required": true, "schema": {"type": "string", "title": "Model Name"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/infer/{model_name}": {"post": {"summary": "Infer", "description": "\uae30\ubcf8 \ucd94\ub860 API \u2014 RF-DETR \uac1d\uccb4 \ud0d0\uc9c0 + PostgreSQL \uc800\uc7a5 + Redis Streams \ubc1c\ud589\n\nArgs:\n    model_name: Triton \ubaa8\ub378\uba85 (\uc608: RFDETRMedium)\n    image_path: \ucee8\ud14c\uc774\ub108 \ub0b4\ubd80 \uc774\ubbf8\uc9c0 \uacbd\ub85c\n                \uc608: /opt/contextra/app/test_user_images/B5-1024x576.jpg\n    confidence_threshold: \ud0d0\uc9c0 \uc2e0\ub8b0\ub3c4 \uc784\uacc4\uac12 (\uae30\ubcf8 0.3)\n    stream_id: \uc2a4\ud2b8\ub9bc ID (\uba54\ud0c0\ub370\uc774\ud130\uc6a9, \uae30\ubcf8 CAM_01)\n    site_id: \uc0ac\uc774\ud2b8 ID (\uba54\ud0c0\ub370\uc774\ud130\uc6a9, \uae30\ubcf8 SITE01)\n\nReturns:\n    \ud0d0\uc9c0 \uacb0\uacfc \ubaa9\ub85d (class_id, class_name, confidence, bbox)", "operationId": "infer_infer__model_name__post", "parameters": [{"name": "model_name", "in": "path", "required": true, "schema": {"type": "string", "title": "Model Name"}}, {"name": "image_path", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "\ucee8\ud14c\uc774\ub108 \ub0b4\ubd80 \uc774\ubbf8\uc9c0 \uacbd\ub85c", "title": "Image Path"}, "description": "\ucee8\ud14c\uc774\ub108 \ub0b4\ubd80 \uc774\ubbf8\uc9c0 \uacbd\ub85c"}, {"name": "confidence_threshold", "in": "query", "required": false, "schema": {"type": "number", "maximum": 1.0, "minimum": 0.0, "default": 0.3, "title": "Confidence Threshold"}}, {"name": "stream_id", "in": "query", "required": false, "schema": {"type": "string", "description": "\uc2a4\ud2b8\ub9bc ID (\uba54\ud0c0\ub370\uc774\ud130\uc6a9)", "default": "CAM_01", "title": "Stream Id"}, "description": "\uc2a4\ud2b8\ub9bc ID (\uba54\ud0c0\ub370\uc774\ud130\uc6a9)"}, {"name": "site_id", "in": "query", "required": false, "schema": {"type": "string", "description": "\uc0ac\uc774\ud2b8 ID (\uba54\ud0c0\ub370\uc774\ud130\uc6a9)", "default": "SITE01", "title": "Site Id"}, "description": "\uc0ac\uc774\ud2b8 ID (\uba54\ud0c0\ub370\uc774\ud130\uc6a9)"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/v1/models": {"get": {"summary": "List Models", "description": "Triton\uc5d0 \ub85c\ub4dc\ub41c \ubaa8\ub4e0 \ubaa8\ub378 \ubaa9\ub85d (det + pose + seg)", "operationId": "list_models_api_v1_models_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/v1/inference-rules": {"get": {"summary": "Get Inference Rules", "description": "\ubca0\uc774\uc2a4 \ucd94\ub860 \ub8f0 (\uc5ed\ud560\ubcc4 \uae30\ubcf8 \ubaa8\ub378 + \ud3f4\ubc31 \uccb4\uc778 + \ud65c\uc131/\uac15\ub4f1 \uc0c1\ud0dc).\n\nMLOps \uac00\uc2dc\uc131: det/pose/seg \uac01\uac01 \uc5b4\ub5a4 \ubaa8\ub378\uc774 \ud65c\uc131\uc778\uc9c0, primary\uac00 \uc8fd\uace0\nfallback\uc73c\ub85c \uac15\ub4f1(degraded=true)\ub41c \uc0c1\ud0dc\uc778\uc9c0 \ud55c\ub208\uc5d0 \ud655\uc778. \uc77d\uae30 \uc804\uc6a9 \u2014\n\ub77c\uc774\ube0c \ud30c\uc774\ud504\ub77c\uc778 \uacbd\ub85c\ub294 \uac74\ub4dc\ub9ac\uc9c0 \uc54a\ub294\ub2e4 (\uc804\ud658\uc740 \ubcc4\ub3c4 \ub2e8\uacc4).", "operationId": "get_inference_rules_api_v1_inference_rules_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/v1/frames": {"get": {"summary": "Get Frames", "description": "\ud074\ub77c\uc774\uc5b8\ud2b8\uc6a9: \ucd5c\uadfc \ud504\ub808\uc784 + \ud0d0\uc9c0 \uacb0\uacfc \uc870\ud68c", "operationId": "get_frames_api_v1_frames_get", "parameters": [{"name": "stream_id", "in": "query", "required": false, "schema": {"type": "string", "default": "CAM_01", "title": "Stream Id"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": 30, "title": "Limit"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/v1/streams/{stream_id}/zones": {"get": {"summary": "List Stream Zones", "description": "\uc2a4\ud2b8\ub9bc\uc758 zone \ubaa9\ub85d (\ube44\ud65c\uc131 \ud3ec\ud568).", "operationId": "list_stream_zones_api_v1_streams__stream_id__zones_get", "parameters": [{"name": "stream_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Stream Id"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/v1/streams/{stream_id}/zones/{name}": {"put": {"summary": "Upsert Stream Zone", "description": "zone \uc0dd\uc131/\uac31\uc2e0 (\uac31\uc2e0 \uc2dc version+1). geometry \uac80\uc99d \uc2e4\ud328 \u2192 422.\n\n\uc800\uc7a5\ub9cc \uc218\ud589 \u2014 \uc801\uc6a9\uc740 \ud574\ub2f9 \uc2a4\ud2b8\ub9bc /restart \uc2dc (\uc5d4\uc9c4\uc774 \uae30\ub3d9 \uc2dc zone \ub85c\ub4dc).", "operationId": "upsert_stream_zone_api_v1_streams__stream_id__zones__name__put", "parameters": [{"name": "stream_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Stream Id"}}, {"name": "name", "in": "path", "required": true, "schema": {"type": "string", "title": "Name"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ZoneSpec"}}}}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "delete": {"summary": "Delete Stream Zone", "operationId": "delete_stream_zone_api_v1_streams__stream_id__zones__name__delete", "parameters": [{"name": "stream_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Stream Id"}}, {"name": "name", "in": "path", "required": true, "schema": {"type": "string", "title": "Name"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/v1/streams/{stream_id}/zones/{name}/active": {"post": {"summary": "Set Zone Active", "description": "zone \ud65c\uc131 \ud1a0\uae00 (\uc0ad\uc81c \uc5c6\uc774 \uc77c\uc2dc \ube44\ud65c\uc131\ud654).", "operationId": "set_zone_active_api_v1_streams__stream_id__zones__name__active_post", "parameters": [{"name": "stream_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Stream Id"}}, {"name": "name", "in": "path", "required": true, "schema": {"type": "string", "title": "Name"}}, {"name": "active", "in": "query", "required": false, "schema": {"type": "boolean", "default": true, "title": "Active"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/v1/events": {"get": {"summary": "List Events", "description": "\uc774\ubca4\ud2b8 \ubaa9\ub85d \uc870\ud68c \u2014 context_frames(\uc99d\uac70 \ud504\ub808\uc784 \uc218) \ud3ec\ud568.\n\nverified \ud544\ud130: true=\uac80\uc99d \uc644\ub8cc\ub9cc, false=\ubbf8\uac80\uc99d\ub9cc.", "operationId": "list_events_api_v1_events_get", "parameters": [{"name": "stream_id", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Stream Id"}}, {"name": "event_type", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Event Type"}}, {"name": "verified", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Verified"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": 50, "title": "Limit"}}, {"name": "offset", "in": "query", "required": false, "schema": {"type": "integer", "default": 0, "title": "Offset"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/v1/events/{event_id}": {"get": {"summary": "Get Event", "description": "\ub2e8\uc77c \uc774\ubca4\ud2b8 \uc0c1\uc138 (\uc99d\uac70 \ud504\ub808\uc784 \uc218 \ud3ec\ud568).", "operationId": "get_event_api_v1_events__event_id__get", "parameters": [{"name": "event_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Event Id"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/v1/events/{event_id}/frames": {"get": {"summary": "Get Event Frames", "description": "\uc774\ubca4\ud2b8 \uc99d\uac70 \ud504\ub808\uc784 \ubaa9\ub85d \u2014 frames.event_context->>'event_id' \ub9e4\uce6d.\n\n\uc774\ubca4\ud2b8 \uac8c\uc774\ud2b8 \uc601\uc18d\ud654 \uc2dc \uc800\uc7a5\ub41c \ud504\ub808\uc784\uc740 \uc804\ubd80 \uc774 \uc774\ubca4\ud2b8\uc758 \u00b1\uc708\ub3c4\uc6b0(\uc804 10s/\ud6c4 5s) \uc99d\uac70.", "operationId": "get_event_frames_api_v1_events__event_id__frames_get", "parameters": [{"name": "event_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Event Id"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": 100, "title": "Limit"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/v1/events/{event_id}/verify": {"post": {"summary": "Verify Event", "description": "\uc774\ubca4\ud2b8 \uac80\uc99d \ub77c\ubca8\ub9c1 \u2014 \uc624\ud0d0(false)/\uc815\ub2f5(true) \uad6c\ubd84.\n\nis_verified=false \u2192 \uc624\ud0d0(\ud5c8\uc704 \uacbd\ubcf4), true \u2192 \uc815\ub2f5(\uc2e4\uc81c \uc774\ubca4\ud2b8).\nverified_at/verified_by \uc790\ub3d9 \uae30\ub85d.", "operationId": "verify_event_api_v1_events__event_id__verify_post", "parameters": [{"name": "event_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Event Id"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EventVerifyRequest"}}}}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/metrics": {"get": {"summary": "Prometheus Metrics", "description": "Prometheus text-format metrics \u2014 live state from stream manager + Triton.", "operationId": "prometheus_metrics_metrics_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/v1/streams/{stream_id}/metrics": {"post": {"summary": "Metrics Window", "operationId": "metrics_window_api_v1_streams__stream_id__metrics_post", "parameters": [{"name": "stream_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Stream Id"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/MetricsWindow"}}}}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/v1/metadata/status": {"get": {"summary": "Metadata Status", "operationId": "metadata_status_api_v1_metadata_status_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/v1/streams/{stream_id}/settings": {"get": {"summary": "Get Settings", "operationId": "get_settings_api_v1_streams__stream_id__settings_get", "parameters": [{"name": "stream_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Stream Id"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "patch": {"summary": "Patch Settings", "operationId": "patch_settings_api_v1_streams__stream_id__settings_patch", "parameters": [{"name": "stream_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Stream Id"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SettingsPatch"}}}}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/v1/streams": {"get": {"summary": "List Streams", "description": "\ubaa8\ub4e0 \uc2a4\ud2b8\ub9bc \uc0c1\ud0dc (detail=true \uc2dc \ucd5c\uc2e0 \ud504\ub808\uc784 \ud0d0\uc9c0 \uc694\uc57d \ud3ec\ud568)", "operationId": "list_streams_api_v1_streams_get", "parameters": [{"name": "detail", "in": "query", "required": false, "schema": {"type": "boolean", "default": false, "title": "Detail"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "post": {"summary": "Add Stream", "description": "\uc2a4\ud2b8\ub9bc\uc744 \ub4f1\ub85d\ud55c\ub2e4. \uc2e4\uc81c \uc2e4\ud589\uc740 \uba85\uc2dc\uc801\uc778 start \uc694\uccad\uc73c\ub85c\ub9cc \uc218\ud589\ud55c\ub2e4.\n\n\uc18c\uc2a4 \ud574\uc11d \uc2e4\ud328(onvif \uc778\uc99d/\ubc1c\uacac \ub4f1)\ub294 201 + state=error + last_error \ub85c \ubc18\ud658 \u2014\n\uc2a4\ud2b8\ub9bc\uc740 \ub808\uc9c0\uc2a4\ud2b8\ub9ac\uc5d0 \ub4f1\ub85d\ub418\ubbc0\ub85c \uc218\uc815 \ud6c4 /restart \uac00\ub2a5.", "operationId": "add_stream_api_v1_streams_post", "parameters": [{"name": "start", "in": "query", "required": false, "schema": {"type": "boolean", "default": false, "title": "Start"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/StreamSpec"}}}}, "responses": {"201": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/v1/streams/{stream_id}": {"get": {"summary": "Stream Status", "operationId": "stream_status_api_v1_streams__stream_id__get", "parameters": [{"name": "stream_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Stream Id"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "delete": {"summary": "Remove Stream", "operationId": "remove_stream_api_v1_streams__stream_id__delete", "parameters": [{"name": "stream_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Stream Id"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/v1/streams/{stream_id}/start": {"post": {"summary": "Start Stream", "operationId": "start_stream_api_v1_streams__stream_id__start_post", "parameters": [{"name": "stream_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Stream Id"}}], "responses": {"202": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/v1/streams/{stream_id}/stop": {"post": {"summary": "Stop Stream", "operationId": "stop_stream_api_v1_streams__stream_id__stop_post", "parameters": [{"name": "stream_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Stream Id"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/v1/streams/{stream_id}/restart": {"post": {"summary": "Restart Stream", "operationId": "restart_stream_api_v1_streams__stream_id__restart_post", "parameters": [{"name": "stream_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Stream Id"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/v1/streams/{stream_id}/onvif-discover": {"post": {"summary": "Onvif Discover", "description": "ONVIF \uc2a4\ud2b8\ub9bc\uc758 \ub514\ubc14\uc774\uc2a4 \uc815\ubcf4 + \ud504\ub85c\ud30c\uc77c + \uc2a4\ud2b8\ub9bc URI \ubbf8\ub9ac\ubcf4\uae30 (\uae30\ub3d9 \uc5c6\uc774).", "operationId": "onvif_discover_api_v1_streams__stream_id__onvif_discover_post", "parameters": [{"name": "stream_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Stream Id"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}}, "components": {"schemas": {"EventVerifyRequest": {"properties": {"is_verified": {"type": "boolean", "title": "Is Verified", "default": true}, "verified_by": {"type": "string", "title": "Verified By", "default": "api"}}, "type": "object", "title": "EventVerifyRequest"}, "FrameAnchor": {"properties": {"startWallTimeMs": {"type": "integer", "maximum": 9007199254740991.0, "minimum": 0.0, "title": "Startwalltimems"}, "synthetic": {"type": "boolean", "title": "Synthetic", "default": false}}, "additionalProperties": false, "type": "object", "required": ["startWallTimeMs"], "title": "FrameAnchor"}, "HTTPValidationError": {"properties": {"detail": {"items": {"$ref": "#/components/schemas/ValidationError"}, "type": "array", "title": "Detail"}}, "type": "object", "title": "HTTPValidationError"}, "MetricsWindow": {"properties": {"run_generation": {"type": "integer", "minimum": 1.0, "title": "Run Generation"}, "enabled": {"type": "boolean", "title": "Enabled"}, "seconds": {"type": "integer", "maximum": 60.0, "minimum": 1.0, "title": "Seconds", "default": 60}}, "additionalProperties": false, "type": "object", "required": ["run_generation", "enabled"], "title": "MetricsWindow"}, "RtspSourceOptions": {"properties": {"transport": {"type": "string", "enum": ["tcp", "auto"], "title": "Transport", "description": "RTSP \uc804\uc1a1 \ubc29\uc2dd. \uccab Smoke\uc758 \uc7ac\ud604 \uac00\ub2a5\ud55c \uae30\ubcf8\uac12\uc740 tcp\ub2e4.", "default": "tcp"}, "latency_ms": {"type": "integer", "maximum": 60000.0, "minimum": 0.0, "title": "Latency Ms", "description": "RTSP jitter buffer \uc9c0\uc5f0 \uc2dc\uac04(ms).", "default": 1000}, "disable_audio": {"type": "boolean", "title": "Disable Audio", "description": "\uc601\uc0c1 \ubd84\uc11d Pipeline\uc774 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 audio track\uc744 \ube44\ud65c\uc131\ud654\ud55c\ub2e4.", "default": true}, "reconnect_policy": {"type": "string", "const": "none", "title": "Reconnect Policy", "description": "\uc790\ub3d9 \uc7ac\uc5f0\uacb0 \uc815\ucc45. \uccab Vertical slice\uc5d0\uc11c\ub294 retry\ud558\uc9c0 \uc54a\ub294\ub2e4.", "default": "none"}, "first_frame_timeout_s": {"type": "integer", "maximum": 300.0, "minimum": 5.0, "title": "First Frame Timeout S", "description": "\ubaa8\ub4e0 required role\uc758 \uccab Frame\uc744 \uae30\ub2e4\ub9ac\ub294 \ucd5c\ub300 \uc2dc\uac04(\ucd08).", "default": 60}}, "additionalProperties": false, "type": "object", "title": "RtspSourceOptions", "description": "Vendor-neutral RTSP behavior exposed by the Contextra API."}, "SettingsPatch": {"properties": {"fire": {"anyOf": [{"type": "object"}, {"type": "null"}], "title": "Fire"}, "pose": {"anyOf": [{"type": "object"}, {"type": "null"}], "title": "Pose"}, "expected_revision": {"type": "string", "pattern": "^[a-f0-9]{64}$", "title": "Expected Revision"}, "display_score": {"anyOf": [{"type": "number", "maximum": 1.0, "minimum": 0.0}, {"type": "null"}], "title": "Display Score"}, "downstream_score": {"anyOf": [{"type": "number", "maximum": 1.0, "exclusiveMinimum": 0.0}, {"type": "null"}], "title": "Downstream Score"}, "frame_time_anchor": {"anyOf": [{"$ref": "#/components/schemas/FrameAnchor"}, {"type": "null"}]}, "analysisFpsTarget": {"anyOf": [{"type": "number", "maximum": 60.0, "minimum": 1.0}, {"type": "null"}], "title": "Analysisfpstarget"}, "intrusion": {"anyOf": [{"type": "object"}, {"type": "null"}], "title": "Intrusion"}, "display_categories": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "Display Categories"}, "debug_all_candidates": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Debug All Candidates"}}, "additionalProperties": false, "type": "object", "required": ["expected_revision"], "title": "SettingsPatch"}, "StreamSpec": {"properties": {"stream_id": {"type": "string", "title": "Stream Id"}, "server_id": {"anyOf": [{"type": "string", "maxLength": 256, "minLength": 1}, {"type": "null"}], "title": "Server Id"}, "source_id": {"anyOf": [{"type": "string", "maxLength": 256, "minLength": 1}, {"type": "null"}], "title": "Source Id"}, "source_type": {"type": "string", "title": "Source Type", "default": "rtsp"}, "uri": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Uri"}, "host": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Host"}, "port": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Port"}, "username": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Username"}, "password": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Password"}, "profile_token": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Profile Token"}, "site_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Site Id", "default": "SITE01"}, "store": {"type": "boolean", "title": "Store", "default": true}, "persist_every": {"type": "integer", "title": "Persist Every", "default": 1}, "persist_mode": {"type": "string", "title": "Persist Mode", "default": "all"}, "scenarios": {"type": "string", "title": "Scenarios", "default": "all"}, "active_learning": {"type": "boolean", "title": "Active Learning", "default": false}, "autostart": {"type": "boolean", "title": "Autostart", "default": false}, "optional_roles": {"items": {"type": "string"}, "type": "array", "title": "Optional Roles"}, "inference_profile": {"anyOf": [{"type": "object"}, {"type": "null"}], "title": "Inference Profile"}, "frame_time_anchor": {"anyOf": [{"$ref": "#/components/schemas/FrameAnchor"}, {"type": "null"}]}, "intrusion": {"anyOf": [{"type": "object"}, {"type": "null"}], "title": "Intrusion"}, "analysisFpsTarget": {"type": "number", "maximum": 60.0, "minimum": 1.0, "title": "Analysisfpstarget", "default": 10}, "source_options": {"anyOf": [{"$ref": "#/components/schemas/RtspSourceOptions"}, {"type": "null"}], "description": "RTSP URI\uc640 \ubd84\ub9ac\ub41c \uc785\ub825 \ub3d9\uc791 \uc124\uc815. \ubbf8\uc9c0\uc815 \uc2dc \uc548\uc804\ud55c \uae30\ubcf8\uac12\uc744 \uc0ac\uc6a9\ud55c\ub2e4."}}, "type": "object", "required": ["stream_id"], "title": "StreamSpec"}, "ValidationError": {"properties": {"loc": {"items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, "type": "array", "title": "Location"}, "msg": {"type": "string", "title": "Message"}, "type": {"type": "string", "title": "Error Type"}, "input": {"title": "Input"}, "ctx": {"type": "object", "title": "Context"}}, "type": "object", "required": ["loc", "msg", "type"], "title": "ValidationError"}, "ZoneSpec": {"properties": {"name": {"type": "string", "title": "Name"}, "geometry": {"type": "object", "title": "Geometry"}, "is_active": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Is Active"}}, "type": "object", "required": ["name", "geometry"], "title": "ZoneSpec"}}}}