Aller au contenu principal

Intégration de Iframe

Introduction

Nous appelons iframe la situation dans laquelle les clients décident de développer une intégration qui nous envoie une quantité minimale de données et affiche les résultats générés sur une très petite interface prédéfinie et intégrée à leur système, et qui peut être facilement personnalisée.

Ce document décrit les étapes nécessaires pour intégrer notre iFrame dans une application iOS native. Il comprend une démonstration vidéo qui présente les fonctionnalités de notre iFrame dans une application et fournit la preuve d'une intégration réussie de la caméra.

Accéder

Pour intégrer notre iFrame dans votre application, vous devez intégrer l'URL suivante : https://iframe.legit.health.

L'URL prend en charge les paramètres suivants :

  • entreprise : Il s'agit d'un identifiant que nous vous fournissons pour que vous puissiez utiliser notre intégration.
  • companyCallbackUrl : Ce paramètre permet de remplacer l'URL de rappel client à laquelle le DiagnosticReport sera envoyé.
  • extraData : Ce paramètre prend en charge une chaîne avec des valeurs supplémentaires que vous souhaitez enregistrer dans le rapport (par exemple, les identifiants du patient). Cette valeur n'est pas visible par l'utilisateur.
  • principal et secondaire : Ces paramètres acceptent les couleurs hexadécimales pour personnaliser l'interface.
  • fontFamily : Ce paramètre permet de définir la famille de polices utilisée. Les valeurs prises en charge sont : Roboto et Montserrat.
  • isResultEnabled : Ce paramètre permet l'activation ou la désactivation de l'affichage des résultats pour l'utilisateur.
  • isForPatient : Ce paramètre simplifie le texte du questionnaire pour une utilisation conviviale pour le patient.
  • locale : Ce paramètre permet de définir les propriétés locales de l'application. Les valeurs prises en charge sont : en et es.
  • showQuestionnaireTitle : Ce paramètre permet d'afficher / masquer le titre au-dessus du formulaire de questionnaire. Sa valeur par défaut est 1
  • disableCallbackOnConclusive - Lorsqu'un ensemble d'images fournies contient un diagnostic concluant, une évaluation de la gravité peut être calculée. Ce paramètre permet d'ignorer l'envoi d'un rappel avec le résultat d'aide au diagnostic, de sorte que seul un rappel, avec l'aide au diagnostic et l'évaluation de la gravité, est envoyé.

Comment obtenir un identifiant d'entreprise

Si vous souhaitez générer des clés d'application pour votre entreprise avec une date d'expiration donnée, vous pouvez utiliser ce terminal de notre API Deep Link pour en générer une avant d'afficher l'iFrame :

Créer un clé d'application d'entreprise

Résultats générés par l'IA

Pour une compréhension complète des résultats générés par l'IA, vous pouvez consulter les sections de notre document où vous pouvez voir les valeurs que nous calculons en fonction du cas d'utilisation : aide au diagnostic ou évaluation de la gravité.

Lecture supplémentaire

Lisez la section Résultats générés du document pour plus d'informations.

En outre, les informations que nous enverrons de notre serveur au vôtre se trouvent sur le lien suivant :

Données d'entrées du patient

Comme le montre la vidéo liée, le patient n'a qu'à remplir la zone du corps et ajouter l'image. Si notre IA détecte, avec une forte probabilité, la présence d'une pathologie particulière, un examen supplémentaire, avec des questionnaires cliniques en lien avec la pathologie, est présenté.

Par exemple, si la lésion semble être un psoriasis avec une probabilité de 98 %, le patient devra remplir les questions liées à l'APASI pour obtenir des informations supplémentaires dans le rapport, telles que l'évaluation de la gravité de la lésion.

Personnalisations

Utilisation par les patients

Lorsque les principaux utilisateurs de l'iFrame sont des patients, vous pouvez utiliser le paramètre isForPatient=1 dans l'URL. L'activation de cette option modifiera le texte des questionnaires pour les rendre plus conviviaux.

Par exemple, au lieu d'afficher l'étiquette de base Démangeaisons pour la question démangeaisons, le texte sera transformé en une requête plus simple : Comment décririez-vous vos démangeaisons ? Cette amélioration vise à améliorer l'accessibilité et la facilité de remplissage du questionnaire pour les patients.

Visibilité des résultats

Les résultats peuvent être affichés ou masqués aux utilisateurs en fonction du paramètre isResultEnabled. Le comportement par défaut affiche les résultats à l'utilisateur après qu'il a téléchargé l'image, mais vous pouvez passer le paramètre isResultEnabled=0 pour afficher uniquement un message.

Couleurs et famille de polices

Les couleurs principales et secondaires peuvent être personnalisées à l'aide des paramètres principal et secondaire dans l'URL.

Vous pouvez également sélectionner la famille de polices que vous souhaitez utiliser. Actuellement, nous prenons en charge Roboto et Montserrat.

Langue

La langue de l'iFrame peut être personnalisée en utilisant le paramètre locale et en fournissant les valeurs es ou en.

Données supplémentaires

Étant donné que vous disposez du champ extraData qui accepte n'importe quelle chaîne, vous pouvez transmettre toute valeur supplémentaire dont vous avez besoin pour être jointe au rapport. Par exemple, si vous devez transmettre des informations sur le patient et le fournisseur d'assurance, procédez comme suit :

const data = toBase64(
JSON.stringify({ patient: "XXX", insuranceProvider: "YYY" })
);

Questionnaires

Le paramètre showQuestionnaireTitle permet d'afficher / masquer le titre au-dessus des questionnaires, celui qui affiche le texte « Questionnaire médical » / « Cuestionario clínico ».

Messages publiés depuis iFrame

Instructions d'intégration

iOS

L'iFrame enverra des messages via le webkit bridge. Vous pouvez écouter ces messages pour fermer l'iFrame ou diriger l'utilisateur ailleurs dans votre application.

Vous trouverez ci-dessous le code Swift correspondant qui vous permet d'afficher l'iFrame dans votre application et de répondre aux événements publiés.

struct WebView: UIViewRepresentable {
@Binding var path: NavigationPath

class Coordinator: NSObject, WKNavigationDelegate, WKScriptMessageHandler {
var webView: WKWebView?
var onMessageReceived: (Any) -> Void

required init(onMessageReceived: @escaping (Any) -> Void) {
self.onMessageReceived = onMessageReceived
super.init()
}

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
self.webView = webView
}

// Receive message from WKWebView
func userContentController(
_ userContentController: WKUserContentController,
didReceive message: WKScriptMessage
) {
print(message.body)
self.onMessageReceived(message.body)
}

}

func onMessageReceived(body: Any) -> Void {
DispatchQueue.main.async {
path.append(body as! String)
}
}

func makeCoordinator() -> Coordinator {
return Coordinator(onMessageReceived: onMessageReceived)
}

func makeUIView(context: Context) -> WKWebView {
let coordinator = makeCoordinator()
let userContentController = WKUserContentController()
userContentController.add(coordinator, name: "bridge")

let configuration = WKWebViewConfiguration()
configuration.userContentController = userContentController

let _wkwebview = WKWebView(frame: .zero, configuration: configuration)
_wkwebview.navigationDelegate = coordinator

return _wkwebview
}

func updateUIView(_ webView: WKWebView, context: Context) {
let companyIdentifier = AppConfig.companyIdentifier
let request = URLRequest(url: URL(string: "https://iframe.legit.health/?company=" + companyIdentifier)!)

webView.load(request)
}
}

Ce code Swift crée une structure WebView conforme au paramètre UIViewRepresentable, permettant la communication entre votre contenu Web et l'application native via le gestionnaire de messages bridge. La classe coordinateur de WebView écoute les événements de l'iFrame et y répond en conséquence.

Android

Si vous développez une application Android, vous devez transmettre un objet appelé legitHealthJsObject à notre iframe en utilisant WebViewCompat

Message d'analyse terminé

Lorsque l'analyse de l'image est terminée et que le résultat est disponible, l'iFrame affichera un message via trois canaux différents selon le type d'intégration.

Le message publié contient l'anonymousDiagnosticReportId, qui est l'identifiant du DiagnosticReport généré. Vous pouvez l'utiliser pour récupérer le rapport complet en consommant le terminal décrit ici : obtenir un DiagnosticReport anonyme

Web

Dans le cas où vous intégrez notre iFrame dans une application Web, l'iFrame enverra un message via le postMessage après le traitement de l'image.

window.parent.postMessage(
{
message: "analysis_completed",
id: "anonymousDiagnosticReportId",
},
"*"
);

Vous pouvez écouter ce message avec une personne qui écoute régulièrement des événements :

window.addEventListener("message", function (event) {
if (event.data.message !== "analysis_completed") {
return;
}
console.log(event.data.id);
});

iOS

L'iFrame enverra un message via le webkit bridge après le traitement de l'image.

if (window.webkit?.messageHandlers?.bridge) {
window.webkit.messageHandlers.bridge.postMessage(
JSON.stringify({
message: "analysis_completed",
id: "anonymousDiagnosticReportId",
})
);
}

Android

L'iFrame enverra un message via legitHealthJsObject après le traitement de l'image.

if (window.legitHealthJsObject) {
window.legitHealthJsObject.postMessage(
JSON.stringify({
message: "analysis_completed",
id: diagnosticReportId,
})
);
}

Clé d'entreprise invalide

Lorsque l'iFrame ne peut pas être chargé en raison d'une clé d'entreprise invalide, l'iFrame publiera un message via trois canaux différents selon le type d'intégration.

Web

Dans le cas où vous intégrez notre iFrame dans une application Web, l'iFrame enverra un message via le postMessage si la clé d'entreprise n'est pas valide.

window.parent.postMessage(
{
message: "invalid_company_key",
id: companyKey,
},
"*"
);

iOS

L'iFrame enverra un message via le webkit bridge si la clé d'entreprise n'est pas valide.

if (window.webkit?.messageHandlers?.bridge) {
window.webkit.messageHandlers.bridge.postMessage(
JSON.stringify({
message: "invalid_company_key",
id: companyKey,
})
);
}

Android

L'iFrame enverra un message via legitHealthJsObject si la clé d'entreprise n'est pas valide.

if (window.legitHealthJsObject) {
window.legitHealthJsObject.postMessage(
JSON.stringify({
message: "invalid_company_key",
id: companyKey,
})
);
}

Rappels

URL de rappel

Une fois le traitement réussi de chaque image téléchargée, notre serveur envoie des données utiles au format JSON contenant des informations détaillées sur le processus de diagnostic au terminal configuré. Ces données utiles au format JSON contiennent plusieurs couches de données de diagnostic et de mesure. Voici un exemple de ce à quoi vous pouvez vous attendre :

{
"id": "0189bafa-0610-7349-a0ab-eb53695b27fd",
"url": "https://iframe.legit.health?companyId=XXXX&diagnosticReportId=signedId",
"pdf": "https://back-{pre}.legit.health/s2s-api/v2/anonymous-diagnostic-reports/encryptedId?format=pdf",
"extraData": "some extra data",
"patientIdentifier": "patient identifier",
"visitIdentifier": "visit identifier",
"anamnesisQuestions": [
{
"question": "What is the reason for the consultation? How did the problem start? Describe the origin.",
"answer": "I have acne on my face and neck. It started 2 months ago."
},
{
"question": "Do you have any allergies, especially to medications? If yes, list allergies."
"answer": "No"
},
{
"question": "Are you taking any medication or treatment? If yes, explain what treatment you are taking.",
"answer": "No"
},{

"question": "Do you have any major illness? Have you had anything operated on?",
"answer": "No"
},
{
"question": "Is there a history of any major illness in your family?",
"answer": "No"
}
],
"pathology": {
"name": "Acne",
"code": "Acne"
},
"bodySite": {
"code": "HEAD_FRONT",
"name": "Face and neck"
},
"createdAt": "2023-08-03T12:38:10+02:00",
"supportingInfo": [
{
"type": "DiagnosticReport",
"subtype": "DiagnosisSupport",
"reference": {
"id": "018cceda-771d-7b9d-918a-f1171443fd6c",
"observations": [
{
"originalMedia": {
"url": "https://legit-dev.s3.eu-west-3.amazonaws.com/diagnostic-report-medias/foo.jpg",
"type": "Image",
"modality": "Clinical",
"diqaScore": 85.0
},
"explainabilityMedia": null
},
{
"originalMedia": {
"url": "https://legit-dev.s3.eu-west-3.amazonaws.com/diagnostic-report-medias/bar.jpg",
"type": "Image",
"modality": "Clinical",
"diqaScore": 89.0
},
"explainabilityMedia": null
}
]
}
}
],
"result": {
"id": "0189bafa-0610-7349-a0ab-eb536a2185f6",
"metrics": {
"sensitivity": 83.31,
"specificity": 99.53
},
"preliminaryFindings": {
"hasConditionSuspicion": 100,
"isPreMalignantSuspicion": 0.02,
"isMalignantSuspicion": 0,
"needsBiopsySuspicion": 0,
"needsSpecialistsAttention": 100
},
"iaSeconds": 0.88273024559021,
"observations": [
{
"originalMedia": {
"type": "Image",
"modality": "Clinical",
"diqaScore": 86,
"url": "https://legit-dev.s3.eu-west-3.amazonaws.com/diagnostic-report-medias/bbb.png"
},
"explainabilityMedia": {
"url": "https://legit-dev.s3.eu-west-3.amazonaws.com/diagnostic-report-medias/ccc.png"
}
},
{
"originalMedia": {
"type": "Image",
"modality": "Clinical",
"diqaScore": 86,
"url": "https://legit-dev.s3.eu-west-3.amazonaws.com/diagnostic-report-medias/bbb.png"
},
"explainabilityMedia": null
}
],
"conclusions": [
{
"probability": 99.65,
"pathology": {
"name": "Acne",
"code": "Acne"
}
},
{
"probability": 0.06,
"pathology": {
"name": "Varicella",
"code": "Varicella"
}
},
{
"probability": 0.05,
"pathology": {
"name": "Impetigo",
"code": "Impetigo"
}
},
{
"probability": 0.03,
"pathology": {
"name": "Rosacea",
"code": "Rosacea"
}
},
{
"probability": 0.02,
"pathology": {
"name": "Dermatitis",
"code": "Dermatitis"
}
}
],
"scoringSystems": [
{
"scoringSystem": {
"name": "Acne lesion estimation grading index",
"code": "ALEGI"
},
"score": 8,
"scoreCategorySeverity": 1,
"scoreCategories": [
{
"code": "None",
"category": "None",
"min": 0.0,
"max": 0.0,
"severity": 1,
"severityAsString": "low"
},
{
"code": "Grade 1",
"category": "Grade 1",
"min": 0.0,
"max": 10.0,
"severity": 1,
"severityAsString": "low"
},
{
"code": "Grade 2",
"category": "Grade 2",
"min": 10.0,
"max": 20.0,
"severity": 1,
"severityAsString": "low"
},
{
"code": "Grade 3",
"category": "Grade 3",
"min": 20.0,
"max": 30.0,
"severity": 2,
"severityAsString": "moderate"
},
{
"code": "Grade 4",
"category": "Grade 4",
"min": 30.0,
"max": 40.0,
"severity": 2,
"severityAsString": "moderate"
},
{
"code": "Grade 4",
"category": "Grade 4",
"min": 40.0,
"max": 50.0,
"severity": 2,
"severityAsString": "moderate"
},
{
"code": "Grade 5",
"category": "Grade 5",
"min": 50.0,
"max": 60.0,
"severity": 2,
"severityAsString": "moderate"
},
{
"code": "Grade 6",
"category": "Grade 6",
"min": 60.0,
"max": 70.0,
"severity": 3,
"severityAsString": "high"
},
{
"code": "Grade 7",
"category": "Grade 7",
"min": 70.0,
"max": 80.0,
"severity": 3,
"severityAsString": "high"
},
{
"code": "Grade 8",
"category": "Grade 8",
"min": 80.0,
"max": 90.0,
"severity": 3,
"severityAsString": "high"
},
{
"code": "Grade 9",
"category": "Grade 9",
"min": 90.0,
"max": 100.0,
"severity": 3,
"severityAsString": "high"
}
],
"resultScoringSystemFacets": [
{
"facet": {
"name": "Acne lesion density",
"description": ""
},
"valueToDisplay": "None (0)",
"rawValue": 0
},
{
"facet": {
"name": "Number of lesions",
"description": ""
},
"valueToDisplay": "Mild (0-10)",
"rawValue": 5
}
]
}
]
}
}

Fundamental fields

  • id: A unique identifier of the Diagnostic Report.
  • url: link to visualize the diagnostic report inside Legit.Health's interface.
  • extraData: A string value passed as a query parameter when you loaded the iFrame.
  • patientIdentifier: A user identifier in your system, passed as a query parameter when you loaded the iFrame.
  • createdAt: Timestamp indicating the time of creation for this diagnostic report.

Supporting info

In our iFrame integration, the application can initiate two types of requests:

  1. Diagnosis Support Request: This request utilizes multiple images to estimate the most probable pathology.

  2. Severity Assessment Request: This request involves the use of the most representative image from the previous set if the confidence of the Diagnosis Support Request surpasses a specific threshold.

For the callback related to the Severity Assessment, we provide a set of images used in the Diagnosis Support Request under the property SupportingInfo. The type and subtype of the object indicate that it is associated with the diagnostic report generated to calculate the most likely pathology.

"supportingInfo": [
{
"type": "DiagnosticReport",
"subtype": "DiagnosisSupport",
"reference": {
"id": "018cceda-771d-7b9d-918a-f1171443fd6c",
"observations": [
{
"originalMedia": {
"url": "https://legit-dev.s3.eu-west-3.amazonaws.com/diagnostic-report-medias/foo.jpg",
"type": "Image",
"modality": "Clinical",
"diqaScore": 85.0
},
"explainabilityMedia": null
},
{
"originalMedia": {
"url": "https://legit-dev.s3.eu-west-3.amazonaws.com/diagnostic-report-medias/bar.jpg",
"type": "Image",
"modality": "Clinical",
"diqaScore": 89.0
},
"explainabilityMedia": null
}
]
}
}
]

For a comprehensive understanding of the callback flow, please refer to this link: iFrame's callback mechanism.

Body site and pathology

These fields contain information about the location (bodySite) and type (pathology) of the lesion captured in the image. These fields are populated when the likelihood of the most probable conclusion surpasses a predetermined threshold or if it was set during image submission.

"bodySite": {
"code": "HEAD_FRONT",
"name": "Face and neck"
},
"pathology": {
"name": "Acne",
"code": "Acne"
}

Anamnesis questions

The anamnesisQuestions field is an array of questions and their corresponding answers. These questions are asked to the patient before the image is submitted for analysis and their objetive is to gather information about the patient's medical history:

"anamnesisQuestions": [
{
"question": "What is the reason for the consultation? How did the problem start? Describe the origin.",
"answer": "I have acne on my face and neck. It started 2 months ago."
},
{
"question": "Do you have any allergies, especially to medications? If yes, list allergies."
"answer": "No"
},
{
"question": "Are you taking any medication or treatment? If yes, explain what treatment you are taking.",
"answer": "No"
},{

"question": "Do you have any major illness? Have you had anything operated on?",
"answer": "No"
},
{
"question": "Is there a history of any major illness in your family?",
"answer": "No"
}
]

Diagnostic result

The result field encapsulates the comprehensive results of the diagnostic process. This includes:

  • metrics: Measures of sensitivity and specificity of the diagnostic process.
"metrics": {
"sensitivity": 83.31,
"specificity": 99.53
}
  • preliminaryFindings: An array of preliminary suspicions and their likelihoods, including the probability of malignancy and the requirement for a biopsy.
"preliminaryFindings": {
"hasConditionSuspicion": 100,
"isPreMalignantSuspicion": 0.02,
"isMalignantSuspicion": 0,
"needsBiopsySuspicion": 0,
"needsSpecialistsAttention": 100
}
  • iaSeconds: The processing time consumed by the AI for image analysis.

Observations

The observations field is an array of medias, each containing two fields: originalMedia and explainabilityMedia.

originalMedia: the media sent to the algorithm to be analyzed. It includes:

  • type: The format of the image.
  • modality: The context or manner of the image capture.
  • diqaScore: The Dermatology Image Quality Assessment (DIQA) score.
  • url: The direct S3 URL to the image. It is a time-limited signed URL; download it within 30 minutes of generation if you plan to use it later.

explainabilityMedia: the processed image highlighting the area of the lesion analyzed by the AI. Like the original image, this is also a time-limited S3 URL, so remember to download it within 30 minutes if needed. The explainabilityMedia contains either null or the URL of an image that demonstrates what their severity estimation algorithms have "seen". Here's a detailed explanation:

  • If there's no conclusive diagnosis for the analyzed image, this field is set to null.
  • If there is a conclusive diagnosis for the analyzed image, but it belongs to a group of pathologies for which severity is not yet measured, this field is again null.
  • Finally, if there is a conclusive diagnosis for the analyzed image and a trained algorithm to measure severity, this field contains the URL to an image that shows the analyzed signs.
"observations": [
{
"originalMedia": {
"type": "Image",
"modality": "Clinical",
"diqaScore": 86,
"url": "https://legit-dev.s3.eu-west-3.amazonaws.com/diagnostic-report-medias/bbb.png"
},
"explainabilityMedia": {
"url": "https://legit-dev.s3.eu-west-3.amazonaws.com/diagnostic-report-medias/ccc.png"
}
},
{
"originalMedia": {
"type": "Image",
"modality": "Clinical",
"diqaScore": 86,
"url": "https://legit-dev.s3.eu-west-3.amazonaws.com/diagnostic-report-medias/bbb.png"
},
"explainabilityMedia": null
}
]

Diagnostic conclusions

The conclusions field is an array of diagnostic outcomes, each containing a pathology type and its associated probability.

"conclusions": [
{
"probability": 99.65,
"pathology": {
"name": "Acne",
"code": "Acne"
}
},
{
"probability": 0.06,
"pathology": {
"name": "Varicella",
"code": "Varicella"
}
},
{
"probability": 0.05,
"pathology": {
"name": "Impetigo",
"code": "Impetigo"
}
},
{
"probability": 0.03,
"pathology": {
"name": "Rosacea",
"code": "Rosacea"
}
},
{
"probability": 0.02,
"pathology": {
"name": "Dermatitis",
"code": "Dermatitis"
}
}
]

Scoring systems

The scoringSystems field houses one or more scoring models for the identified pathology. These models come into play when the likelihood of the most probable conclusion surpasses a certain threshold.

"scoringSystems": [
{
"scoringSystem": {
"name": "Acne lesion estimation grading index",
"code": "ALEGI"
},
"score": 8,
"scoreCategorySeverity": 1,
"scoreCategories": [
{
"code": "None",
"category": "None",
"min": 0.0,
"max": 0.0,
"severity": 1,
"severityAsString": "low"
},
{
"code": "Grade 1",
"category": "Grade 1",
"min": 0.0,
"max": 10.0,
"severity": 1,
"severityAsString": "low"
},
{
"code": "Grade 2",
"category": "Grade 2",
"min": 10.0,
"max": 20.0,
"severity": 1,
"severityAsString": "low"
},
{
"code": "Grade 3",
"category": "Grade 3",
"min": 20.0,
"max": 30.0,
"severity": 2,
"severityAsString": "moderate"
},
{
"code": "Grade 4",
"category": "Grade 4",
"min": 30.0,
"max": 40.0,
"severity": 2,
"severityAsString": "moderate"
},
{
"code": "Grade 4",
"category": "Grade 4",
"min": 40.0,
"max": 50.0,
"severity": 2,
"severityAsString": "moderate"
},
{
"code": "Grade 5",
"category": "Grade 5",
"min": 50.0,
"max": 60.0,
"severity": 2,
"severityAsString": "moderate"
},
{
"code": "Grade 6",
"category": "Grade 6",
"min": 60.0,
"max": 70.0,
"severity": 3,
"severityAsString": "high"
},
{
"code": "Grade 7",
"category": "Grade 7",
"min": 70.0,
"max": 80.0,
"severity": 3,
"severityAsString": "high"
},
{
"code": "Grade 8",
"category": "Grade 8",
"min": 80.0,
"max": 90.0,
"severity": 3,
"severityAsString": "high"
},
{
"code": "Grade 9",
"category": "Grade 9",
"min": 90.0,
"max": 100.0,
"severity": 3,
"severityAsString": "high"
}
],
"resultScoringSystemFacets": [
{
"facet": {
"name": "Acne lesion density",
"description": ""
},
"valueToDisplay": "None (0)",
"rawValue": 0
},
{
"facet": {
"id": 108,
"inputAdornment": null,
"allowsInputFromUser": false,
"name": "Number of lesions",
"description": ""
},
"valueToDisplay": "Mild (0-10)",
"rawValue": 5
}
]
}
]

In each scoring system:

  • scoringSystem includes the name and code of the scoring methodology.
  • score indicates the calculated score according to the system's rules.
  • scoreCategorySeverity signifies the severity associated with the computed score. It has three possible values:
    • 1: low
    • 2: moderate
    • 3: high
  • resultScoringSystemFacets is an array of facets used in score calculation, with each object containing the facet's information and the corresponding raw and displayed values.

Comprehensive scoring systems information

For an exhaustive understanding of scoring systems, their identifiers, and facets, you can download the detailed documentation:

Écraser l'URL de rappel

Lors du processus de configuration, la personne en charge de l'intégration doit fournir une URL de rappel à laquelle envoyer les DiagnosticReport. Cette URL peut être personnalisée au niveau de l'iFrame via le paramètre companyCallbackUrl, par exemple :

https://iframe.legit.health/?company=XXX&companyCallbackUrl=http://someserver.dev

Désactiver le paramètre de rappel sur concluant

Ceci est le flux de travail iFrame :

  • Demande initiale: Au cours de la réception d'un ensemble d'images de l'utilisateur, notre système lance une demande d'aide au diagnostic, traitée par nos algorithmes dotés de l'IA.
  • Évaluation de la fiabilité : Si le niveau de fiabilité de l'analyse IA dépasse un seuil prédéterminé, l'iFrame déclenche une deuxième demande. Cette demande est spécifiquement destinée à effectuer une évaluation de la gravité, en se concentrant sur l'image la plus appropriée de l'ensemble fourni.
  • Finalisation du rapport: Dans les scénarios où la fiabilité de l'IA n'atteint pas le seuil, le processus de diagnostic est considéré comme terminé à ce stade.

DiagnosticReport en deux étapes

Notre système génère deux types de DiagnosticReport basés sur l'évaluation de la fiabilité de l'IA :

  1. Rapport intermédiaire : Cela inclut le résultat initial de l'aide au diagnostic. Il est généré lorsque la fiabilité de l'IA est inférieure au seuil ou lorsque l'évaluation de la gravité est en attente.
  2. Rapport final : Ce rapport complet englobe à la fois l'aide au diagnostic initial et les résultats de l'évaluation de la gravité. Il est produit lorsque la fiabilité de l'IA est suffisamment élevée pour procéder à l'évaluation de la gravité.

Mécanisme de rappel

Les deux DiagnosticReport sont envoyés à l'URL de rappel que vous avez fournie. Cela garantit que vous recevez toutes les données d'analyse pertinentes. Cependant, il peut y avoir des scénarios dans lesquels il est plus avantageux de ne recevoir que le rapport final, en particulier pour éviter de traiter les résultats intermédiaires.

flowchart TD A["L'utilisateur envoie les images"] -- B["Demande d'aide au diagnostic"] B --> C{"Vérification de la fiabilité de l'IA"} C -- Au-dessus du seuil--> D{disableCallbackOnConclusive?} C -- En-dessous du seuil--> E[Générer le rapport final. Aide au diagnostic] E --> F[Envoyer un rappel] D -- 0 --> G["Envoyer un rappel à l'aide d'un rapport intermédiaire"] D -- 1 --> H["Ignorer l'envoi d'un rappel à l'aide d'un rapport intermédiaire"] G --> I["Demande d'évaluation de la gravité"] H --> I["Demande d'évaluation de la gravité"] I --> J[Générer le rapport final. Aide au diagnostic et évaluation de la gravité] J --> K[Envoyer un rappel]

Paramètre disableCallbackOnConclusive

C'est là que le paramètre disableCallbackOnConclusive devient crucial :

  • Valeur du paramètre 0 (par défaut) : Le mécanisme de rappel fonctionne dans son mode par défaut, envoyant à la fois les DiagnosticReport intermédiaires et finaux à l'URL de rappel spécifiée.
  • Valeur du paramètre 1 : L'activation de ce mode (disableCallbackOnConclusive = 1) modifie le comportement de rappel. Dans ce scénario, si l'ensemble initial d'images aboutit à un diagnostic concluant (c'est-à-dire une fiabilité élevée de l'IA), le DiagnosticReport intermédiaire n'est pas envoyé à votre rappel. Au lieu de cela, seul le rapport final, comprenant à la fois l'aide au diagnostic et l'évaluation de la gravité, est transmis.
Objectif du paramètre disableCallbackOnConclusive

Ce paramètre fournit une option de personnalisation cruciale, vous permettant de rationaliser le processus de création de DiagnosticReport. En définissant le paramètre disableCallbackOnConclusive=1, vous réduisez efficacement la charge de traitement des données, en vous concentrant uniquement sur les rapports finaux complets, qui pourraient être plus pertinents pour des scénarios de diagnostic concluants.

Indications de mise en œuvre :

  • Intégration d'URL : Assurez-vous que le paramètredisableCallbackOnConclusive est correctement intégré dans l'URL utilisée pour la demande iFrame.
  • Test : Il est important de tester les deux réglages du paramètre (0 et 1) pour confirmer que le comportement de rappel correspond à vos préférences et exigences opérationnelles.

Ce paramètre est conçu pour vous offrir flexibilité et contrôle sur le flux d'informations de diagnostic, vous garantissant ainsi de recevoir les données les plus pertinentes pour vos besoins.

Générer un PDF

Pour plus de détails sur la génération d'un rapport PDF, référez-vous au terminal suivant : Obtenir un DiagnosticReport anonyme