Delen via


Azure DocumentIntelligence (voorheen FormRecognizer) REST-clientbibliotheek voor JavaScript - versie 1.0.0

Extraheert inhoud, indeling en gestructureerde gegevens uit documenten.

Vertrouw sterk op onze REST-clientdocumenten om deze bibliotheek te gebruiken

OPMERKING: Form Recognizer is hernoemd naar Document Intelligence. Raadpleeg de migratiehandleiding voor van @azure/ai-form-recognizer naar @azure-rest/ai-document-intelligence.

Sleutelkoppelingen:

Deze versie van de clientbibliotheek is standaard ingesteld op de "2024-11-30" versie van de service.

In deze tabel ziet u de relatie tussen SDK-versies en ondersteunde API-versies van de service:

SDK-versie Ondersteunde API-versie van de service
1.0.0 2024-11-30

Vertrouw op de oudere @azure/ai-form-recognizer-bibliotheek via de oudere service-API-versies voor buiten gebruik gestelde modellen, zoals "prebuilt-businessCard" en "prebuilt-document". Zie Changelogvoor meer informatie.

In de onderstaande tabel wordt de relatie van elke client en de ondersteunde API-versie(s) beschreven:

Service-API-versie Ondersteunde clients Pak
2024-11-30 DocumentIntelligenceClient @azure-rest/ai-document-intelligence versie 1.0.0
2023-07-31 DocumentAnalysisClient en DocumentModelAdministrationClient @azure/ai-form-recognizer versie ^5.0.0
2022-08-01 DocumentAnalysisClient en DocumentModelAdministrationClient @azure/ai-form-recognizer versie ^4.0.0

Slag

Momenteel ondersteunde omgevingen

  • LTS-versies van Node.js

Voorwaarden

Het @azure-rest/ai-document-intelligence-pakket installeren

Installeer de AZURE DocumentIntelligence(voorheenFormRecognizer) REST-clientbibliotheek voor JavaScript met npm:

npm install @azure-rest/ai-document-intelligence

Een DocumentIntelligenceClient maken en verifiëren

Als u een AAD-tokenreferenties (Azure Active Directory) wilt gebruiken, geeft u een exemplaar op van het gewenste referentietype dat is verkregen uit de @azure/identity-bibliotheek.

Als u zich wilt verifiëren met AAD, moet u eerst npm@azure/identity installeren

Na de installatie kunt u kiezen welk type referentie uit @azure/identity te gebruiken. Als voorbeeld kan DefaultAzureCredential- worden gebruikt om de client te verifiëren.

Stel de waarden van de client-id, tenant-id en clientgeheim van de AAD-toepassing in als omgevingsvariabelen: AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET

Een tokenreferentie gebruiken

import DocumentIntelligence from "@azure-rest/ai-document-intelligence";

const client = DocumentIntelligence(
  process.env["DOCUMENT_INTELLIGENCE_ENDPOINT"],
  new DefaultAzureCredential()
);

Een API-SLEUTEL gebruiken

import DocumentIntelligence from "@azure-rest/ai-document-intelligence";

const client = DocumentIntelligence(process.env["DOCUMENT_INTELLIGENCE_ENDPOINT"], {
  key: process.env["DOCUMENT_INTELLIGENCE_API_KEY"],
});

Documentmodellen

Vooraf gedefinieerde indeling analyseren (urlSource)

const initialResponse = await client
  .path("/documentModels/{modelId}:analyze", "prebuilt-layout")
  .post({
    contentType: "application/json",
    body: {
      urlSource:
        "https://raw.githubusercontent.com/Azure/azure-sdk-for-js/6704eff082aaaf2d97c1371a28461f512f8d748a/sdk/formrecognizer/ai-form-recognizer/assets/forms/Invoice_1.pdf",
    },
    queryParameters: { locale: "en-IN" },
  });

Vooraf gedefinieerde indeling analyseren (base64Source)

import fs from "fs";
import path from "path";

const filePath = path.join(ASSET_PATH, "forms", "Invoice_1.pdf");
const base64Source = fs.readFileSync(filePath, { encoding: "base64" });
const initialResponse = await client
  .path("/documentModels/{modelId}:analyze", "prebuilt-layout")
  .post({
    contentType: "application/json",
    body: {
      base64Source,
    },
    queryParameters: { locale: "en-IN" },
  });

Doorgaan met het maken van de poller vanuit het eerste antwoord

import {
  getLongRunningPoller,
  AnalyzeResultOperationOutput,
  isUnexpected,
} from "@azure-rest/ai-document-intelligence";

if (isUnexpected(initialResponse)) {
  throw initialResponse.body.error;
}
const poller = getLongRunningPoller(client, initialResponse);
const result = (await poller.pollUntilDone()).body as AnalyzeResultOperationOutput;
console.log(result);
// {
//   status: 'succeeded',
//   createdDateTime: '2023-11-10T13:31:31Z',
//   lastUpdatedDateTime: '2023-11-10T13:31:34Z',
//   analyzeResult: {
//     apiVersion: '2023-10-31-preview',
//     .
//     .
//     .
//     contentFormat: 'text'
//   }
// }

Batchanalyse

import { parseResultIdFromResponse, isUnexpected } from "@azure-rest/ai-document-intelligence";

// 1. Analyze a batch of documents
const initialResponse = await client
  .path("/documentModels/{modelId}:analyzeBatch", "prebuilt-layout")
  .post({
    contentType: "application/json",
    body: {
      azureBlobSource: {
        containerUrl: batchTrainingFilesContainerUrl(),
      },
      resultContainerUrl: batchTrainingFilesResultContainerUrl(),
      resultPrefix: "result",
    },
  });

if (isUnexpected(initialResponse)) {
  throw initialResponse.body.error;
}
const resultId = parseResultIdFromResponse(initialResponse);
console.log("resultId: ", resultId);

// (Optional) You can poll for the batch analysis result but be aware that a job may take unexpectedly long time, and polling could incur additional costs.
// const poller = getLongRunningPoller(client, initialResponse);
// await poller.pollUntilDone();

// 2. At a later time, you can retrieve the operation result using the resultId
const output = await client
  .path("/documentModels/{modelId}/analyzeResults/{resultId}", "prebuilt-layout", resultId)
  .get();
console.log(output);

Markdown-inhoudsindeling

Ondersteunt uitvoer met Markdown-inhoudsindeling, samen met de standaard zonder opmaak tekst. Voorlopig wordt dit alleen ondersteund voor 'vooraf gedefinieerde indeling'. Markdown-inhoudsindeling wordt beschouwd als een meer beschrijvende indeling voor LLM-verbruik in een chat- of automatiseringsscenario.

De service volgt de GFM-specificatie (GitHub Flavored Markdown) voor de Markdown-indeling. Introduceert ook een nieuwe eigenschap contentFormat met de waarde 'text' of 'markdown' om de indeling van de resultaatinhoud aan te geven.

import DocumentIntelligence from "@azure-rest/ai-document-intelligence";
const client = DocumentIntelligence(process.env["DOCUMENT_INTELLIGENCE_ENDPOINT"], {
  key: process.env["DOCUMENT_INTELLIGENCE_API_KEY"],
});

const initialResponse = await client
  .path("/documentModels/{modelId}:analyze", "prebuilt-layout")
  .post({
    contentType: "application/json",
    body: {
      urlSource:
        "https://raw.githubusercontent.com/Azure/azure-sdk-for-js/6704eff082aaaf2d97c1371a28461f512f8d748a/sdk/formrecognizer/ai-form-recognizer/assets/forms/Invoice_1.pdf",
    },
    queryParameters: { outputContentFormat: "markdown" }, // <-- new query parameter
  });

Queryvelden

Wanneer deze functievlag is opgegeven, extraheert de service de waarden van de velden die zijn opgegeven via de queryparameter queryVelds om bestaande velden die door het model zijn gedefinieerd als terugval aan te vullen.

await client.path("/documentModels/{modelId}:analyze", "prebuilt-layout").post({
  contentType: "application/json",
  body: { urlSource: "..." },
  queryParameters: {
    features: ["queryFields"],
    queryFields: ["NumberOfGuests", "StoreNumber"],
  }, // <-- new query parameter
});

Opties voor splitsen

In de vorige API-versies die worden ondersteund door de oudere @azure/ai-form-recognizer-bibliotheek, probeerden documentsplitsing en classificatiebewerking ("/documentClassifiers/{classifierId}:analyze") het invoerbestand altijd te splitsen in meerdere documenten.

Om een bredere set scenario's mogelijk te maken, introduceert de service een queryparameter splitsen met de nieuwe serviceversie 2023-10-31-preview. De volgende waarden worden ondersteund:

  • split: "auto"

    Laat de service bepalen waar moet worden gesplitst.

  • split: "none"

    Het hele bestand wordt behandeld als één document. Er wordt geen splitsing uitgevoerd.

  • split: "perPage"

    Elke pagina wordt behandeld als een afzonderlijk document. Elke lege pagina wordt bewaard als een eigen document.

Documentclassificaties #Build

import {
  DocumentClassifierBuildOperationDetailsOutput,
  getLongRunningPoller,
  isUnexpected,
} from "@azure-rest/ai-document-intelligence";

const containerSasUrl = (): string =>
  process.env["DOCUMENT_INTELLIGENCE_TRAINING_CONTAINER_SAS_URL"];
const initialResponse = await client.path("/documentClassifiers:build").post({
  body: {
    classifierId: `customClassifier${getRandomNumber()}`,
    description: "Custom classifier description",
    docTypes: {
      foo: {
        azureBlobSource: {
          containerUrl: containerSasUrl(),
        },
      },
      bar: {
        azureBlobSource: {
          containerUrl: containerSasUrl(),
        },
      },
    },
  },
});

if (isUnexpected(initialResponse)) {
  throw initialResponse.body.error;
}
const poller = getLongRunningPoller(client, initialResponse);
const response = (await poller.pollUntilDone())
  .body as DocumentClassifierBuildOperationDetailsOutput;
console.log(response);
//  {
//    operationId: '31466834048_f3ee629e-73fb-48ab-993b-1d55d73ca460',
//    kind: 'documentClassifierBuild',
//    status: 'succeeded',
//    .
//    .
//    result: {
//      classifierId: 'customClassifier10978',
//      createdDateTime: '2023-11-09T12:45:56Z',
//      .
//      .
//      description: 'Custom classifier description'
//    },
//    apiVersion: '2023-10-31-preview'
//  }

De gegenereerde PDF-uitvoer ophalen uit documentanalyse

const filePath = path.join(ASSET_PATH, "layout-pageobject.pdf");

const base64Source = await fs.readFile(filePath, { encoding: "base64" });

const initialResponse = await client
  .path("/documentModels/{modelId}:analyze", "prebuilt-read")
  .post({
    contentType: "application/json",
    body: {
      base64Source,
    },
    queryParameters: { output: ["pdf"] },
  });

if (isUnexpected(initialResponse)) {
  throw initialResponse.body.error;
}

const poller = getLongRunningPoller(client, initialResponse);

await poller.pollUntilDone();

const output = await client
  .path(
    "/documentModels/{modelId}/analyzeResults/{resultId}/pdf",
    "prebuilt-read",
    parseResultIdFromResponse(initialResponse)
  )
  .get()
  .asNodeStream(); // output.body would be NodeJS.ReadableStream

if (output.status !== "200" || !output.body) {
  throw new Error("The response was unexpected, expected NodeJS.ReadableStream in the body.");
}

const pdfData = await streamToUint8Array(output.body);
fs.promises.writeFile(`./output.pdf`, pdfData);
// Or you can consume the NodeJS.ReadableStream directly

De gegenereerde bijgesneden afbeelding van de opgegeven afbeelding ophalen uit documentanalyse

const filePath = path.join(ASSET_PATH, "layout-pageobject.pdf");

const base64Source = fs.readFileSync(filePath, { encoding: "base64" });

const initialResponse = await client
  .path("/documentModels/{modelId}:analyze", "prebuilt-layout")
  .post({
    contentType: "application/json",
    body: {
      base64Source,
    },
    queryParameters: { output: ["figures"] },
  });

if (isUnexpected(initialResponse)) {
  throw initialResponse.body.error;
}

const poller = getLongRunningPoller(client, initialResponse, { ...testPollingOptions });

const result = (await poller.pollUntilDone()).body as AnalyzeResultOperationOutput;
const figures = result.analyzeResult?.figures;
assert.isArray(figures);
assert.isNotEmpty(figures?.[0]);
const figureId = figures?.[0].id || "";
assert.isDefined(figureId);

const output = await client
  .path(
    "/documentModels/{modelId}/analyzeResults/{resultId}/figures/{figureId}",
    "prebuilt-layout",
    parseResultIdFromResponse(initialResponse),
    figureId
  )
  .get()
  .asNodeStream(); // output.body would be NodeJS.ReadableStream

if (output.status !== "200" || !output.body) {
  throw new Error("The response was unexpected, expected NodeJS.ReadableStream in the body.");
}

const imageData = await streamToUint8Array(output.body);
fs.promises.writeFile(`./figures/${figureId}.png`, imageData);
// Or you can consume the NodeJS.ReadableStream directly

Informatie ophalen

const response = await client.path("/info").get();
if (isUnexpected(response)) {
  throw response.body.error;
}
console.log(response.body.customDocumentModels.limit);
// 20000

Documentmodellen weergeven

import { paginate } from "@azure-rest/ai-document-intelligence";
const response = await client.path("/documentModels").get();
if (isUnexpected(response)) {
  throw response.body.error;
}

const modelsInAccount: string[] = [];
for await (const model of paginate(client, response)) {
  console.log(model.modelId);
}

Probleemoplossing

Logboekregistratie

Het inschakelen van logboekregistratie kan helpen nuttige informatie over fouten te ontdekken. Als u een logboek met HTTP-aanvragen en -antwoorden wilt zien, stelt u de omgevingsvariabele AZURE_LOG_LEVEL in op info. U kunt logboekregistratie ook tijdens runtime inschakelen door setLogLevel aan te roepen in de @azure/logger:

const { setLogLevel } = require("@azure/logger");

setLogLevel("info");

Voor meer gedetailleerde instructies over het inschakelen van logboeken, kunt u de @azure/logger pakketdocumentenbekijken.