Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Note

This specification might evolve based on the development constraints.

Summary

Table of Contents

Claim AI-based Adjudication System

...

The AI input model is represented by a matrix having on each row one Medical Item/Service from a Claim. If the FHIR Claim Bundle contains multiple Claims then the AI input model will contain all Items/Services from all Claims. Each row contains the following informations (either FHIR Medical OR ActivityDefinition, representing an Item in FHIR Claim):

FHIR Medication fields

FHIR ActivityDefinition fields

FHIR Claim fields

FHIR Patient fields

FHIR HealthcareService fields

identifier (ItemUUID)

identifier (ServiceUUID)

identifier (ClaimUUID)

identifier (InsureeUUID, CHFID)

identifier (HfUUID)

extension.unitPrice

unitPrice

billablePeriod (start, end)

birthDate (to calculate age)

location (HFLocationUUID)

frequency

frequency

created

gender

category

extension.useContext (ItemPatCat)

useContext (ServicePatCat)

type

extension.isHead

type

type (always “Medication”)

type (always “ActivityDefinition”)

item.quantity

extension.povertyStatus

item.unitPrice

extension.locationCode (LocationUUID)

diagnosis.diagnosisReference (for icd_0 get ICDID)

extension.group (FamilyUUID)

diagnosis.diagnosisReference (for icd_1 get ICDID)

enterer (ClaimAdminUUID)

...

Note

In this project, the generated AI Model is only valid for Nepal openIMIS implementation. Any usage in other context/implementation will give wrong categorization responses. For other context/implementation, the retraining of the AI Model, based on already categorized Claims, is mandatory.

Several data files are to be loaded and saved during the AI Model execution:

  • encoded fields data file

  • scalling file

  • AI model file

The AI Model file name with full path (or relative path) is configured in the modules configuration key ai_model_file. Each time the model is executed, the model file is loaded, allowing to change the filename on execution in the configuration (hot-reload).

...

The following module configuration is defined:

Code Block
languagejson
{
    'authentication': [string], // Authentication key list. Default:String
 []   ai'claim_modelresponse_fileurl': string'http://localhost:8000/claim_ai/ClaimResponse', // AI Model file name with full path. Default: ./ai_model.pkl
  claim_response_organization: string // Value to build the insurer reference in the ClaimResponse. Default: openIMIS-Claim-AI
}URL set in the ClaimResponse. String
    'ai_model_file': "joblib_Voting_Model.pkl", // AI Model file name, relative location to module folder. String
    'ai_scaler_file': "scaler.pkl", // AI Scaler file name, relative location to module folder. String
    'ai_encoder_file': "Encoder.obj", // AI Encoder file name, relative location to module folder. String
    'claim_response_organization': 'openIMIS-Claim-AI', // Organisation name in ClaimResponse. String
    'date_format': '%Y-%m-%d', // Date format to use. String
    'first_date': '2016-01-01' // First date for date transformation. String
}
Note

The default AI Model filename will be defined after finalizing the AI Algorithm development.

...

FHIR Contained Resources feature allows to integrate the referred resourced. Because AI-model is requiring information from other resources referenced by the Claim, these resources must to be accessible from the Claim sent by Claim-AI Quality module. In case of FHIR Claim, these are Patient, Condition, Medication, HealthcareService, Practitioner, ActivityDefinition. The mechanism to build Claim resource with Contained Resources is developed in the openIMIS FHIR R4 module. In FHIR R4 module, the inclusion of Contained Resources should be possible based on the query variable contained=true/false (default false).

...

Plantumlcloud
filenameClaimStatusStateDiagram.png
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
width
compressedtrue
revision914
Expand
titleDiagram source
Code Block
@startuml


state "Enter Claim" as ClaimEntering {


 [*] --> Entered : Enter Claim

 
 Entered --> Entered : Edit\nClaim


 Entered : ClaimStatus=Entered (2)


 Entered : ReviewStatus=Idle (1)


 Entered : ClaimItemStatus=Accepted (1)


 Entered : RejectionReason=Accepted (0)


}


state "Rule Engine Checking" as RuleEngineCheck {


 state RuleEngineValidation <<choice>>


 Entered --> RuleEngineValidation : Submit Claim


 RuleEngineValidation --> RejectedByRuleEngine : Reject\nAll Items


 RejectedByRuleEngine : ClaimStatus=Rejected (1)


 RejectedByRuleEngine : ClaimItemStatus=Rejected (2)


 RejectedByRuleEngine : RejectionReason=[1-19]

RejectedByRuleEngine --> [*]

RuleEngineValidation --> CheckedIdle : Accept \n Some Items
CheckedIdle : ClaimStatus=Checked (4)
CheckedIdle :

 RejectedByRuleEngine : json_ext.claim_ai_quality.was_categorized=false

}

state "AI Automatic Categorisation" as AICheck {

state AIClaimCategorisation <<choice>>

CheckedIdle --> AIClaimCategorisation

AIClaimCategorisation --> CheckedAIAccepted : Accept\nAll Items
CheckedAIAccepted :

 RejectedByRuleEngine : json_ext.claim_ai_quality.
was
request_
categorized=true
CheckedAIAccepted :
time=ValidityFrom
 RejectedByRuleEngine : json_ext.claim_ai_quality.
ai
response_
result=Accepted (1)AIClaimCategorisation --> CheckedAIFlagged : Reject\nSome Items
CheckedAIFlagged : ReviewStatus=SelectedForReview (4)
CheckedAIFlagged : ClaimItemStatus=Rejected (2)
CheckedAIFlagged : RejectionReason=Rejected by AI (-2)
CheckedAIFlagged : json_ext.claim_ai_quality.was_categorized=true
CheckedAIFlagged :
time=ValidityFrom
 RejectedByRuleEngine : json_ext.claim_ai_quality.ai_result=Rejected (2)

note top of CheckedAIFlagged : Rejected Items values

}

state "Manual Review" as ManualReview {

state SelectForReview <<choice>>

CheckedAIAccepted --> SelectForReview

SelectForReview --> CheckedNotSelected : Select manually\nnot to review
CheckedNotSelected : ReviewStatus=Not Selected (2)
CheckedNotSelected : RejectionReason=Accepted (0)

SelectForReview --> CheckedSelected : Select manually\nto review
CheckedSelected : ReviewStatus=Selected (4)
CheckedSelected : RejectionReason=Accepted (0)

state RequireManualReview <<choice>>

CheckedSelected --> RequireManualReview

CheckedAIFlagged --> RequireManualReview : Selected automatically\nfor review

RequireManualReview --> CheckedRejected : Manual Review\nReject All Items
CheckedRejected: ClaimItemStatus=Rejected (2)
CheckedRejected : RejectionReason=Rejected by MO (-1)

CheckedRejected --> [*]

RequireManualReview --> CheckedAccepted : Manual Review\nAccept Some Items
CheckedAccepted : ClaimItemStatus=Accepted (1)
CheckedAccepted : RejectionReason=Accepted (0)

CheckedAccepted --> CheckedReviewed : Deliver review
CheckedReviewed : ReviewStatus=Reviewed (8)

}

state "Processing" as Process {

CheckedReviewed --> ValuatedAccepted : Process
ValuatedAccepted : ClaimStatus=Valuated (16)

CheckedNotSelected --> ValuatedAccepted : Process

CheckedAccepted --> ValuatedBypassed : Process \nwithout \ndelivering \nreview
ValuatedBypassed : ClaimStatus=Valuated (16)
ValuatedBypassed : ReviewStatus=Bypassed (16)

ValuatedBypassed --> [*]

ValuatedAccepted --> [*]

}

@enduml

Only the Claims which contains Items/Services rejected by Claim-AI module will have the fields updated. The json_ext fields are always updated, even for the totally accepted Claim.

To ease the conversion from FHIR ClaimResponse to openIMIS Claim and saving into the DB, we have implemented the HTTP PUT method for ClaimResponse resource into openIMIS FHIR R4 Module.

Models

The new Claim-AI adjudication process is executed between Rule-based engine and the manual adjudication (see Getting the ClaimResponse from Claim-AI Module section). Because we decided not to add additional statuses to Claim, requiring to modify the Claim module, we will to use the JSON extensions that can be added and updated from the Claim-AI Quality module.

The following JSON extensions will be created to support the Claim AI-based Categorisation:

  • to add information on Claim. The field was_categorized allow to filter automatically checked Claim that have not been categorized by AI and ‘hide’ them for manual adjudication.

    Code Block
    languagejson
    "json_ext": {
      "claim_ai_quality": {
        "was_categorized": "boolean", // whether the claim has been categorized by Claim-AI module or not
        "request_time": "datetime", // time when the claim has been sent to Claim-AI module
        "response_time": "datetime" // time when the claim adjudication response has been received from Claim-AI module
      }
    }
  • to add information on ClaimItem and ClaimService. This is used to store AI categorisation result to allow the misclassification report.

    Code Block
    "json_ext": {
      "claim_ai_quality": {
        "ai_result": "integer" // claim adjudication value provided by Claim-AI module (for misclassification report)
      }
    }

...

Expand
titleDiagram source

@startuml

class Claim as "openimis.claim.models.Claim" {
id: models.AutoField
uuid: models.CharField
code: models.CharField
-- claim_ai_quality extension --
+json_ext.claim_ai_quality.was_categorized: boolean = false
+json_ext.claim_ai_quality.request_time: datetime
+json_ext.claim_ai_quality.response_time: datetime
}

class ClaimItem as "openimis.claim.models.ClaimItem" {
-- claim_ai_quality extension --
+



 RejectedByRuleEngine --> [*]

 RuleEngineValidation --> CheckedIdle : Accept \n Some Items
 CheckedIdle : ClaimStatus=Checked (4)
 CheckedIdle : json_ext.claim_ai_quality.was_categorized=false
 
}

state "AI Automatic Categorisation" as AICheck {

 state AIClaimCategorisation <<choice>>

 CheckedIdle --> AIClaimCategorisation 

 AIClaimCategorisation --> CheckedAIAccepted : Accept\nAll Items
 CheckedAIAccepted : json_ext.claim_ai_quality.was_categorized=true
 CheckedAIAccepted : json_ext.claim_ai_quality.ai_result=Accepted (1)

 AIClaimCategorisation --> CheckedAIFlagged : Reject\nSome Items
 CheckedAIFlagged : ReviewStatus=SelectedForReview (4)
 CheckedAIFlagged : ClaimItemStatus=Rejected (2)
 CheckedAIFlagged : RejectionReason=Rejected by AI (-2)
 CheckedAIFlagged : json_ext.claim_ai_quality.was_categorized=true
 CheckedAIFlagged : json_ext.claim_ai_quality.ai_result=Rejected (2)

 note top of CheckedAIFlagged : Rejected Items values 

}

state "Manual Review" as ManualReview {

 state SelectForReview <<choice>>

 CheckedAIAccepted --> SelectForReview

 SelectForReview --> CheckedNotSelected : Select manually\nnot to review
 CheckedNotSelected : ReviewStatus=Not Selected (2)
 CheckedNotSelected : RejectionReason=Accepted (0)

 SelectForReview --> CheckedSelected : Select manually\nto review
 CheckedSelected : ReviewStatus=Selected (4)
 CheckedSelected : RejectionReason=Accepted (0)

 state RequireManualReview <<choice>>

 CheckedSelected --> RequireManualReview 

 CheckedAIFlagged --> RequireManualReview : Selected automatically\nfor review

 RequireManualReview --> CheckedRejected : Manual Review\nReject All Items
 CheckedRejected: ClaimStatus=Rejected (1)
 CheckedRejected: ClaimItemStatus=Rejected (2)
 CheckedRejected : RejectionReason=Rejected by MO (-1)

 CheckedRejected --> [*]

 RequireManualReview --> CheckedAccepted : Manual Review\nAccept Some Items
 CheckedAccepted : ClaimItemStatus=Accepted (1)
 CheckedAccepted : RejectionReason=Accepted (0)

 CheckedAccepted  --> CheckedReviewed : Deliver review
 CheckedReviewed : ReviewStatus=Reviewed (8)

}

state "Processing" as Process {

 CheckedReviewed --> ValuatedAccepted : Process
 ValuatedAccepted : ClaimStatus=Valuated (16)

 CheckedNotSelected --> ValuatedAccepted : Process

 CheckedAccepted --> ValuatedBypassed : Process \nwithout \ndelivering \nreview
 ValuatedBypassed : ClaimStatus=Valuated (16)
 ValuatedBypassed : ReviewStatus=Bypassed (16)

 ValuatedBypassed --> [*]

 ValuatedAccepted --> [*]

}

@enduml

Only the Claims which contains Items/Services rejected by Claim-AI module will have the fields updated. The json_ext fields are always updated, even for the totally accepted Claim.

To ease the conversion from FHIR ClaimResponse to openIMIS Claim and saving into the DB, we have implemented the HTTP PUT method for ClaimResponse resource into openIMIS FHIR R4 Module.

Models

The new Claim-AI adjudication process is executed between Rule-based engine and the manual adjudication (see Getting the ClaimResponse from Claim-AI Module section). Because we decided not to add additional statuses to Claim, requiring to modify the Claim module, we will to use the JSON extensions that can be added and updated from the Claim-AI Quality module.

The following JSON extensions will be created to support the Claim AI-based Categorisation:

  • to add information on Claim. The field was_categorized allow to filter automatically checked Claim that have not been categorized by AI and ‘hide’ them for manual adjudication.

    Code Block
    languagejson
    "json_ext": {
      "claim_ai_quality": {
        "was_categorized": "boolean", // whether the claim has been categorized by Claim-AI module or not
        "request_time": "datetime", // time when the claim has been sent to Claim-AI module
        "response_time": "datetime" // time when the claim adjudication response has been received from Claim-AI module
      }
    }
  • to add information on ClaimItem and ClaimService. This is used to store AI categorisation result to allow the misclassification report.

    Code Block
    "json_ext": {
      "claim_ai_quality": {
        "ai_result": "integer" // claim adjudication value provided by Claim-AI module (for misclassification report)
      }
    }
Plantumlcloud
filenameClaimAIExec.png
datazVVdT8IwFP01S9CEZhkYnvlMMFEfSHxdLtsVq90Kbafir7dd1wHbinvwwaTZ6O25pz3ndpdgHEoFQhUZC8KpHgkDKYMonDOgmX6DmQRRxPeY04xKkpgFkvEUmSQVKjKYycwwGLAZNA1GZlYBp4XiK4osPccURQM1fwXRQiV6zYNyEDPOMoZDk2aOFgONDwUwqo46hF8Kc0l5bjFnGUE0e5M8jzWCNBPJJ8g4AYU7Lug3Vifecs4QDFMwWujnCzCJvSkFHgqUKlY0q7SleoNy1p9C7nku0cMxWXTUc62wZ00tsqOuf+yt/qmFFExZBTTXNqOoXQ29UjYoPmiC/dTU4P8p6IqWDFOaAHNquoR0EPrq3GCrYL+xnYzlAl3u0tiTwpbhgwm0fXUWWR9WwNgWkvf7zdNj/YX32ugZhakCpp59GO4gOcauk6yt4a09OrlnILHNf7cs70Sf0/ipvbS2ZXqyOlyt0ojL08P1Zl24kJBbW79hM1BWN5wOTuh5Fb0xfOSiKZS8p3t4ndkdZVAnzF30ktqt23s1DrU2/UfzAw==
width
compressedtrue
revision9
Expand
titleDiagram source

@startuml

class Claim as "openimis.claim.models.Claim" {
id: models.AutoField
uuid: models.CharField
code: models.CharField
-- claim_ai_quality extension --
+json_ext.claim_ai_quality.was_categorized: boolean = false
+json_ext.claim_ai_quality.request_time: datetime
+json_ext.claim_ai_quality.response_time: datetime
}

class ClaimItem as "openimis.claim.models.ClaimItem" {
-- claim_ai_quality extension --
+json_ext.claim_ai_quality.ai_result: integer = 0
}

class ClaimService as "openimis.claim.models.ClaimService" {
-- claim_ai_quality extension --
+json_ext.claim_ai_quality.ai_result: integer = 0
}

class Service as "openimis.medical.models.Service" {

}

class Item as "openimis.medical.models.Item " {

}

class openimis.core.models.ExtendableModel {
json_ext: FallbackJSONField
}

class openimis.core.models.VersionedModel {
legacy_id: IntegerField
}

openimis.core.models.BaseVersionedModel ^-- openimis.core.models.VersionedModel

openimis.core.models.VersionedModel ^-- Claim
openimis.core.models.ExtendableModel ^-- .Claim

Claim "0.." - "0.." Item
(Claim , Item) .. ClaimItem

Service "0.." - "0.." Claim
(Service, Claim) .. ClaimService

@enduml

Because currently ClaimItem and ClaimService doesn’t support custom fields, these classes will also extend the ExtendableModel class.

Migrations

Because the Claim-AI modules are activated after Claims have been adjudicated (the data used for the training), a migration script needs to be created to insert the JSON fields into the available data. The following initializations will be used:

If Claim.ClaimStatus == Entered (Value 2) Then don’t add Claim.json_ext.claim_ai_quality

If Claim.ClaimStatus == Checked (Value 4) Then add

Code Block
Claim.json_ext.claim_ai_quality.
ai_result: integer = 0
}class ClaimService as "openimis.claim.models.ClaimService" {
--
was_categorized = false
Claim.json_ext.claim_ai_quality
extension --
+
.request_time = null
Claim.json_ext.claim_ai_quality.
ai_result: integer = 0
}

class Service as "openimis.medical.models.Service" {

}

class Item as "openimis.medical.models.Item " {

}

class openimis.core.models.ExtendableModel {
json_ext: FallbackJSONField
}

class openimis.core.models.VersionedModel {
legacy_id: IntegerField
}

openimis.core.models.BaseVersionedModel ^-- openimis.core.models.VersionedModel

openimis.core.models.VersionedModel ^-- Claim
openimis.core.models.ExtendableModel ^-- .Claim

Claim "0.." - "0.." Item
(Claim , Item) .. ClaimItem

Service "0.." - "0.." Claim
(Service, Claim) .. ClaimService

@enduml

Because currently ClaimItem and ClaimService doesn’t support custom fields, these classes will also extend the ExtendableModel class.

Migrations

...

response_time = null

If Claim.ClaimStatus == Rejected (Value 1) Then add

Code Block
Claim.json_ext.claim_ai_quality.was_categorized = false
Claim.json_ext.claim_ai_quality.request_time = Claim.ValidityFrom
Claim.json_ext.claim_ai_quality.response_time = Claim.ValidityFrom
ClaimService.json_ext.claim_ai_quality.ai_result = ClaimService.ClaimServiceStatus
ClaimItem.json_ext.claim_ai_quality.ai_result = ClaimItem.ClaimItemStatus

If Claim.ClaimStatus in [Reviewed/Processed (Value 8), Valuated (Value 16)] Then add

Code Block
Claim.json_ext.claim_ai_quality.was_categorized = true
Claim.json_ext.claim_ai_quality.request_time = Claim.ValidityFromReview
Claim.json_ext.claim_ai_quality.response_time = Claim.ValidityFromReview
ClaimService.json_ext.claim_ai_quality.ai_result = ClaimService.ClaimServiceStatus
ClaimItem.json_ext.claim_ai_quality.ai_result = ClaimItem.ClaimItemStatus

...

  • ClaimFilterMedicalItem allows Medical Officers to filter the Claims list based on a specific Medical Item (only one from autocomplete list)

  • ClaimFilterMedicalService allows Medical Officers to filter the Claims list based on a specific Medical Service (only one from autocomplete list)

  • ClaimFilterAIProcessed allows Medical Officers to display or hide the non AI-processed Claims (checkbox, default checked)dropdown with options: Show all, AI-Categorized Claim Only, Not AI-Categorized Claims Only, default AI-Categorized Claim Only)

Custom Claim Review Search Results - Frontend

The following column will be added to the claim.Searcher result list:

  • ClaimResultsAIProcessed will display the value of Claim.json_ext.claim_ai_quality.was_categorized as True/False.

AI Categorisation Misclassification Report

...

  • total number of Claims

  • accuracy scoresscore ( Accuracy = (TP+TN)/(TP+TN+FP+FN) )

  • number of True Positives results

  • number of True Negative results

  • number of False Positive results

  • number of False Negative results

  • Table with Claim that were fixed (ClaimItem.json_ext.claim_ai_quality.ai_result != ClaimItem.ClaimItemStatus - same for ClaimService)

    • same format as Claim Overview report with additional Scope as ‘Claim and All Details’

    • For each Item and Service will be added:

      • json_ext.claim_ai_quality.ai

      _result column for each Item and Service
      • _result column

      • Medical Officer name from AuditUserIDReview (same as for ClaimAdmin)

To generate this report, the user will have have to filter through the Review Claims search form and trigger the report through a button (label is “AI Misclassification Report”). Only the filtered Claims will be considered for the report.

...

Plantumlcloud
filenameopenIMIS-AI-Modules-Deployment.png
datalVTLboMwEPwaSpVXbboMwDP2aSNsDUkSp+0BySJEOTtJo1pqDqX9ATdsE0tpyWTUNaH8b2A1nx2kghIBIe9vdzuBQaQqGaZEGIfU6c+IGwODiQiGrDK1PnklCGpooMSEiLElRyTD6TvJSQgzLciEKhg2t8kDDsA/fsujxTi4EKkFTK7O4O9M4Zk1HlRDLjQltxG7f8p2KvCwUOnHyILnIj0VWSxgxNbM47B2hD8WSj5pLYX5n4SzBRxd0h+VorQhlGIbz4Eg5ISm0Jhh31LUnTaMJip3GURg4UzUEEZLvPuL5ARrZxQDYvzsY2zDJuDmi1ButHo2xmFz42Z8FHGZHSzanZR8YN/5x37blYwtxmmuSwUajBdeWoMF4fBB0vTagG9hT9p0bHq+k9WlNVjE5E4JqY+2qBWMmNosLq+FdArF+HstlPQ/UTjj+Oib/mE7vPI8z+5YmjSu8iyAYgSIhKy3hXAXKMh6n5DVS3CwFWsYVzuMGieMdQzKIqeYYgs++CgjUoZ7as9BNvtuEdV2ajMjf0T2cW+afmdLvNO2Jq12j9mI8WkndFxjCdH48lucbpGgosCmlA7znRf+Shifz9/op2jpcxJzecvYW7Pz+QT+iS7H5+BwjA5uZOuhn5WQRprzrFBD45xETJ1tJf1FR4b91tzboWc09THykcGfwUAlPLjwmswRLvL5oGNGwRT4P/0FZ6XN24K9JtYXw5jRD/3+AymbVd3A0mouyWWqPNJjRotPGYTFniV1rLNZYIdo/44adbJMhZoHWFw4EtC6snXHdWE1r6HMx1UcPYSb/tIw/+ia7Hp6DxGDXclK2DflVcKKHOi4UaApdKxOS5qIS55DOH/W7vhSHGqdYgwxRKKU78Tmb4jrF/rpeCJ4FH6ncGBRU3oK9V9CWzvneqFjMmXJnhdN01MosoqAz/GX8=
width
compressedtrue
revision24
Expand
titleDiagram source
Code Block
@startuml

database openIMISDB

node openIMISImplementation as


node openIMISImplementation as "openIMIS Implementation" {


component ClaimModule as "Claim Module"


component ClaimAIQualityModule as "Claim AI Quality Module"


component FHIRR4Module as "FHIR R4 Module"


FHIRR4Module -[dashed]-> ClaimModule: <<use>>


ClaimAIQualityModule -[dashed]-> FHIRR4Module : <<use>>

ClaimAIQualityModule --^ ClaimModule

}

openIMISImplementation

ClaimAIQualityModule --^ ClaimModule

database openIMISDB

ClaimModule -[dashed]-> openIMISDB:
<<use>>node openIMISClaimAIImplementation as "openIMIS
 <<use>>

}


node openIMISClaimAIImplementation as "openIMIS Claim-AI Implementation" {


component ClaimAIModule as "Claim-AI Module"


artifact ClaimAIModel as "Claim-AI Model"


ClaimAIModule -[dashed]-> ClaimAIModel: <<use>>

}

ClaimAIModule


}


ClaimAIModule -0)- ClaimAIQualityModule: FHIR Claim


ClaimAIModule -(0- ClaimAIQualityModule: FHIR ClaimResponse


node ClaimAITraining as "openIMIS Claim-AI Training" {


component ClaimAIAlgorithm as "Claim-AI ML Algorithm"

ClaimAIAlgorithm

artifact openIMISDBReplica as "openIMIS Claim Data"

ClaimAIAlgorithm -[dashed]-> ClaimAIModel:
<<generates>>
ClaimAIAlgorithm
 <<generates>>
openIMISDBReplica -[dashed]-> openIMISDB: <<replicates>>
ClaimAIAlgorithm -[dashed]->
openIMISDB
 openIMISDBReplica: <<use>>


}


@enduml

Testing

Testing the WebSocket from JavaScript console

...