你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

适用于 JavaScript 的 Azure 认知服务 Health Insights Radiology Insights REST 客户端库 - 版本 2.0.0

Health Insights 是使用 Azure 认知服务框架构建的 Azure 应用 AI 服务,它利用多个认知服务、医疗保健 API 服务和其他 Azure 资源。

Radiology Insights 是一个模型,旨在提供质量检查作为对错误和不一致(不匹配)的反馈,并确保使用报告的完整上下文来识别和传达关键发现。 另外还可以确定后续建议和放射科医生记录的测量(尺寸)的临床发现。

请严重依赖 REST 客户端文档, 使用此库

关键链接: 源代码 | 包 (NPM) | API 参考文档 | 产品信息 | 示例

入门指南

当前支持的环境

  • Node.js 的 LTS 版本
  • 最新版本的 Safari、Chrome、Edge 和 Firefox。

先决条件

  • Node.js 的 LTS 版本
  • 必须具有 Azure 订阅 才能使用此包。
  • 现有的 Cognitive Services Health Insights 实例。

安装 @azure-rest/health-insights-radiologyinsights

使用以下命令 npm安装适用于 JavaScript 的 RadiologyInsights REST 客户端库:

npm install @azure-rest/health-insights-radiologyinsights

创建和验证 RadiologyInsightsClient

要使用 Azure Active Directory (AAD) 令牌凭证,请提供从 Azure 标识库获取的所需凭证类型的实例。

若要使用 AAD 进行身份验证,必须先 npm 安装 @azure/identity

设置后,可以从 中选择要使用的 @azure/identity 类型。 例如,可以使用 DefaultAzureCredential 对客户端进行身份验证。 请参阅 defaultAzureCredentials default_information的详细信息。 托管身份还可用于通过 DefaultAzureCredential managed_identity进行身份验证。

例子

创建 RadiologyInsights 异步客户端

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);

构建请求,将其发送给客户端并打印出关键结果推理的描述

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);
  }
}
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;
  }
}
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})`);
    }
  }
}
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}`);
        }
      }
    }
  }
}
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}`);
      }
    }
  }
}
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);
    }
  }
}
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);
    }
  }
}
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})`);
    }
  }
}
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})`);
    }
  }
}
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})`);
  }
}
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);
    }
  }
}
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}`);
  }
}
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})`);
    }
  }
}

使用托管标识时,需要更改以下作:将托管标识的 clientID 添加为 const,将其添加到 DefaultAzureCredential 并添加 Authorization 标头

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",
    },
  });

故障排除

伐木业

启用日志记录可能有助于发现有关故障的有用信息。 若要查看 HTTP 请求和响应的日志,请将 AZURE_LOG_LEVEL 环境变量设置为 info。 或者,可以在运行时通过调用 setLogLevel 中的 @azure/logger 来启用日志记录:

import { setLogLevel } from "@azure/logger";

setLogLevel("info");

有关如何启用日志的更详细说明,可以查看 @azure/记录器包文档