Aller au contenu principal

DiagnosticReport anonymes

Publier un DiagnosticReport anonyme

Nous fournissons un terminal pour créer un DiagnosticReport anonyme. Ce type de demande permet d'exécuter nos algorithmes d'IA sur une image sans créer de patient. C'est-à-dire que vous pouvez envoyer une image à notre système et obtenir le résultat, mais ce rapport ne sera lié à aucun patient de notre système.

Pour publier un DiagnosticReport anonyme, vous devez utiliser le terminal createAnonymousDiagnosticReport.

Ce terminal permet de trier les demandes :

Aide au diagnostic

Si vous souhaitez uniquement obtenir la liste des conclusions possibles et des résultats préliminaires d'une lésion cutanée, vous pouvez envoyer une demande comprenant deux propriétés :

  • l'image
  • et la zone du corps où se trouve la lésion.
{
"bodySite": "ARM_LEFT",
"image": {
"x": 57.91903409090901,
"y": 0,
"width": 1258.261855332168,
"height": 729.0723905723905,
"image": "data:image/jpeg;base64,/9j"
}
}

Dans ce cas, vous obtiendrez un JSON avec la forme suivante :

{
"success": true,
"message": "Diagnostic report created",
"data": {
"id": "01898d7a-92d2-7dd1-a2bb-f585f16da0a3",
"originalMedia": {
"focusScore": null,
"type": "Image",
"modality": "Clinical",
"diqaScore": 86.0,
"pxToCm": null,
"annotations": [],
"url": "https://legit-app-pre.s3.eu-west-3.amazonaws.com/diagnostic-report-medias/xxx.jpg",
"thumbnailUrl": null
},
"bodySite": {
"id": 3,
"code": "ARM_LEFT",
"name": "Arm left"
},
"createdAt": "2023-07-25T14:36:05+00:00",
"result": {
"id": "01898d7a-92d2-7dd1-a2bb-f585f1d1b1d2",
"explainabilityMedia": {
"focusScore": null,
"type": null,
"modality": null,
"diqaScore": null,
"pxToCm": null,
"annotations": [],
"url": null,
"thumbnailUrl": null
},
"metrics": {
"sensitivity": 83.31,
"specificity": 99.53
},
"preliminaryFindings": {
"hasConditionSuspicion": 100.0,
"isPreMalignantSuspicion": 0.0,
"isMalignantSuspicion": 0.0,
"needsBiopsySuspicion": 0.0,
"needsSpecialistsAttention": 100.0,
"adjustedIsPreMalignantSuspicion": null,
"adjustedIsMalignantSuspicion": null,
"isPreMalignantSuspicionOverThreshold": false,
"isMalignantSuspicionOverThreshold": false
},
"iaSeconds": 0.5766849517822266,
"conclusions": [
{
"probability": 100.0,
"pathology": {
"id": 237,
"name": "Psoriasis",
"code": "Psoriasis"
}
}
],
"scoringSystems": []
},
"pathology": null
},
"errorCode": null
}

Mesure de la gravité

Vous pouvez également effectuer une mesure de gravité si vous connaissez la pathologie que présente la lésion. Dans ce cas, vous devez envoyer l'image et la zone du corps, mais aussi la pathologie et les systèmes de notation associés qui permettent de mesurer la gravité.

{
"bodySite": "ARM_LEFT",
"image": {
"x": 57.91903409090901,
"y": 0,
"width": 1258.261855332168,
"height": 729.0723905723905,
"image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/",
"orientation": -1
},
"scoringSystems": [
{
"scoringSystem": "2",
"scoringSystemFacets": [
{
"scoringSystemFacet": "8",
"value": "139"
}
]
},
{
"scoringSystem": "8",
"scoringSystemFacets": [
{
"scoringSystemFacet": "19",
"value": "73"
},
{
"scoringSystemFacet": "20",
"value": "77"
},
{
"scoringSystemFacet": "21",
"value": "81"
},
{
"scoringSystemFacet": "22",
"value": "85"
},
{
"scoringSystemFacet": "23",
"value": "89"
},
{
"scoringSystemFacet": "24",
"value": "93"
},
{
"scoringSystemFacet": "25",
"value": "97"
},
{
"scoringSystemFacet": "26",
"value": "101"
},
{
"scoringSystemFacet": "27",
"value": "105"
},
{
"scoringSystemFacet": "28",
"value": "110"
}
]
},
{
"scoringSystem": "16",
"scoringSystemFacets": [
{
"scoringSystemFacet": "72",
"value": "331"
},
{
"scoringSystemFacet": "73",
"value": "333"
},
{
"scoringSystemFacet": "74",
"value": "335"
},
{
"scoringSystemFacet": "75",
"value": "337"
}
]
}
],
"pathology": "Psoriasis",
"extraData": null,
"patientIdentifier": "A1"
}

Dans ce cas, vous obtiendrez un JSON avec la forme suivante :

{
"success": true,
"message": "Diagnostic report created",
"data": {
"id": "01898ce9-c246-72fb-b2cf-337629cd7bd0",
"originalMedia": {
"focusScore": null,
"type": "Image",
"modality": "Clinical",
"diqaScore": 86.0,
"pxToCm": null,
"annotations": [],
"url": "https://legit-app-pre.s3.eu-west-3.amazonaws.com/diagnostic-report-medias/xxx.jpg"
"thumbnailUrl": null
},
"bodySite": {
"id": 3,
"code": "ARM_LEFT",
"name": "Arm left"
},
"createdAt": "2023-07-25T11:57:54+00:00",
"result": {
"id": "01898ce9-c246-72fb-b2cf-33762a9b2e98",
"explainabilityMedia": {
"type": null,
"modality": null,
"diqaScore": null,
"url": "https://legit-app-pre.s3.eu-west-3.amazonaws.com/diagnostic-report-medias/yyy.jpg",
"thumbnailUrl": null
},
"metrics": {
"sensitivity": 83.31,
"specificity": 99.53
},
"preliminaryFindings": {
"hasConditionSuspicion": 100.0,
"isPreMalignantSuspicion": 0.0,
"isMalignantSuspicion": 0.0,
"needsBiopsySuspicion": 0.0,
"needsSpecialistsAttention": 100.0,
"isPreMalignantSuspicionOverThreshold": false,
"isMalignantSuspicionOverThreshold": false
},
"iaSeconds": 0.7282395362854004,
"conclusions": [
{
"probability": 100.0,
"pathology": {
"id": 237,
"name": "Psoriasis",
"code": "Psoriasis"
}
}
],
"scoringSystems": [
{
"scoringSystem": 2,
"score": 4.200000000000001,
"scoreCategory": "Severe",
"scoreCategorySeverity": 3,
"resultScoringSystemFacets": [
{
"facet": {
"id": 4,
"inputAdornment": null,
"allowsInputFromUser": false,
"name": "Desquamation",
"description": "This value corresponds to the shedding intensity of the outermost layer of skin of the affected zone"
},
"valueToDisplay": "Moderate (2)"
},
{
"facet": {
"id": 1,
"inputAdornment": null,
"allowsInputFromUser": false,
"name": "Redness",
"description": "This value corresponds to the redness intensity of the lesion"
},
"valueToDisplay": "Severe (3)"
},
{
"facet": {
"id": 3,
"inputAdornment": null,
"allowsInputFromUser": false,
"name": "Induration",
"description": "This value corresponds to the hardening intensity of the lesion"
},
"valueToDisplay": "Moderate (2)"
},
{
"facet": {
"id": 26,
"inputAdornment": null,
"allowsInputFromUser": false,
"name": "Affected area",
"description": "This value corresponds to the percentage of involvement of the specific area of the body you are reporting"
},
"valueToDisplay": "50% (3)"
}
],
"reduction": null,
"explainabilityMediaUrl": "https://legit-app-pre.s3.eu-west-3.amazonaws.com/diagnostic-report-medias/ps4q5JKDNHLejFjfbhGVVRtKNYCVRNoN4fi17gijUWNVypJ4JLBapASPeMbsRN7Y.jpg?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA52A2ZCZF32OWDLDS%2F20230725%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20230725T143807Z&X-Amz-SignedHeaders=host&X-Amz-Expires=1800&X-Amz-Signature=eec91bccdbbe8bcab1230e230bbc66d610518cca4ad610a5270b5e1ccddb9896"
},
{
"scoringSystem": 16,
"score": 0.0,
"scoreCategory": "No apparent symptoms",
"scoreCategorySeverity": 1,
"resultScoringSystemFacets": [
{
"facet": {
"id": 68,
"inputAdornment": null,
"allowsInputFromUser": false,
"name": "Have you ever had a globally swollen and painful finger or toe?",
"description": ""
},
"valueToDisplay": "No (0)"
},
{
"facet": {
"id": 69,
"inputAdornment": null,
"allowsInputFromUser": false,
"name": "Have you ever had heel pain as soon as you stand up in the morning?",
"description": ""
},
"valueToDisplay": "No (0)"
},
{
"facet": {
"id": 70,
"inputAdornment": null,
"allowsInputFromUser": false,
"name": "Have you ever had left and right buttock pain, at the same time or not?",
"description": ""
},
"valueToDisplay": "No (0)"
},
{
"facet": {
"id": 71,
"inputAdornment": null,
"allowsInputFromUser": false,
"name": "Have you ever had a swollen and painful joint? (hands, feet, knees, or ankles, for example)",
"description": ""
},
"valueToDisplay": "No (0)"
}
],
"reduction": null,
"explainabilityMediaUrl": "https://legit-app-pre.s3.eu-west-3.amazonaws.com/diagnostic-report-medias/ps4q5JKDNHLejFjfbhGVVRtKNYCVRNoN4fi17gijUWNVypJ4JLBapASPeMbsRN7Y.jpg?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA52A2ZCZF32OWDLDS%2F20230725%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20230725T143807Z&X-Amz-SignedHeaders=host&X-Amz-Expires=1800&X-Amz-Signature=eec91bccdbbe8bcab1230e230bbc66d610518cca4ad610a5270b5e1ccddb9896"
},
{
"scoringSystem": 8,
"score": 1.0,
"scoreCategory": "No effect at all on patient's life",
"scoreCategorySeverity": 1,
"resultScoringSystemFacets": [
{
"facet": {
"id": 16,
"inputAdornment": null,
"allowsInputFromUser": false,
"name": "Over the last week, how itchy, sore, painful or stinging has your skin been?",
"description": ""
},
"valueToDisplay": "Not at all (0)"
},
{
"facet": {
"id": 25,
"inputAdornment": null,
"allowsInputFromUser": false,
"name": "Over the last week, how much of a problem has the treatment for your skin been, for example by making your home messy, or by taking up time?",
"description": ""
},
"valueToDisplay": "A little (1)"
},
{
"facet": {
"id": 17,
"inputAdornment": null,
"allowsInputFromUser": false,
"name": "Over the last week, how embarrassed or self conscious have you been because of your skin?",
"description": ""
},
"valueToDisplay": "Not at all (0)"
},
{
"facet": {
"id": 18,
"inputAdornment": null,
"allowsInputFromUser": false,
"name": "Over the last week, how much has your skin interfered with you going shopping or looking after your home or garden? ",
"description": ""
},
"valueToDisplay": "Not at all (0)"
},
{
"facet": {
"id": 19,
"inputAdornment": null,
"allowsInputFromUser": false,
"name": "Over the last week, how much has your skin influenced the clothes you wear?",
"description": ""
},
"valueToDisplay": "Not at all (0)"
},
{
"facet": {
"id": 20,
"inputAdornment": null,
"allowsInputFromUser": false,
"name": "Over the last week, how much has your skin affected any social or leisure activities?",
"description": ""
},
"valueToDisplay": "Not at all (0)"
},
{
"facet": {
"id": 21,
"inputAdornment": null,
"allowsInputFromUser": false,
"name": "Over the last week, how much has your skin made it difficult for you to do any sport?",
"description": ""
},
"valueToDisplay": "Not at all (0)"
},
{
"facet": {
"id": 22,
"inputAdornment": null,
"allowsInputFromUser": false,
"name": "Over the last week, how much has your skin prevented you from working or studying?",
"description": ""
},
"valueToDisplay": "Not at all (0)"
},
{
"facet": {
"id": 23,
"inputAdornment": null,
"allowsInputFromUser": false,
"name": "Over the last week, how much has your skin created problems with your partner or any of your close friends or relatives?",
"description": ""
},
"valueToDisplay": "Not at all (0)"
},
{
"facet": {
"id": 24,
"inputAdornment": null,
"allowsInputFromUser": false,
"name": "Over the last week, how much has your skin caused any sexual difficulties?",
"description": ""
},
"valueToDisplay": "Not at all (0)"
}
],
"reduction": null,
"explainabilityMediaUrl": "https://legit-app-pre.s3.eu-west-3.amazonaws.com/diagnostic-report-medias/ps4q5JKDNHLejFjfbhGVVRtKNYCVRNoN4fi17gijUWNVypJ4JLBapASPeMbsRN7Y.jpg?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA52A2ZCZF32OWDLDS%2F20230725%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20230725T143807Z&X-Amz-SignedHeaders=host&X-Amz-Expires=1800&X-Amz-Signature=eec91bccdbbe8bcab1230e230bbc66d610518cca4ad610a5270b5e1ccddb9896"
}
]
},
"pathology": "Psoriasis"
},
"errorCode": null
}

Demander les données

Vous pouvez également envoyer deux paramètres dans le corps pour définir des méta-informations sur la demande :

  • patientIdentifier, une chaîne avec l'identifiant du patient dans votre système.
  • extraData, une chaîne avec toutes les informations supplémentaires que vous souhaitez associer à la demande.

Les deux propriétés seront enregistrées et liées au DiagnosticReport.

{
"bodySite": "ARM_LEFT",
"image": {
"x": 57.91903409090901,
"y": 0,
"width": 1258.261855332168,
"height": 729.0723905723905,
"image": "data:image/jpeg;base64,/9j"
},
"patientIdentifier": "XYZ",
"extraData": "a base64 encoded string"
}

Comment envoyer un système de notation

Pour soumettre un système de notation, vous devez fournir l'identifiant du système correspondant dans notre base de données, ainsi qu'un tableau de valeurs pour chaque facette requise par le système de notation :

{
"scoringSystem": "2",
"scoringSystemFacets": [
{
"scoringSystemFacet": "8", // scoring system facet id
"value": "139"
}
]
}

Pour obtenir une liste complète des systèmes de notation ainsi que leurs identifiants et facettes, téléchargez le fichier approprié à partir des emplacements suivants :

À titre d'exemple, notre système de notation APASI_LOCALcomprend quatre facettes : surface, érythème, induration et desquamation. Cependant, selon la définition de notre système de notation, l'utilisateur n'est tenu de fournir des informations que pour la facette de surface ; les valeurs des trois facettes restantes, dont la propriété isAskedInQuestionnaire est définie sur false, sont calculées par notre IA. Voici un exemple d'une facette qui n'est pas obligatoire :

{
"id": 9,
"isAskedInQuestionnaire": false,
"code": "erythema"
}

Pour solliciter les informations de la facette de surface auprès de l'utilisateur, invitez-le à sélectionner une plage parmi les options fournies, puis enregistrez l'identifiant de la plage choisie pour une soumission ultérieure au terminal. Par exemple, si l'utilisateur sélectionne la plage 10 % - 30 %, vous devez enregistrer l'identifiant de cette plage, qui est 138.

La facette de surface de notre système ressemble à ceci :

{
"id": 8,
"isAskedInQuestionnaire": true,
"code": "surface",
"allowsInputFromUser": false,
"name": {
"en": "Affected area",
"es": "Area afectada"
},
"description": {
"en": "This value corresponds to the percentage of involvement of the specific area of the body you are reporting",
"es": "Este valor corresponde al porcentaje de afectación de la zona concreta del cuerpo que estás reportando"
},
"ranges": [
{
"id": 29,
"label": {
"en": "0",
"es": "0"
},
"min": 0,
"max": 0,
"code": "0",
"value": "0"
},
{
"id": 137,
"label": {
"en": "0-10%",
"es": "0-10%"
},
"min": 1,
"max": 1,
"code": "0-10%",
"value": "1"
},
{
"id": 138,
"label": {
"en": "10-30%",
"es": "10-30%"
},
"min": 2,
"max": 2,
"code": "10-30%",
"value": "2"
},
{
"id": 139,
"label": {
"en": "30-50%",
"es": "30-50%"
},
"min": 3,
"max": 3,
"code": "30-50%",
"value": "3"
},
{
"id": 140,
"label": {
"en": "50-70%",
"es": "50-70%"
},
"min": 4,
"max": 4,
"code": "50-70%",
"value": "4"
},
{
"id": 141,
"label": {
"en": "70-90%",
"es": "70-90%"
},
"min": 5,
"max": 5,
"code": "70-90%",
"value": "5"
},
{
"id": 142,
"label": {
"en": "90-100%",
"es": "90-100%"
},
"min": 6,
"max": 6,
"code": "90-100%",
"value": "6"
}
]
}

Chaque option de plage est définie avec un identifiant, une étiquette (avec des options en anglais et en espagnol), un code et une valeur. L'utilisateur doit choisir parmi les options disponibles, et l'identifiant correspondant doit être envoyé au terminal. Par exemple, la plage 10 % - 30 % est définie comme suit :

{
"id": 138,
"label": {
"en": "10-30%",
"es": "10-30%"
},
"min": 2,
"max": 2,
"code": "10-30%",
"value": "2"
}

Certaines facettes, telles que surfaceValue de ASCORAD_LOCAL, ont leur propriété allowsInputFromUser définie sur true. Cela implique qu'au lieu de plages prédéfinies, les utilisateurs doivent disposer d'un champ de saisie de texte dans lequel ils peuvent saisir un nombre.

Dans le cas de la facette surfaceValue, les utilisateurs doivent saisir le pourcentage de la zone du corps spécifique impliquée ou affectée. Le JSON soumis à l'API pourrait donc être le suivant :

{
"scoringSystem": "1",
"scoringSystemFacets": [
{
"scoringSystemFacet": "85",
"value": "83"
}
// Include additional facets as needed
]
}

Dans cet exemple, l'utilisateur a signalé que 83 % de la zone du corps spécifique est impliquée ou affectée, comme indiqué par la valeur de 83.

Chaque système de notation comprend un ensemble de catégories qui vous permettent de déterminer la gravité en fonction du score calculé. Les détails de ces catégories sont hébergés dans la propriété scoreCategories pour chaque système de notation :

{
"scoreCategories": [
{
"code": "Mild",
"min": 0,
"max": 20,
"severity": 1,
"bodySite": "GENITAL"
}
// other categories
]
}

Notez que certaines catégories dépendent de la zone du corps spécifique où l'image a été prise. Ainsi, lorsque vous souhaitez déterminer la gravité, utilisez le score renvoyé par le terminal en combinaison avec la zone du corps.

Par exemple, si ASCORAD_LOCAL renvoie un score de 22 pour une image prise du BRAS_DROIT, la gravité serait déterminée comme suit :

{
"code": "Moderate",
"min": 21,
"max": 49,
"severity": 2,
"bodySite": "ARM_RIGHT"
}

Toutefois, pour le système de notation AUAS_LOCAL, la zone du corps n'est pas pertinente :

{
"scoreCategories": [
{
"code": "None",
"min": 0,
"max": 0,
"severity": 1,
"bodySite": null
},
{
"code": "Mild",
"min": 0,
"max": 2,
"severity": 1,
"bodySite": null
},
{
"code": "Moderate",
"min": 2,
"max": 4,
"severity": 2,
"bodySite": null
},
{
"code": "Severe",
"min": 4,
"max": 6,
"severity": 3,
"bodySite": null
}
]
}

Dans ce scénario, quelle que soit la zone du corps, la gravité est déterminée uniquement en fonction du score obtenu.