Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Health Insights is an Azure Applied AI Service built with the Azure Cognitive Services Framework, that leverages multiple Cognitive Services, Healthcare API services and other Azure resources.
Radiology Insights is a model that aims to provide quality checks as feedback on errors and inconsistencies (mismatches) and ensures critical findings are identified and communicated using the full context of the report. Follow-up recommendations and clinical findings with measurements (sizes) documented by the radiologist are also identified.
Please rely heavily on our REST client docs to use this library
Key links: Source code | Package (NPM) | API reference documentation | Product Information | Samples
Getting started
Currently supported environments
- LTS versions of Node.js
- Latest versions of Safari, Chrome, Edge and Firefox.
Prerequisites
- LTS versions of Node.js
- You must have an Azure subscription to use this package.
- An existing Cognitive Services Health Insights instance.
Install the @azure-rest/health-insights-radiologyinsights
package
Install the RadiologyInsights REST client library for JavaScript with npm
:
npm install @azure-rest/health-insights-radiologyinsights
Create and authenticate a RadiologyInsightsClient
To use an Azure Active Directory (AAD) token credential, provide an instance of the desired credential type obtained from the Azure Identity library.
To authenticate with AAD, you must first npm
install @azure/identity
After setup, you can choose which type of credential from @azure/identity
to use.
As an example, DefaultAzureCredential
can be used to authenticate the client. See more info on defaultAzureCredentials default_information.
Managed Identities can also be used to authenticate through DefaultAzureCredential managed_identity.
Examples
Create a RadiologyInsights asynchronous client
import { DefaultAzureCredential } from "@azure/identity";
import RadiologyInsightsRestClient from "@azure-rest/health-insights-radiologyinsights";
const endpoint = "https://<your-endpoint>";
const credential = new DefaultAzureCredential();
const client = RadiologyInsightsRestClient(endpoint, credential);
Build a request, send it to the client and print out the description of a Critical Result Inference
import { DefaultAzureCredential } from "@azure/identity";
import RadiologyInsightsRestClient, {
ClinicalDocumentTypeEnum,
isUnexpected,
getLongRunningPoller,
RadiologyProcedureInference,
Coding,
ImagingProcedure,
} from "@azure-rest/health-insights-radiologyinsights";
const endpoint = "https://<your-endpoint>";
const credential = new DefaultAzureCredential();
const client = RadiologyInsightsRestClient(endpoint, credential);
const codingData = {
system: "Http://hl7.org/fhir/ValueSet/cpt-all",
code: "24727-0",
display: "CT HEAD W CONTRAST IV",
};
const code = {
coding: [codingData],
};
const patientInfo = {
sex: "female",
birthDate: new Date("1959-11-11T19:00:00+00:00"),
};
const encounterData = {
id: "encounterid1",
period: {
start: "2021-8-28T00:00:00",
end: "2021-8-28T00:00:00",
},
class: "inpatient",
};
const authorData = {
id: "authorid1",
fullName: "authorname1",
};
const orderedProceduresData = {
code: code,
description: "CT HEAD W CONTRAST IV",
};
const administrativeMetadata = {
orderedProcedures: [orderedProceduresData],
encounterId: "encounterid1",
};
const content = {
sourceType: "inline",
value: ` Exam: Head CT with Contrast
History: Headaches for 2 months
Technique: Axial, sagittal, and coronal images were reconstructed from helical CT through the head without IV contrast.
IV contrast: 100 mL IV Omnipaque 300.
Findings: There is no mass effect. There is no abnormal enhancement of the brain or within injuries with IV contrast.
However, there is no evidence of enhancing lesion in either internal auditory canal.
Impression: Negative CT of the brain without IV contrast.
I recommend a new brain CT within nine months.`,
};
const patientDocumentData = {
type: "note",
clinicalType: ClinicalDocumentTypeEnum.RadiologyReport,
id: "docid1",
language: "en",
authors: [authorData],
specialtyType: "radiology",
administrativeMetadata: administrativeMetadata,
content: content,
createdAt: new Date("2021-05-31T16:00:00.000Z"),
orderedProceduresAsCsv: "CT HEAD W CONTRAST IV",
};
const patientData = {
id: "Samantha Jones",
details: patientInfo,
encounters: [encounterData],
patientDocuments: [patientDocumentData],
};
const inferenceTypes = [
"finding",
"ageMismatch",
"lateralityDiscrepancy",
"sexMismatch",
"completeOrderDiscrepancy",
"limitedOrderDiscrepancy",
"criticalResult",
"criticalRecommendation",
"followupRecommendation",
"followupCommunication",
"radiologyProcedure",
];
const followupRecommendationOptions = {
includeRecommendationsWithNoSpecifiedModality: true,
includeRecommendationsInReferences: true,
provideFocusedSentenceEvidence: true,
};
const findingOptions = {
provideFocusedSentenceEvidence: true,
};
//the mipscodes (“merit based payment incentive”) need to be filled in for which the qualityMeasure is checked
const qualityMeasureOptions = {
measureTypes: ["mipsxxx", "mipsyyy", "mipszz"],
};
const guidanceOptions = {
showGuidanceInHistory: true,
};
const inferenceOptions = {
followupRecommendationOptions: followupRecommendationOptions,
findingOptions: findingOptions,
GuidanceOptions: guidanceOptions,
QualityMeasureOptions: qualityMeasureOptions,
};
// Create RI Configuration
const configuration = {
inferenceOptions: inferenceOptions,
inferenceTypes: inferenceTypes,
locale: "en-US",
verbose: false,
includeEvidence: true,
};
// create RI Data
const radiologyInsightsJob = {
jobData: {
patients: [patientData],
configuration: configuration,
},
};
// Create request body
const radiologyInsightsParameter = { body: radiologyInsightsJob };
// Initiate radiology insights job and retrieve results
const dateString = Date.now();
const jobID = "jobId-" + dateString;
const initialResponse = await client
.path("/radiology-insights/jobs/{id}", jobID)
.put(radiologyInsightsParameter);
if (isUnexpected(initialResponse)) {
throw initialResponse.body.error;
}
const poller = await getLongRunningPoller(client, initialResponse);
const radiologyInsightsResult = await poller.pollUntilDone();
if (isUnexpected(radiologyInsightsResult)) {
throw radiologyInsightsResult.body.error;
}
const result = radiologyInsightsResult.body.result;
if (result) {
for (const patientResult of result.patientResults) {
if (patientResult.inferences) {
for (const inference of patientResult.inferences) {
if (inference.kind === "radiologyProcedure") {
console.log("Radiology Procedure Inference found");
const radiologyProcedureInference = inference as RadiologyProcedureInference;
for (const procedureCode of radiologyProcedureInference?.procedureCodes || []) {
console.log(" Procedure Codes: ");
displayCodes(procedureCode.coding);
}
if (radiologyProcedureInference.imagingProcedures) {
console.log(" Imaging Procedure Codes: ");
for (const imagingProcedure of radiologyProcedureInference.imagingProcedures) {
displayImaging(imagingProcedure);
}
}
if (radiologyProcedureInference.orderedProcedure) {
console.log(" Ordered Procedure Codes: ");
displayCodes(radiologyProcedureInference.orderedProcedure.code?.coding);
}
if (radiologyProcedureInference.orderedProcedure.description) {
console.log(
` Description: ${radiologyProcedureInference.orderedProcedure.description}`,
);
}
}
}
}
}
}
function displayCodes(codingList: Coding[] | undefined) {
for (const coding of codingList || []) {
console.log(` Coding: ${coding.code} , ${coding.display} (${coding.system})`);
}
}
function displayImaging(images: ImagingProcedure): void {
console.log(" Modality Codes: ");
displayCodes(images.modality.coding);
console.log(" Anatomy Codes: ");
displayCodes(images.anatomy.coding);
if (images.laterality) {
console.log(" Laterality Codes: ");
displayCodes(images.laterality.coding);
}
if (images.contrast) {
console.log(" Contrast Codes: ");
displayCodes(images.contrast.code.coding);
}
if (images.view) {
console.log(" View Codes: ");
displayCodes(images.view.code.coding);
}
}
Print out the Age Mismatch Inference evidences
import {
RadiologyInsightsJobOutput,
ExtensionOutput,
} from "@azure-rest/health-insights-radiologyinsights";
function printResults(radiologyInsightsResult: RadiologyInsightsJobOutput, content: string): void {
for (const patientResult of radiologyInsightsResult?.result?.patientResults || []) {
for (const inference of patientResult?.inferences || []) {
if (inference.kind === "ageMismatch") {
console.log("Age Mismatch Inference found: ");
const evidence = findAgeEvidence(inference.extension, content);
console.log(" Evidence: " + evidence);
}
}
}
function findAgeEvidence(extensions: ExtensionOutput[], content: string) {
let offset = -1;
let length = -1;
let piece = "";
let evidence = "";
// for loop needed for traversing from top to bottom of the array
for (const first of extensions) {
for (const ext of first.extension) {
if (ext.url === "offset") {
offset = ext.valueInteger;
} else if (ext.url === "length") {
length = ext.valueInteger;
}
if (offset > 0 && length > 0) {
piece = content.substring(offset, offset + length);
}
}
evidence += `${piece} `;
}
return evidence;
}
}
Print out the Complete Order Discrepancy Inference ordertype and its missing Body Parts and missing Body Part Measurements
import {
RadiologyInsightsJobOutput,
CompleteOrderDiscrepancyInference,
CodeableConcept,
} from "@azure-rest/health-insights-radiologyinsights";
function printResults(radiologyInsightsResult: RadiologyInsightsJobOutput): void {
for (const patientResult of radiologyInsightsResult?.result?.patientResults || []) {
for (const inference of patientResult?.inferences || []) {
if (inference.kind === "completeOrderDiscrepancy") {
const completeOrderDiscrepancyInference = inference as CompleteOrderDiscrepancyInference;
console.log("Complete Order Discrepancy Inference found: ");
console.log(" Ordertype: ");
displayCodes({ codeableConcept: completeOrderDiscrepancyInference.orderType });
for (const missingBodyPart of completeOrderDiscrepancyInference.missingBodyParts) {
console.log(" Missing Body Parts: ");
displayCodes({ codeableConcept: missingBodyPart });
}
for (const missingBodymeasure of completeOrderDiscrepancyInference.missingBodyPartMeasurements) {
console.log(" Missing Body Part Measurements: ");
displayCodes({ codeableConcept: missingBodymeasure });
}
}
}
}
function displayCodes({ codeableConcept }: { codeableConcept: CodeableConcept }): void {
for (const coding of codeableConcept.coding || []) {
console.log(` Coding: ${coding.code}, ${coding.display} (${coding.system})`);
}
}
}
Print out the Finding Inference code, interpretation, Component codes and the section info
import {
RadiologyInsightsJobOutput,
FindingInference,
CodeableConcept,
Extension,
} from "@azure-rest/health-insights-radiologyinsights";
function printResults(radiologyInsightsResult: RadiologyInsightsJobOutput): void {
if (radiologyInsightsResult.result) {
for (const patientResult of radiologyInsightsResult.result.patientResults) {
if (patientResult.inferences) {
for (const inference of patientResult.inferences) {
console.log("Finding Inference found: ");
if (inference.kind === "finding") {
const findingInference = inference as FindingInference;
if (findingInference.finding.code) {
console.log(" Code: ");
displayCodes(findingInference.finding.code);
}
for (const interpretation of findingInference.finding.interpretation) {
console.log(" Interpretation: ");
displayCodes(interpretation);
}
for (const component of findingInference.finding.component) {
console.log(" Component code: ");
displayCodes(component.code);
if (component.valueCodeableConcept) {
console.log(" Value component codeable concept: ");
displayCodes(component.valueCodeableConcept);
}
}
if (findingInference.extension) {
displaySectionInfo(findingInference);
}
}
}
}
}
}
function displayCodes(codeableConcept: CodeableConcept): void {
for (const coding of codeableConcept.coding || []) {
console.log(` Coding: ${coding.code}, ${coding.display} (${coding.system})`);
}
}
function displaySectionInfo(inference: { extension?: Extension[] }) {
for (const extension of inference.extension || []) {
if (extension.url === "section") {
console.log(" Section:");
for (const { url, valueString } of extension.extension || []) {
console.log(` ${url}: ${valueString}`);
}
}
}
}
}
Print out the Follow Up Communication Inference date and recipient
import {
RadiologyInsightsJobOutput,
FollowupCommunicationInference,
} from "@azure-rest/health-insights-radiologyinsights";
function printResults(radiologyInsightsResult: RadiologyInsightsJobOutput): void {
for (const patientResult of radiologyInsightsResult?.result?.patientResults || []) {
for (const inference of patientResult?.inferences || []) {
if (inference.kind === "followupCommunication") {
const followupCommunicationInference = inference as FollowupCommunicationInference;
console.log("Followup Communication Inference found");
if (followupCommunicationInference.communicatedAt) {
console.log(
`Communicated at: ${followupCommunicationInference.communicatedAt.join(" ")}`,
);
}
if (followupCommunicationInference.recipient) {
console.log(`Recipient: ${followupCommunicationInference.recipient.join(" ")}`);
}
console.log(` Acknowledged: ${followupCommunicationInference.wasAcknowledged}`);
}
}
}
}
Print out the Follow Up Recommendation Inference booleans, Generic Procedure code, description and Imaging Procedure codes
import {
RadiologyInsightsJobOutput,
FollowupRecommendationInference,
GenericProcedureRecommendation,
ImagingProcedureRecommendation,
CodeableConcept,
ImagingProcedure,
} from "@azure-rest/health-insights-radiologyinsights";
function printResults(radiologyInsightsResult: RadiologyInsightsJobOutput): void {
for (const patientResult of radiologyInsightsResult?.result?.patientResults || []) {
for (const inference of patientResult?.inferences || []) {
if (inference.kind === "followupRecommendation") {
const followupRecommendationInference = inference as FollowupRecommendationInference;
console.log("Follow Up Recommendation Inference found");
console.log(` Is conditional: ${followupRecommendationInference.isConditional}`);
console.log(` Is guideline: ${followupRecommendationInference.isGuideline}`);
console.log(` Is hedging: ${followupRecommendationInference.isHedging}`);
console.log(` Is option: ${followupRecommendationInference.isOption}`);
const procedure = followupRecommendationInference.recommendedProcedure;
if (procedure.kind === "genericProcedureRecommendation") {
const genericProcedureRecommendation = procedure as GenericProcedureRecommendation;
console.log(` Recommended Generic Procedure: ${genericProcedureRecommendation.code}`);
console.log(` Description: ${genericProcedureRecommendation.description}`);
} else if (procedure.kind === "imagingProcedureRecommendation") {
const imagingProcedureRecommendation = procedure as ImagingProcedureRecommendation;
for (const procedureCode of imagingProcedureRecommendation?.procedureCodes || []) {
console.log(" Recommended Procedure Codes: ");
displayCodes(procedureCode);
}
for (const imagingProcedure of imagingProcedureRecommendation?.imagingProcedures || []) {
console.log(" Recommended Imaging Procedure Codes: ");
displayImaging(imagingProcedure);
}
}
}
}
}
function displayCodes(codeableConcept: CodeableConcept): void {
for (const coding of codeableConcept.coding || []) {
console.log(` Coding: ${coding.code}, ${coding.display} (${coding.system})`);
}
}
function displayImaging(images: ImagingProcedure): void {
console.log(" Modality Codes: ");
displayCodes(images.modality);
console.log(" Anatomy Codes: ");
displayCodes(images.anatomy);
if (images.laterality) {
console.log(" Laterality Codes: ");
displayCodes(images.laterality);
}
if (images.contrast) {
console.log(" Contrast Codes: ");
displayCodes(images.contrast.code);
}
if (images.view) {
console.log(" View Codes: ");
displayCodes(images.view.code);
}
}
}
Print out the Guidance Inference details, finding codes associated, identifier, present guidance information, Ranking, recommendationProposals and missing guidance information if present
import {
RadiologyInsightsJobOutput,
GuidanceInference,
ImagingProcedureRecommendation,
CodeableConcept,
PresentGuidanceInformation,
Extension,
ImagingProcedure,
} from "@azure-rest/health-insights-radiologyinsights";
function printResults(radiologyInsightsResult: RadiologyInsightsJobOutput): void {
for (const patientResult of radiologyInsightsResult?.result?.patientResults || []) {
for (const inference of patientResult?.inferences || []) {
if (inference.kind === "guidance") {
const guidanceInference = inference as GuidanceInference;
console.log("Guidance Inference found: ");
if (guidanceInference.finding) {
const find = guidanceInference.finding.finding.code;
if (find) {
console.log(" Finding Code: ");
displayCodes(find);
}
}
if (guidanceInference.identifier) {
console.log(" Identifier: ");
displayCodes(guidanceInference.identifier);
}
if (guidanceInference.presentGuidanceInformation) {
console.log(" Present Guidance Information: ");
for (const presentInfo of guidanceInference.presentGuidanceInformation) {
displayPresentGuidanceInformation(presentInfo);
}
}
if (guidanceInference.ranking) {
console.log(` Ranking: , ${guidanceInference.ranking}`);
}
if (guidanceInference.recommendationProposals) {
console.log(" Recommendation Proposal: ");
const recommendationProposals = guidanceInference.recommendationProposals;
for (const proposal of recommendationProposals) {
console.log(` Recommended Proposal: ${proposal.kind}`);
console.log(` Recommendation Procedure: ${proposal.recommendedProcedure.kind}`);
let imagingprocedure;
if (proposal.recommendedProcedure.kind === "imagingProcedureRecommendation") {
imagingprocedure = (proposal.recommendedProcedure as ImagingProcedureRecommendation)
.imagingProcedures;
if (imagingprocedure) {
console.log(" Imaging Procedure Codes: ");
for (const imagingProcedure of imagingprocedure) {
displayImaging(imagingProcedure);
}
}
}
}
}
for (const missingInfo of guidanceInference.missingGuidanceInformation || []) {
console.log(" Missing Guidance Information: ", missingInfo);
}
}
}
}
function displayCodes(codeableConcept: CodeableConcept): void {
for (const coding of codeableConcept.coding || []) {
console.log(` Coding: ${coding.code}, ${coding.display} (${coding.system})`);
}
}
function displayPresentGuidanceInformation(presentInfo: PresentGuidanceInformation): void {
console.log(" Present Guidance Information Item: ", presentInfo.presentGuidanceItem);
presentInfo.presentGuidanceValues?.forEach((sizes: any) => {
console.log(" Present Guidance Value: ", sizes);
});
presentInfo.sizes?.forEach((gsizes: any) => {
if ("valueQuantity" in gsizes) {
console.log(" Size valueQuantity: ");
displayQuantityOutput(gsizes.valueQuantity);
}
if ("valueRange" in gsizes) {
if ("low" in gsizes.valueRange) {
console.log(" Size ValueRange: min", gsizes.valueRange.low);
}
if ("high" in gsizes.valueRange) {
console.log(" Size ValueRange: max", gsizes.valueRange.high);
}
}
});
if ("maximumDiameterAsInText" in presentInfo) {
console.log(" Maximum Diameter As In Text: ");
displayQuantityOutput(presentInfo.maximumDiameterAsInText);
}
if ("extension" in presentInfo) {
console.log(" Extension: ");
displaySectionInfo(presentInfo.extension);
}
}
function displayQuantityOutput(quantity: any): void {
console.log(` Value: ${quantity.value}`);
console.log(` Unit: ${quantity.unit}`);
}
function displaySectionInfo(extensions: Extension[]): void {
for (const extension of extensions) {
if (extension.url === "section") {
console.log(" Section:");
for (const { url, valueString } of extension.extension || []) {
console.log(` ${url}: ${valueString}`);
}
}
}
}
function displayImaging(images: ImagingProcedure): void {
console.log(" Modality Codes: ");
displayCodes(images.modality);
console.log(" Anatomy Codes: ");
displayCodes(images.anatomy);
if (images.laterality) {
console.log(" Laterality Codes: ");
displayCodes(images.laterality);
}
if (images.contrast) {
console.log(" Contrast Codes: ");
displayCodes(images.contrast.code);
}
if (images.view) {
console.log(" View Codes: ");
displayCodes(images.view.code);
}
}
}
Print out the Laterality Discrepancy Inference codes
import {
RadiologyInsightsJobOutput,
LateralityDiscrepancyInference,
CodeableConcept,
} from "@azure-rest/health-insights-radiologyinsights";
function printResults(radiologyInsightsResult: RadiologyInsightsJobOutput): void {
for (const patientResult of radiologyInsightsResult?.result?.patientResults || []) {
for (const inference of patientResult?.inferences || []) {
if (inference.kind === "lateralityDiscrepancy") {
const lateralityDiscrepancyInference = inference as LateralityDiscrepancyInference;
console.log("Laterality Discrepancy Inference found: ");
displayCodes(lateralityDiscrepancyInference.lateralityIndication);
}
}
}
function displayCodes(codeableConcept: CodeableConcept): void {
for (const coding of codeableConcept.coding || []) {
console.log(` Coding: ${coding.code}, ${coding.display} (${coding.system})`);
}
}
}
Print out the Limited Order Discrepancy Inference ordertype with present Body Parts and present Body Part Measurements
import {
RadiologyInsightsJobOutput,
LimitedOrderDiscrepancyInference,
CodeableConcept,
} from "@azure-rest/health-insights-radiologyinsights";
function printResults(radiologyInsightsResult: RadiologyInsightsJobOutput): void {
for (const patientResult of radiologyInsightsResult?.result?.patientResults || []) {
for (const inference of patientResult?.inferences || []) {
if (inference.kind === "limitedOrderDiscrepancy") {
const limitedOrderDiscrepancyInference = inference as LimitedOrderDiscrepancyInference;
console.log("Limited Order Discrepancy Inference found: ");
console.log(" Ordertype: ");
displayCodes(limitedOrderDiscrepancyInference.orderType);
for (const presentBodyParts of limitedOrderDiscrepancyInference?.presentBodyParts || []) {
console.log(" Present Body Parts: ");
displayCodes(presentBodyParts);
}
for (const presentBodymeasure of limitedOrderDiscrepancyInference?.presentBodyPartMeasurements ||
[]) {
console.log(" Present Body Part Measurements: ");
displayCodes(presentBodymeasure);
}
}
}
}
function displayCodes(codeableConcept: CodeableConcept): void {
for (const coding of codeableConcept.coding || []) {
console.log(` Coding: ${coding.code}, ${coding.display} (${coding.system})`);
}
}
}
Print out the Quality Measure Inference with the measure denominator, compliance typa and quality criterium. ! The MIPS-codes (“merit based payment incentive”) need to be filled in in the qualityMeasureOptions !
import {
RadiologyInsightsJobOutput,
QualityMeasureInference,
CodeableConcept,
} from "@azure-rest/health-insights-radiologyinsights";
function printResults(radiologyInsightsResult: RadiologyInsightsJobOutput): void {
for (const patientResult of radiologyInsightsResult?.result?.patientResults || []) {
for (const inference of patientResult?.inferences || []) {
if (inference.kind === "qualityMeasure") {
const qualityMeasureInference = inference as QualityMeasureInference;
console.log("Quality Measure Inference found: ");
if (qualityMeasureInference.qualityMeasureDenominator) {
console.log(" Quality Measure Denominator: ");
console.log(
` Quality Measure Denominator: ${qualityMeasureInference.qualityMeasureDenominator}`,
);
}
if (qualityMeasureInference.complianceType) {
console.log(" Quality Measure Numerator: ");
console.log(` Quality Measure Numerator: ${qualityMeasureInference.complianceType}`);
}
for (const qualityCriteria of qualityMeasureInference.qualityCriteria || []) {
console.log(` Quality Criteria: ${qualityCriteria}`);
}
}
}
}
}
function displayCodes(codeableConcept: CodeableConcept): void {
for (const coding of codeableConcept.coding || []) {
console.log(` Coding: ${coding.code}, ${coding.display} (${coding.system})`);
}
}
Print out the Radiology Procedure Inference codes, Imaging Procedure codes and Order Procedure Codes and its description
import {
RadiologyInsightsJobOutput,
RadiologyProcedureInference,
CodeableConcept,
ImagingProcedure,
} from "@azure-rest/health-insights-radiologyinsights";
function printResults(radiologyInsightsResult: RadiologyInsightsJobOutput): void {
for (const patientResult of radiologyInsightsResult?.result?.patientResults || []) {
for (const inference of patientResult?.inferences || []) {
if (inference.kind === "radiologyProcedure") {
const radiologyProcedureInference = inference as RadiologyProcedureInference;
console.log("Radiology Procedure Inference found");
for (const procedureCode of radiologyProcedureInference?.procedureCodes || []) {
console.log(" Procedure Codes: ");
displayCodes(procedureCode);
}
for (const imagingProcedure of radiologyProcedureInference?.imagingProcedures || []) {
console.log(" Imaging Procedure Codes: ");
displayImaging(imagingProcedure);
}
if (radiologyProcedureInference.orderedProcedure) {
console.log(" Ordered Procedure Codes: ");
displayCodes(radiologyProcedureInference.orderedProcedure.code);
}
if (radiologyProcedureInference.orderedProcedure.description) {
console.log(
` Description: ${radiologyProcedureInference.orderedProcedure.description}`,
);
}
}
}
}
function displayCodes(codeableConcept: CodeableConcept): void {
for (const coding of codeableConcept.coding || []) {
console.log(` Coding: ${coding.code}, ${coding.display} (${coding.system})`);
}
}
function displayImaging(images: ImagingProcedure): void {
console.log(" Modality Codes: ");
displayCodes(images.modality);
console.log(" Anatomy Codes: ");
displayCodes(images.anatomy);
if (images.laterality) {
console.log(" Laterality Codes: ");
displayCodes(images.laterality);
}
if (images.contrast) {
console.log(" Contrast Codes: ");
displayCodes(images.contrast.code);
}
if (images.view) {
console.log(" View Codes: ");
displayCodes(images.view.code);
}
}
}
Print out the Scoring and Assessment Inference with category and description and single or range values if present
import {
RadiologyInsightsJobOutput,
ScoringAndAssessmentInference,
} from "@azure-rest/health-insights-radiologyinsights";
function printResults(radiologyInsightsResult: RadiologyInsightsJobOutput): void {
for (const patientResult of radiologyInsightsResult?.result?.patientResults || []) {
for (const inference of patientResult?.inferences || []) {
if (inference.kind === "scoringAndAssessment") {
const scoringAndAssessmentInference = inference as ScoringAndAssessmentInference;
console.log("Scoring and Assessment Inference found: ");
if (scoringAndAssessmentInference.category) {
console.log(` Category: ${scoringAndAssessmentInference.category}`);
}
if (scoringAndAssessmentInference.categoryDescription) {
console.log(
` Category Description: "${scoringAndAssessmentInference.categoryDescription}`,
);
}
if (scoringAndAssessmentInference.singleValue) {
console.log(` Single Value: "${scoringAndAssessmentInference.singleValue}`);
}
if (scoringAndAssessmentInference?.rangeValue) {
console.log(" Range Value: ");
displayValueRange(scoringAndAssessmentInference?.rangeValue);
}
}
}
}
function displayValueRange(valueRange: { minimum: string; maximum: string }): void {
console.log(` Low: ${valueRange.minimum}`);
console.log(` High: ${valueRange.maximum}`);
}
}
Print out the Sex Mismatch Inference code
import {
RadiologyInsightsJobOutput,
SexMismatchInference,
CodeableConcept,
} from "@azure-rest/health-insights-radiologyinsights";
function printResults(radiologyInsightsResult: RadiologyInsightsJobOutput): void {
for (const patientResult of radiologyInsightsResult?.result?.patientResults || []) {
for (const inference of patientResult?.inferences || []) {
if (inference.kind === "sexMismatch") {
const sexMismatchInference = inference as SexMismatchInference;
console.log("Sex Mismatch Inference found: ");
displayCodes(sexMismatchInference.sexIndication);
}
}
}
function displayCodes(codeableConcept: CodeableConcept): void {
for (const coding of codeableConcept.coding || []) {
console.log(` Coding: ${coding.code}, ${coding.display} (${coding.system})`);
}
}
}
Using a Managed Identity require changes in adding the clientID of your managed identity as a const, adding it to you DefaultAzureCredential and add the Authorization Header
import { DefaultAzureCredential } from "@azure/identity";
import RadiologyInsightsRestClient from "@azure-rest/health-insights-radiologyinsights";
const managedIdentityClientId = "<client-id>";
const endpoint = "https://<your-endpoint>";
const credential = new DefaultAzureCredential({ managedIdentityClientId });
const client = RadiologyInsightsRestClient(endpoint, credential);
const tokenResponse = await credential.getToken("https://cognitiveservices.azure.com/.default");
const jobID = "jobId-123456789";
const radiologyInsightsJob = {
jobData: {
patients: [],
configuration: {},
},
};
// Create request body
const radiologyInsightsParameter = { body: radiologyInsightsJob };
// Create request body
const initialResponse = await client
.path("/radiology-insights/jobs/{id}", jobID)
.put(radiologyInsightsParameter, {
headers: {
Authorization: `Bearer ${tokenResponse?.token}`,
"Content-Type": "application/json",
},
});
Troubleshooting
Logging
Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the AZURE_LOG_LEVEL
environment variable to info
. Alternatively, logging can be enabled at runtime by calling setLogLevel
in the @azure/logger
:
import { setLogLevel } from "@azure/logger";
setLogLevel("info");
For more detailed instructions on how to enable logs, you can look at the @azure/logger package docs.
Azure SDK for JavaScript