OpenApi for Luna Tasks service

View spec in html.

openapi: 3.0.0
info:
  version: 'v.3.24.0'
  title: 'Luna tasks'
  description: |
          
          VisionLabs Luna Tasks

          OpenAPI specification is the only valid document providing up-to-date information about the service API. 

          The specification can be used:

          - By documentation generation tools to visualize the API.
          - By code generation tools.

          All the documents and code generated using this specification can include inaccuracies and should be carefully checked.

          OpenAPI specification can be received using the "/docs/spec" resource. The "Accept" header should be set to "application/x-yaml".

servers:
- description: SwaggerHub API Auto Mocking
  url: https://virtserver.swaggerhub.com/visionlabs/luna-tasks/v.3.24.0

components:
  headers:
    application_json:
      schema:
        type: string
        enum:
        - application/json
      required: true
      description: content type is application/json

    application_zip:
      schema:
        type: string
        enum:
        - application/zip
      required: true
      description: content type is application/zip

    content_disposition:
      schema:
        type: string
      example: 'attachment; filename=task_146.zip'
      required: true
      description: content disposition with filename

    text_plain:
      schema:
        type: string
        enum:
        - text/plain
      required: true
      description: content type is text/plain

    image_jpeg:
      schema:
        type: string
        enum:
        - image/jpeg
      description: content type is image/jpeg
      required: true

    transfer_encoding:
      schema:
        type: string
      example: 'chunked'
      required: true
      description: transfer encoding type

    luna_request_id:
      schema:
        type: string
        format: timestamp,uuid
        example: 1536751345,8b8b5937-2e9c-4e8b-a7a7-5caf86621b5a
        pattern: ^[0-9]{10},[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$
      description: request id. Helps to uniquely identify messages that correspond to particular requests, in system logs.
      required: true

    docs_content_type:
      schema:
        type: string
        enum:
          - application/x-yaml
          - text/html
      required: true
      description: Type of receiving data

    text_html:
      schema:
        type: string
        enum:
          - text/html
      required: true
      description: Content type is text/html

    config_accept_content_type:
      schema:
        type: string
        enum:
          - application/json
          - text/plain
      required: false
      description: The content type of the response body.
  parameters:
    page:
      in: query
      name: page
      schema:
        type: integer
        minimum: 1
        default: 1
      description: a page number.

    luna_request_id:
      in: header
      schema:
        type: string
        format: timestamp,uuid
        example: 1536751345,8b8b5937-2e9c-4e8b-a7a7-5caf86621b5a
        pattern: ^[0-9]{10},[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$
      description: |
        external request id. Helps to uniquely identify messages that correspond to particular requests, in system logs.
        If it was not set, system will set it in default format ("timestamp,UUID"). It will be returned with response.
      name: Luna-Request-Id

    page_size:
      in: query
      name: page_size
      schema:
        type: integer
        minimum: 1
        maximum: 1000
        default: 10
      description: the number of items on page.

    applicationJsonContent:
      in: header
      name: Content-Type
      schema:
        type: string
        enum:
        - application/json
      description: content type is application/json.

    schedule_id:
      in: query
      name: schedule_id
      schema:
        $ref: '#/components/schemas/schedule_id'
      description: Schedule according to which the task was created

    schedule_id_path:
      in: path
      name: schedule_id
      required: true
      schema:
        $ref: '#/components/schemas/schedule_id'
      description: Schedule according to which the task was created

    schedule_patch:
      in: query
      name: action
      required: true
      schema:
        type: string
        enum: [pause, start]
      description: pause/start tasks schedule

    create_time__lt:
      in: query
      name: create_time__lt
      schema:
        type: string
        format: date-time
      description: upper bound for object create_time.
      example: "2018-08-11T09:11:41.674Z"

    create_time__gte:
      in: query
      name: create_time__gte
      schema:
        type: string
        format: date-time
      description: lower included bound for object create_time.
      example: "2018-08-11T09:11:41.674Z"

    end_time__lt:
      in: query
      name: end_time__lt
      schema:
        type: string
        format: date-time
      description: upper bound for object end_time.
      example: "2018-08-11T09:11:41.674Z"

    end_time__gte:
      in: query
      name: end_time__gte
      schema:
        type: string
        format: date-time
      description: lower included bound for object end_time.
      example: "2018-08-11T09:11:41.674Z"

    error_time__lt:
      in: query
      name: error_time__lt
      schema:
        type: string
        format: date-time
      description: upper bound for object error_time.
      example: "2018-08-11T09:11:41.674Z"

    error_time__gte:
      in: query
      name: error_time__gte
      schema:
        type: string
        format: date-time
      description: lower included bound for object error_time.
      example: "2018-08-11T09:11:41.674Z"

    task_type:
      in: query
      name: task_type
      schema:
        $ref: '#/components/schemas/task_type'
      example: 1

    task_type_schedulable:
      in: query
      name: task_type
      schema:
        $ref: '#/components/schemas/task_type_schedulable'
      example: 1

    task_status:
      in: query
      name: task_status
      schema:
        $ref: '#/components/schemas/task_status'
      example: 1

    subtask_status:
      in: query
      name: subtask_status
      schema:
        $ref: '#/components/schemas/subtask_status'
      example: 2

    account_id:
      in: query
      name: account_id
      schema:
        $ref: '#/components/schemas/uuid'
      description: account id.
      example: 7daa0e35-36a2-474a-8f2b-87f78b59d080

    account_id_header_required:
      in: header
      name: Luna-Account-Id
      schema:
        $ref: '#/components/schemas/account_id'
      description: luna account id
      example: '8950722f-3fd4-4223-b48f-03f95f0e8dfb'
      required: true

    result_id:
      in: query
      name: result_id
      schema:
        $ref: '#/components/schemas/uuid'
      description: id of task result, which stored in luna-image store.
      example: 8f4f0070-c464-460b-bf78-fac225df72e9

    error_ids:
      in: query
      name: error_ids
      schema:
        $ref: '#/components/schemas/errorIds'
      description: error ids

    error_id_uri:
      in: path
      name: error_id
      schema:
        $ref: '#/components/schemas/error_id'
      required: true
      description: error id
      example: 10

    task_ids:
      in: query
      name: task_ids
      schema:
        $ref: '#/components/schemas/task_ids'
      description: comma-separate task ids

    task_id_uri:
      in: path
      name: task_id
      schema:
        $ref: '#/components/schemas/task_id'
      required: true
      description: task id

    error_code:
      in: query
      name: error_code
      schema:
        $ref: '#/components/schemas/error_code'
      description: error code

    status_code:
      in: query
      name: status_code
      schema:
        $ref: '#/components/schemas/status_code'
      description: status code

    accept_docs_handler:
      in: header
      name: Accept
      schema:
        $ref: '#/components/schemas/accept_docs_handler'
      required: true
      description: acceptable type of receiving data

    include_luna_services:
      in: query
      name: include_luna_services
      schema:
        type: integer
        enum: [0, 1]
        default: 0
      description: whether to perform healthchecks for dependent luna services.

    accept_config_handler:
      in: header
      name: Accept
      schema:
        type: string
        enum:
          - application/json
          - text/plain
        description: One of application/json, text/plain
      required: false
      description: acceptable type of receiving data
  schemas:
    Error:
      type: object
      properties:
        error_code:
          type: integer
          description: Error code.
        desc:
          type: string
          description: Short error description.
        detail:
          type: string
          description: Error details.
        link:
          type: string
          description: Link to the documentation website with the error description.
      required: [error_code, detail, desc, link]
      example:
        error_code: 1
        detail: Internal server error
        desc: Internal server error
        link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-1

    error_code:
      type: integer
      description: error code.

    error_link:
      type: string
      description: Link to the documentation website with the error description.

    uuid:
      type: string
      format: uuid
      pattern: '^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$'
      example: 557d54ec-29ad-4f3c-93b4-c9092ef12515

    int01:
      type: integer
      enum: [ 0,1 ]

    int0100:
      type: integer
      minimum: 0
      maximum: 100

    string36:
      type: string
      maxLength: 36

    image_origin:
      type: string
      maxLength: 256
      description: the image url - source of the detection
      nullable: true

    tags:
      description: tag array.
      type: array
      minItems: 1
      items:
        $ref: '#/components/schemas/string36'
      example: ["tag1", "tag2"]

    error_id:
      type: integer
      example: 10

    errorIds:
      type: string
      format: comma-separate task ids
      minItems: 1
      example: 4,5,6

    task_status:
      type: integer
      enum: [0, 1, 2, 3, 4, 5]
      example: 1
      description: |
        task status

        | task status | value |
        |-----------------|---|
        | pending         | 0 |
        | in progress     | 1 |
        | cancelled       | 2 |
        | failed          | 3 |
        | collect results | 4 |
        | done            | 5 |

    subtask_status:
      type: integer
      enum: [0, 1, 2, 3, 4]
      example: 2
      description: |
        subtask status

        | subtask status| value |
        |-------------------|---|
        | pending           | 0 |
        | in progress       | 1 |
        | cancelled         | 2 |
        | failed            | 3 |
        | done              | 4 |

    result_id:
      allOf:
      - $ref: '#/components/schemas/uuid'
      description: task result id in a storage.
      nullable: true

    account_id:
      allOf:
      - $ref: '#/components/schemas/uuid'
      description: account id

    task_account_id:
      allOf:
      - $ref: '#/components/schemas/uuid'
      description: account id of the task
      example: '346a5645-ec89-4806-820a-dbcb6e0dc381'

    task_count:
      type: object
      properties:
        count:
          type: integer
          minimum: 0
          example: 152
          description: tasks count

    error_count:
      type: object
      properties:
        count:
          type: integer
          minimum: 0
          example: 101
          description: errors count

    task_type:
      type: integer
      enum: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      example: 3
      description: |
        task type

        | task type            | value |
        |----------------------|-------|
        | unknown              | 0     |
        | linker               | 1     |
        | clusterization       | 2     |
        | report               | 3     |
        | garbage collect      | 4     |
        | additional extract   | 5     |
        | cross match          | 6     |
        | roc-curve calculation| 7     |
        | export objects       | 8     |
        | estimate data        | 9     |
        | lambda task          | 10    |

    task_type_schedulable:
      type: integer
      enum: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      example: 3
      description: |
        task type

        | task type            | value |
        |----------------------|-------|
        | linker               | 1     |
        | clusterization       | 2     |
        | report               | 3     |
        | garbage collect      | 4     |
        | additional extract   | 5     |
        | cross match          | 6     |
        | roc-curve calculation| 7     |
        | export objects       | 8     |
        | estimate data        | 9     |
        | lambda               | 10    |

        Scheduling a *report* task will spawn 2 tasks: *clusterization* and then *report*. If the *clustering* task is not completed, the *report* task will not be created

    int_version:
      type: integer
      minimum: 0

    task_ids:
      type: string
      format: comma-separate task ids
      description: task ids.
      example: 1,2,3

    task_description:
      type: string
      maxLength: 128
      description: task description
      example: "task description"

    notification_policy:
      type: object
      description: tasks processing notification policy
      properties:
        enable:
          allOf:
            - $ref: '#/components/schemas/int01'
            - description: Whether callbacks enabled or not
            - default: 0
        task_callbacks:
          $ref: '#/components/schemas/task_callbacks'
        subtask_callbacks:
          $ref: '#/components/schemas/subtask_callbacks'

    result_storage_policy_response:
      type: object
      description: tasks processing result storage policy
      properties:
        ttl:
          type: integer
          enum: [ 1, 2, 3, 4, 5, 6, 7, 14, 30, 60, 90, 180, 365, -1 ]
          description: Lifetime for task result object, in days. By default, parent bucket lifetime configuration applied. For object to be retained indefinitely, setup `ttl=-1`.

    result_storage_policy:
      allOf:
        - $ref: '#/components/schemas/result_storage_policy_response'
        - type: object
          properties:
            ttl:
              nullable: true

    task_notification_policy_response:
      allOf:
        - $ref: "#/components/schemas/notification_policy"
      required: [enable, task_callbacks, subtask_callbacks]

    task_base:
      type: object
      properties:
        notification_policy:
          $ref: '#/components/schemas/notification_policy'
        result_storage_policy:
          $ref: '#/components/schemas/result_storage_policy'
        description:
          $ref: '#/components/schemas/task_description'
      required: [content]

    callback_basic_authorization:
      type: object
      properties:
        type:
          type: string
          description: Authorization type.
          enum: [basic]
        login:
          type: string
          description: Login
        password:
          type: string
          description: Password
      required: [ type, login, password]
      description: Callback basic authorization parameters

    http_callback:
      type: object
      properties:
        type:
          type: string
          enum: [http]
        authorization:
          $ref: '#/components/schemas/callback_basic_authorization'
        url:
          type: string
          description: Request url.
          format: uri-reference
        params:
          type: object
          properties:
            timeout:
              type: integer
              default: 60
              description: Callback request timeout.
            content_type:
              type: string
              default: application/json
              enum: [application/json, application/msgpack]
              description: Callback request content type.
            headers:
              type: object
              description: Callback request headers.
          description: Callback request parameters
        enable:
          allOf:
            - $ref: '#/components/schemas/int01'
            - description: Whether callback enabled or not
            - default: 1
      required: [ type, url ]

    telegram_callback:
      type: object
      properties:
        type:
          type: string
          enum: [ telegram ]
        chat_id:
          type: integer
          description: |
            Telegram chat id where callbacks will be sent.

            Messages can be delivered to users or channels using their ids. 
            For detailed information on where to find these ids, please refer to https://core.telegram.org/bots/api.
        token:
          type: string
          description: |
            Telegram authorization token. 
            For details information see <a href="https://core.telegram.org/bots/features#botfather">botfather</a>.
        params:
          type: object
          description: Callback request parameters
          properties:
            timeout:
              type: integer
              default: 60
              description: Callback request timeout.
        enable:
          allOf:
            - $ref: '#/components/schemas/int01'
            - description: Whether callback enabled or not
            - default: 1
      required: [type, chat_id, token]

    task_callback:
      oneOf:
        - $ref: '#/components/schemas/http_callback'
        - $ref: '#/components/schemas/telegram_callback'
      discriminator:
        propertyName: "type"
        mapping:
          http: '#/components/schemas/http_callback'
          telegram: '#/components/schemas/telegram_callback'

    task_callbacks_example:
      - type: http
        enable: 1
        authorization:
          type: basic
          login: login
          password: password
        url: http://callback.url
        params:
          timeout: 60
          content_type: "application/json"
          headers: { }
      - type: telegram
        enable: 1
        token: 1111111111:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
        chat_id: 111111111
        params:
          timeout: 60

    task_callbacks:
      type: array
      items:
        $ref: '#/components/schemas/task_callback'
      description: |
        Callbacks for sending tasks id and status to third party system. Callbacks are executed after task status changed.
        
        **Sample Output for successful task**
        ```
        {
          "task_id": 123,  
          "task_status": "done",  
          "result_id": "00000000-0000-4000-a000-000000658854", 
          "result_url": "http://127.0.0.1:5000/6/tasks/00000000-0000-4000-a000-000000658854/result"
        }
        ```
        
        ** Sample Output for failed task **
        ```
        {"task_id": 123, "task_status": "failed"}
        ```
                
        ** Sample Output for cancelled task **
        ```
        {"task_id": 123, "task_status": "cancelled"}
        ```
      example:
        $ref: "#/components/schemas/task_callbacks_example"

    subtask_callbacks:
      type: array
      items:
        $ref: '#/components/schemas/task_callback'
      description: |
        Callbacks for sending subtasks id, status and number of completed subtasks to third party system. 
        Callbacks are executed after subtask status changed.
        
        ** Sample Output for start subtask **
        ```
        {"subtask_id": 123, "subtask_status": "in_progress", "completed_subtasks": 0}
        ```
        
        ** Sample Output for successful subtask **
        ```
        {"subtask_id": 123, "subtask_status": "done", "completed_subtasks": 1}
        ```
        
        ** Sample Output for failed subtask **
        ```
        {"subtask_id": 123, "subtask_status": "failed", "completed_subtasks": 0}
        ```
                
        ** Sample Output for cancelled subtask **
        ```
        {"subtask_id": 123, "subtask_status": "cancelled", "completed_subtasks": 0}

      example:
        $ref: "#/components/schemas/task_callbacks_example"

    task_content:
      type: object
      description: content of task
      example: content

    subtask_content:
      type: object
      description: content of subtask
      example: content
      additionalProperties: true

    objects_type:
      type: string
      description: objects type - faces or events
      enum: ["faces", "events"]
      example: "faces"

    common_objects_type:
      type: string
      description: objects type - faces, attributes or events
      enum: ["faces", "events", "attributes"]

    error_description:
      type: string
      description: error description
      example: Faces not found

    error_detail:
      type: string
      description: error detail
      example: One or more faces not found, including face with id '8f4f0070-c464-460b-bf78-fac225df72e9'

    errors_additional_info:
      type: string
      description: additional error info
      example: 8f4f0070-c464-460b-bf78-fac225df72e9
      nullable: true

    count_task_parts_done:
      type: integer
      minimum: 0
      description: count of task finished parts
      example: 10

    count_task_parts_all:
      type: integer
      minimum: 1
      description: count of task parts
      example: 100

    status_code:
      type: integer
      minimum: 400
      maximum: 599
      description: error status code
      example: 500

    Version:
      type: object
      properties:
        Version:
          type: object
          properties:
            api:
              allOf:
              - $ref: '#/components/schemas/int_version'
              description: an api version of service.
            major:
              allOf:
              - $ref: '#/components/schemas/int_version'
              description: a major version of service.
            minor:
              allOf:
              - $ref: '#/components/schemas/int_version'
              description: a minor version of service.
            patch:
              allOf:
              - $ref: '#/components/schemas/int_version'
              description: a patch version of service.
          required: [api, major, minor, patch]

      example:
        Version:
          api: 1
          major: 0
          minor: 0
          patch: 0

    task_id:
      type: integer
      minimum: 1
      description: task id
      example: 123

    subtask_id:
      type: integer
      minimum: 1
      description: subtask id
      example: 5

    time:
      description: time in rfc3339 format
      type: string
      format: date-time
      example: "2021-07-28T01:23:21.537604+03:00"

    detect_ts:
      type: number
      minimum: 0.0
      maximum: 158731466399.999
      description: user-defined timestamp relative to something, such as the start of a video
      example: 123.456
      nullable: true

    time_nullable:
      type: string
      nullable: true
      format: date-time
      example: "2018-08-11T10:11:41.674Z"

    tasks_reply:
      type: object
      description: tasks container
      properties:
        tasks:
          type: array
          description: found tasks
          items:
            $ref: '#/components/schemas/task_reply'

    limit:
      description: Maximum number of matching candidates to return for every match.
      type: integer
      minimum: 1
      example: 3
      default: 5

    clustering_limit:
      allOf:
      - $ref: '#/components/schemas/limit'
      maximum: 20000
      default: 20000

    subtask_in_reply:
      type: object
      properties:
        subtask_id:
          $ref: '#/components/schemas/subtask_id'
        task_id:
          $ref: '#/components/schemas/task_id'
        result_id:
          $ref: '#/components/schemas/result_id'
        create_time:
          allOf:
          - $ref: '#/components/schemas/time'
          description: subtask create time
        end_time:
          allOf:
          - $ref: '#/components/schemas/time_nullable'
          description: subtask end time
        subtask_status:
          $ref: '#/components/schemas/subtask_status'
        content:
          $ref: '#/components/schemas/subtask_content'
      required: [subtask_id, task_id, create_time, subtask_status, content]

    subtasks_reply:
      description: Subtasks of a current task.
      type: object
      properties:
        subtasks:
          type: array
          items:
            $ref: '#/components/schemas/subtask_in_reply'

    task_error:
      type: object
      properties:
        error_id:
          $ref: '#/components/schemas/error_id'
        task_id:
          $ref: '#/components/schemas/task_id'
        subtask_id:
          $ref: '#/components/schemas/subtask_id'
        error_code:
          $ref: '#/components/schemas/error_code'
        link:
          $ref: '#/components/schemas/error_link'
        description:
          $ref: '#/components/schemas/error_description'
        detail:
          $ref: '#/components/schemas/error_detail'
        additional_info:
          $ref: '#/components/schemas/errors_additional_info'
        error_time:
          allOf:
          - $ref: '#/components/schemas/time'
          description: error time
      required: [error_id, task_id, subtask_id, error_code, link, description, detail, error_time]

    task_errors:
      type: array
      items:
        $ref: '#/components/schemas/task_error'
      maxItems: 100000
      description: |
        done task errors. Max error count is setting in the service configuration file. This limitation is applied at the moment when the
        task creates result.

    task_handler_errors:
      type: array
      items:
        $ref: '#/components/schemas/Error'
      minItems: 0
      description: image processing errors in handlers

    float10:
      type: number
      format: float
      minimum: 0
      maximum: 1

    face_ids:
      description: face ids
      type: array
      minItems: 1
      items:
        $ref: '#/components/schemas/uuid'
      example: ['8950722f-3fd4-4223-b48f-03f95f0e8dfb', '346a5645-ec89-4806-820a-dbcb6e0dc381']

    attribute_ids:
      description: attribute ids
      type: array
      items:
        $ref: '#/components/schemas/uuid'
      minItems: 1
      example: ['8950722f-3fd4-4223-b48f-03f95f0e8dfb', '346a5645-ec89-4806-820a-dbcb6e0dc381']

    external_id:
      description: user-defined external id for face.
      type: string
      maxLength: 36
      example: "2xQ2gprbMUePw1s9gw9fvA=="

    external_ids:
      type: array
      minItems: 1
      items:
        $ref: '#/components/schemas/external_id'
      description: list of external ids. Each event from result will contain one of the given external ids.
      example: ['8950722f-3fd4-4223-b48f-03f95f0e8dfb', '346a5645-ec89-4806-820a-dbcb6e0dc381']

    user_data:
      description: user data.
      type: string
      maxLength: 128
      example: "100-00-12"

    face_id__gte:
      allOf:
        - $ref: '#/components/schemas/uuid'
      description: face id lower included boundary

    face_id__lt:
      allOf:
        - $ref: '#/components/schemas/uuid'
      description: face id upper excluded boundary

    descriptor_info:
      type: object
      description: descriptor object filter
      properties:
        type:
          type: string
          description: descriptor type
          enum: ["face", "body"]
          default: "face"
      required: [type]

    faces_filters_no_account:
      allOf:
        - $ref: '#/components/schemas/faces_filters_no_create_time'
      type: object
      properties:
        create_time__gte:
          description: Create time lower included boundary.
          oneOf:
            - $ref: '#/components/schemas/create_time__gte'
            - $ref: '#/components/schemas/create_time_now__gte'
        create_time__lt:
          description: Create time upper excluded boundary.
          oneOf:
            - $ref: '#/components/schemas/create_time__lt'
            - $ref: '#/components/schemas/create_time_now__lt'

    faces_filters_schedule:
      allOf:
        - $ref: '#/components/schemas/faces_filters_no_create_time'
      type: object
      properties:
        create_time__gte:
          description: Create time lower included boundary.
          $ref: '#/components/schemas/create_time_now__gte'
        create_time__lt:
          description: Create time upper excluded boundary.
          $ref: '#/components/schemas/create_time_now__lt'
        account_id:
          $ref: '#/components/schemas/account_id'

    faces_filters_no_create_time:
      type: object
      properties:
        face_ids:
          $ref: '#/components/schemas/face_ids'
        external_ids:
          $ref: '#/components/schemas/external_ids'
        user_data:
          $ref: '#/components/schemas/user_data'
        face_id__gte:
          $ref: '#/components/schemas/face_id__gte'
        face_id__lt:
          $ref: '#/components/schemas/face_id__lt'
        list_id:
          allOf:
            - $ref: '#/components/schemas/uuid'
          description: list id.
          example: '8950722f-3fd4-4223-b48f-03f95f0e8dfb'

    faces_filters_no_account_limited:
      allOf:
        - $ref: '#/components/schemas/faces_filters_no_account'
      properties:
        face_ids:
          maxItems: 20000
        external_ids:
          maxItems: 1000

    faces_filters_no_account_limited_reply:
      allOf:
        - $ref: '#/components/schemas/faces_filters_no_create_time'
      properties:
        create_time__gte:
          description: Create time lower included boundary.
          $ref: '#/components/schemas/create_time__gte'
        create_time__lt:
          description: Create time upper excluded boundary.
          $ref: '#/components/schemas/create_time__lt'
        face_ids:
          maxItems: 20000
        external_ids:
          maxItems: 1000

    faces_filters:
      allOf:
        - $ref: '#/components/schemas/faces_filters_no_account'
      type: object
      properties:
        account_id:
          $ref: '#/components/schemas/account_id'
      required: [ account_id ]

    faces_filters_regular_create_time:
      allOf:
        - $ref: '#/components/schemas/faces_filters_no_create_time'
      type: object
      properties:
        create_time__gte:
          description: Create time lower included boundary.
          $ref: '#/components/schemas/create_time__gte'
        create_time__lt:
          description: Create time upper excluded boundary.
          $ref: '#/components/schemas/create_time__lt'
        account_id:
          $ref: '#/components/schemas/account_id'
      required: [ account_id ]

    faces_filters_limited_optional_account:
      allOf:
      - $ref: '#/components/schemas/faces_filters_no_account_limited'
      properties:
        account_id:
          $ref: '#/components/schemas/account_id'

    faces_filters_limited:
      allOf:
      - $ref: '#/components/schemas/faces_filters_limited_optional_account'
      required: [account_id]

    attributes_filters_no_account:
      type: object
      properties:
        attribute_ids:
          $ref: '#/components/schemas/attribute_ids'
      required: [attribute_ids]

    attributes_filters_no_account_limited:
      allOf:
      - $ref: '#/components/schemas/attributes_filters_no_account'
      type: object
      properties:
        attribute_ids:
          minItems: 1
          maxItems: 20000

    geo_position:
      type: object
      description: |
        geo position filter is bounding box specified by coordinates of its center (origin) and some delta.
        WARNING: boxes with a vertex or border on the International Date Line (IDL) or the North or South pole are
        not fully supported due to features of database spatial index - filter result may be unexpected.
        NOTE: highly recommended for citywide use only.
      properties:
        origin_longitude:
          $ref: '#/components/schemas/longitude'
        origin_latitude:
          $ref: '#/components/schemas/latitude'
        longitude_delta:
          type: number
          minimum: 0
          maximum: 90
          default: 0.01
          example: 0.1
          description: |
            longitude delta in degrees.
            WARNING: boxes with a vertex or border on the International Date Line (IDL) or the North or South pole
            are not fully supported due to features of database spatial index - filter result may be unexpected.
            Box edges more than 180 degrees long are not allowed. Boundaries of valid range are **exclusive**. NOTE: highly recommended for citywide use only.
        latitude_delta:
          type: number
          minimum: 0
          maximum: 90
          default: 0.01
          example: 0.1
          description: |
            latitude delta in degrees.
            WARNING: boxes with a vertex or border on the International Date Line (IDL) or the North or South pole
            are not fully supported due to features of database spatial index - filter result may be unexpected.
            Box edges more than 180 degrees long are not allowed. Boundaries of valid range are **exclusive**. NOTE: highly recommended for citywide use only.
      required: [origin_longitude, origin_latitude]

    label:
      type: string
      maxLength: 36
      description: matching label
      example: "matching_label"

    stream_id:
      allOf:
        - $ref: '#/components/schemas/uuid'
      description: stream ID.
      example: "b668c4a5-2191-476e-a261-3b4f9ce2e25e"

    event_id:
      allOf:
      - $ref: '#/components/schemas/uuid'
      description: event ID.
      example: "b668c4a5-2191-476e-a261-3b4f9ce2e25e"

    event_id__gte:
      allOf:
        - $ref: '#/components/schemas/event_id'
      description: event id lower included boundary

    event_id__lt:
      allOf:
        - $ref: '#/components/schemas/event_id'
      description: event id upper excluded boundary

    lower_garment_type:
      type: [string, null]
      enum: [ skirt, shorts, trousers, undefined, null ]
      description: |
        lower garment type.
        
        > **WARNING** This enum may be to expand. This field must be interpret as arbitrary string which can be equal 
        to one element from enum.

    short_palette:
      description: |
        short color palette
        
        > **WARNING** This enum may be to expand. This field must be interpret as arbitrary string which can be equal 
        to one element from enum.
      type: [string, null]
      enum: [ black, other, white, undefined, null ]

    expanded_palette:
      description: |
        expanded color palette for clothing
        
        > **WARNING** This enum may be to expand. This field must be interpret as arbitrary string which can be equal 
        to one element from enum.
      type: [string, null]
      enum: [ black, blue, green, gray, orange, purple, red, white, yellow, pink, brown, beige, khaki, multicolored, undefined, null ]

    events_filters_no_account:
      allOf:
        - $ref: '#/components/schemas/events_filters_no_create_end_time'
      properties:
        create_time__gte:
          description: Create time lower included boundary.
          oneOf:
            - $ref: '#/components/schemas/create_time__gte'
            - $ref: '#/components/schemas/create_time_now__gte'
        create_time__lt:
          description: Create time upper excluded boundary.
          oneOf:
            - $ref: '#/components/schemas/create_time__lt'
            - $ref: '#/components/schemas/create_time_now__lt'
        end_time__gte:
          description: End time lower included boundary.
          oneOf:
            - $ref: '#/components/schemas/end_time__gte'
            - $ref: '#/components/schemas/end_time_now__gte'
        end_time__lt:
          description: End time upper excluded boundary.
          oneOf:
            - $ref: '#/components/schemas/end_time__lt'
            - $ref: '#/components/schemas/end_time_now__lt'

    events_filters_schedule:
      allOf:
        - $ref: '#/components/schemas/events_filters_no_create_end_time'
      properties:
        create_time__gte:
          description: Create time lower included boundary.
          $ref: '#/components/schemas/create_time_now__gte'
        create_time__lt:
          description: Create time upper excluded boundary.
          $ref: '#/components/schemas/create_time_now__lt'
        end_time__gte:
          description: End time lower included boundary.
          $ref: '#/components/schemas/end_time_now__gte'
        end_time__lt:
          description: End time upper excluded boundary.
          $ref: '#/components/schemas/end_time_now__lt'
        account_id:
          $ref: '#/components/schemas/account_id'

    deepfake_enum:
      description: |
        predominant deepfake.

        | deepfake | value |
        |--------------|---|
        | fake         | 0 |
        | real         | 1 |

      type: [integer, null]
      enum: [0, 1, null]

    deepfake_filter:
      type: array
      minItems: 1
      items:
        $ref: '#/components/schemas/deepfake_enum'
      description: |
        list of deepfake. Each event from result will contain one of the given deepfake.

        | deepfake | value |
        |--------------|---|
        | fake         | 0 |
        | real         | 1 |

    events_filters_no_create_end_time:
      type: object
      properties:
        sources:
          description: sources. Each event from result will contain one of the given sources.
          type: array
          minItems: 1
          items:
            type: [string, null]
          example: ["cam1", "cam2"]
        stream_ids:
          description: stream ids
          type: array
          minItems: 1
          items:
            allOf:
              - $ref: '#/components/schemas/stream_id'
              - nullable: true
          example: ['8950722f-3fd4-4223-b48f-03f95f0e8dfb', '346a5645-ec89-4806-820a-dbcb6e0dc381']
        event_ids:
          description: events ids
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/event_id'
          example: ['8950722f-3fd4-4223-b48f-03f95f0e8dfb', '346a5645-ec89-4806-820a-dbcb6e0dc381']
        event_id__gte:
          $ref: '#/components/schemas/event_id__gte'
        event_id__lt:
          $ref: '#/components/schemas/event_id__lt'
        external_ids:
          $ref: '#/components/schemas/external_ids'
        handler_ids:
          description: handler ids. Each event from result will contain one of the given handlers.
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/uuid'
          example: ['8950722f-3fd4-4223-b48f-03f95f0e8dfb', '346a5645-ec89-4806-820a-dbcb6e0dc381']
        top_matching_candidates_label:
          type: string
          maxLength: 36
          description: top matching candidate label
          example: "matching_label"
        top_similar_object_ids:
          description: ids of the most similar object.
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/uuid'
          example: ['8950722f-3fd4-4223-b48f-03f95f0e8dfb', '346a5645-ec89-4806-820a-dbcb6e0dc381']
        top_similar_external_ids:
          description: external ids of the most similar objects.
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/external_id'
          example: ['external_id_1', 'external_id_2']
        top_similar_object_similarity__gte:
          allOf:
            - $ref: '#/components/schemas/float10'
          description: the lower including boundary of the most similar face similarity.
          example: 0.5
        top_similar_object_similarity__lt:
          allOf:
            - $ref: '#/components/schemas/float10'
          description: the upper excluding boundary of the most similar face similarity.
        age__lt:
          description: the upper excluding boundary of age.
          type: integer
          minimum: 0
          maximum: 100
          example: 50
        age__gte:
          description: the lower including boundary of age.
          type: integer
          minimum: 0
          maximum: 100
          example: 50
        gender:
          type: [integer, null]
          enum: [ 0, 1, null ]
          description: gender, 0 - female, 1 - male
        emotions:
          description: |
            list of predominant emotions. Each event from result will contain one of the given emotions.

            | emotions    | value |
            |-----------------|---|
            | anger           | 1 |
            | disgust         | 2 |
            | fear            | 3 |
            | happiness       | 4 |
            | neutral         | 5 |
            | sadness         | 6 |
            | surprise        | 7 |
          type: array
          minItems: 1
          items:
            type: [integer, null]
            enum: [1, 2, 3, 4, 5, 6, 7, null]
          example: [1, 2, 3]
        ethnic_groups:
          description: |
            list of dominant ethnic group. Each event from result will contain one of the given ethnic groups.

            | ethnicity   | value |
            |-----------------|---|
            | AfricanAmerican | 1 |
            | Indian          | 2 |
            | Asian           | 3 |
            | Caucasian       | 4 |
          type: array
          minItems: 1
          items:
            type: [integer, null]
            enum: [1, 2, 3, 4, null]
          example: [1, 2]
        face_ids:
          $ref: '#/components/schemas/face_ids'
        user_data:
          $ref: '#/components/schemas/user_data'
        tags:
          allOf:
            - $ref: '#/components/schemas/tags'
          description: list of tags. Each event from result will contain all of the given tags.
        cities:
          description: comma-separated list of cities. Each event from result will contain one of the given cities in location.
          type: array
          minItems: 1
          items:
            type: [string, null]
          example: ["moscow", "New-York"]
        areas:
          description: comma-separated list of areas. Each event from result will contain one of the given areas in location.
          type: array
          minItems: 1
          items:
            type: [string, null]
          example: ["CAO", "central park"]
        districts:
          description: comma-separated list of districts. Each event from result will contain one of the given districts in location.
          type: array
          minItems: 1
          items:
            type: [string, null]
          example: ["mitino", "central park"]
        streets:
          description: comma-separated list of streets. Each event from result will contain one of the given streets  in location.
          type: array
          minItems: 1
          items:
            type: [string, null]
          example: ["arbat", "schepkina"]
        house_numbers:
          description: comma-separated list of house numbers. Each event from result will contain one of the given house numbers in location.
          type: array
          minItems: 1
          items:
            type: [string, null]
          example: ["1", "1/2str3"]
        geo_position:
          allOf:
          - $ref: '#/components/schemas/geo_position'
          nullable: true
        masks:
          description: |
            list of mask states. Each event from result will contain one of the given mask states.

            | masks      | value |
            |----------------|---|
            | missing        | 1 |
            | medical_mask   | 2 |
            | occluded       | 3 |
          type: array
          minItems: 1
          items:
            type: [integer, null]
            enum: [1, 2, 3, null]
          example: [2, 3]
        track_ids:
          type: array
          minItems: 1
          description: list of track ids. Each event from result will contain one of the given track ids.
          items:
            type: [string, null]
            pattern: '^[a-zA-Z0-9_\-]{1,36}$'
          example: ["track_id_number_1", "track_id_number_2"]
        liveness:
          type: array
          minItems: 1
          description: |
            list of predominant liveness. Each event from result will contain one of the given liveness.

            | liveness | value |
            |--------------|---|
            | spoof        | 0 |
            | real         | 1 |
            | unknown      | 2 |
          items:
            type: [integer, null]
            enum: [0, 1, 2, null]
          example: [1, 2]
        deepfake:
          $ref: '#/components/schemas/deepfake_filter'
        apparent_gender:
          type: array
          minItems: 1
          items:
            type: [integer, null]
            nullable: true
            enum: [ 0, 1, 2, null ]
          description: |
            List of apparent gender: 0 - female, 1 - male, 2 - undefined. Each event from result will contain one of the given states.
          example: [0,1]
        apparent_age__lt:
          type: integer
          minimum: 0
          maximum: 100
          description: Apparent age upper excluded bound.
          example: 50
        apparent_age__gte:
          type: integer
          minimum: 0
          maximum: 100
          description: Apparent age lower included bound.
          example: 50
        headwear_states:
          type: array
          minItems: 1
          items:
            type: [integer, null]
            enum: [ 0, 1, 2, null ]
          description: |
            List of headwear states: 0 - absent, 1 - present, 2 - undefined. Each event from result will contain one of the given states.
          example: [0,1]
        sleeve_lengths:
          type: array
          minItems: 1
          items:
            type: [string, null]
            enum: [ short, long, undefined, null ]
          description: |
            List of sleeve length states. Each event from result will contain one of the given states.
          example: [short,long]
        upper_clothing_colors:
          type: array
          minItems: 1
          items:
            $ref: "#/components/schemas/expanded_palette"
          description: |
            List of upper clothing colors. Each event from result will contain at least one of the given clothing colors.
          example: [black,white]
        lower_garment_colors:
          type: array
          minItems: 1
          items:
            $ref: "#/components/schemas/expanded_palette"
          description: |
            Clothing color filter. Each event from result will contain at least one of the given clothing colors.
            
            > **WARNING** This enum may be to expand. This field must be interpret as arbitrary string which can be equal 
            to one element from enum.
          example: [ black, white ]
        backpack_states:
          type: array
          minItems: 1
          items:
            type: [integer, null]
            enum: [ 0, 1, 2, null ]
          description: |
            List of backpack states: 0 - absent, 1 - present, 2 - undefined. Each event from result will contain one of the given states.
          example: [1,2]
        lower_garment_types:
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/lower_garment_type'
          description: |
            Lower garment type filter.
            
            > **WARNING** This enum may be to expand. This field must be interpret as arbitrary string which can be equal 
            to one element from enum.
          example: [ 'shorts',  'skirt' ]
        shoes_apparent_colors:
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/short_palette'
          description: |
            Shoes apparent color filter.
            
            > **WARNING** This enum may be to expand. This field must be interpret as arbitrary string which can be equal 
            to one element from enum.
          example: [ 'white' ]
        headwear_apparent_colors:
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/short_palette'
          description: |
            Headwear apparent color filter.
            
            > **WARNING** This enum may be to expand. This field must be interpret as arbitrary string which can be equal 
            to one element from enum.
          example: [ 'black' ]
        meta:
          type: object
          nullable: true
          additionalProperties: true
          description: |
            User-defined event meta's filters.

            Parameter name pattern: `path.to.field[__operator]`

            Path to field is an event meta's json field path. To navigate through nested objects the dot (.) is used.

            Field comparison **operator** is optional one of `eq` (default), `neq`, `like`, `nlike`, `in`, `nin`, `gt`, `gte`, `lt`, `lte`.

            Please note importance of using correct types when filtering. For example, the following filter is not valid:
            {"age__gt": 20.0} in case some of the metas contain `age` with datatype different from `number`.

            Allowed usage of filters is:

            |  operator  | type |        |         |         |
            |------------|------|--------|---------|---------|
            |            | none | string | integer | numeric |
            | eq         | +    | +      | +       | +       |
            | neq        | +    | +      | +       | +       |
            | like       | -    | +      | -       | -       |
            | nlike      | -    | +      | -       | -       |
            | in         | +    | +      | +       | +       |
            | nin        | +    | +      | +       | +       |
            | gt         | -    | +      | +       | +       |
            | gte        | -    | +      | +       | +       |
            | lt         | -    | +      | +       | +       |
            | lte        | -    | +      | +       | +       |

          example: {"user.email": "root@localhost", "user.age__gt": 18}

    events_filters_no_filters_limited:
      allOf:
        - $ref: '#/components/schemas/events_filters_no_create_end_time'
      type: object
      properties:
        event_ids:
          maxItems: 20000
        handler_ids:
          maxItems: 1000
        external_ids:
          maxItems: 1000
        top_similar_object_ids:
          maxItems: 1000
        top_similar_external_ids:
          maxItems: 1000
        face_ids:
          maxItems: 1000
        sources:
          maxItems: 1000
        stream_ids:
          maxItems: 1000
        cities:
          maxItems: 1000
        areas:
          maxItems: 1000
        districts:
          maxItems: 1000
        streets:
          maxItems: 1000
        house_numbers:
          maxItems: 1000
        track_ids:
          maxItems: 1000

    events_filters_no_account_limited:
      allOf:
        - $ref: '#/components/schemas/events_filters_no_filters_limited'
      properties:
        create_time__gte:
          description: Create time lower included boundary.
          oneOf:
            - $ref: '#/components/schemas/create_time__gte'
            - $ref: '#/components/schemas/create_time_now__gte'
        create_time__lt:
          description: Create time upper excluded boundary.
          oneOf:
            - $ref: '#/components/schemas/create_time__lt'
            - $ref: '#/components/schemas/create_time_now__lt'
        end_time__gte:
          description: End time lower included boundary.
          oneOf:
            - $ref: '#/components/schemas/end_time__gte'
            - $ref: '#/components/schemas/end_time_now__gte'
        end_time__lt:
          description: End time upper excluded boundary.
          oneOf:
            - $ref: '#/components/schemas/end_time__lt'
            - $ref: '#/components/schemas/end_time_now__lt'

    events_filters_no_account_limited_reply:
      allOf:
        - $ref: '#/components/schemas/events_filters_no_filters_limited'
      type: object
      properties:
        create_time__gte:
          description: Create time lower included boundary.
          $ref: '#/components/schemas/create_time__gte'
        create_time__lt:
          description: Create time upper excluded boundary.
          $ref: '#/components/schemas/create_time__lt'
        end_time__gte:
          description: End time lower included boundary.
          $ref: '#/components/schemas/end_time__gte'
        end_time__lt:
          description: End time upper excluded boundary.
          $ref: '#/components/schemas/end_time__lt'

    events_filters:
      allOf:
      - $ref: '#/components/schemas/events_filters_no_account'
      properties:
        account_id:
          $ref: '#/components/schemas/account_id'
      required: [ account_id ]

    events_filters_regular_create_time:
      allOf:
        - $ref: '#/components/schemas/events_filters_no_create_end_time'
      type: object
      properties:
        create_time__gte:
          description: Create time lower included boundary.
          $ref: '#/components/schemas/create_time__gte'
        create_time__lt:
          description: Create time upper excluded boundary.
          $ref: '#/components/schemas/create_time__lt'
        end_time__gte:
          description: End time lower included boundary.
          $ref: '#/components/schemas/end_time__gte'
        end_time__lt:
          description: End time upper excluded boundary.
          $ref: '#/components/schemas/end_time__lt'
        account_id:
          $ref: '#/components/schemas/account_id'
      required: [ account_id ]

    events_filters_limited_optional_account:
      allOf:
      - $ref: '#/components/schemas/events_filters_no_account_limited'
      properties:
        account_id:
          $ref: '#/components/schemas/account_id'

    events_filters_limited:
      allOf:
      - $ref: '#/components/schemas/events_filters_limited_optional_account'
      required: [ account_id ]

    face_filters:
      description: face filters.
      type: object
      properties:
        account_id:
            $ref: '#/components/schemas/account_id'
        face_id__lt:
          allOf:
            - $ref: '#/components/schemas/uuid'
          description: upper face id excluding boundary.
        face_id__gte:
          allOf:
            - $ref: '#/components/schemas/uuid'
          description: lower face id including boundary.

    linker_task_content:
      allOf:
        - $ref: "#/components/schemas/linker_task_content_no_filters"
      type: object
      properties:
        filters:
          anyOf:
            - $ref: '#/components/schemas/faces_filters'
            - $ref: '#/components/schemas/events_filters'
      required: [ objects_type, filters ]

    linker_task_content_reply:
      allOf:
        - $ref: "#/components/schemas/linker_task_content_no_filters"
      type: object
      properties:
        filters:
          anyOf:
            - $ref: '#/components/schemas/faces_filters_regular_create_time'
            - $ref: '#/components/schemas/events_filters_regular_create_time'
      required: [ objects_type, filters ]

    linker_task_content_schedule:
      allOf:
        - $ref: "#/components/schemas/linker_task_content_no_filters"
      type: object
      properties:
        filters:
          anyOf:
            - $ref: '#/components/schemas/faces_filters_schedule'
            - $ref: '#/components/schemas/events_filters_schedule'
          required: [account_id]
      required: [ objects_type, filters ]

    linker_task_content_no_filters:
      type: object
      description: linker task content
      properties:
        create_list:
          description: create list to link faces to or not | require list_id or create_list set to 1
          type: integer
          enum: [0, 1]
          example: 0
        list_id:
          description: id of list to link faces to | require list_id or create_list set to 1
          allOf:
          - $ref: '#/components/schemas/uuid'
        user_data:
          allOf:
          - $ref: '#/components/schemas/user_data'
          description: user data to create the list with | works if create_list set to 1
        objects_type:
          $ref: '#/components/schemas/objects_type'

    linker_task:
      allOf:
        - $ref: '#/components/schemas/task_base'
        - properties:
            content:
              $ref: '#/components/schemas/linker_task_content'

    new_handler_task_estimator:
      type: object
      description: new handler with policies
      properties:
        description:
          type: string
          maxLength: 128
          description: user description.
          default: estimator_task_{task_id}
        policies:
          description: handler policies.
          type: object
          additionalProperties:
            x-additionalPropertiesName: new handler policies fields
            description: See the Luna Handlers documentation section for details - "creating a handler".
      required: [policies]

    existing_handler_task_estimator:
      type: object
      description: existing handler
      properties:
        handler_id:
          allOf:
            - $ref: '#/components/schemas/uuid'
          description: |
           handler_id of static or dynamic handler.

           An error will occur if policies are specified for static handlers.
        policies:
          description: handler policies (required for dynamic handler).
          type: object
          additionalProperties:
            x-additionalPropertiesName: handler policies fields
            description: See the Luna Handlers documentation section for details - "creating a handler".
      required: [ handler_id ]

    base_estimator_task_content_source:
      type: object
      properties:
        image_type:
          type: integer
          enum: [0,1,2]
          default: 0
          description: image type of input image.  0 - raw image, 1 - face warped image, 2 - body warped image
      required: [source_type]

    base_estimator_task_content_source_required:
      allOf:
        - $ref: '#/components/schemas/base_estimator_task_content_source'
        - required: [image_type, source_type]

    zip_password_authorization:
      type: object
      description: password authorization
      properties:
        password:
          type: string
          maxLength: 128
          description: user password for the archive (zip archive support now)

    estimator_authorization_by_password:
      type: object
      description: user authorization meta
      properties:
        source_type:
          type: string
          enum: ["zip"]
          description: data type where images are located
        reference:
          oneOf:
          - $ref: '#/components/schemas/zip_reference'
          - type: string
            description: archive location url
            format: uri
        authorization:
          $ref: '#/components/schemas/zip_password_authorization'
        recursive:
          type: boolean
          default: true
          description: whether to estimate images from zip archive subdirectories recursively
      required: [reference]

    estimator_source_with_option_zip:
      allOf:
        - $ref: '#/components/schemas/estimator_authorization_by_password'
        - $ref: '#/components/schemas/base_estimator_task_content_source'

    estimator_source_with_option_network_disk:
      allOf:
        - $ref: '#/components/schemas/estimator_mounted_network_path'
        - $ref: '#/components/schemas/base_estimator_task_content_source'

    estimator_source_with_option_ftp:
      allOf:
        - $ref: '#/components/schemas/estimator_ftp_server_data'
        - $ref: '#/components/schemas/base_estimator_task_content_source'

    estimator_source_with_option_samba:
      allOf:
        - $ref: '#/components/schemas/estimator_samba_data'
        - $ref: '#/components/schemas/base_estimator_task_content_source'

    estimator_source_with_option_zip_required:
      allOf:
        - $ref: '#/components/schemas/estimator_authorization_by_password'
        - $ref: '#/components/schemas/base_estimator_task_content_source_required'

    estimator_source_with_option_network_disk_required:
      allOf:
        - $ref: '#/components/schemas/estimator_mounted_network_path_required'
        - $ref: '#/components/schemas/base_estimator_task_content_source_required'

    estimator_source_with_option_ftp_required:
      allOf:
        - $ref: '#/components/schemas/estimator_ftp_server_data_required'
        - $ref: '#/components/schemas/base_estimator_task_content_source_required'

    estimator_source_with_option_samba_required:
      allOf:
        - $ref: '#/components/schemas/estimator_samba_data_required'
        - $ref: '#/components/schemas/base_estimator_task_content_source_required'

    prefix_schema:
      type: string
      description: |
        file key prefix, also can be used to download from specific folder

        example file tree and prefixes
        ```
        .
        ├── prefix
        │   ├── 123_file.jpg
        │   └── file2.jpg
        ├── temp_file.jpg
        └── prefix_file.jpg
        ```

        | prefix        | result files                                           |
        |---------------|--------------------------------------------------------|
        | prefix        | prefix/file2.jpg, prefix/123_file.jpg, prefix_file.jpg |
        | prefix/       | prefix/file2.jpg, prefix/123_file.jpg                  |
        | prefix/123    | prefix/123_file.jpg                                    |
        | temp          | temp_file.jpg                                          |

    postfix_schema:
      type: string
      description: |
        file key postfix, also can be used to download files with specific extension

        example file tree and postfixes
        ```
        .
        ├── dir
        │   ├── face1.jpg
        │   └── face2.png
        ├── temp_file.png
        └── file.jpg
        ```

        | postfix       | result files                          |
        |---------------|---------------------------------------|
        | .jpg          | dir/face1.jpg, file.jpg               |
        | .png          | dir/face2.png, temp_file.png          |

    zip_reference:
      type: object
      description: zip archive reference
      properties:
        url:
          type: string
          description: archive location url
          format: uri
        prefix:
          $ref: '#/components/schemas/prefix_schema'
        postfix:
          $ref: '#/components/schemas/postfix_schema'
      required: [url]

    samba_reference:
      type: object
      description: samba reference.
      properties:
        host:
          type: string
          description: samba server host (IP)
        port:
          type: integer
          description: samba port
          minimum: 1
          maximum: 65535
          default: 445
        path:
          type: string
          description: path to directory with images
        prefix:
          $ref: '#/components/schemas/prefix_schema'
        postfix:
          $ref: '#/components/schemas/postfix_schema'
      required: [host]

    samba_reference_required:
      allOf:
        - $ref: '#/components/schemas/samba_reference'
        - required: [ host, port, path ]

    samba_authorization:
      type: object
      description: | 
        samba authorization.
        
        If no authorization data, connect to samba will be like guest.
      properties:
        user:
          type: string
          description: samba user
        password:
          type: string
          description: samba server password
      required: [user, password]

    estimator_samba_data:
      type: object
      description: samba
      properties:
        source_type:
          type: string
          enum: ["samba"]
          description: data type where images are located
        reference:
          $ref: '#/components/schemas/samba_reference'
        authorization:
          $ref: '#/components/schemas/samba_authorization'
        recursive:
          type: boolean
          default: true
          description: whether to estimate images from samba subdirectories recursively
      required: [reference]

    estimator_samba_data_required:
      allOf:
        - $ref: '#/components/schemas/estimator_samba_data'
        - properties:
            reference:
              $ref: '#/components/schemas/samba_reference_required'
        - required: [source_type, reference, recursive]

    ftp_reference:
      type: object
      description: ftp server reference
      properties:
        host:
          type: string
          description: ftp server host (IP or hostname)
        port:
          type: integer
          description: ftp server port
          minimum: 1
          maximum: 65535
          default: 21
        max_sessions:
          type: integer
          description: maximum number of allowed FTP sessions on server
          minimum: 1
          maximum: 50
          default: 8
        path:
          type: string
          description: path to directory with images
        prefix:
          $ref: '#/components/schemas/prefix_schema'
        postfix:
          $ref: '#/components/schemas/postfix_schema'
      required: [host]

    ftp_reference_required:
      allOf:
        - $ref: '#/components/schemas/ftp_reference'
        - required: [host, port, max_sessions, path]

    ftp_authorization:
      type: object
      description: FTP authorization
      properties:
        user:
          type: string
          description: ftp server user
          default: anonymous
        password:
          type: string
          description: ftp server password
          default: anonymous

    estimator_ftp_server_data:
      type: object
      description: ftp server
      properties:
        source_type:
          type: string
          enum: ["ftp"]
          description: data type where images are located
        reference:
          $ref: '#/components/schemas/ftp_reference'
        authorization:
          $ref: '#/components/schemas/ftp_authorization'
        recursive:
          type: boolean
          default: true
          description: whether to estimate images from ftp subdirectories recursively
      required: [reference]

    estimator_ftp_server_data_required:
      allOf:
        - $ref: '#/components/schemas/estimator_ftp_server_data'
        - properties:
            reference:
              $ref: '#/components/schemas/ftp_reference_required'
        - required: [source_type, reference, recursive]

    follow_links:
      type: boolean
      default: false
      description: whether follow file system links

    network_disk_reference:
      type: object
      description: network disk reference
      properties:
        path:
          type: string
          description: absolute mounted directory path
        prefix:
          $ref: '#/components/schemas/prefix_schema'
        postfix:
          $ref: '#/components/schemas/postfix_schema'
        follow_links:
          $ref: '#/components/schemas/follow_links'
      required: [path]

    estimator_mounted_network_path:
      type: object
      description: mounted network disk
      properties:
        source_type:
          type: string
          enum: ["network_disk"]
          description: Network disk source must be configured properly. See luna-tasks development manual for more information
        reference:
          $ref: '#/components/schemas/network_disk_reference'
        recursive:
          type: boolean
          default: true
          description: whether to estimate images from bucket subdirectories recursively
      required: [reference]

    estimator_mounted_network_path_required:
      allOf:
        - $ref: '#/components/schemas/estimator_mounted_network_path'
        - required: [source_type, reference, recursive]

    s3_reference:
      type: object
      description: s3-like storage reference
      properties:
        endpoint:
          type: string
          description: storage endpoint
          format: uri
        bucket_name:
          type: string
          description: |
            one of the following options:<ul>
            <li>raw bucket name (in this case, `endpoint` must be specified)</li>
            <li>access point ARN (in this case, `endpoint` and `region` must not be specified)
            (see <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html">aws userguide</a> for details)</li>
            <li>outpost ARN (in this case, `endpoint` and `region` must not be specified)
            (see <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html">aws userguide</a> for details)</li>
            </ul>
        prefix:
          type: string
          description: |
            file key prefix, also can be used to download from specific folder
            (see <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-prefixes.html"> aws userguide</a> for details)
        region:
          type: string
          description: bucket region
      required: [bucket_name]

    s3_authorization:
      type: object
      description: s3-like authorization
      properties:
        public_access_key:
          type: string
          description: public access key
        secret_access_key:
          type: string
          description: secret access key
        signature_version:
          type: string
          enum: [ s3v2, s3v4 ]
          default: s3v4
          description: authorization signature version
        verify_ssl:
          type: boolean
          default: true
          description: enable ssl certificate verification
      required: [public_access_key, secret_access_key]

    s3_authorization_required:
      allOf:
        - $ref: '#/components/schemas/s3_authorization'
        - required: [public_access_key, secret_access_key, signature_version]

    estimator_authorization_s3_like_storage:
      type: object
      description: s3-like storages auth data
      properties:
        source_type:
          type: string
          enum: ["s3"]
          description: data type where images are located
        reference:
          $ref: '#/components/schemas/s3_reference'
        authorization:
          $ref: '#/components/schemas/s3_authorization'
        recursive:
          type: boolean
          default: true
          description: whether to estimate images from bucket subdirectories recursively
        save_origin:
          type: boolean
          default: true
          description: whether to save image origin
      required: [reference]

    estimator_authorization_s3_like_storage_required:
      allOf:
        - $ref: "#/components/schemas/estimator_authorization_s3_like_storage"
        - properties:
            reference:
              $ref: '#/components/schemas/s3_reference'
            authorization:
              $ref: '#/components/schemas/s3_authorization_required'
        - required: [source_type, reference, recursive, save_origin]

    estimator_source_with_option_s3bucket:
      allOf:
        - $ref: '#/components/schemas/estimator_authorization_s3_like_storage'
        - $ref: '#/components/schemas/base_estimator_task_content_source'

    estimator_source_with_option_s3bucket_required:
      allOf:
        - $ref: '#/components/schemas/estimator_authorization_s3_like_storage_required'
        - $ref: '#/components/schemas/base_estimator_task_content_source_required'

    estimator_task_content_handler:
      description: |
        handler for estimator task.

        You can create a new static handler and specify policies for it or specify an existing static or dynamic handler. For the existing dynamic handler, you can specify policies.

        The same dynamic handler can be used in different estimator tasks, and it is not required to create a new handler for each task.
      oneOf:
        - $ref: '#/components/schemas/new_handler_task_estimator'
        - $ref: '#/components/schemas/existing_handler_task_estimator'

    estimator_task_content_filters:
      type: object
      description: estimator filters
      properties:
        account_id:
          $ref: '#/components/schemas/account_id'
      required: [account_id]

    estimator_task_content_source:
      description: images source
      oneOf:
        - $ref: '#/components/schemas/estimator_source_with_option_zip'
        - $ref: '#/components/schemas/estimator_source_with_option_s3bucket'
        - $ref: '#/components/schemas/estimator_source_with_option_network_disk'
        - $ref: '#/components/schemas/estimator_source_with_option_ftp'
        - $ref: '#/components/schemas/estimator_source_with_option_samba'
      discriminator:
        propertyName: "source_type"
        mapping:
          zip: '#/components/schemas/estimator_source_with_option_zip'
          s3: '#/components/schemas/estimator_source_with_option_s3bucket'
          network_disk: '#/components/schemas/estimator_source_with_option_network_disk'
          ftp: '#/components/schemas/estimator_source_with_option_ftp'
          samba: '#/components/schemas/estimator_source_with_option_samba'

    estimator_task_content_source_schedulable:
      description: images source
      oneOf:
        - $ref: '#/components/schemas/estimator_source_with_option_s3bucket'
        - $ref: '#/components/schemas/estimator_source_with_option_network_disk'
        - $ref: '#/components/schemas/estimator_source_with_option_ftp'
        - $ref: '#/components/schemas/estimator_source_with_option_samba'
      discriminator:
        propertyName: "source_type"
        mapping:
          s3: '#/components/schemas/estimator_source_with_option_s3bucket'
          network_disk: '#/components/schemas/estimator_source_with_option_network_disk'
          ftp: '#/components/schemas/estimator_source_with_option_ftp'
          samba: '#/components/schemas/estimator_source_with_option_samba'

    estimator_task_content_source_required:
      description: images source
      oneOf:
        - $ref: '#/components/schemas/estimator_source_with_option_zip_required'
        - $ref: '#/components/schemas/estimator_source_with_option_s3bucket_required'
        - $ref: '#/components/schemas/estimator_source_with_option_network_disk_required'
        - $ref: '#/components/schemas/estimator_source_with_option_ftp_required'
        - $ref: '#/components/schemas/estimator_source_with_option_samba_required'
      discriminator:
        propertyName: "source_type"
        mapping:
          zip: '#/components/schemas/estimator_source_with_option_zip_required'
          s3: '#/components/schemas/estimator_source_with_option_s3bucket_required'
          network_disk: '#/components/schemas/estimator_source_with_option_network_disk_required'
          ftp: '#/components/schemas/estimator_source_with_option_ftp_required'
          samba: '#/components/schemas/estimator_source_with_option_samba_required'

    estimator_task_content:
      type: object
      description: estimator task content
      properties:
        handler:
          $ref: '#/components/schemas/estimator_task_content_handler'
        source:
          $ref: '#/components/schemas/estimator_task_content_source'
        filters:
          $ref: '#/components/schemas/estimator_task_content_filters'
      required: [handler, source, filters]

    estimator_task_content_for_schedule:
      type: object
      description: estimator task content
      properties:
        handler:
          $ref: '#/components/schemas/estimator_task_content_handler'
        source:
          $ref: '#/components/schemas/estimator_task_content_source_schedulable'
        filters:
          $ref: '#/components/schemas/estimator_task_content_filters'
      required: [handler, source, filters]

    estimator_content_props:
      type: object
      properties:
        task_type:
          allOf:
            - $ref: "#/components/schemas/task_type_schedulable"
          enum: [9]
        content:
          $ref: '#/components/schemas/estimator_task_content_for_schedule'

    schedule_estimator_task_content_request:
      allOf:
        - $ref: "#/components/schemas/task_schedule_template_request"
        - $ref: "#/components/schemas/estimator_content_props"

    schedule_estimator_task_content_response:
      allOf:
        - $ref: "#/components/schemas/task_schedule_template_response"
        - $ref: "#/components/schemas/estimator_content_props"


    estimator_task_content_required:
      type: object
      description: estimator task content
      properties:
        handler:
          $ref: '#/components/schemas/estimator_task_content_handler'
        source:
          $ref: '#/components/schemas/estimator_task_content_source_required'
        filters:
          $ref: '#/components/schemas/estimator_task_content_filters'
      required: [handler, source, filters]

    estimator_task:
      allOf:
        - $ref: '#/components/schemas/task_base'
        - properties:
            content:
              $ref: '#/components/schemas/estimator_task_content'

    lambda_task_content:
      type: object
      description: lambda task content
      properties:
        lambda_id:
          type: string
          description: lambda task id
      required: [lambda_id]
      additionalProperties:
        x-additionalPropertiesName: lambda task content fields
        description: Fields define by lambda task creator.

    lambda_task:
      allOf:
        - $ref: '#/components/schemas/task_base'
        - properties:
            content:
              $ref: '#/components/schemas/lambda_task_content'

    schedule_lambda_task_props:
      type: object
      properties:
        task_type:
          allOf:
            - $ref: "#/components/schemas/task_type_schedulable"
          enum: [ 10 ]
        content:
          $ref: '#/components/schemas/lambda_task_content'

    schedule_lambda_task_content_request:
      allOf:
        - $ref: "#/components/schemas/task_schedule_template_request"
        - $ref: "#/components/schemas/schedule_lambda_task_props"

    schedule_lambda_task_content_response:
      allOf:
        - $ref: "#/components/schemas/task_schedule_template_response"
        - $ref: "#/components/schemas/schedule_lambda_task_props"

    gc_task_content_reply:
      oneOf:
        - $ref: '#/components/schemas/gc_face_descriptors_task_content'
        - $ref: '#/components/schemas/gc_faces_task_content_reply'
        - $ref: '#/components/schemas/gc_event_descriptors_task_content'
        - $ref: '#/components/schemas/gc_events_task_content_reply'
        - $ref: '#/components/schemas/gc_general_events_task_content_reply'
      discriminator:
        propertyName: "target"
        mapping:
          face_descriptors: '#/components/schemas/gc_face_descriptors_task_content'
          faces: '#/components/schemas/gc_faces_task_content_reply'
          event_descriptors: '#/components/schemas/gc_event_descriptors_task_content'
          events: '#/components/schemas/gc_events_task_content_reply'
          general_events: '#/components/schemas/gc_general_events_task_content_reply'

    gc_task_content:
      oneOf:
        - $ref: '#/components/schemas/gc_face_descriptors_task_content'
        - $ref: '#/components/schemas/gc_faces_task_content'
        - $ref: '#/components/schemas/gc_event_descriptors_task_content'
        - $ref: '#/components/schemas/gc_events_task_content'
        - $ref: '#/components/schemas/gc_general_events_task_content'
      discriminator:
        propertyName: "target"
        mapping:
          face_descriptors: '#/components/schemas/gc_face_descriptors_task_content'
          faces: '#/components/schemas/gc_faces_task_content'
          event_descriptors: '#/components/schemas/gc_event_descriptors_task_content'
          events: '#/components/schemas/gc_events_task_content'
          general_events: '#/components/schemas/gc_general_events_task_content'

    gc_task:
      allOf:
        - $ref: '#/components/schemas/task_base'
        - properties:
            content:
              $ref: '#/components/schemas/gc_task_content'

    gc_face_descriptors_task_content:
      description: Garbage collecting task content to delete face descriptors by version.
      type: object
      properties:
        target:
          type: string
          enum: ['face_descriptors']
        filters:
          type: object
          properties:
            descriptor_version:
              description: version of descriptors to delete
              type: integer
          required: [descriptor_version]
        store_results:
          type: boolean
          description: Whether to store task results. Whatever, task errors are stored.
          default: true
      required: [target, filters]

    gc_faces_task_content_no_filters:
      description: Garbage collecting task content to delete faces by extended filters.
      type: object
      properties:
        target:
          type: string
          enum: ['faces']
        filters:
          type: object
          properties:
            account_id:
              $ref: '#/components/schemas/account_id'
            user_data:
              $ref: '#/components/schemas/user_data'
            list_id:
              allOf:
                - $ref: '#/components/schemas/uuid'
              description: list id.
              example: '8950722f-3fd4-4223-b48f-03f95f0e8dfb'
        store_results:
          type: boolean
          description: Whether to store task results. Whatever, task errors are stored.
          default: true
        remove_samples:
          type: boolean
          description: |
            Whether to remove face descriptor and basic attributes samples along with the face.
          default: false

    gc_faces_task_content:
      allOf:
        - $ref: '#/components/schemas/gc_faces_task_content_no_filters'
      properties:
        filters:
          type: object
          properties:
            create_time__lt:
              description: Create time lower included boundary.
              oneOf:
                - $ref: '#/components/schemas/create_time__lt'
                - $ref: '#/components/schemas/create_time_now__lt'
            create_time__gte:
              description: Create time lower included boundary.
              oneOf:
                - $ref: '#/components/schemas/create_time__gte'
                - $ref: '#/components/schemas/create_time_now__gte'
      required: [ target, filters ]

    gc_faces_task_content_schedule:
      allOf:
        - $ref: '#/components/schemas/gc_faces_task_content_no_filters'
      properties:
        filters:
          type: object
          properties:
            create_time__lt:
              description: Create time lower included boundary.
              $ref: '#/components/schemas/create_time_now__lt'
            create_time__gte:
              description: Create time lower included boundary.
              $ref: '#/components/schemas/create_time_now__gte'
      required: [ target, filters ]

    gc_faces_task_content_reply:
      allOf:
        - $ref: '#/components/schemas/gc_faces_task_content_no_filters'
      properties:
        filters:
          type: object
          properties:
            create_time__lt:
              description: Create time lower included boundary.
              $ref: '#/components/schemas/create_time__lt'
            create_time__gte:
              description: Create time lower included boundary.
              $ref: '#/components/schemas/create_time__gte'
      required: [ target, filters ]

    gc_event_descriptors_task_content:
      description: Garbage collecting task content to delete event descriptors by version and type.
      type: object
      properties:
        target:
          type: string
          enum: [ event_descriptors ]
        filters:
          type: object
          properties:
            descriptor_version:
              description: Descriptors version.
              type: integer
            descriptor_type:
              description: Descriptors type.
              type: string
              enum: ['face', 'body']
          required: [descriptor_version, descriptor_type]
        store_results:
          type: boolean
          description: Whether to store task results. Whatever, task errors are stored.
          default: true
      required: [target, filters]

    gc_events_task_content_no_filters:
      description: garbage collecting task content to remove events
      type: object
      properties:
        target:
          type: string
          enum: ['events']
        filters:
          type: object
          properties:
            account_id:
              allOf:
                - $ref: '#/components/schemas/uuid'
              description: account id to execute task within the specified account.
            handler_id:
              allOf:
                - $ref: '#/components/schemas/uuid'
              description: handler id to execute task within the handler.
        store_results:
          type: boolean
          description: Whether to store task results. Whatever, task errors are stored.
          default: true
        remove_samples:
          type: boolean
          description: |
            Whether to remove face and body samples along with the event.

            > **WARNING**: After removing samples, it will become impossible to re-extract the attribute or descriptor for the created face.
          default: false
        remove_image_origins:
          type: boolean
          description: |
            Whether to remove origin images.
            In case url of the image origin points to external image task tries to remove it by performing DELETE request to the image url.

            > **WARNING**: Some images may belong to multiple events simultaneously.

          default: false
      required: [target, filters]

    gc_general_events_task_content_no_filters:
      description: garbage collecting task content to remove general events
      type: object
      properties:
        target:
          type: string
          enum: ['general_events']
        filters:
          type: object
          properties:
            account_id:
              allOf:
                - $ref: '#/components/schemas/uuid'
              description: Account id to execute task within the specified account.
            event_type:
              type: array
              description: List of general event types.
              minItems: 1
              maxItems: 1000
              items:
                type: string
                minLength: 1
                maxLength: 36
        store_results:
          type: boolean
          description: Whether to store task results. Whatever, task errors are stored.
          default: true
      required: [target, filters]

    gc_events_task_content:
      allOf:
        - $ref: '#/components/schemas/gc_events_task_content_no_filters'
      properties:
        filters:
          type: object
          properties:
            create_time__lt:
              description: Create time upper excluded boundary.
              oneOf:
                - $ref: '#/components/schemas/create_time__lt'
                - $ref: '#/components/schemas/create_time_now__lt'
            insert_time__lt:
              description: Insert time upper excluding boundary.
              oneOf:
                - $ref: '#/components/schemas/insert_time__lt'
                - $ref: '#/components/schemas/insert_time_now__lt'

    gc_general_events_task_content:
      allOf:
        - $ref: '#/components/schemas/gc_general_events_task_content_no_filters'
      properties:
        filters:
          type: object
          properties:
            event_create_time__lt:
              description: General event create time upper excluded boundary.
              oneOf:
                - $ref: '#/components/schemas/general_event_create_time__lt'
                - $ref: '#/components/schemas/general_event_create_time_now__lt'
            insert_time__lt:
              description: Insert time upper excluding boundary.
              oneOf:
                - $ref: '#/components/schemas/insert_time__lt'
                - $ref: '#/components/schemas/insert_time_now__lt'

    gc_events_task_content_reply:
      allOf:
        - $ref: '#/components/schemas/gc_events_task_content_no_filters'
      properties:
        filters:
          type: object
          properties:
            create_time__lt:
              description: Create time upper excluded boundary.
              $ref: '#/components/schemas/create_time__lt'
            insert_time__lt:
              description: Insert time upper excluding boundary.
              $ref: '#/components/schemas/insert_time__lt'

    gc_general_events_task_content_reply:
      allOf:
        - $ref: '#/components/schemas/gc_general_events_task_content_no_filters'
      properties:
        filters:
          type: object
          properties:
            event_create_time__lt:
              description: General event create time upper excluded boundary.
              $ref: '#/components/schemas/general_event_create_time__lt'
            insert_time__lt:
              description: Insert time upper excluding boundary.
              $ref: '#/components/schemas/insert_time__lt'

    clustering_task:
      anyOf:
        - $ref: '#/components/schemas/event_clustering_task'
        - $ref: '#/components/schemas/face_clustering_task'

    event_clustering_task_params:
      type: object
      description: additional task parameters
      properties:
        use_track_info:
          type: integer
          enum: [0, 1]
          default: 0
          description: whether to place events with equal track_id in the same clusters

    clustering_task_content_template:
      description: Clustering task content
      type: object
      properties:
        threshold:
          description: The minimum acceptable degree of similarity. If the similarity of two descriptors exceeds the specified value, it is considered that they belong to the same person. In this case, both descriptors are added to the same cluster.
          type: number
          format: float
          maximum: 1
          minimum: 0
          example: 0.5
          default: 0.81
        descriptor:
          $ref: '#/components/schemas/descriptor_info'
        limit:
          $ref: '#/components/schemas/clustering_limit'
      required: [objects_type, filters]

    clustering_task_content_events:
      allOf:
        - $ref: '#/components/schemas/clustering_task_content_template'
      description: Events clustering task content
      properties:
        objects_type:
          enum: [ events ]
        filters:
          $ref: '#/components/schemas/events_filters_limited_optional_account'
        params:
          $ref: '#/components/schemas/event_clustering_task_params'

    clustering_task_content_events_regular_create_time:
      allOf:
        - $ref: '#/components/schemas/clustering_task_content_template'
      description: Events clustering task content
      properties:
        objects_type:
          enum: [ events ]
        filters:
          allOf:
            - $ref: '#/components/schemas/events_filters_no_account_limited_reply'
          properties:
            account_id:
              $ref: '#/components/schemas/account_id'
        params:
          $ref: '#/components/schemas/event_clustering_task_params'

    event_clustering_task:
      allOf:
        - $ref: '#/components/schemas/task_base'
        - properties:
            content:
              $ref: '#/components/schemas/clustering_task_content_events'

    clustering_task_content_faces:
      allOf:
        - $ref: '#/components/schemas/clustering_task_content_template'
      description: Faces clustering task content
      properties:
        objects_type:
          enum: [ faces ]
        filters:
          $ref: '#/components/schemas/faces_filters_limited_optional_account'

    clustering_task_content_faces_regular_create_time:
      allOf:
        - $ref: '#/components/schemas/clustering_task_content_template'
      description: Faces clustering task content
      properties:
        objects_type:
          enum: [ faces ]
        filters:
          allOf:
            - $ref: '#/components/schemas/faces_filters_no_create_time'
          type: object
          properties:
            create_time__gte:
              description: Create time lower included boundary.
              $ref: '#/components/schemas/create_time__gte'
            create_time__lt:
              description: Create time upper excluded boundary.
              $ref: '#/components/schemas/create_time__lt'
            account_id:
              $ref: '#/components/schemas/account_id'
            face_ids:
              maxItems: 20000
            external_ids:
              maxItems: 1000

    face_clustering_task:
      allOf:
        - $ref: '#/components/schemas/task_base'
        - properties:
            content:
              $ref: '#/components/schemas/clustering_task_content_faces'

    clustering_task_content:
      description: Clustering task content
      oneOf:
        - $ref: '#/components/schemas/clustering_task_content_faces'
        - $ref: '#/components/schemas/clustering_task_content_events'
      discriminator:
        propertyName: objects_type
        mapping:
          faces: '#/components/schemas/clustering_task_content_faces'
          events: '#/components/schemas/clustering_task_content_events'

    clustering_task_content_reply:
      description: Clustering task content
      oneOf:
        - $ref: '#/components/schemas/clustering_task_content_faces_regular_create_time'
        - $ref: '#/components/schemas/clustering_task_content_events_regular_create_time'
      discriminator:
        propertyName: objects_type
        mapping:
          faces: '#/components/schemas/clustering_task_content_faces_regular_create_time'
          events: '#/components/schemas/clustering_task_content_events_regular_create_time'

    ae_face_filters:
      description: face filters.
      type: object
      properties:
        objects_type:
          description: object type.
          type: string
          enum: [ "faces" ]
        account_id:
          $ref: '#/components/schemas/account_id'
        face_id__lt:
          allOf:
            - $ref: '#/components/schemas/uuid'
          description: upper face id excluding boundary.
        face_id__gte:
          allOf:
            - $ref: '#/components/schemas/uuid'
          description: lower face id including boundary.
      required: [ objects_type ]

    ae_event_filters_no_inspect_time:
      description: event filters.
      type: object
      properties:
        objects_type:
          description: object type.
          type: string
          enum: [ "events" ]
        account_id:
          $ref: '#/components/schemas/account_id'
        handler_id:
          allOf:
            - $ref: '#/components/schemas/uuid'
          description: handler id.
        event_id__gte:
          allOf:
            - $ref: '#/components/schemas/uuid'
          description: lower event id including boundary.
        event_id__lt:
          allOf:
            - $ref: '#/components/schemas/uuid'
          description: upper event id excluding boundary.
      required: [ objects_type ]

    ae_event_filters:
      allOf:
        - $ref: "#/components/schemas/ae_event_filters_no_inspect_time"
      type: object
      properties:
        insert_time__gte:
          description: Insert time upper excluding boundary.
          oneOf:
            - $ref: '#/components/schemas/insert_time__gte'
            - $ref: '#/components/schemas/insert_time_now__gte'
        insert_time__lt:
          description: Insert time upper excluding boundary.
          oneOf:
            - $ref: '#/components/schemas/insert_time__lt'
            - $ref: '#/components/schemas/insert_time_now__lt'

    ae_event_filters_reply:
      allOf:
        - $ref: "#/components/schemas/ae_event_filters_no_inspect_time"
      type: object
      properties:
        insert_time__gte:
          description: Insert time upper excluding boundary.
          $ref: '#/components/schemas/insert_time__gte'
        insert_time__lt:
          description: Insert time upper excluding boundary.
          $ref: '#/components/schemas/insert_time__lt'

    additional_extract_task_content_body_descriptor_no_filters:
      description: additional extract human descriptors task
      type: object
      properties:
        extraction_target:
          description: extraction target
          type: string
          enum: [ "body_descriptor" ]
        options:
          description: extract task options
          type: object
          properties:
            descriptor_version:
              description: version of descriptors to extract
              type: integer
            missing:
              type: boolean
              description: whether to extract only missing descriptors (`false` is not implemented)
              default: true
          required: [ descriptor_version ]

    additional_extract_task_content_body_descriptor:
      allOf:
        - $ref: '#/components/schemas/additional_extract_task_content_body_descriptor_no_filters'
      properties:
        filters:
          allOf:
            - $ref: '#/components/schemas/ae_event_filters'
          description: |
            object filters.
            Body descriptor re-extraction can be performed on events only (see `objects_type` in filters).
      required: [ extraction_target, options, filters ]

    additional_extract_task_content_body_descriptor_reply:
      allOf:
        - $ref: '#/components/schemas/additional_extract_task_content_body_descriptor_no_filters'
      properties:
        filters:
          allOf:
            - $ref: '#/components/schemas/ae_event_filters_reply'
          description: |
            object filters.
            Body descriptor re-extraction can be performed on events only (see `objects_type` in filters).
      required: [ extraction_target, options, filters ]

    additional_extract_task_content_face_descriptor_no_filters:
      description: additional extract face descriptors task
      type: object
      properties:
        extraction_target:
          description: extraction target
          type: string
          enum: ["face_descriptor"]
        options:
          description: extract task options
          type: object
          properties:
            descriptor_version:
              description: version of descriptors to extract
              type: integer
            missing:
              type: boolean
              description: whether to extract only missing descriptors (`false` is not implemented)
              default: true
          required: [descriptor_version]

    additional_extract_task_content_face_descriptor:
      allOf:
        - $ref: '#/components/schemas/additional_extract_task_content_face_descriptor_no_filters'
      properties:
        filters:
          description: |
            object filters.
            Face descriptor re-extraction can be performed on either faces or events (see `objects_type` in filters).
          oneOf:
            - $ref: '#/components/schemas/ae_face_filters'
            - $ref: '#/components/schemas/ae_event_filters'
          discriminator:
            propertyName: objects_type
            mapping:
              faces: '#/components/schemas/ae_face_filters'
              events: '#/components/schemas/ae_event_filters'
      required: [ extraction_target, options, filters ]

    additional_extract_task_content_face_descriptor_reply:
      allOf:
        - $ref: '#/components/schemas/additional_extract_task_content_face_descriptor_no_filters'
      properties:
        filters:
          description: |
            object filters.
            Face descriptor re-extraction can be performed on either faces or events (see `objects_type` in filters).
          oneOf:
            - $ref: '#/components/schemas/ae_face_filters'
            - $ref: '#/components/schemas/ae_event_filters_reply'
          discriminator:
            propertyName: objects_type
            mapping:
              faces: '#/components/schemas/ae_face_filters'
              events: '#/components/schemas/ae_event_filters_reply'
      required: [ extraction_target, options, filters ]

    additional_extract_task_content_basic_attributes_no_filters:
      description: additional extract basic attributes task
      type: object
      properties:
        extraction_target:
          description: extraction target
          type: string
          enum: ["basic_attributes"]
        options:
          type: object
          description: extract task options
          properties:
            missing:
              type: boolean
              description: whether to extract only missing basic attributes (`false` is not implemented)
              default: true

    additional_extract_task_content_basic_attributes:
      allOf:
        - $ref: '#/components/schemas/additional_extract_task_content_basic_attributes_no_filters'
      properties:
        filters:
          description: |
            object filters.
            Basic attributes re-extraction can be performed on either faces or events (see `objects_type` in filters).
          oneOf:
            - $ref: '#/components/schemas/ae_face_filters'
            - $ref: '#/components/schemas/ae_event_filters'
          discriminator:
            propertyName: objects_type
            mapping:
              faces: '#/components/schemas/ae_face_filters'
              events: '#/components/schemas/ae_event_filters'
      required: [ extraction_target, filters ]

    additional_extract_task_content_basic_attributes_reply:
      allOf:
        - $ref: '#/components/schemas/additional_extract_task_content_basic_attributes_no_filters'
      properties:
        filters:
          description: |
            object filters.
            Basic attributes re-extraction can be performed on either faces or events (see `objects_type` in filters).
          oneOf:
            - $ref: '#/components/schemas/ae_face_filters'
            - $ref: '#/components/schemas/ae_event_filters_reply'
          discriminator:
            propertyName: objects_type
            mapping:
              faces: '#/components/schemas/ae_face_filters'
              events: '#/components/schemas/ae_event_filters_reply'
      required: [ extraction_target, options, filters ]

    additional_extract_task_content:
      description: additional extractor task content.
      oneOf:
        - $ref: '#/components/schemas/additional_extract_task_content_basic_attributes'
        - $ref: '#/components/schemas/additional_extract_task_content_face_descriptor'
        - $ref: '#/components/schemas/additional_extract_task_content_body_descriptor'
      discriminator:
        propertyName: extraction_target
        mapping:
          basic_attributes: '#/components/schemas/additional_extract_task_content_basic_attributes'
          face_descriptor: '#/components/schemas/additional_extract_task_content_face_descriptor'
          body_descriptor: '#/components/schemas/additional_extract_task_content_body_descriptor'

    additional_extract_task:
      allOf:
        - $ref: '#/components/schemas/task_base'
        - properties:
            content:
              $ref: '#/components/schemas/additional_extract_task_content'

    gc_descriptors_task_result:
      description: faces whoes descriptors was removed
      type: array
      items:
        allOf:
          - $ref: '#/components/schemas/uuid'
        description: face id whoes descriptor was removed

    gc_general_events_task_result:
      description: removed general events
      type: array
      items:
        description: removed general event
        type: object
        properties:
          event_id:
            description: removed general event id.
            allOf:
              - $ref: '#/components/schemas/uuid'
        required: [event_id]

    gc_events_task_result:
      description: removed events
      type: array
      items:
        description: removed event
        type: object
        properties:
          event_id:
            description: removed event id.
            allOf:
              - $ref: '#/components/schemas/uuid'
          samples:
            description: sample ids of the removed face attribute from events.
            type: array
            items:
              $ref: '#/components/schemas/uuid'
          image_origins:
            description: removed image origins.
            type: array
            items:
              type: string
              example: '/6/images/557d54ec-29ad-4f3c-93b4-c9092ef12515'
        required: [event_id]

    gc_faces_task_result:
      description: removed faces
      type: array
      items:
        description: removed face
        type: object
        properties:
          face_id:
            description: removed face id
            allOf:
              - $ref: '#/components/schemas/uuid'
          basic_attributes_samples:
            description: sample ids of the removed basic attributes samples of the face
            type: array
            items:
              $ref: '#/components/schemas/uuid'
          face_descriptor_samples:
            description: sample ids of the removed face descriptors samples of the face
            type: array
            items:
              $ref: '#/components/schemas/uuid'
        required: [face_id]

    gc_task_result:
      description: Garbage Collecting task result
      type: object
      properties:
        result:
          anyOf:
            - $ref: '#/components/schemas/gc_descriptors_task_result'
            - $ref: '#/components/schemas/gc_events_task_result'
            - $ref: '#/components/schemas/gc_general_events_task_result'
            - $ref: '#/components/schemas/gc_faces_task_result'
        errors:
          $ref: '#/components/schemas/task_errors'
      required: [errors]

    linker_task_result:
      description: Linking task result
      type: object
      properties:
        result:
          type: object
          description: linker task result
          properties:
            list_id:
              allOf:
              - $ref: '#/components/schemas/uuid'
              description: list id
            face_ids:
              description: linked faces' ids
              type: array
              items:
                $ref: '#/components/schemas/uuid'
        errors:
          $ref: '#/components/schemas/task_errors'
      required: [errors]

    clustering_task_result:
      description: Clustering task result
      type: object
      properties:
        result:
          description: clustering result
          type: object
          properties:
            clusters:
              description: generated clusters - lists of objects ids
              type: array
              items:
                description: single cluster - list of objects' ids
                type: array
                items:
                  $ref: '#/components/schemas/uuid'
            total_objects:
              type: integer
              description: total objects count.
              example: 1
            total_clusters:
              type: integer
              description: total clusters count.
              example: 1
          required: [clusters, total_objects, total_clusters]
        errors:
          $ref: '#/components/schemas/task_errors'
      required: [errors]

    longitude:
      type: number
      minimum: -180
      maximum: 180
      description: longitude in degrees

    latitude:
      type: number
      minimum: -90
      maximum: 90
      description: latitude in degrees

    location_geo_position:
      type: object
      description: geo position specified by geographic coordinates - longitude and latitude.
      properties:
        longitude:
          $ref: '#/components/schemas/longitude'
        latitude:
          $ref: '#/components/schemas/latitude'
      required: [ longitude, latitude ]

    location:
      type: object
      description: information about a place where event is incidented
      properties:
        city:
          allOf:
            - $ref: '#/components/schemas/string36'
            - nullable: true
            - description: city
        area:
          allOf:
            - $ref: '#/components/schemas/string36'
            - nullable: true
            - description: area
        district:
          allOf:
            - $ref: '#/components/schemas/string36'
            - nullable: true
            - description: district
        street:
          allOf:
            - $ref: '#/components/schemas/string36'
            - nullable: true
            - description: street
        house_number:
          allOf:
            - $ref: '#/components/schemas/string36'
            - nullable: true
            - description: house number
        geo_position:
          allOf:
            - $ref: '#/components/schemas/location_geo_position'
            - nullable: true
            - description: geo coordinates

    event_from_handler:
      type: object
      description: event format from handler.
      additionalProperties:
        x-additionalPropertiesName: handler_event
        description: |
          A generated event from handler. See the Luna Handlers documentation section for
          details - "generate events".

    success_estimator_result:
      description: Estimator task result
      type: array
      items:
        type: object
        properties:
          filename:
            type: string
            description: source image file name
          result:
            type: object
            description: image estimation result
            nullable: true
            properties:
              events:
                type: array
                items:
                  $ref: '#/components/schemas/event_from_handler'
              filtered_detections:
                type: object
                additionalProperties:
                  x-additionalPropertiesName: filtered_detections
                  description: |
                    Filtered detections on the image. See the Luna Handlers documentation section for details -
                    "generate events".
                required: [ face_detections ]
            required: [events, filtered_detections]
          errors:
            $ref: '#/components/schemas/task_handler_errors'
        required: [filename, result, errors]

    estimator_task_result:
      type: object
      description: Estimator task result
      properties:
        result:
          $ref: '#/components/schemas/success_estimator_result'
        errors:
          $ref: '#/components/schemas/task_errors'
      required: [errors]

    reporter_task_content_without_filters:
      type: object
      description: reporter task content
      properties:
        columns:
          description: Column targets in CSV report. Order of fields determinates the order columns in report.
          anyOf:
            - $ref: '#/components/schemas/report_event_columns'
            - $ref: '#/components/schemas/report_face_columns'
          example: [ "face_id", "user_data", "create_time" ]
        csv_delimiter:
          default: ','
          type: string
          description: csv delimiter
          maxLength: 1
          minLength: 1
          example: '$'
        save_images:
          type: integer
          default: 0
          enum: [ 0, 1 ]
          description: whether to save images in the result

    reporter_task_content:
      allOf:
        - $ref: '#/components/schemas/reporter_task_content_without_filters'
        - properties:
            filters:
              type: object
              description: reporter task filters
              properties:
                account_id:
                  $ref: '#/components/schemas/account_id'
                task_id:
                  description: id of task
                  type: integer
                  example: 146
              required: [ task_id ]
      required: [ filters ]

    report_event_columns:
      type: array
      items:
        description: |
          event columns
        type: string
        enum: ["event_id", "create_time", "end_time", "external_id", "handler_id", "stream_id", "source", "top_match",
               "match_result", "face_detections", "body_detections", "face_id", "attach_result", "gender", "age",
               "emotion", "ethnic_group", "tags", "user_data", "city", "area", "district", "street", "house_number",
               "geo_position", "mask", "track_id", "liveness", "deepfake", "body_basic_attributes", "upper_body",
               "lower_body", "accessories", "meta"]
      default: ["event_id","create_time", "end_time", "external_id", "handler_id", "stream_id", "source", "top_match",
                "face_id", "gender", "age", "emotion", "ethnic_group", "user_data", "city", "area", "district",
                "street", "house_number", "geo_position", "mask", "track_id", "liveness", "deepfake",
                "body_basic_attributes", "upper_body", "lower_body", "accessories", "meta"]

    report_face_columns:
      type: array
      items:
        description: face columns.
        type: string
        enum: ["user_data", "create_time", "lists", "external_id", "avatar", "event_id"]
      default: ["user_data", "create_time", "external_id", "avatar", "event_id"]

    reporter_task:
      allOf:
        - $ref: '#/components/schemas/task_base'
        - properties:
            content:
              $ref: '#/components/schemas/reporter_task_content'

    exporter_event_columns:
      type: array
      items:
        description: |
          event columns. default is
          ["event_id", "create_time", "end_time", "external_id", "handler_id", "stream_id", "source", "top_match",
           "face_id", "gender", "age", "emotion", "ethnic_group", "user_data", "city", "area", "district",
           "street", "house_number", "geo_position", "mask", "track_id", "liveness", "deepfake", "body_basic_attributes", 
           "upper_body", "lower_body", "accessories", "meta"]
        type: string
        enum: ["event_id", "create_time", "external_id", "handler_id", "stream_id", "source", "top_match", "match_result",
               "face_detections", "face_id", "attach_result", "gender", "end_time",
               "age", "emotion", "ethnic_group", "tags", "user_data", "city", "area", "district", "street",
               "house_number", "geo_position", "body_detections", "mask", "track_id", "liveness", "deepfake",
               "body_basic_attributes", "upper_body", "lower_body", "accessories", "meta"
               ]

    exporter_face_columns:
      type: array
      items:
        description: face columns. default is ["face_id", "user_data", "create_time", "external_id", "avatar", "event_id"]
        type: string
        enum: ["face_id", "user_data", "create_time", "lists", "external_id", "avatar", "event_id"]

    exporter_task_content_no_filters:
      type: object
      description: exporter task content
      properties:
        objects_type:
          $ref: '#/components/schemas/objects_type'

        columns:
          description: colum names in csv report. Order of fields determinates the order columns in report.
          anyOf:
            - $ref: '#/components/schemas/exporter_event_columns'
            - $ref: '#/components/schemas/exporter_face_columns'
          example: [ "face_id", "user_data", "create_time" ]

        descriptor:
          $ref: '#/components/schemas/descriptor_info'

        csv_delimiter:
          default: ','
          type: string
          description: csv delimiter
          maxLength: 1
          minLength: 1
          example: '$'

        save_images:
          type: integer
          default: 0
          enum: [ 0, 1 ]
          description: whether to add images to the resulting archive

      required: [ filters, objects_type ]

    exporter_task_content:
      allOf:
        - $ref: "#/components/schemas/exporter_task_content_no_filters"
      type: object
      properties:
        filters:
          description: exporter task filters
          anyOf:
            - $ref: '#/components/schemas/events_filters'
            - $ref: '#/components/schemas/faces_filters'

    exporter_task_content_reply:
      allOf:
        - $ref: "#/components/schemas/exporter_task_content_no_filters"
      type: object
      properties:
        filters:
          description: exporter task filters
          anyOf:
            - $ref: '#/components/schemas/faces_filters_regular_create_time'
            - $ref: '#/components/schemas/events_filters_regular_create_time'

    exporter_task:
      allOf:
        - $ref: '#/components/schemas/task_base'
        - properties:
            content:
              $ref: '#/components/schemas/exporter_task_content'

    face_additional_extract_result:
      type: object
      properties:
        face_id:
          description: extracted attribute face id.
          allOf:
            - $ref: '#/components/schemas/uuid'
        samples:
          description: sample ids used for extraction
          type: array
          items:
            $ref: '#/components/schemas/uuid'
      required: [face_id, samples]

    event_additional_extract_result:
      type: object
      properties:
        event_id:
          description: extracted attribute event id.
          allOf:
            - $ref: '#/components/schemas/uuid'
        samples:
          description: sample ids used for extraction
          type: array
          items:
            $ref: '#/components/schemas/uuid'
      required: [event_id, samples]

    additional_extract_task_result:
      description: Additional extract task result
      type: object
      properties:
        result:
          description: additional extract result
          type: array
          items:
            oneOf:
              - $ref: '#/components/schemas/event_additional_extract_result'
              - $ref: '#/components/schemas/face_additional_extract_result'
        errors:
          $ref: '#/components/schemas/task_errors'
      required: [errors]

    cross_match_task_reference_filters:
      description: Object filters for references.
      anyOf:
        - $ref: '#/components/schemas/faces_filters_no_account_limited'
        - $ref: '#/components/schemas/events_filters_no_account_limited'
        - $ref: '#/components/schemas/attributes_filters_no_account_limited'

    cross_match_task_reference_filters_reply:
      description: Object filters for references.
      anyOf:
        - $ref: '#/components/schemas/faces_filters_no_account_limited_reply'
        - $ref: '#/components/schemas/events_filters_no_account_limited_reply'
        - $ref: '#/components/schemas/attributes_filters_no_account_limited'

    cross_match_task_candidate_filters:
      description: Object filters for candidates.
      anyOf:
        - $ref: '#/components/schemas/faces_filters_no_account_limited'
        - $ref: '#/components/schemas/events_filters_no_account_limited'
        - $ref: '#/components/schemas/attributes_filters_no_account_limited'

    cross_match_task_candidate_filters_reply:
      description: Object filters for candidates.
      anyOf:
        - $ref: '#/components/schemas/faces_filters_no_account_limited_reply'
        - $ref: '#/components/schemas/events_filters_no_account_limited_reply'
        - $ref: '#/components/schemas/attributes_filters_no_account_limited'

    cross_match_task_content_no_filters:
      type: object
      description: cross match task content
      properties:
        filters:
          description: Task objects' filters.
          type: object
          properties:
            reference_type:
              $ref: '#/components/schemas/common_objects_type'
            candidate_type:
              $ref: '#/components/schemas/common_objects_type'
            descriptor:
              $ref: '#/components/schemas/descriptor_info'
            account_id:
              allOf:
                - $ref: '#/components/schemas/uuid'
              description: account ID filter for task objects.
          required: [ reference_type, candidate_type, reference_filters, candidate_filters ]
        threshold:
          description: The minimum acceptable degree of similarity. If the similarity of two descriptors falls behind the specified value, the match will be ignored. References with all filtered matches also will be ignored.
          type: number
          format: float
          maximum: 1
          minimum: 0
          example: 0.5
          default: 0.0
        limit:
          $ref: '#/components/schemas/limit'
      required: [ filters ]

    cross_match_task_content:
      allOf:
        - $ref: '#/components/schemas/cross_match_task_content_no_filters'
      properties:
        filters:
          type: object
          properties:
            reference_filters:
              $ref: '#/components/schemas/cross_match_task_reference_filters'
            candidate_filters:
              $ref: '#/components/schemas/cross_match_task_candidate_filters'
          required: [ reference_filters, candidate_filters ]

    cross_match_task_content_reply:
      allOf:
        - $ref: '#/components/schemas/cross_match_task_content_no_filters'
      properties:
        filters:
          type: object
          properties:
            reference_filters:
              $ref: '#/components/schemas/cross_match_task_reference_filters_reply'
            candidate_filters:
              $ref: '#/components/schemas/cross_match_task_candidate_filters_reply'
          required: [ reference_filters, candidate_filters ]

    cross_match_task:
      allOf:
        - $ref: '#/components/schemas/task_base'
        - properties:
            content:
              $ref: '#/components/schemas/cross_match_task_content'

    cross_match_task_result:
      description: Cross Match task result
      type: object
      properties:
        result:
          description: cross match task result
          type: array
          items:
            type: object
            properties:
              reference_id:
                description: reference id (see reference_type field in cross_match_task filters).
                allOf:
                  - $ref: '#/components/schemas/uuid'
              candidates:
                description: match candidates for the reference
                type: array
                items:
                  type: object
                  description: match with a candidate
                  properties:
                    candidate_id:
                      description: candidate id (see candidate_type field in cross_match_task filters)
                      allOf:
                        - $ref: '#/components/schemas/uuid'
                    similarity:
                      description: similatrity for the reference-candidate pair
                      type: number
                      minimum: 0
                      maximum: 1
                      example: 1
                  required: [candidate_id, similarity]
                minItems: 1
            required: [reference_id, candidates]
        errors:
          $ref: '#/components/schemas/task_errors'
      required: [errors]

    markup_face_items:
      type: object
      properties:
        face_id:
          allOf:
            - $ref: '#/components/schemas/uuid'
          description: face id.
        label:
          type: integer
          description: face label (group id)
          example: 12
      required: [face_id, label]

    markup_attribute_items:
      type: object
      properties:
        attribute_id:
          allOf:
            - $ref: '#/components/schemas/uuid'
          description: attribute id.
        label:
          type: integer
          description: face attribute label (group id)
          example: 12
      required: [attribute_id, label]

    roc_task_content:
      description: roc task content.
      type: object
      properties:
        markup:
          description: markup of face ids to labels (group ids).
          type: array
          minItems: 2
          maxItems: 20000
          items:
            oneOf:
              - $ref: '#/components/schemas/markup_face_items'
              - $ref: '#/components/schemas/markup_attribute_items'
        filters:
          description: task objects' filters.
          type: object
          properties:
            account_id:
              allOf:
                - $ref: '#/components/schemas/uuid'
              description: account id filter for a task objects.
        threshold_hit_top:
          allOf:
            - $ref: '#/components/schemas/float10'
          description: similarity threshold to calculate hit into the top-N.
          example: 0.95
          default: 0
        limit:
          $ref: '#/components/schemas/limit'
        key_FPRs:
          description: roc-curve key FPR values
          type: array
          items:
            $ref: '#/components/schemas/float10'
          example: [ 0.000001, 0.001 ]
      required: [ markup, filters ]

    roc_task:
      allOf:
        - $ref: '#/components/schemas/task_base'
        - properties:
            content:
              $ref: '#/components/schemas/roc_task_content'

    roc_points:
      type: object
      properties:
        FPR:
          allOf:
            - $ref: '#/components/schemas/float10'
          description: false positive rate.
        TPR:
          allOf:
            - $ref: '#/components/schemas/float10'
          description: true positive rate.
        similarity:
          allOf:
            - $ref: '#/components/schemas/float10'
          description: similatrity threshold.
      required: [FPR, TPR, similarity]

    roc_task_result:
      description: roc task result.
      type: object
      properties:
        result:
          description: roc-curve calculation result.
          type: object
          properties:
            roc:
              type: array
              items:
                $ref: '#/components/schemas/roc_points'
              description: roc-curve points.
              example:
               - FPR: 0.1
                 TPR: 0.95
                 similarity: 0.9
               - FPR: 0.15
                 TPR: 0.96
                 similarity: 0.8
            hit_top_probability:
              type: object
              description: propability of hit into the top.
              properties:
                top-1:
                  allOf:
                    - $ref: '#/components/schemas/float10'
                  description: propability of hit into the top-1.
                  nullable: true
                top-2:
                  allOf:
                    - $ref: '#/components/schemas/float10'
                  description: propability of hit into the top-2.
                  nullable: true
                top-3:
                  allOf:
                    - $ref: '#/components/schemas/float10'
                  description: propability of hit into the top-3.
                  nullable: true
                top-4:
                  allOf:
                    - $ref: '#/components/schemas/float10'
                  description: propability of hit into the top-4.
                  nullable: true
                top-5:
                  allOf:
                    - $ref: '#/components/schemas/float10'
                  description: propability of hit into the top-5.
                  nullable: true
              required: [top-1, top-2, top-3, top-4, top-5]
              example:
                top-1: 0.995
                top-2: 0.997
                top-3: 0.999
                top-4: 0.999
                top-5: 0.999
            auc:
              allOf:
                - $ref: '#/components/schemas/float10'
              description: area under the roc-curve.
              example: 0.99
            type_I_and_II_error_rates_equal_point:
              allOf:
                - $ref: '#/components/schemas/roc_points'
              description: ROC-curve point where type I error rate (1 - TPR) and type II error rate (FPR) are equal, i.e. intersection point of the ROC-curve and the secondary main diagonal.
              example:
                FPR: 0.15
                TPR: 0.85
                similarity: 0.8
              nullable: true
            key_points:
              type: array
              items:
                $ref: '#/components/schemas/roc_points'
              description: roc-curve points.
              example:
                - FPR: 0.000001
                  TPR: 0.95
                  similarity: 0.9
                - FPR: 0.001
                  TPR: 0.96
                  similarity: 0.8
              nullable: true
          required: [roc, hit_top_probability, auc, type_I_and_II_error_rates_equal_point, key_points]
        errors:
          $ref: '#/components/schemas/task_errors'
      required: [errors]

    accept_docs_handler:
      type: string
      enum: [application/x-yaml, text/html]

    report_task_result:
      type: string
      format: binary
      description: |
        zip archive with task result (now zip is supported in tasks on reports).

        Csv file and optional a folder with images in the case clusterization report.

        | cluster | event_id                             | create_time                      | end_time                         | external_id | handler_id                           | attribute_id                         | source | stream_id                            | top_match                                                                                                                                      | face_id                              | gender | age | emotion | ethnic_group | user_data                         | city   | area | district | street | house_number | latitude | longitude | mask | apparent_gender | apparent_age | headwear_state | sleeve_length | upper_clothing_colors | backpack_state | headwear_apparent_color | lower_garment_type    | lower_garment_colors | shoes_apparent_color | meta             |
        |---------|--------------------------------------|----------------------------------|----------------------------------|-------------|--------------------------------------|--------------------------------------|--------|--------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------|--------|-----|---------|--------------|-----------------------------------|--------|------|----------|--------|--------------|----------|-----------|------|-----------------|--------------|----------------|---------------|-----------------------|----------------|-------------------------|-----------------------|----------------------|----------------------|------------------|
        | 0       | 6a4053de-17ab-40b5-bf2b-a1495df39085 | 2019-02-13T18:04:40.723800+03:00 | 2019-02-13T18:04:40.723800+03:00 |             | d727b3f5-e8ca-4fca-b092-d170ef5f9e49 | b3f9e82d-1654-4250-b39e-f8bbbca9880c |        | 91a7fd34-0877-46f5-844c-e88fd28d68f0 | "{'face_id': '23978f64-305f-4c43-8c01-c40bafabe554', 'label': '3a118ebc-18e2-4ed0-a0f0-3a50db652729', 'similarity': 0.6, 'external_id': 'e0'}" | cfb8ca11-4901-4296-a71d-0783d61ccf05 | 1      | 28  |         | 2            | vl test events_with_created_faces | Moscow | CAA  | Arbat    | Arbat  | 1            | 12.34    |   56.78   |  1   | 1               | 33           | 0              | "long"        | ["black", "white"]    | 2              | "black"                 | "shorts"              | ["black", "blue"]    | "black"              | "{'foo':'bar1'}" |
        | 1       | 110cc2d3-0350-418e-b956-90ef4dacbd23 | 2019-02-13T18:04:40.723800+03:00 | 2019-02-13T18:04:40.723800+03:00 |             | d727b3f5-e8ca-4fca-b092-d170ef5f9e49 | 3e1d0ffb-1fa6-449e-8c8b-8f9b56bfff6d |        | 91a7fd34-0877-46f5-844c-e88fd28d68f0 | "{'face_id': 'ad008886-942c-4c13-934c-8232dc7eefb2', 'label': '15859afa-37d3-41e2-8bc2-cb6f970dc6a0', 'similarity': 0.5, 'external_id': 'e1'}" | f4f17cbe-9197-4347-b214-692fa4ca9f26 | 0      | 24  |         | 2            | vl test events_with_created_faces | Moscow | CAA  | Arbat    | Arbat  | 1            | 12.34    |   56.78   |  1   | 1               | 33           | 0              | "long"        | ["black", "white"]    | 2              | "black"                 | "shorts"              | ["black", "blue"]    | "black"              | "{'foo':'bar1'}" |
        | 2       | 9a9c9445-6a3d-4f4d-b22a-64601f4c8675 | 2019-02-13T18:04:40.723800+03:00 | 2019-02-13T18:04:40.723800+03:00 |             | d727b3f5-e8ca-4fca-b092-d170ef5f9e49 | 91a7fd34-0877-46f5-844c-e88fd28d68f0 |        | 91a7fd34-0877-46f5-844c-e88fd28d68f0 | "{'face_id': 'c77bda6b-74ea-412f-989f-f27fd5be1e20', 'label': '3ac8c676-c717-4da4-8ed3-6ca9e6139c6d', 'similarity': 0.4, 'external_id': 'e2'}" | 83086070-bce2-40b9-a5c4-9df36a52fe4f | 0      | 19  |         | 4            | vl test events_with_created_faces | Moscow | CAA  | Arbat    | Arbat  | 1            | 12.34    |   56.78   |  1   | 1               | 33           | 0              | "long"        | ["black", "white"]    | 2              | "black"                 | "shorts"              | ["black", "blue"]    | "black"              | "{'foo':'bar1'}" |
        | 2       | 979be9cd-6363-431a-a8a6-3f3fff806abf | 2019-02-13T18:04:40.723800+03:00 | 2019-02-13T18:04:40.723800+03:00 |             | d727b3f5-e8ca-4fca-b092-d170ef5f9e49 | 2cfacb32-fc7a-4abd-8518-0bf759acc4f9 |        | 91a7fd34-0877-46f5-844c-e88fd28d68f0 | "{'face_id': '477a4ef7-16dc-4189-ab3b-91b1d342e101', 'label': '64058eac-eff1-4efc-b6c3-982133523a31', 'similarity': 0.3, 'external_id': 'e3'}" | e09228a7-8a7e-4581-b550-d5c0818c871f | 0      | 28  |         | 4            | vl test events_with_created_faces | Moscow | CAA  | Arbat    | Arbat  | 1            | 12.34    |   56.78   |  1   | 1               | 33           | 0              | "long"        | ["black", "white"]    | 2              | "black"                 | "shorts"              | ["black", "blue"]    | "black"              | "{'foo':'bar1'}" |
        | 3       | 60b86bf7-3395-40cf-90f0-4e0756f50b9e | 2019-02-13T18:04:40.723800+03:00 | 2019-02-13T18:04:40.723800+03:00 |             | d727b3f5-e8ca-4fca-b092-d170ef5f9e49 | 67c823db-8e3c-4638-abf9-63078d2687d5 |        | 91a7fd34-0877-46f5-844c-e88fd28d68f0 | "{'face_id': '7f5bf6fb-2ad0-42bf-98f2-fe949516db7d', 'label': 'be309d4d-deaa-479e-ba70-026a712f39e2', 'similarity': 0.2, 'external_id': 'e4'}" | 301e8eb8-b6af-4c33-b5a1-6861509d2df4 | 1      | 56  |         | 4            | vl test events_with_created_faces | Moscow | CAA  | Arbat    | Arbat  | 1            | 12.34    |   56.78   |  1   | 1               | 33           | 0              | "long"        | ["black", "white"]    | 2              | "black"                 | "shorts"              | ["black", "blue"]    | "black"              | "{'foo':'bar1'}" |

    export_task_result:
      type: string
      format: binary
      description: |
        zip archive with task result (now zip is supported in tasks on export).

        Csv file and optional a folder with images in the case export.

        | event_id                             | create_time                      | end_time                         | external_id                          | handler_id                           | source                               | stream_id                            | top_match                                                                                                                                      | face_id                              | gender | age | emotion | ethnic_group | user_data                            | mask | track_id                             | city   | area | district | street | house_number | geo_position     | mask | apparent_gender | apparent_age | headwear_state | sleeve_length | upper_clothing_colors | backpack_state | headwear_apparent_color | lower_garment_type    | lower_garment_colors | shoes_apparent_color | meta             |
        |--------------------------------------|----------------------------------|----------------------------------|--------------------------------------|--------------------------------------|--------------------------------------|--------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------|--------|-----|---------|--------------|--------------------------------------|------|--------------------------------------|--------|------|----------|--------|--------------| -----------------|------|-----------------|--------------|----------------|---------------|-----------------------|----------------|-------------------------|-----------------------|----------------------|----------------------|------------------|
        | 0370f6b6-643a-4ad6-8c30-57849d7b070d | 2021-06-18T09:01:45.115401+03:00 | 2021-06-18T09:01:45.115401+03:00 | a2c4ef84-8ed6-4b9c-b4ac-b96e7ae4d973 | 0f474053-8b2c-4d62-bfd0-b2f6072464cd | a7f009a9-3a98-4e5b-8e45-0c43290c84df | 91a7fd34-0877-46f5-844c-e88fd28d68f0 | "{'face_id': '23978f64-305f-4c43-8c01-c40bafabe554', 'label': '3a118ebc-18e2-4ed0-a0f0-3a50db652729', 'similarity': 0.6, 'external_id': 'e0'}" | f687a4d1-0d25-4940-bbda-192b7b964fed | 1      | 33  | 7       | 1            | 1111632d-70fc-4e2e-b336-d5a68e1deb14 | 1    | 09e6642b-1ebe-405d-9bcd-86bbe254dc4f | Moscow | CAA  | Arbat    | Arbat  | 1            | "55.752, 36.616" | 1    | 1               | 33           | 0              | "long"        | ["black", "white"]    | 2              | "black"                 | "shorts"              | ["black", "blue"]    | "black"              | "{'foo':'bar1'}" |
        | 0370f6b6-643a-4ad6-8c30-57849d7b070c | 2021-06-18T09:01:45.115206+03:00 | 2021-06-18T09:01:45.115401+03:00 | 2ba4dcb3-0ca6-43b2-a588-42cd776a09ab | 2daa17f1-a5e6-4d7b-bae4-a224eec35eee | c038bede-f002-4c74-98fe-d3686b043fcd | 91a7fd34-0877-46f5-844c-e88fd28d68f0 | "{'face_id': 'ad008886-942c-4c13-934c-8232dc7eefb2', 'label': '15859afa-37d3-41e2-8bc2-cb6f970dc6a0', 'similarity': 0.5, 'external_id': 'e1'}" | ed5ea7ce-02b3-4129-b3e8-4721b678c463 | 1      | 33  | 7       | 1            | 42d908a4-52c5-4f46-87bd-4903ee315260 | 1    | b152f0a9-2fe7-458d-9107-9783cf14e491 | Moscow | CAA  | Arbat    | Arbat  | 1            | "55.752, 36.616" | 1    | 1               | 33           | 0              | "long"        | ["black", "white"]    | 2              | "black"                 | "shorts"              | ["black", "blue"]    | "black"              | "{'foo':'bar1'}" |
        | 0370f6b6-643a-4ad6-8c30-57849d7b070b | 2021-06-18T09:01:45.115014+03:00 | 2021-06-18T09:01:45.115401+03:00 | ca23bb19-6c15-4466-a89c-b1181adaf874 | 757318b2-3570-496a-b3c2-5d8a024e0ae1 | 4fd91006-d51a-4491-8923-1c6341a579c4 | 91a7fd34-0877-46f5-844c-e88fd28d68f0 | "{'face_id': 'c77bda6b-74ea-412f-989f-f27fd5be1e20', 'label': '3ac8c676-c717-4da4-8ed3-6ca9e6139c6d', 'similarity': 0.4, 'external_id': 'e2'}" | ae6381e6-0341-47bb-9989-3a3706ae99f9 | 1      | 33  | 7       | 1            | 079c8ecc-d29b-4ab5-aa65-d1954b5101d6 | 1    | e6495a29-7c25-45bd-b9f6-17d954f5a485 | Moscow | CAA  | Arbat    | Arbat  | 1            | "55.752, 36.616" | 1    | 1               | 33           | 0              | "long"        | ["black", "white"]    | 2              | "black"                 | "shorts"              | ["black", "blue"]    | "black"              | "{'foo':'bar1'}" |
        | 0370f6b6-643a-4ad6-8c30-57849d7b070a | 2021-06-18T09:01:45.114805+03:00 | 2021-06-18T09:01:45.115401+03:00 | 7e1c37d0-74f1-4ca7-8fbe-f5c26b6a5fb7 | 7c57c339-4fc3-4a1a-90e3-e932eb4b022d | 8391e7c7-a8b1-4466-8b1e-76433f3e92a7 | 91a7fd34-0877-46f5-844c-e88fd28d68f0 | "{'face_id': '477a4ef7-16dc-4189-ab3b-91b1d342e101', 'label': '64058eac-eff1-4efc-b6c3-982133523a31', 'similarity': 0.3, 'external_id': 'e3'}" | 830bc063-d5ca-4eba-a8c3-2094d9e4bd32 | 1      | 33  | 7       | 1            | 5068d60e-5f50-4e45-bdbf-d68a3020097c | 1    | b3b780ea-76f2-4147-ae4e-674bbf8c8aa0 | Moscow | CAA  | Arbat    | Arbat  | 1            | "55.752, 36.616" | 1    | 1               | 33           | 0              | "long"        | ["black", "white"]    | 2              | "black"                 | "shorts"              | ["black", "blue"]    | "black"              | "{'foo':'bar1'}" |
        | 0370f6b6-643a-4ad6-8c30-57849d7b0709 | 2021-06-18T09:01:45.114531+03:00 | 2021-06-18T09:01:45.115401+03:00 | 3a95f340-9b02-4b4d-b56c-bc6aeaae46db | aa7d4de1-d4fb-4052-acb4-1ccb5be99ece | c1275d2f-95d1-4034-870f-da0a8f9d02b8 | 91a7fd34-0877-46f5-844c-e88fd28d68f0 | "{'face_id': '7f5bf6fb-2ad0-42bf-98f2-fe949516db7d', 'label': 'be309d4d-deaa-479e-ba70-026a712f39e2', 'similarity': 0.2, 'external_id': 'e4'}" | 64c4f42e-e7e3-4a72-93d8-399e5c8451c9 | 1      | 33  | 7       | 1            | 7bcc784c-d699-492e-99e5-5c3cdea79764 | 1    | d0e339e3-472a-4da0-b90a-43693ca5fb47 | Moscow | CAA  | Arbat    | Arbat  | 1            | "55.752, 36.616" | 1    | 1               | 33           | 0              | "long"        | ["black", "white"]    | 2              | "black"                 | "shorts"              | ["black", "blue"]    | "black"              | "{'foo':'bar1'}" |

    schedule_id:
      type: integer
      nullable: false
      minimum: 1
      description: Schedule according to which the task was created

    schedule_trigger:
      type: object
      description: task schedule trigger
      properties:
        cron:
          type: string
          maxLength: 128
          example: 5 4 * * *
          description: |
            The cron syntax consists of five fields:

            | Field           | Allowed Values        |
            |-----------------|-----------------------|
            | Minute          | 0-59                  |
            | Hour            | 0-23                  |
            | Day of month    | 1-31                  |
            | Month           | 1-12                  |
            | Day of week     | 0-6 (Sunday-Saturday) |

            There are special characters such as `*` (any value), `-` (range), `,` (list), and `/` (step) that can be used before each field.
            
            Expression examples:            
            
            `0 0 * * *` - runs a scheduled task at midnight (00:00) every day.
            
            `*/15 * * * *` - runs a scheduled task every 15 minutes.
            
            `30 8 * * 1-5` - runs a scheduled task at 8:30 AM every weekday (Monday to Friday).
            
            `0 0 1 * *` - runs a scheduled task at midnight (00:00) on the first day of every month.
            
            `0 3 * * 1,3,5` - runs a scheduled task at 3:00 AM every Monday, Wednesday, and Friday.
            
            For more detail about cron syntax see https://en.wikipedia.org/wiki/Cron.

        cron_timezone:
          type: string
          enum: [utc, local]
          description: cron timezone - utc or local
          default: local
      required: [cron]

    schedule_behaviour:
      type: object
      description: schedule behaviour parameters
      properties:
        start_immediately:
          type: bool
          default: false
          description: whether to create first task immediately regardless to schedule
        create_stopped:
          type: bool
          default: false
          description: |
            whether to create schedule and not execute any tasks

            expected that schedule will execute by user manually in future

    task_schedule_template_request:
      type: object
      description: tasks schedule
      properties:
        notification_policy:
          $ref: '#/components/schemas/notification_policy'
        result_storage_policy:
          $ref: '#/components/schemas/result_storage_policy'
      required: [task_type, content]

    task_schedule_template_response:
      type: object
      description: tasks schedule
      properties:
        notification_policy:
          $ref: '#/components/schemas/task_notification_policy_response'
        result_storage_policy:
          $ref: '#/components/schemas/result_storage_policy_response'
      required: [task_type, content, notification_policy, result_storage_policy]

    linker_content_props:
      type: object
      properties:
        task_type:
          allOf:
            - $ref: "#/components/schemas/task_type_schedulable"
          enum: [1]
        content:
          $ref: "#/components/schemas/linker_task_content"

    schedule_linker_task_content_request:
      allOf:
        - $ref: "#/components/schemas/task_schedule_template_request"
        - $ref: "#/components/schemas/linker_content_props"

    schedule_linker_task_content_response:
      allOf:
        - $ref: "#/components/schemas/task_schedule_template_response"
        - $ref: "#/components/schemas/linker_content_props"

    clustering_content_props:
      type: object
      properties:
        task_type:
          allOf:
            - $ref: "#/components/schemas/task_type_schedulable"
          enum: [2]
        content:
          $ref: "#/components/schemas/clustering_task_content"

    schedule_clustering_task_content_request:
      allOf:
        - $ref: "#/components/schemas/task_schedule_template_request"
        - $ref: "#/components/schemas/clustering_content_props"

    schedule_clustering_task_content_response:
      allOf:
        - $ref: "#/components/schemas/task_schedule_template_response"
        - $ref: "#/components/schemas/clustering_content_props"

    reporter_content_props:
      type: object
      properties:
        task_type:
          allOf:
            - $ref: "#/components/schemas/task_type_schedulable"
          enum: [3]
        content:
          type: object
          properties:
            clusterization:
              $ref: "#/components/schemas/clustering_task_content"
            reporter:
              $ref: "#/components/schemas/reporter_task_content_without_filters"
          required: [clusterization, reporter]

    schedule_reporter_task_content_request:
      allOf:
        - $ref: "#/components/schemas/task_schedule_template_request"
        - $ref: "#/components/schemas/reporter_content_props"

    schedule_reporter_task_content_response:
      allOf:
        - $ref: "#/components/schemas/task_schedule_template_response"
        - $ref: "#/components/schemas/reporter_content_props"

    gc_content_props:
      type: object
      properties:
        task_type:
          allOf:
            - $ref: "#/components/schemas/task_type_schedulable"
          enum: [4]
        content:
          $ref: "#/components/schemas/gc_task_content"

    schedule_gc_task_content_request:
      allOf:
        - $ref: "#/components/schemas/task_schedule_template_request"
        - $ref: "#/components/schemas/gc_content_props"

    schedule_gc_task_content_response:
      allOf:
        - $ref: "#/components/schemas/task_schedule_template_response"
        - $ref: "#/components/schemas/gc_content_props"

    ae_task_content_props:
      type: object
      properties:
        task_type:
          allOf:
            - $ref: "#/components/schemas/task_type_schedulable"
          enum: [5]
        content:
          $ref: "#/components/schemas/additional_extract_task_content"

    schedule_ae_task_content_request:
      allOf:
        - $ref: "#/components/schemas/task_schedule_template_request"
        - $ref: "#/components/schemas/ae_task_content_props"

    schedule_ae_task_content_response:
      allOf:
        - $ref: "#/components/schemas/task_schedule_template_response"
        - $ref: "#/components/schemas/ae_task_content_props"

    cm_content_props:
      type: object
      properties:
        task_type:
          allOf:
            - $ref: "#/components/schemas/task_type_schedulable"
          enum: [6]
        content:
          $ref: "#/components/schemas/cross_match_task_content"

    schedule_cross_match_task_content_request:
      allOf:
        - $ref: "#/components/schemas/task_schedule_template_request"
        - $ref: "#/components/schemas/cm_content_props"

    schedule_cross_match_task_content_response:
      allOf:
        - $ref: "#/components/schemas/task_schedule_template_response"
        - $ref: "#/components/schemas/cm_content_props"

    roc_content_props:
      type: object
      properties:
        task_type:
          allOf:
            - $ref: "#/components/schemas/task_type_schedulable"
          enum: [7]
        content:
          $ref: "#/components/schemas/roc_task_content"

    schedule_roc_task_content_request:
      allOf:
        - $ref: "#/components/schemas/task_schedule_template_request"
        - $ref: "#/components/schemas/roc_content_props"

    schedule_roc_task_content_response:
      allOf:
        - $ref: "#/components/schemas/task_schedule_template_response"
        - $ref: "#/components/schemas/roc_content_props"

    exporter_content_props:
      type: object
      properties:
        task_type:
          allOf:
            - $ref: "#/components/schemas/task_type_schedulable"
          enum: [8]
        content:
          $ref: "#/components/schemas/exporter_task_content"

    schedule_exporter_task_content_request:
      allOf:
        - $ref: "#/components/schemas/task_schedule_template_request"
        - $ref: "#/components/schemas/exporter_content_props"

    schedule_exporter_task_content_response:
      allOf:
        - $ref: "#/components/schemas/task_schedule_template_response"
        - $ref: "#/components/schemas/exporter_content_props"

    task_schedulable_request:
      description: task schedule
      oneOf:
        - $ref: '#/components/schemas/schedule_linker_task_content_request'
        - $ref: '#/components/schemas/schedule_clustering_task_content_request'
        - $ref: '#/components/schemas/schedule_reporter_task_content_request'
        - $ref: '#/components/schemas/schedule_gc_task_content_request'
        - $ref: '#/components/schemas/schedule_ae_task_content_request'
        - $ref: '#/components/schemas/schedule_cross_match_task_content_request'
        - $ref: '#/components/schemas/schedule_roc_task_content_request'
        - $ref: '#/components/schemas/schedule_exporter_task_content_request'
        - $ref: '#/components/schemas/schedule_estimator_task_content_request'
        - $ref: '#/components/schemas/schedule_lambda_task_content_request'
      discriminator:
        propertyName: task_type
        mapping:
          1: '#/components/schemas/schedule_linker_task_content_request'
          2: '#/components/schemas/schedule_clustering_task_content_request'
          3: '#/components/schemas/schedule_reporter_task_content_request'
          4: '#/components/schemas/schedule_gc_task_content_request'
          5: '#/components/schemas/schedule_ae_task_content_request'
          6: '#/components/schemas/schedule_cross_match_task_content_request'
          7: '#/components/schemas/schedule_roc_task_content_request'
          8: '#/components/schemas/schedule_exporter_task_content_request'
          9: '#/components/schemas/schedule_estimator_task_content_request'
          10: '#/components/schemas/schedule_lambda_task_content_request'

    task_schedulable_response:
      description: task schedule
      oneOf:
        - $ref: '#/components/schemas/schedule_linker_task_content_response'
        - $ref: '#/components/schemas/schedule_clustering_task_content_response'
        - $ref: '#/components/schemas/schedule_reporter_task_content_response'
        - $ref: '#/components/schemas/schedule_gc_task_content_response'
        - $ref: '#/components/schemas/schedule_ae_task_content_response'
        - $ref: '#/components/schemas/schedule_cross_match_task_content_response'
        - $ref: '#/components/schemas/schedule_roc_task_content_response'
        - $ref: '#/components/schemas/schedule_exporter_task_content_response'
        - $ref: '#/components/schemas/schedule_estimator_task_content_response'
        - $ref: '#/components/schemas/schedule_lambda_task_content_response'
      discriminator:
        propertyName: task_type
        mapping:
          1: '#/components/schemas/schedule_linker_task_content_response'
          2: '#/components/schemas/schedule_clustering_task_content_response'
          3: '#/components/schemas/schedule_reporter_task_content_response'
          4: '#/components/schemas/schedule_gc_task_content_response'
          5: '#/components/schemas/schedule_ae_task_content_response'
          6: '#/components/schemas/schedule_cross_match_task_content_response'
          7: '#/components/schemas/schedule_roc_task_content_response'
          8: '#/components/schemas/schedule_exporter_task_content_response'
          9: '#/components/schemas/schedule_estimator_task_content_response'
          10: '#/components/schemas/schedule_lambda_task_content_response'

    schedule:
      type: object
      description: tasks schedule
      properties:
        task:
          $ref: '#/components/schemas/task_schedulable_request'
        trigger:
          $ref: '#/components/schemas/schedule_trigger'
        behaviour:
          $ref: '#/components/schemas/schedule_behaviour'
      required: [trigger, task]

    schedule_status:
      type: string
      enum: [running, stopped]
      description: |
        schedule status

        | status  | description                                  |
        |---------|----------------------------------------------|
        | running | schedule is running                          |
        | stopped | schedule is stopped by user                  |

    schedule_reply:
      type: object
      properties:
        schedule_id:
          $ref: '#/components/schemas/schedule_id'
        task_ids:
          type: array
          items:
            $ref: '#/components/schemas/task_id'
          example: [1,2,3]
          description: list of executed task ids in descending order
        account_id:
          $ref: '#/components/schemas/account_id'
        task:
          $ref: '#/components/schemas/task_schedulable_response'
        trigger:
          $ref: '#/components/schemas/schedule_trigger'
        status:
          $ref: '#/components/schemas/schedule_status'
        next_run_time:
          allOf:
            - $ref: '#/components/schemas/time'
          nullable: True
          description: estimated time for next task
        create_time:
          allOf:
            - $ref: '#/components/schemas/time'
          description: schedule create time
        last_update_time:
          allOf:
            - $ref: '#/components/schemas/time'
          description: schedule last update time
      required:
        - schedule_id
        - task_ids
        - account_id
        - task
        - trigger
        - status
        - next_run_time
        - create_time
        - last_update_time

    schedules_reply:
      type: array
      items:
        $ref: '#/components/schemas/schedule_reply'

    task_template_reply:
      type: object
      properties:
        task_id:
          $ref: '#/components/schemas/task_id'
        create_time:
          allOf:
            - $ref: '#/components/schemas/time'
          description: task create time
        end_time:
          allOf:
            - $ref: '#/components/schemas/time_nullable'
          description: task end time
        last_update_time:
          allOf:
            - description: task last update time
          $ref: '#/components/schemas/time_nullable'
        task_status:
          $ref: '#/components/schemas/task_status'
        result_id:
          $ref: '#/components/schemas/result_id'
        account_id:
          $ref: '#/components/schemas/account_id'
        count_task_parts_done:
          $ref: '#/components/schemas/count_task_parts_done'
        count_task_parts_all:
          $ref: '#/components/schemas/count_task_parts_all'
        description:
          $ref: '#/components/schemas/task_description'
        notification_policy:
          $ref: '#/components/schemas/task_notification_policy_response'
        result_storage_policy:
          $ref: '#/components/schemas/result_storage_policy_response'
      required: [ task_id, create_time, last_update_time, task_type, task_status, count_task_parts_done,
                  count_task_parts_all, content, result_storage_policy, notification_policy ]

    schedulable_task_template_reply:
      allOf:
        - $ref: '#/components/schemas/task_template_reply'
        - properties:
            schedule_id:
              $ref: '#/components/schemas/schedule_id'

    task_linker_reply:
      allOf:
        - $ref: "#/components/schemas/schedulable_task_template_reply"
      properties:
        task_type:
          allOf:
            - $ref: "#/components/schemas/task_type"
          enum: [ 1 ]
        content:
          $ref: "#/components/schemas/linker_task_content_reply"

    task_clustering_reply:
      allOf:
        - $ref: "#/components/schemas/schedulable_task_template_reply"
      properties:
        task_type:
          allOf:
            - $ref: "#/components/schemas/task_type"
          enum: [ 2 ]
        content:
          $ref: "#/components/schemas/clustering_task_content_reply"

    task_report_reply:
      allOf:
        - $ref: "#/components/schemas/schedulable_task_template_reply"
      properties:
        task_type:
          allOf:
            - $ref: "#/components/schemas/task_type"
          enum: [ 3 ]
        content:
          $ref: "#/components/schemas/reporter_task_content"

    task_lambda_reply:
      allOf:
        - $ref: "#/components/schemas/schedulable_task_template_reply"
      properties:
        task_type:
          allOf:
            - $ref: "#/components/schemas/task_type"
          enum: [ 10 ]
        content:
          $ref: "#/components/schemas/lambda_task_content"

    task_gc_reply:
      allOf:
        - $ref: "#/components/schemas/schedulable_task_template_reply"
      properties:
        task_type:
          allOf:
            - $ref: "#/components/schemas/task_type"
          enum: [ 4 ]
        content:
          description: Garbage collecting task content
          oneOf:
            - $ref: '#/components/schemas/gc_face_descriptors_task_content'
            - $ref: '#/components/schemas/gc_faces_task_content_reply'
            - $ref: '#/components/schemas/gc_event_descriptors_task_content'
            - $ref: '#/components/schemas/gc_events_task_content_reply'
            - $ref: '#/components/schemas/gc_general_events_task_content_reply'
          discriminator:
            propertyName: target
            mapping:
              face_descriptors: '#/components/schemas/gc_face_descriptors_task_content'
              faces: '#/components/schemas/gc_faces_task_content_reply'
              event_descriptors: '#/components/schemas/gc_event_descriptors_task_content'
              events: '#/components/schemas/gc_events_task_content_reply'
              general_events: '#/components/schemas/gc_general_events_task_content_reply'

    task_additional_extract_reply:
      allOf:
        - $ref: "#/components/schemas/schedulable_task_template_reply"
      properties:
        task_type:
          allOf:
            - $ref: "#/components/schemas/task_type"
          enum: [ 5 ]
        content:
          description: additional extractor task content.
          oneOf:
            - $ref: '#/components/schemas/additional_extract_task_content_basic_attributes_reply'
            - $ref: '#/components/schemas/additional_extract_task_content_face_descriptor_reply'
            - $ref: '#/components/schemas/additional_extract_task_content_body_descriptor_reply'
          discriminator:
            propertyName: extraction_target
            mapping:
              basic_attributes: '#/components/schemas/additional_extract_task_content_basic_attributes_reply'
              face_descriptor: '#/components/schemas/additional_extract_task_content_face_descriptor_reply'
              body_descriptor: '#/components/schemas/additional_extract_task_content_body_descriptor_reply'

    task_cross_match_reply:
      allOf:
        - $ref: "#/components/schemas/schedulable_task_template_reply"
      properties:
        task_type:
          allOf:
            - $ref: "#/components/schemas/task_type"
          enum: [ 6 ]
        content:
          $ref: "#/components/schemas/cross_match_task_content_reply"

    task_roc_reply:
      allOf:
        - $ref: "#/components/schemas/schedulable_task_template_reply"
      properties:
        task_type:
          allOf:
            - $ref: "#/components/schemas/task_type"
          enum: [ 7 ]
        content:
          $ref: "#/components/schemas/roc_task_content"

    task_exporter_reply:
      allOf:
        - $ref: "#/components/schemas/schedulable_task_template_reply"
      properties:
        task_type:
          allOf:
            - $ref: "#/components/schemas/task_type"
          enum: [ 8 ]
        content:
          $ref: "#/components/schemas/exporter_task_content_reply"

    task_estimator_reply:
      allOf:
        - $ref: "#/components/schemas/schedulable_task_template_reply"
      properties:
        task_type:
          allOf:
            - $ref: "#/components/schemas/task_type"
          enum: [9]
        content:
          $ref: "#/components/schemas/estimator_task_content_required"

    task_reply:
      oneOf:
        - $ref: "#/components/schemas/task_linker_reply"
        - $ref: "#/components/schemas/task_clustering_reply"
        - $ref: "#/components/schemas/task_report_reply"
        - $ref: "#/components/schemas/task_gc_reply"
        - $ref: "#/components/schemas/task_additional_extract_reply"
        - $ref: "#/components/schemas/task_cross_match_reply"
        - $ref: "#/components/schemas/task_roc_reply"
        - $ref: "#/components/schemas/task_exporter_reply"
        - $ref: "#/components/schemas/task_estimator_reply"
        - $ref: "#/components/schemas/task_lambda_reply"
      discriminator:
        propertyName: task_type
        mapping:
          1: '#/components/schemas/task_linker_reply'
          2: '#/components/schemas/task_clustering_reply'
          3: '#/components/schemas/task_report_reply'
          4: '#/components/schemas/task_gc_reply'
          5: '#/components/schemas/task_additional_extract_reply'
          6: '#/components/schemas/task_cross_match_reply'
          7: '#/components/schemas/task_roc_reply'
          8: '#/components/schemas/task_exporter_reply'
          9: '#/components/schemas/task_estimator_reply'
          10: '#/components/schemas/task_lambda_reply'

    health_ok:
      description: successful healthcheck execution info
      type: object
      properties:
        execution_time:
          type: number
          example: 0.123
          description: request execution time in seconds
      required: [execution_time]

    health_errors:
      type: object
      properties:
        errors:
          description: failed healthcheck execution info
          type: array
          items:
            type: object
            properties:
              component:
                description: component name
                type: string
              error:
                allOf:
                  - description: healthcheck error
                  - $ref: '#/components/schemas/Error'
              status:
                description: component health status
                type: integer
                enum: [0, 1]
            required: [component, error, status]
      required: [errors]
      example:
        errors:
          - component: tasks_db
            error:
              error_code: 10017
              desc: Database error
              detail: Database connection timeout error
              link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-10017
            status: 0
          - component: tasks_worker
            error:
              error_code: 0
              desc: Success
              detail: Success
              link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-0
            status: 1

    time_pattern:
      pattern: '^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(Z|\.\d+Z|\.\d+[+-]\d{2}:\d{2}|[+-]\d{2}:\d{2}))$'
      example: "2018-08-11T09:11:41.674Z"

    create_time__gte:
      allOf:
        - $ref: '#/components/schemas/time'
        - $ref: '#/components/schemas/time_pattern'
      description: Create time lower included boundary.

    create_time__lt:
      allOf:
        - $ref: '#/components/schemas/time'
        - $ref: '#/components/schemas/time_pattern'
      description: Create time upper excluded boundary.

    general_event_create_time__lt:
      allOf:
        - $ref: '#/components/schemas/time'
        - $ref: '#/components/schemas/time_pattern'
      description: General event create time upper excluded boundary.

    end_time__gte:
      allOf:
        - $ref: '#/components/schemas/time'
        - $ref: '#/components/schemas/time_pattern'
      description: End time lower included boundary.

    end_time__lt:
      allOf:
        - $ref: '#/components/schemas/time'
        - $ref: '#/components/schemas/time_pattern'
      description: End time upper excluded boundary.

    insert_time__gte:
      allOf:
        - $ref: '#/components/schemas/time'
        - $ref: '#/components/schemas/time_pattern'
      description: Event insert time lower excluding boundary.

    insert_time__lt:
      allOf:
        - $ref: '#/components/schemas/time'
        - $ref: '#/components/schemas/time_pattern'
      description: Event insert time upper excluding boundary.

    now_delta_time_filter:
      type: string
      pattern: '^now-(\d+)[smhdwMy]$'
      example: "now-2d"

    create_time_now__gte:
      allOf:
        - $ref: '#/components/schemas/now_delta_time_filter'
      description: |
            Create time lower included boundary in format `now-time`, where time must be present as follows:

            | Parameter value | Description  |
            |---------------------|--------------|
            | `1m`                | one minute   |
            | `2h`                | two hours    |
            | `7d`                | seven days   |
            | `5w`                | five weeks   |
            | `3M`                | three months |
            | `10y`               | ten years    |

    create_time_now__lt:
      allOf:
        - $ref: '#/components/schemas/now_delta_time_filter'
      description: |
            Create time upper excluded boundary in format `now-time`, where time must be present as follows:

            | Parameter value | Description  |
            |---------------------|--------------|
            | `1m`                | one minute   |
            | `2h`                | two hours    |
            | `7d`                | seven days   |
            | `5w`                | five weeks   |
            | `3M`                | three months |
            | `10y`               | ten years    |

    general_event_create_time_now__lt:
      allOf:
        - $ref: '#/components/schemas/now_delta_time_filter'
      description: |
            General event create time upper excluded boundary in format `now-time`, where time must be present as follows:

            | Parameter value | Description  |
            |---------------------|--------------|
            | `1m`                | one minute   |
            | `2h`                | two hours    |
            | `7d`                | seven days   |
            | `5w`                | five weeks   |
            | `3M`                | three months |
            | `10y`               | ten years    |

    end_time_now__gte:
      allOf:
        - $ref: '#/components/schemas/now_delta_time_filter'
      description: |
        End time lower included boundary in format `now-time`, where time must be present as follows:

        | Parameter value | Description  |
        |---------------------|--------------|
        | `1m`                | one minute   |
        | `2h`                | two hours    |
        | `7d`                | seven days   |
        | `5w`                | five weeks   |
        | `3M`                | three months |
        | `10y`               | ten years    |

    end_time_now__lt:
      allOf:
        - $ref: '#/components/schemas/now_delta_time_filter'
      description: |
        End time upper excluded boundary in format `now-time`, where time must be present as follows:

        | Parameter value | Description  |
        |---------------------|--------------|
        | `1m`                | one minute   |
        | `2h`                | two hours    |
        | `7d`                | seven days   |
        | `5w`                | five weeks   |
        | `3M`                | three months |
        | `10y`               | ten years    |

    insert_time_now__gte:
      allOf:
        - $ref: '#/components/schemas/now_delta_time_filter'
      description: |
        End time lower included boundary in format `now-time`, where time must be present as follows:

        | Parameter value | Description  |
        |---------------------|--------------|
        | `1m`                | one minute   |
        | `2h`                | two hours    |
        | `7d`                | seven days   |
        | `5w`                | five weeks   |
        | `3M`                | three months |
        | `10y`               | ten years    |

    insert_time_now__lt:
      allOf:
        - $ref: '#/components/schemas/now_delta_time_filter'
      description: |
        End time upper excluded boundary in format `now-time`, where time must be present as follows:

        | Parameter value | Description  |
        |---------------------|--------------|
        | `1m`                | one minute   |
        | `2h`                | two hours    |
        | `7d`                | seven days   |
        | `5w`                | five weeks   |
        | `3M`                | three months |
        | `10y`               | ten years    |

    plugin_status:
      type: object
      properties:
        name:
          type: string
          description: Plugin name
        running:
          type: integer
          enum: [0, 1]
          description: Whether plugin is running or not.
      required: [name, running]

    plugins:
      type: object
      properties:
        plugins:
          description: list of imported plugins
          type: array
          items:
            $ref: '#/components/schemas/plugin_status'
      required: [plugins]
      example:
        plugins:
          - name: foo
            running: 1
  responses:
    internal_server_error:
      description: internal server error.
      headers:
        Content-Type:
          $ref: '#/components/headers/application_json'
        Luna-Request-Id:
          $ref: '#/components/headers/luna_request_id'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'

    server_timeout_error:
      description: server timeout error.
      headers:
        Content-Type:
          $ref: '#/components/headers/application_json'
        Luna-Request-Id:
          $ref: '#/components/headers/luna_request_id'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error_code: 9
            detail: Request timeout
            desc: Request timeout on http://127.0.0.1:5050/{...}, method {...}
            link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-9

    lis_disabled:
      description: The luna-image-store is disabled.
      headers:
        Content-Type:
          $ref: '#/components/headers/application_json'
        Luna-Request-Id:
          $ref: '#/components/headers/luna_request_id'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error_code: 11070
            desc: Forbidden
            detail: Luna Image Store service is disabled
            link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11070"

    ae_not_implemented:
      description: not implemented.
      headers:
        Luna-Request-Id:
          $ref: '#/components/headers/luna_request_id'
        Content-Type:
          $ref: '#/components/headers/application_json'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            not_implemented:
              value:
                error_code: 12029
                desc: Functionality is not implemented
                detail: Required server functionality is not implemented
                link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12029

    forbidden_resource_error:
      description: Forbidden.
      headers:
        Content-Type:
          $ref: '#/components/headers/application_json'
        Luna-Request-Id:
          $ref: '#/components/headers/luna_request_id'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            resource_is_disabled:
              value:
                error_code: 12049
                desc: Forbidden
                detail: Resource is disabled.
                link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12049"
paths:
  /version:
    get:
      tags:
      - version

      summary: get version
      description: get version of service
      operationId: getVersion

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Version'
        500:
          $ref: '#/components/responses/internal_server_error'
  /2/tasks:
    get:
      tags:
      - tasks

      summary: get tasks
      description: get tasks with filters
      operationId: getTasks

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/applicationJsonContent'
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/page_size'
      - $ref: '#/components/parameters/create_time__lt'
      - $ref: '#/components/parameters/create_time__gte'
      - $ref: '#/components/parameters/end_time__lt'
      - $ref: '#/components/parameters/end_time__gte'
      - $ref: '#/components/parameters/task_ids'
      - $ref: '#/components/parameters/task_type'
      - $ref: '#/components/parameters/task_status'
      - $ref: '#/components/parameters/account_id'
      - $ref: '#/components/parameters/result_id'
      - $ref: '#/components/parameters/schedule_id'

      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tasks_reply'
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'create_time__lt'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        500:
          $ref: '#/components/responses/internal_server_error'
  /2/tasks/count:
    get:
      tags:
      - tasks

      summary: get tasks count
      description: get tasks count with filters
      operationId: getTasksCount

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/applicationJsonContent'
      - $ref: '#/components/parameters/create_time__lt'
      - $ref: '#/components/parameters/create_time__gte'
      - $ref: '#/components/parameters/end_time__lt'
      - $ref: '#/components/parameters/end_time__gte'
      - $ref: '#/components/parameters/task_ids'
      - $ref: '#/components/parameters/task_type'
      - $ref: '#/components/parameters/task_status'
      - $ref: '#/components/parameters/account_id'
      - $ref: '#/components/parameters/schedule_id'

      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/task_count'
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'create_time__lt'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        500:
          $ref: '#/components/responses/internal_server_error'
  /2/tasks/{task_id}:
    parameters:
      - $ref: '#/components/parameters/task_id_uri'

    get:
      tags:
      - tasks

      summary: get task
      description: get task by id
      operationId: getTask

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/account_id'

      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/task_reply'
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'account_id'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        404:
          description: task not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 28001
                    desc: Object not found
                    detail: Task with id '146' not found
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28001
        500:
          $ref: '#/components/responses/internal_server_error'

    patch:
      tags:
      - tasks

      summary: cancel task
      description: cancel task by id
      operationId: cancelTask

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/account_id'

      responses:
        202:
          description: Canceling
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'account_id'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
                task_can_not_canceled:
                  value:
                    error_code: 28019
                    desc: Bad/incomplete input data
                    detail: Task '146' with status 5 can not canceled
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28019
        403:
          $ref: '#/components/responses/lis_disabled'
        404:
          description: task not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 28001
                    desc: Object not found
                    detail: Task with id '146' not found
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28001
        500:
          $ref: '#/components/responses/internal_server_error'

    delete:
      tags:
      - tasks

      summary: delete task
      description: delete task by id
      operationId: deleteTask
      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/account_id'

      responses:
        204:
          description: Deleted.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'account_id'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        404:
          description: task not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 28001
                    desc: Object not found
                    detail: Task with id '146' not found
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28001
        500:
          $ref: '#/components/responses/internal_server_error'
  /2/tasks/{task_id}/notification_policy:
    parameters:
      - $ref: '#/components/parameters/task_id_uri'

    get:
      tags:
      - tasks notification policy

      summary: get task notification policy
      description: get task notification policy by task id
      operationId: getTaskNotificationPolicy

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/account_id'

      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/task_notification_policy_response'
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'account_id'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        404:
          description: task not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 28001
                    desc: Object not found
                    detail: Task with id '146' not found
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28001
        500:
          $ref: '#/components/responses/internal_server_error'

    put:
      tags:
      - tasks notification policy

      summary: replace task notification policy
      description: replace task notification policy by task id
      operationId: putTaskNotificationPolicy

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/account_id_header_required'

      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/notification_policy'
        required: true

      responses:
        204:
          description: Done
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'account_id'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
                task_can_not_canceled:
                  value:
                    error_code: 28019
                    desc: Bad/incomplete input data
                    detail: Task '146' with status 5 can not canceled
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28019
        403:
          $ref: '#/components/responses/lis_disabled'
        404:
          description: task not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 28001
                    desc: Object not found
                    detail: Task with id '146' not found
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28001
        500:
          $ref: '#/components/responses/internal_server_error'
  /2/tasks/{task_id}/result:
    parameters:
      - $ref: '#/components/parameters/task_id_uri'

    get:
      tags:
      - tasks

      summary: get task result
      description: get task result by task id
      operationId: getTaskResult

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/applicationJsonContent'
      - $ref: '#/components/parameters/account_id'

      responses:
        200:
          description: OK
          headers:
            Content-Type:
              schema:
                type: string
                enum:
                - application/json
                - application/zip
              required: true
              description: content type of body
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Transfer-Encoding:
              $ref: '#/components/headers/transfer_encoding'
            Content-Disposition:
              $ref: '#/components/headers/content_disposition'
          content:
            application/json:
              schema:
                anyOf:
                - $ref: '#/components/schemas/gc_task_result'
                - $ref: '#/components/schemas/clustering_task_result'
                - $ref: '#/components/schemas/linker_task_result'
                - $ref: '#/components/schemas/additional_extract_task_result'
                - $ref: '#/components/schemas/cross_match_task_result'
                - $ref: '#/components/schemas/roc_task_result'
                - $ref: '#/components/schemas/estimator_task_result'
            application/zip:
              schema:
                oneOf:
                - $ref: '#/components/schemas/report_task_result'
                - $ref: '#/components/schemas/export_task_result'

        400:
          description: task result not found (user error)
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                task_cancelled:
                  value:
                    error_code: 28020
                    desc: Object not found
                    detail: Impossible get a result of task 146 with status 2
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28020
        403:
          $ref: '#/components/responses/lis_disabled'
        404:
          description: object not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                task_not_found:
                  value:
                    error_code: 28001
                    desc: Object not found
                    detail: Task with id '146' not found
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28001
                task_result_not_found:
                  value:
                    error_code: 28017
                    desc: Object not found
                    detail: Result of the task '146' not found
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28017
                task_does_not_have_result_yet:
                  value:
                    error_code: 28018
                    desc: Object not found
                    detail: task '146' does not have result yet
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28018
        500:
          $ref: '#/components/responses/internal_server_error'
  /2/tasks/{task_id}/errors:
    parameters:
      - $ref: '#/components/parameters/task_id_uri'

    get:
      tags:
      - errors

      summary: get errors of task
      description: get errors of task by task id
      operationId: getTaskErrors

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/applicationJsonContent'
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/page_size'
      - $ref: '#/components/parameters/account_id'

      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                properties:
                  errors:
                    description: task errors
                    allOf:
                    - $ref: '#/components/schemas/task_errors'
                required: [errors]
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'create_time__lt'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        404:
          description: task not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 28001
                    desc: Object not found
                    detail: Task with id '146' not found
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28001
        500:
          $ref: '#/components/responses/internal_server_error'
  /2/tasks/{task_id}/errors/count:
    parameters:
      - $ref: '#/components/parameters/task_id_uri'

    get:
      tags:
      - errors

      summary: get error count of task
      description: get task error count by task id with filters
      operationId: getTaskErrorsCount

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/applicationJsonContent'
      - $ref: '#/components/parameters/error_time__lt'
      - $ref: '#/components/parameters/error_time__gte'
      - $ref: '#/components/parameters/error_code'
      - $ref: '#/components/parameters/account_id'

      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error_count'
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'error_time__lt'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        404:
          description: object not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 28001
                    desc: Object not found
                    detail: Task with id '49152' not found'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28001
        500:
          $ref: '#/components/responses/internal_server_error'
  /2/tasks/{task_id}/subtasks:
    parameters:
      - $ref: '#/components/parameters/task_id_uri'

    get:
      tags:
      - tasks

      summary: get subtasks
      description: get subtasks of task with filter(s)
      operationId: getSubTasks

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/applicationJsonContent'
      - $ref: '#/components/parameters/account_id'

      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/subtasks_reply'
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'create_time__lt'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        404:
          description: subtask not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 28001
                    desc: Object not found
                    detail: Subtask with id '146' not found
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28001
        500:
          $ref: '#/components/responses/internal_server_error'
  /2/tasks/clustering:
    post:
      tags:
      - task processing

      summary: clustering task
      description: Create new clustering task.
      operationId: createClusteringTask

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/applicationJsonContent'
      - $ref: '#/components/parameters/account_id_header_required'

      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/clustering_task'
        required: true

      responses:
        202:
          description: Accepted
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                properties:
                  task_id:
                    $ref: '#/components/schemas/task_id'
                required:
                - task_id
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'create_time__lt'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
                account_id_not_found:
                  value:
                    error_code: 11066
                    desc: Bad/incomplete input data
                    detail: Luna-Account-Id header not found
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11066"
                bad_account_id:
                  value:
                    error_code: 11037
                    desc: Bad/incomplete input data
                    detail: "Luna-Account-Id header is not UUID, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11037"
        403:
          description: Access to this resource on the server is denied
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                events_is_disabled:
                  value:
                    error_code: 11040
                    desc: Forbidden
                    detail: Luna Events service is disabled
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11040"
                lis_is_disabled:
                  value:
                    error_code: 11070
                    desc: Forbidden
                    detail: Luna Image Store service is disabled
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11070"
        500:
          $ref: '#/components/responses/internal_server_error'
        504:
          $ref: '#/components/responses/server_timeout_error'
  /2/tasks/errors:
    get:
      tags:
      - errors

      summary: get errors
      description: get errors with filters
      operationId: getErrors

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/applicationJsonContent'
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/page_size'
      - $ref: '#/components/parameters/task_ids'
      - $ref: '#/components/parameters/error_code'
      - $ref: '#/components/parameters/error_ids'
      - $ref: '#/components/parameters/error_time__lt'
      - $ref: '#/components/parameters/error_time__gte'
      - $ref: '#/components/parameters/task_type'
      - $ref: '#/components/parameters/status_code'
      - $ref: '#/components/parameters/account_id'

      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                properties:
                  errors:
                    description: task errors
                    $ref: '#/components/schemas/task_errors'
                required: [errors]
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'create_time__lt'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        500:
          $ref: '#/components/responses/internal_server_error'
  /2/tasks/errors/count:
    get:
      tags:
      - errors

      summary: get errors count
      description: get errors count with filters
      operationId: getErrorsCount

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/applicationJsonContent'
      - $ref: '#/components/parameters/error_time__lt'
      - $ref: '#/components/parameters/error_time__gte'
      - $ref: '#/components/parameters/task_type'
      - $ref: '#/components/parameters/task_ids'
      - $ref: '#/components/parameters/error_ids'
      - $ref: '#/components/parameters/error_code'
      - $ref: '#/components/parameters/account_id'

      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error_count'
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'create_time__lt'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        500:
          $ref: '#/components/responses/internal_server_error'
  /2/tasks/errors/{error_id}:
    parameters:
      - $ref: '#/components/parameters/error_id_uri'

    get:
      tags:
      - errors

      summary: get error
      description: get error
      operationId: getTaskError

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/applicationJsonContent'
      - $ref: '#/components/parameters/account_id'

      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/task_error'
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'create_time__lt'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        404:
          description: error not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 28003
                    desc: Object not found
                    detail: Task error with id '146' not found
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28003
        500:
          $ref: '#/components/responses/internal_server_error'
  /2/tasks/exporter:
    post:
      tags:
      - task processing

      summary: exporter task
      description: |
        Collect objects of interest, returns zip archive with csv file and images (optional).
      operationId: createExporterTask

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/applicationJsonContent'
      - $ref: '#/components/parameters/account_id_header_required'

      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/exporter_task'
        required: true

      responses:
        202:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                properties:
                  task_id:
                    $ref: '#/components/schemas/task_id'
                required:
                - task_id
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12022
                    desc: Bad/incomplete input data
                    detail: 'Failed to validate input json. Path: ''user_data'',  message: ''Extra inputs are not permitted'''
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022
                task_not_foud:
                  value:
                    error_code: 28001
                    desc: Object not found
                    detail: Task with id '147' not found
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28001
                bad_task_type:
                  value:
                    error_code: 28013
                    desc: Bad/incomplete input data
                    detail: Tasks with type '0' does not support a build report
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28013
                bad_task_status:
                  value:
                    error_code: 28015
                    desc: Bad/incomplete input data
                    detail: Tasks with type '0' does not support a build report
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28015
                account_id_not_found:
                  value:
                    error_code: 11066
                    desc: Bad/incomplete input data
                    detail: Luna-Account-Id header not found
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11066"
                bad_account_id:
                  value:
                    error_code: 11037
                    desc: Bad/incomplete input data
                    detail: "Luna-Account-Id header is not UUID, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11037"
        403:
          description: Access to this resource on the server is denied
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                events_is_disabled:
                  value:
                    error_code: 11040
                    desc: Forbidden
                    detail: Luna Events service is disabled
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11040"
                lis_is_disabled:
                  value:
                    error_code: 11070
                    desc: Forbidden
                    detail: Luna Image Store service is disabled
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11070"
        500:
          $ref: '#/components/responses/internal_server_error'
        504:
          $ref: '#/components/responses/server_timeout_error'
  /2/tasks/linker:
    post:
      tags:
      - task processing

      summary: linker task
      description: |
        Create new linker task.

        Task perfomance.

        - Firstly, it checks existence of specified *list_id* or create new list, if *create_list* parameter
          set to 1

        - It gets face ids from luna-faces or luna-events\* with filters and pagination. Then forms one or several subtasks
          with 1000(or less) face ids for each, and save content for each subtask into luna-image-store.

        - For each subtask: it gets subtask content (*list_id* and *face_ids* from luna-image-store) and
          do request to luna-faces to link specified faces to specified list. Each subtask saves results to
          luna-image-store with its own *result_id*

        - After the last subtask is done, it collect results from all subtasks, merge and put them to luna-image store
          with new *result_id* (as task result)

        \* for luna-events:
          - Get event with its descriptor from Luna Events

          - Create face, attribute(s) and sample(s) in Luna Faces. 
            Heavy requests to internal services are executed with a timeout x 100 compared to the set one.

          - Link created face to the list
        
        \* if luna-image-store is disabled no subtask/task result will be stored
      operationId: createLinkerTask

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/applicationJsonContent'
      - $ref: '#/components/parameters/account_id_header_required'

      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/linker_task'
        required: true

      responses:
        202:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                properties:
                  task_id:
                    $ref: '#/components/schemas/task_id'
                required:
                - task_id
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12022
                    desc: Bad/incomplete input data
                    detail: 'Failed to validate input json. Path: ''user_data'',  message: ''Extra inputs are not permitted'''
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022
                account_id_not_found:
                  value:
                    error_code: 11066
                    desc: Bad/incomplete input data
                    detail: Luna-Account-Id header not found
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11066"
                bad_account_id:
                  value:
                    error_code: 11037
                    desc: Bad/incomplete input data
                    detail: "Luna-Account-Id header is not UUID, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11037"
        403:
          description: Access to this resource on the server is denied
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                events_is_disabled:
                  value:
                    error_code: 11040
                    desc: Forbidden
                    detail: Luna Events service is disabled
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11040"
        500:
          $ref: '#/components/responses/internal_server_error'
        504:
          $ref: '#/components/responses/server_timeout_error'
  /2/tasks/gc:
    post:
      tags:
      - task processing

      summary: garbage collecting task
      description: | 
                   Create new garbage collecting task. 
                   Heavy requests to internal services are executed with a timeout x 100 compared to the set one.
      operationId: createGCTask

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/applicationJsonContent'
      - $ref: '#/components/parameters/account_id_header_required'

      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/gc_task'
        required: true

      responses:
        202:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                properties:
                  task_id:
                    $ref: '#/components/schemas/task_id'
                required:
                - task_id
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12022
                    desc: Bad/incomplete input data
                    detail: 'Failed to validate input json. Path: ''user_data'',  message: ''Extra inputs are not permitted'''
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022
                account_id_not_found:
                  value:
                    error_code: 11066
                    desc: Bad/incomplete input data
                    detail: Luna-Account-Id header not found
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11066"
                bad_account_id:
                  value:
                    error_code: 11037
                    desc: Bad/incomplete input data
                    detail: "Luna-Account-Id header is not UUID, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11037"
        403:
          description: Access to this resource on the server is denied
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                events_is_disabled:
                  value:
                    error_code: 11040
                    desc: Forbidden
                    detail: Luna Events service is disabled
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11040"
                lis_is_disabled:
                  value:
                    error_code: 11070
                    desc: Forbidden
                    detail: Luna Image Store service is disabled
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11070"
        500:
          $ref: '#/components/responses/internal_server_error'
        504:
          $ref: '#/components/responses/server_timeout_error'
  /2/tasks/reporter:
    post:
      tags:
      - task processing

      summary: reporter task
      description: |
        Create report in csv format by a task. Now support only clasterization tasks for reporting. Report contains
        additional info about clusterization objects (faces or events). You can set which additional info set to the
        report. First and second columns in report always a number of cluster and an object id.
      operationId: createReporterTask

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/applicationJsonContent'
      - $ref: '#/components/parameters/account_id_header_required'

      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/reporter_task'
        required: true

      responses:
        202:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                properties:
                  task_id:
                    $ref: '#/components/schemas/task_id'
                required:
                - task_id
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12022
                    desc: Bad/incomplete input data
                    detail: 'Failed to validate input json. Path: ''user_data'',  message: ''Extra inputs are not permitted'''
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022
                task_not_foud:
                  value:
                    error_code: 28001
                    desc: Object not found
                    detail: Task with id '147' not found
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28001
                bad_task_type:
                  value:
                    error_code: 28013
                    desc: Bad/incomplete input data
                    detail: Tasks with type '0' does not support a build report
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28013
                bad_task_status:
                  value:
                    error_code: 28015
                    desc: Bad/incomplete input data
                    detail: Tasks with type '0' does not support a build report
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28015
                account_id_not_found:
                  value:
                    error_code: 11066
                    desc: Bad/incomplete input data
                    detail: Luna-Account-Id header not found
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11066"
                bad_account_id:
                  value:
                    error_code: 11037
                    desc: Bad/incomplete input data
                    detail: "Luna-Account-Id header is not UUID, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11037"
        403:
          $ref: '#/components/responses/lis_disabled'
        500:
          $ref: '#/components/responses/internal_server_error'
        504:
          $ref: '#/components/responses/server_timeout_error'
  /2/tasks/additional_extract:
    post:
      tags:
      - task processing

      summary: additional extract task
      description: Create new additional extract task, extraction of missing descriptors and base attributes is available.
      operationId: createAdditionalExtractTask

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/applicationJsonContent'
      - $ref: '#/components/parameters/account_id_header_required'

      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/additional_extract_task'
        required: true

      responses:
        202:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                properties:
                  task_id:
                    $ref: '#/components/schemas/task_id'
                required:
                - task_id
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12022
                    desc: Bad/incomplete input data
                    detail: 'Failed to validate input json. Path: ''user_data'',  message: ''Extra inputs are not permitted'''
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022
        403:
          description: Access to this resource on the server is denied
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                events_is_disabled:
                  value:
                    error_code: 11040
                    desc: Forbidden
                    detail: Luna Events service is disabled
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11040"
                lis_is_disabled:
                  value:
                    error_code: 11070
                    desc: Forbidden
                    detail: Luna Image Store service is disabled
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11070"
                handlers_is_disabled:
                  value:
                    error_code: 11071
                    desc: Forbidden
                    detail: Luna Handlers service is disabled
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11071"
        501:
          description: not implemented.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                not_implemented:
                  value:
                    error_code: 12029
                    desc: Functionality is not implemented
                    detail: Required server functionality is not implemented
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12029
                account_id_not_found:
                  value:
                    error_code: 11066
                    desc: Bad/incomplete input data
                    detail: Luna-Account-Id header not found
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11066"
                bad_account_id:
                  value:
                    error_code: 11037
                    desc: Bad/incomplete input data
                    detail: "Luna-Account-Id header is not UUID, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11037"
        500:
          $ref: '#/components/responses/internal_server_error'
        504:
          $ref: '#/components/responses/server_timeout_error'
  /2/tasks/cross_match:
    post:
      tags:
      - task processing

      summary: cross matching task
      description: Create cross matching task. Match references with candidates.

      operationId: createCrossMatchTask

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/applicationJsonContent'
      - $ref: '#/components/parameters/account_id_header_required'

      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/cross_match_task'
        required: true

      responses:
        202:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                properties:
                  task_id:
                    $ref: '#/components/schemas/task_id'
                required:
                - task_id
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12022
                    desc: Bad/incomplete input data
                    detail: 'Failed to validate input json. Path: ''user_data'',  message: ''Extra inputs are not permitted'''
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022
                task_not_foud:
                  value:
                    error_code: 28001
                    desc: Object not found
                    detail: Task with id '147' not found
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28001
                bad_task_type:
                  value:
                    error_code: 28013
                    desc: Bad/incomplete input data
                    detail: Tasks with type '0' does not support a build report
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28013
                bad_task_status:
                  value:
                    error_code: 28015
                    desc: Bad/incomplete input data
                    detail: Tasks with type '0' does not support a build report
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28015
                account_id_not_found:
                  value:
                    error_code: 11066
                    desc: Bad/incomplete input data
                    detail: Luna-Account-Id header not found
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11066"
                bad_account_id:
                  value:
                    error_code: 11037
                    desc: Bad/incomplete input data
                    detail: "Luna-Account-Id header is not UUID, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11037"
        403:
          description: Access to this resource on the server is denied
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                events_is_disabled:
                  value:
                    error_code: 11040
                    desc: Forbidden
                    detail: Luna Events service is disabled
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11040"
                lis_is_disabled:
                  value:
                    error_code: 11070
                    desc: Forbidden
                    detail: Luna Image Store service is disabled
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11070"
        500:
          $ref: '#/components/responses/internal_server_error'
        504:
          $ref: '#/components/responses/server_timeout_error'
  /2/tasks/roc:
    post:
      tags:
      - task processing

      summary: ROC-curve calculating task
      description: Create ROC task. ROC (or Receiver Operating Characteristic) is a performance measurement for classification problem at various thresholds settings. The ROC-curve is plotted with TPR (True Positive Rate) against the FPR (False Positive Rate). TPR is a true positive match pair count divided by a count of total expected positive match pairs, and FPR is a false positive match pair count divided by a count of total expected negative match pairs. Each point (FPR, TPR) of the ROC-cure corresponds to a certain similarity threshold. Using ROC the model performance is determined by looking at the area under the ROC-curve (or AUC) and the ROC-curve and the secondary main diagonal intersection point where type I and type II error rates are equal. The model performance also determined by getting into the top-N probability, i.e. probability of getting a positive match pair into the top-N for any match result group sorted by similarity.
      operationId: createROCTask

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/applicationJsonContent'
      - $ref: '#/components/parameters/account_id_header_required'

      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/roc_task'
        required: true

      responses:
        202:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                properties:
                  task_id:
                    $ref: '#/components/schemas/task_id'
                required:
                - task_id
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12022
                    desc: Bad/incomplete input data
                    detail: 'Failed to validate input json. Path: ''user_data'',  message: ''Extra inputs are not permitted'''
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022
                task_not_foud:
                  value:
                    error_code: 28001
                    desc: Object not found
                    detail: Task with id '147' not found
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28001
                bad_task_type:
                  value:
                    error_code: 28013
                    desc: Bad/incomplete input data
                    detail: Tasks with type '0' does not support a build report
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28013
                bad_task_status:
                  value:
                    error_code: 28015
                    desc: Bad/incomplete input data
                    detail: Tasks with type '0' does not support a build report
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28015
                account_id_not_found:
                  value:
                    error_code: 11066
                    desc: Bad/incomplete input data
                    detail: Luna-Account-Id header not found
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11066"
                bad_account_id:
                  value:
                    error_code: 11037
                    desc: Bad/incomplete input data
                    detail: "Luna-Account-Id header is not UUID, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11037"
        403:
          $ref: '#/components/responses/lis_disabled'
        500:
          $ref: '#/components/responses/internal_server_error'
        504:
          $ref: '#/components/responses/server_timeout_error'
  /2/tasks/estimator:
    post:
      tags:
        - task processing

      summary: estimator task
      description: Create new estimator task.
      operationId: createEstimatorTask

      parameters:
        - $ref: '#/components/parameters/luna_request_id'
        - $ref: '#/components/parameters/applicationJsonContent'
        - $ref: '#/components/parameters/account_id_header_required'

      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/estimator_task'
            examples:
              estimate_from_zip_archive:
                value:
                  notificaion_policy:
                    enable: 0
                    task_callbacks:
                      - type: http
                        enable: 1
                        authorization:
                          type: basic
                          login: login
                          password: password
                        url: http://callback.url
                        params:
                          timeout: 60
                          content_type: "application/json"
                          headers: { }
                      - type: telegram
                        enable: 1
                        token: 1111111111:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
                        chat_id: 111111111
                        params:
                          timeout: 60
                    subtask_callbacks:
                      - type: http
                        enable: 1
                        authorization:
                          type: basic
                          login: login
                          password: password
                        url: http://callback.url
                        params:
                          timeout: 60
                          content_type: "application/json"
                          headers: { }
                      - type: telegram
                        enable: 1
                        token: 1111111111:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
                        chat_id: 111111111
                        params:
                          timeout: 60
                  description: "estimator task with zip archive"
                  content:
                    handler:
                      handler_id: "c42ad7cb-9078-4be4-8457-4d3c744477df"
                    source:
                      source_type: zip
                      reference:
                        url: http://example.com/123.zip
                        prefix: folder_in_archive/some_prefix
                        postfix: .jpg
                      recursive: true
                      authorization:
                        password: 123456
                      image_type: 1
                    filters:
                      account_id: "c42ad7cb-9078-4be4-8457-4d3c744477df"
              estimate_from_s3_bucket:
                value:
                  notificaion_policy:
                    enable: 0
                    task_callbacks:
                      - type: http
                        enable: 1
                        authorization:
                          type: basic
                          login: login
                          password: password
                        url: http://callback.url
                        params:
                          timeout: 60
                          content_type: "application/json"
                          headers: { }
                      - type: telegram
                        enable: 1
                        token: 1111111111:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
                        chat_id: 111111111
                        params:
                          timeout: 60
                    subtask_callbacks:
                      - type: http
                        enable: 1
                        authorization:
                          type: basic
                          login: login
                          password: password
                        url: http://callback.url
                        params:
                          timeout: 60
                          content_type: "application/json"
                          headers: { }
                      - type: telegram
                        enable: 1
                        token: 1111111111:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
                        chat_id: 111111111
                        params:
                          timeout: 60
                  description: "estimator task with s3 bucket"
                  content:
                    handler:
                      handler_id: "c42ad7cb-9078-4be4-8457-4d3c744477df"
                    source:
                      source_type: s3
                      reference:
                        endpoint: http://localhost:7480
                        bucket_name: portraits
                        prefix: folder1/folder2
                      authorization:
                        public_access_key: user
                        secret_access_key: password
                      image_type: 1
                    filters:
                      account_id: "c42ad7cb-9078-4be4-8457-4d3c744477df"
              estimate_from_s3_arn:
                value:
                  notificaion_policy:
                    enable: 0
                    task_callbacks:
                      - type: http
                        enable: 1
                        authorization:
                          type: basic
                          login: login
                          password: password
                        url: http://callback.url
                        params:
                          timeout: 60
                          content_type: "application/json"
                          headers: { }
                      - type: telegram
                        enable: 1
                        token: 1111111111:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
                        chat_id: 111111111
                        params:
                          timeout: 60
                    subtask_callbacks:
                      - type: http
                        enable: 1
                        authorization:
                          type: basic
                          login: login
                          password: password
                        url: http://callback.url
                        params:
                          timeout: 60
                          content_type: "application/json"
                          headers: { }
                      - type: telegram
                        enable: 1
                        token: 1111111111:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
                        chat_id: 111111111
                        params:
                          timeout: 60
                  description: "estimator task with s3 bucket using arn"
                  content:
                    handler:
                      handler_id: "c42ad7cb-9078-4be4-8457-4d3c744477df"
                    source:
                      source_type: s3
                      reference:
                        bucket_name: arn:aws:s3:eu-central-1:000000000000:accesspoint/bucket-with-images
                        prefix: DCIM_
                      authorization:
                        public_access_key: user
                        secret_access_key: password
                      image_type: 1
                    filters:
                      account_id: "c42ad7cb-9078-4be4-8457-4d3c744477df"
              estimate_from_network_disk:
                value:
                  notificaion_policy:
                    enable: 0
                    task_callbacks:
                      - type: http
                        enable: 1
                        authorization:
                          type: basic
                          login: login
                          password: password
                        url: http://callback.url
                        params:
                          timeout: 60
                          content_type: "application/json"
                          headers: { }
                      - type: telegram
                        enable: 1
                        token: 1111111111:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
                        chat_id: 111111111
                        params:
                          timeout: 60
                    subtask_callbacks:
                      - type: http
                        enable: 1
                        authorization:
                          type: basic
                          login: login
                          password: password
                        url: http://callback.url
                        params:
                          timeout: 60
                          content_type: "application/json"
                          headers: { }
                      - type: telegram
                        enable: 1
                        token: 1111111111:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
                        chat_id: 111111111
                        params:
                          timeout: 60
                  description: "estimator task with network disk"
                  content:
                    handler:
                      handler_id: "c42ad7cb-9078-4be4-8457-4d3c744477df"
                    source:
                      source_type: network_disk
                      reference:
                        path: /mnt/nfs_volume/pictures
                        prefix: portraits
                        postfix: .jpg
                      recursive: true
              estimate_from_ftp:
                value:
                  notificaion_policy:
                    enable: 0
                    task_callbacks:
                      - type: http
                        enable: 1
                        authorization:
                          type: basic
                          login: login
                          password: password
                        url: http://callback.url
                        params:
                          timeout: 60
                          content_type: "application/json"
                          headers: { }
                      - type: telegram
                        enable: 1
                        token: 1111111111:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
                        chat_id: 111111111
                        params:
                          timeout: 60
                    subtask_callbacks:
                      - type: http
                        enable: 1
                        authorization:
                          type: basic
                          login: login
                          password: password
                        url: http://callback.url
                        params:
                          timeout: 60
                          content_type: "application/json"
                          headers: { }
                      - type: telegram
                        enable: 1
                        token: 1111111111:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
                        chat_id: 111111111
                        params:
                          timeout: 60
                  description: "estimator task with ftp server"
                  content:
                    handler:
                      handler_id: "c42ad7cb-9078-4be4-8457-4d3c744477df"
                    source:
                      source_type: ftp
                      authorization:
                        user: admin
                        password: secret-password
                      reference:
                        host: 10.0.0.1
                        port: 2121
                        path: image-storage/
                        prefix: portraits
                        postfix: .jpg
                        max_sessions: 20
                      recursive: true
              estimate_from_samba:
                value:
                  notificaion_policy:
                    enable: 0
                    task_callbacks:
                      - type: http
                        enable: 1
                        authorization:
                          type: basic
                          login: login
                          password: password
                        url: http://callback.url
                        params:
                          timeout: 60
                          content_type: "application/json"
                          headers: { }
                      - type: telegram
                        enable: 1
                        token: 1111111111:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
                        chat_id: 111111111
                        params:
                          timeout: 60
                    subtask_callbacks:
                      - type: http
                        enable: 1
                        authorization:
                          type: basic
                          login: login
                          password: password
                        url: http://callback.url
                        params:
                          timeout: 60
                          content_type: "application/json"
                          headers: { }
                      - type: telegram
                        enable: 1
                        token: 1111111111:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
                        chat_id: 111111111
                        params:
                          timeout: 60
                  description: "estimator task with samba"
                  content:
                    handler:
                      handler_id: "c42ad7cb-9078-4be4-8457-4d3c744477df"
                    source:
                      source_type: samba
                      authorization:
                        user: admin
                        password: secret-password
                      reference:
                        host: 10.0.0.1
                        port: 2121
                        path: image-storage/
                        prefix: portraits
                        postfix: .jpg
                      recursive: true
        required: true

      responses:
        202:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                properties:
                  task_id:
                    $ref: '#/components/schemas/task_id'
                required:
                  - task_id
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_input_json:
                  value:
                    error_code: 12022
                    desc: Bad/incomplete input data
                    detail: 'Failed to validate input json. Path: ''user_data'',  message: ''Extra inputs are not permitted'''
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022
                invalid_handler:
                  value:
                    error_code: 12031
                    desc: Bad/incomplete input data
                    detail: 'Handler 8c335656-3145-4c0d-9e99-fa9d6843ab95 is dynamic. Dynamic handler not supported'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12031
                handler_not_found:
                  value:
                    error_code: 34000
                    desc: Object not found
                    detail: 'Handler with id 8c335656-3145-4c0d-9e99-fa9d6843ab95 not found'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-34000
                account_id_not_found:
                  value:
                    error_code: 11066
                    desc: Bad/incomplete input data
                    detail: Luna-Account-Id header not found
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11066"
                bad_account_id:
                  value:
                    error_code: 11037
                    desc: Bad/incomplete input data
                    detail: "Luna-Account-Id header is not UUID, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11037"
        403:
          description: Access to this resource on the server is denied
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                events_is_disabled:
                  value:
                    error_code: 11040
                    desc: Forbidden
                    detail: Luna Events service is disabled
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11040"
                lis_is_disabled:
                  value:
                    error_code: 11070
                    desc: Forbidden
                    detail: Luna Image Store service is disabled
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11070"
                handlers_is_disabled:
                  value:
                    error_code: 11071
                    desc: Forbidden
                    detail: Luna Handlers service is disabled
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11071"
        500:
          $ref: '#/components/responses/internal_server_error'
        504:
          $ref: '#/components/responses/server_timeout_error'
  /2/tasks/lambda:
    post:
      tags:
      - task processing

      summary: lambda task
      description: | 
                   Create new lambda task.
      operationId: createLambdaTask

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/applicationJsonContent'
      - $ref: '#/components/parameters/account_id_header_required'

      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/lambda_task'
        required: true

      responses:
        202:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                properties:
                  task_id:
                    $ref: '#/components/schemas/task_id'
                required:
                - task_id
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12022
                    desc: Bad/incomplete input data
                    detail: 'Failed to validate input json. Path: ''user_data'',  message: ''Extra inputs are not permitted'''
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022
                account_id_not_found:
                  value:
                    error_code: 11066
                    desc: Bad/incomplete input data
                    detail: Luna-Account-Id header not found
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11066"
                bad_account_id:
                  value:
                    error_code: 11037
                    desc: Bad/incomplete input data
                    detail: "Luna-Account-Id header is not UUID, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11037"
        403:
          description: Access to this resource on the server is denied
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                events_is_disabled:
                  value:
                    error_code: 11040
                    desc: Forbidden
                    detail: Luna Events service is disabled
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11040"
                lis_is_disabled:
                  value:
                    error_code: 11070
                    desc: Forbidden
                    detail: Luna Image Store service is disabled
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11070"
        500:
          $ref: '#/components/responses/internal_server_error'
        504:
          $ref: '#/components/responses/server_timeout_error'
  /2/tasks/schedules:
    post:
      tags:
      - schedules

      summary: create tasks schedule
      description: |
        Create a new task schedule.

        Execution of scheduled tasks will be regulated according to the trigger and optionally starts one task 
        immediately (see *start_immediately* parameter in *behavior* section)

        No task from the schedule will be executed if the previous task has not yet been completed

      operationId: createSchedule

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/applicationJsonContent'
      - $ref: '#/components/parameters/account_id_header_required'

      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/schedule'
        required: true

      responses:
        201:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                properties:
                  schedule_id:
                    $ref: '#/components/schemas/schedule_id'
                required:
                - schedule_id
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                account_id_not_found:
                  value:
                    error_code: 11066
                    desc: Bad/incomplete input data
                    detail: Luna-Account-Id header not found
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11066"
                bad_account_id:
                  value:
                    error_code: 11037
                    desc: Bad/incomplete input data
                    detail: "Luna-Account-Id header is not UUID, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11037"
        403:
          description: Access to this resource on the server is denied
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                events_is_disabled:
                  value:
                    error_code: 11040
                    desc: Forbidden
                    detail: Luna Events service is disabled
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11040"
                lis_is_disabled:
                  value:
                    error_code: 11070
                    desc: Forbidden
                    detail: Luna Image Store service is disabled
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11070"
        500:
          $ref: '#/components/responses/internal_server_error'
        501:
          $ref: '#/components/responses/ae_not_implemented'
        504:
          $ref: '#/components/responses/server_timeout_error'

    get:
      tags:
      - schedules

      summary: get tasks schedules
      description: get tasks schedules with filters
      operationId: getTasksSchedules

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/page_size'
      - $ref: '#/components/parameters/task_type_schedulable'
      - $ref: '#/components/parameters/create_time__lt'
      - $ref: '#/components/parameters/create_time__gte'
      - $ref: '#/components/parameters/account_id'

      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/schedules_reply'
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'account_id'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        500:
          $ref: '#/components/responses/internal_server_error'
  /2/tasks/schedules/{schedule_id}:
    parameters:
      - $ref: '#/components/parameters/schedule_id_path'

    get:
      tags:
      - schedules

      summary: get tasks schedule
      description: get tasks schedule
      operationId: getTasksSchedule

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/account_id'

      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/schedule_reply'
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'account_id'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        404:
          description: object not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                object_not_found:
                  value:
                    error_code: 28040
                    desc: Object not found
                    detail: Schedule with id '12345' not found'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28040
        500:
          $ref: '#/components/responses/internal_server_error'

    put:
      tags:
      - schedules

      summary: replace tasks schedule
      description: |
        Replace tasks schedule:
        
        - if any task created by old schedule is running, it will be cancelled
        
        - schedule parameters will be replaced with the new ones
        
        - tasks will be executed according to the new schedule
      operationId: putTasksSchedule

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/account_id_header_required'

      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/schedule'
        required: true

      responses:
        200:
          description: OK
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                properties:
                  schedule_id:
                    $ref: '#/components/schemas/schedule_id'
                required:
                  - schedule_id
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'account_id'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        404:
          description: object not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                object_not_found:
                  value:
                    error_code: 28040
                    desc: Object not found
                    detail: Schedule with id '12345' not found'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28040
        500:
          $ref: '#/components/responses/internal_server_error'
        501:
          $ref: '#/components/responses/ae_not_implemented'

    patch:
      tags:
      - schedules

      summary: patch tasks schedule
      description: pause/start tasks schedule
      operationId: patchTasksSchedule

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/account_id_header_required'
      - $ref: '#/components/parameters/schedule_patch'

      responses:
        204:
          description: OK
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'account_id'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        404:
          description: object not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                object_not_found:
                  value:
                    error_code: 28040
                    desc: Object not found
                    detail: Schedule with id '12345' not found'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28040
        500:
          $ref: '#/components/responses/internal_server_error'

    delete:
      tags:
      - schedules

      summary: delete tasks schedule
      description: delete tasks schedule
      operationId: deleteTasksSchedule

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/account_id'

      responses:
        204:
          description: OK
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
        400:
          description: bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'account_id'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        404:
          description: object not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                object_not_found:
                  value:
                    error_code: 28040
                    desc: Object not found
                    detail: Schedule with id '12345' not found'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-28040
        500:
          $ref: '#/components/responses/internal_server_error'
  /2/docs/spec:
    get:
      tags:
        - documents
      summary: get openapi documentation
      description: |
        Get service OpenApi documentation. If *Accept* request header is of type `application/x-yaml`,
        returns documentation in `yaml` format or returns `html` documentation, if *Accept-Type* is `text/html`
      operationId: getSpec

      parameters:
        - $ref: '#/components/parameters/luna_request_id'
        - $ref: '#/components/parameters/accept_docs_handler'
      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/docs_content_type'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/x-yaml:
              schema:
                type: string
                description: yaml format documentation
            text/html:
              schema:
                type: string
                description: html format documentation
        415:
          description: Unsupported Media Type
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                unsupported_media_type:
                  value:
                    error_code: 12024
                    detail: Bad/incomplete input data
                    desc: Unsupported media type
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12024
        500:
          $ref: '#/components/responses/internal_server_error'
  /2/docs/dev:
    get:
      tags:
        - documents
      summary: get development manual
      description: |
        Get sphinx documentation - *Development Manual*. After the request you will be redirected to the page `/docs/dev/index.html`
      operationId: getDevManual

      parameters:
        - $ref: '#/components/parameters/luna_request_id'
      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/text_html'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            text/html:
              schema:
                type: string
                description: html format documentation
        500:
          $ref: '#/components/responses/internal_server_error'
  /2/config:
    get:
      tags:
        - config
      summary: get service configuration
      description: Get service configuration. Passwords and tokens will be hidden in the response.
      operationId: getConfig

      parameters:
        - $ref: '#/components/parameters/luna_request_id'
        - $ref: '#/components/parameters/accept_config_handler'
      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/config_accept_content_type'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                description: json format configuration
              example:
                INFLUX_MONITORING:
                  SEND_DATA_FOR_MONITORING: 0
                  VERSION: 2
                  ORGANIZATION: ORGANIZATION_NAME
                  TOKEN: '********'
                  BUCKET: luna_monitoring
                  HOST: 127.0.0.1
                  PORT: 8086
                  USE_SSL: 0
                  FLUSHING_PERIOD: 1.0
            text/plain:
              schema:
                type: string
                description: text format configuration
              example: |
                [INFLUX_MONITORING]
                SEND_DATA_FOR_MONITORING = 0
                VERSION = 2
                ORGANIZATION = ORGANIZATION_NAME
                TOKEN = ********
                BUCKET = luna_monitoring
                HOST = 127.0.0.1
                PORT = 8086
                USE_SSL = 0
                FLUSHING_PERIOD = 1.0
        415:
          description: Unsupported Media Type
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                unsupported_media_type:
                  value:
                    error_code: 12024
                    detail: Bad/incomplete input data
                    desc: Unsupported media type
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12024
        500:
          $ref: '#/components/responses/internal_server_error'
  /2/plugins:
    get:
      tags:
        - plugins
      summary: get list of plugins
      description: |
        Get list of service plugins
      operationId: getPlugins
      parameters:
        - $ref: '#/components/parameters/luna_request_id'
      responses:
        200:
          description: OK.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/plugins'
        500:
          $ref: '#/components/responses/internal_server_error'
  /metrics:

    get:
      tags:
        - metrics
      summary: get service requests statistics
      description: Get statistics of success and failed requests to the service in prometheus format.
      operationId: metrics
      parameters:
        - $ref: '#/components/parameters/luna_request_id'
      responses:
        200:
          description: OK.
          headers:
            Content-Type:
              schema:
                type: string
                enum:
                  - text/plain; charset=UTF-8
              required: true
              description: Content type is `text/plain`.
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            text/plain:
              schema:
                type: string
                description: Prometheus plain text format.
              example: |
                # HELP request_count_total Counter of requests
                # TYPE request_count_total counter
                request_count_total{path="GET:/healthcheck",status_code="200"} 1.0
        403:
          $ref: '#/components/responses/forbidden_resource_error'
        500:
          $ref: '#/components/responses/internal_server_error'
        504:
          $ref: '#/components/responses/server_timeout_error'
  /healthcheck:
    get:
      tags:
        - health
      summary: get health
      description: get health of service
      operationId: healthcheck
      parameters:
        - $ref: '#/components/parameters/luna_request_id'
        - $ref: '#/components/parameters/include_luna_services'
      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/health_ok'
        500:
          $ref: '#/components/responses/internal_server_error'
        502:
          description: Unhealthy
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/health_errors'