Azure AI Document Intelligence ügyfélkódtár Pythonhoz – 1.0.0b1-es verzió

Az Azure AI Document Intelligence (korábbi nevén Form Recognizer) egy felhőalapú szolgáltatás, amely gépi tanulással elemzi a dokumentumokból származó szövegeket és strukturált adatokat. A következő fő funkciókat tartalmazza:

  • Elrendezés – Tartalom és szerkezet (például szavak, kijelölési jelek, táblázatok) kinyerése a dokumentumokból.
  • Dokumentum – Kulcs-érték párok elemzése a dokumentumok általános elrendezése mellett.
  • Olvasás – Lapinformációk olvasása dokumentumokból.
  • Előre összeállított – Kinyerheti a közös mezőértékeket a kiválasztott dokumentumtípusokból (például nyugták, számlák, névjegykártyák, azonosító dokumentumok, egyesült államokbeli adódokumentumok stb.) előre összeállított modellek használatával.
  • Egyéni – Egyéni modelleket hozhat létre a saját adataiból, hogy testreszabott mezőértékeket nyerjen ki a dokumentumok általános elrendezése mellett.
  • Osztályozók – Egyéni besorolási modelleket hozhat létre, amelyek az elrendezési és nyelvi funkciókat kombinálva pontosan észlelik és azonosítják az alkalmazásban feldolgozott dokumentumokat.
  • Bővítményfunkciók – Vonalkódok/QR-kódok, képletek, betűtípus/stílus stb. kinyerése, vagy nagy felbontású mód engedélyezése nagy méretű dokumentumokhoz opcionális paraméterekkel.

Első lépések

A csomag telepítése

python -m pip install azure-ai-documentintelligence

Prequisites

  • A csomag használatához Python 3.7 vagy újabb verzió szükséges.
  • A csomag használatához Azure-előfizetésre van szükség.
  • Egy meglévő Azure AI Document Intelligence-példány.

Cognitive Services- vagy dokumentumintelligencia-erőforrás létrehozása

A Dokumentumintelligencia a többszolgáltatásos és az egyszolgáltatásos hozzáférést is támogatja. Hozzon létre egy Cognitive Services-erőforrást, ha több Cognitive Services-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Vegye figyelembe, hogy egy egyszolgáltatásos erőforrásra lesz szüksége, ha Azure Active Directory-hitelesítést kíván használni.

Bármelyik erőforrást létrehozhatja a következő használatával:

Az alábbiakban egy példa látható arra, hogyan hozhat létre dokumentumintelligencia-erőforrást a parancssori felület használatával:

# Create a new resource group to hold the Document Intelligence resource
# if using an existing resource group, skip this step
az group create --name <your-resource-name> --location <location>
# Create the Document Intelligence resource
az cognitiveservices account create \
    --name <your-resource-name> \
    --resource-group <your-resource-group-name> \
    --kind FormRecognizer \
    --sku <sku> \
    --location <location> \
    --yes

Az erőforrás létrehozásával vagy a hely és a termékváltozat lekérésével kapcsolatos további információkért lásd itt.

Az ügyfél hitelesítése

A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia egy ügyfélpéldányt. Az ügyfélobjektum példányosításához végpontra és hitelesítő adatokra van szükség.

A végpont lekérése

A dokumentumintelligencia-erőforrás végpontját az Azure Portalon vagy az Azure CLI-vel keresheti meg:

# Get the endpoint for the Document Intelligence resource
az cognitiveservices account show --name "resource-name" --resource-group "resource-group-name" --query "properties.endpoint"

A hitelesítéshez használhat regionális végpontot vagy egyéni altartományt. Ezek a következőképpen vannak formázva:

Regional endpoint: https://<region>.api.cognitive.microsoft.com/
Custom subdomain: https://<resource-name>.cognitiveservices.azure.com/

A regionális végpontok megegyeznek a régióban lévő összes erőforrás esetében. A támogatott regionális végpontok teljes listáját itt tekintheti meg. Vegye figyelembe, hogy a regionális végpontok nem támogatják az AAD-hitelesítést.

Az egyéni altartomány azonban a Dokumentumintelligencia-erőforrás egyedi neve. Csak egyszolgáltatásos erőforrások használhatják őket.

Az API-kulcs lekérése

Az API-kulcs az Azure Portalon vagy a következő Azure CLI-parancs futtatásával található meg:

az cognitiveservices account keys list --name "<resource-name>" --resource-group "<resource-group-name>"

Az ügyfél létrehozása az AzureKeyCredential használatával

Ha egy API-kulcsot szeretne paraméterként credential használni, adja át a kulcsot sztringként az AzureKeyCredential egy példányába.

from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient

endpoint = "https://<my-custom-subdomain>.cognitiveservices.azure.com/"
credential = AzureKeyCredential("<api_key>")
document_analysis_client = DocumentIntelligenceClient(endpoint, credential)

Az ügyfél létrehozása Azure Active Directory-hitelesítő adatokkal

AzureKeyCredential A hitelesítést az első lépések útmutatójának példáiban használjuk, de az Azure Active Directoryval is végezhet hitelesítést az azure-identity kódtár használatával. Vegye figyelembe, hogy a regionális végpontok nem támogatják az AAD-hitelesítést. Hozzon létre egy egyéni altartománynevet az erőforráshoz az ilyen típusú hitelesítés használatához.

Az alább látható DefaultAzureCredential típus vagy az Azure SDK-hoz biztosított egyéb hitelesítőadat-típusok használatához telepítse a azure-identity csomagot:

pip install azure-identity

Emellett regisztrálnia kell egy új AAD-alkalmazást, és hozzáférést kell adnia a Dokumentumintelligencia szolgáltatáshoz, ha hozzárendeli a szerepkört a "Cognitive Services User" szolgáltatásnévhez.

Ha végzett, állítsa be az AAD-alkalmazás ügyfél-azonosítójának, bérlőazonosítójának és titkos ügyfélkulcsának értékeit környezeti változóként: AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET.

"""DefaultAzureCredential will use the values from these environment
variables: AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET
"""
from azure.ai.documentintelligence import DocumentIntelligenceClient
from azure.identity import DefaultAzureCredential

endpoint = os.environ["DOCUMENTINTELLIGENCE_ENDPOINT"]
credential = DefaultAzureCredential()

document_analysis_client = DocumentIntelligenceClient(endpoint, credential)

Fő fogalmak

DocumentIntelligenceClient

DocumentIntelligenceClient műveleteket biztosít a bemeneti dokumentumok elemzéséhez előre összeállított és egyéni modellek használatával az begin_analyze_document API-val. A paraméter használatával model_id válassza ki az elemzéshez használt modell típusát. A támogatott modellek teljes listáját itt tekintheti meg. A DocumentIntelligenceClient emellett műveleteket is biztosít a dokumentumok API-val történő besorolásához begin_classify_document . Az egyéni besorolási modellek osztályozhatják a bemeneti fájl egyes lapjait a dokumentum(ok) azonosításához, és több dokumentumot vagy egyetlen dokumentum több példányát is azonosíthatják egy bemeneti fájlban.

Mintakódrészleteket ad meg, amelyek a DocumentIntelligenceClient itt szemléltetik. A dokumentumok elemzéséről, beleértve a támogatott funkciókat, a területi beállításokat és a dokumentumtípusokat, a szolgáltatás dokumentációjában talál további információt.

DocumentIntelligenceAdministrationClient

DocumentIntelligenceAdministrationClient a következő műveletekhez nyújt műveleteket:

  • Egyéni modellek létrehozása a megadott mezők elemzéséhez az egyéni dokumentumok címkézésével. A DocumentModelDetails visszaadott érték jelzi a modell által elemezhető dokumentumtípus(ok)t, valamint az egyes mezők becsült megbízhatóságát. Részletesebb magyarázatért tekintse meg a szolgáltatás dokumentációját .
  • Összeállított modell létrehozása meglévő modellek gyűjteményéből.
  • A fiókban létrehozott modellek kezelése.
  • Az elmúlt 24 órában létrehozott műveletek listázása vagy egy adott modellművelet lekérése.
  • Egyéni modell másolása egy dokumentumintelligencia-erőforrásból egy másikba.
  • Egyéni besorolási modellt hozhat létre és kezelhet az alkalmazásban feldolgozott dokumentumok besorolásához.

Vegye figyelembe, hogy a modellek olyan grafikus felhasználói felülettel is létrehozhatók, mint a Document Intelligence Studio.

Mintakódrészletek találhatók, amelyek a DocumentIntelligenceAdministrationClient itt szemléltetik.

Hosszú ideig futó műveletek

A hosszú ideig futó műveletek olyan műveletek, amelyek egy kezdeti kérésből állnak, amelyet a szolgáltatásnak küldött egy művelet elindításához, majd a szolgáltatás időközönkénti lekérdezése annak megállapításához, hogy a művelet befejeződött vagy sikertelen volt-e, és ha sikerült, az eredmény lekéréséhez.

A dokumentumok elemzésére, modellek létrehozására vagy másolására/írására szolgáló módszerek hosszú ideig futó műveletekként vannak modellezve. Az ügyfél egy metódust begin_<method-name> tesz elérhetővé, amely egy vagy AsyncLROPollerértéket LROPoller ad vissza. A hívónak meg kell várnia a művelet befejezését a metódusból begin_<method-name> visszaadott poller objektum meghívásávalresult(). Mintakódrészleteket ad meg, amelyek hosszú ideig futó műveletek használatát szemléltetik. Példák az alábbi .

Példák

A következő szakasz számos kódrészletet tartalmaz, amelyek a leggyakoribb dokumentumintelligencia-feladatokat fedik le, például:

Elrendezés kibontva

Szöveg, kijelölésjelek, szövegstílusok és táblázatstruktúrák, valamint azok határolórégió-koordinátáinak kinyerése dokumentumokból.

from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient

endpoint = os.environ["DOCUMENTINTELLIGENCE_ENDPOINT"]
key = os.environ["DOCUMENTINTELLIGENCE_API_KEY"]

document_intelligence_client = DocumentIntelligenceClient(
    endpoint=endpoint, credential=AzureKeyCredential(key)
)
with open(path_to_sample_documents, "rb") as f:
    poller = document_intelligence_client.begin_analyze_document(
        "prebuilt-layout", analyze_request=f, content_type="application/octet-stream"
    )
result = poller.result()

for idx, style in enumerate(result.styles):
    print(
        "Document contains {} content".format(
            "handwritten" if style.is_handwritten else "no handwritten"
        )
    )

for page in result.pages:
    print("----Analyzing layout from page #{}----".format(page.page_number))
    print(
        "Page has width: {} and height: {}, measured with unit: {}".format(
            page.width, page.height, page.unit
        )
    )

    for line_idx, line in enumerate(page.lines):
        words = line.get_words()
        print(
            "...Line # {} has word count {} and text '{}' within bounding polygon '{}'".format(
                line_idx,
                len(words),
                line.content,
                line.polygon,
            )
        )

        for word in words:
            print(
                "......Word '{}' has a confidence of {}".format(
                    word.content, word.confidence
                )
            )

    for selection_mark in page.selection_marks:
        print(
            "...Selection mark is '{}' within bounding polygon '{}' and has a confidence of {}".format(
                selection_mark.state,
                selection_mark.polygon,
                selection_mark.confidence,
            )
        )

for table_idx, table in enumerate(result.tables):
    print(
        "Table # {} has {} rows and {} columns".format(
            table_idx, table.row_count, table.column_count
        )
    )
    for region in table.bounding_regions:
        print(
            "Table # {} location on page: {} is {}".format(
                table_idx,
                region.page_number,
                region.polygon,
            )
        )
    for cell in table.cells:
        print(
            "...Cell[{}][{}] has content '{}'".format(
                cell.row_index,
                cell.column_index,
                cell.content,
            )
        )
        for region in cell.bounding_regions:
            print(
                "...content on page {} is within bounding polygon '{}'".format(
                    region.page_number,
                    region.polygon,
                )
            )

print("----------------------------------------")

Előre összeállított modellek használata

A Dokumentumintelligencia szolgáltatás előre összeállított modelljeinek használatával mezőket nyerhet ki bizonyos dokumentumtípusokból, például nyugtákból, számlákból, névjegykártyákból, személyazonossági dokumentumokból és az egyesült államokbeli W-2 adódokumentumokból.

Ha például egy értékesítési nyugta mezőit szeretné elemezni, használja az előre összeállított nyugtamodellt, amelyet a begin_analyze_document metódusnak való átadással model_id="prebuilt-receipt" biztosít:

from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient

endpoint = os.environ["DOCUMENTINTELLIGENCE_ENDPOINT"]
key = os.environ["DOCUMENTINTELLIGENCE_API_KEY"]

document_analysis_client = DocumentIntelligenceClient(endpoint=endpoint, credential=AzureKeyCredential(key))
with open(path_to_sample_documents, "rb") as f:
    poller = document_analysis_client.begin_analyze_document(
        "prebuilt-receipt", analyze_request=f, locale="en-US", content_type="application/octet-stream"
    )
receipts = poller.result()

for idx, receipt in enumerate(receipts.documents):
    print(f"--------Analysis of receipt #{idx + 1}--------")
    print(f"Receipt type: {receipt.doc_type if receipt.doc_type else 'N/A'}")
    merchant_name = receipt.fields.get("MerchantName")
    if merchant_name:
        print(f"Merchant Name: {merchant_name.get('valueString')} has confidence: " f"{merchant_name.confidence}")
    transaction_date = receipt.fields.get("TransactionDate")
    if transaction_date:
        print(
            f"Transaction Date: {transaction_date.get('valueDate')} has confidence: "
            f"{transaction_date.confidence}"
        )
    if receipt.fields.get("Items"):
        print("Receipt items:")
        for idx, item in enumerate(receipt.fields.get("Items").get("valueArray")):
            print(f"...Item #{idx + 1}")
            item_description = item.get("valueObject").get("Description")
            if item_description:
                print(
                    f"......Item Description: {item_description.get('valueString')} has confidence: "
                    f"{item_description.confidence}"
                )
            item_quantity = item.get("valueObject").get("Quantity")
            if item_quantity:
                print(
                    f"......Item Quantity: {item_quantity.get('valueString')} has confidence: "
                    f"{item_quantity.confidence}"
                )
            item_total_price = item.get("valueObject").get("TotalPrice")
            if item_total_price:
                print(
                    f"......Total Item Price: {format_price(item_total_price.get('valueCurrency'))} has confidence: "
                    f"{item_total_price.confidence}"
                )
    subtotal = receipt.fields.get("Subtotal")
    if subtotal:
        print(f"Subtotal: {format_price(subtotal.get('valueCurrency'))} has confidence: {subtotal.confidence}")
    tax = receipt.fields.get("TotalTax")
    if tax:
        print(f"Total tax: {format_price(tax.get('valueCurrency'))} has confidence: {tax.confidence}")
    tip = receipt.fields.get("Tip")
    if tip:
        print(f"Tip: {format_price(tip.get('valueCurrency'))} has confidence: {tip.confidence}")
    total = receipt.fields.get("Total")
    if total:
        print(f"Total: {format_price(total.get('valueCurrency'))} has confidence: {total.confidence}")
    print("--------------------------------------")

Nem csak a nyugtákra van korlátozva! Néhány előre összeállított modell közül választhat, amelyek mindegyike saját támogatott mezőkészlettel rendelkezik. Az egyéb támogatott előre összeállított modelleket itt tekinti meg.

Egyéni modell létrehozása

Hozzon létre egy egyéni modellt a saját dokumentumtípusán. Az eredményként kapott modell a betanított dokumentumtípusok értékeinek elemzésére használható. Adjon meg egy tároló SAS-URL-címét az Azure Storage Blob-tárolónak, ahol a betanítási dokumentumokat tárolja.

A tárolók és a szükséges fájlstruktúra beállításáról további információt a szolgáltatás dokumentációjában talál.

from azure.ai.formrecognizer import (
    DocumentIntelligenceAdministrationClient,
    ModelBuildMode,
)
from azure.core.credentials import AzureKeyCredential

endpoint = os.environ["DOCUMENTINTELLIGENCE_ENDPOINT"]
key = os.environ["DOCUMENTINTELLIGENCE_API_KEY"]
container_sas_url = os.environ["CONTAINER_SAS_URL"]

document_model_admin_client = DocumentIntelligenceAdministrationClient(
    endpoint, AzureKeyCredential(key)
)
poller = document_model_admin_client.begin_build_document_model(
    ModelBuildMode.TEMPLATE,
    blob_container_url=container_sas_url,
    description="my model description",
)
model = poller.result()

print(f"Model ID: {model.model_id}")
print(f"Description: {model.description}")
print(f"Model created on: {model.created_on}")
print(f"Model expires on: {model.expires_on}")
print("Doc types the model can recognize:")
for name, doc_type in model.doc_types.items():
    print(
        f"Doc Type: '{name}' built with '{doc_type.build_mode}' mode which has the following fields:"
    )
    for field_name, field in doc_type.field_schema.items():
        print(
            f"Field: '{field_name}' has type '{field['type']}' and confidence score "
            f"{doc_type.field_confidence[field_name]}"
        )

Dokumentumok elemzése egyéni modellel

Dokumentummezők, táblázatok, kijelölési jelek és egyebek elemzése. Ezek a modellek saját adatokkal vannak betanva, így a dokumentumokra vannak szabva. A legjobb eredmény érdekében csak az egyéni modellben létrehozott dokumentumtípusú dokumentumokat kell elemeznie.

from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient

endpoint = os.environ["DOCUMENTINTELLIGENCE_ENDPOINT"]
key = os.environ["DOCUMENTINTELLIGENCE_API_KEY"]
model_id = os.getenv("CUSTOM_BUILT_MODEL_ID", custom_model_id)

document_analysis_client = DocumentIntelligenceClient(endpoint=endpoint, credential=AzureKeyCredential(key))

# Make sure your document's type is included in the list of document types the custom model can analyze
with open(path_to_sample_documents, "rb") as f:
    poller = document_analysis_client.begin_analyze_document(
        model_id=model_id, analyze_request=f, content_type="application/octet-stream"
    )
result = poller.result()

for idx, document in enumerate(result.documents):
    print(f"--------Analyzing document #{idx + 1}--------")
    print(f"Document has type {document.doc_type}")
    print(f"Document has document type confidence {document.confidence}")
    print(f"Document was analyzed with model with ID {result.model_id}")
    for name, field in document.fields.items():
        field_value = field.get("valueString") if field.get("valueString") else field.content
        print(
            f"......found field of type '{field.type}' with value '{field_value}' and with confidence {field.confidence}"
        )

# iterate over tables, lines, and selection marks on each page
for page in result.pages:
    print(f"\nLines found on page {page.page_number}")
    for line in page.lines:
        print(f"...Line '{line.content}'")
    for word in page.words:
        print(f"...Word '{word.content}' has a confidence of {word.confidence}")
    if page.selection_marks:
        print(f"\nSelection marks found on page {page.page_number}")
        for selection_mark in page.selection_marks:
            print(
                f"...Selection mark is '{selection_mark.state}' and has a confidence of {selection_mark.confidence}"
            )

for i, table in enumerate(result.tables):
    print(f"\nTable {i + 1} can be found on page:")
    for region in table.bounding_regions:
        print(f"...{region.page_number}")
    for cell in table.cells:
        print(f"...Cell[{cell.row_index}][{cell.column_index}] has text '{cell.content}'")
print("-----------------------------------")

Emellett a dokumentum URL-címével is elemezheti a dokumentumokat a begin_analyze_document metódussal.

from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient
from azure.ai.documentintelligence.models import AnalyzeDocumentRequest

endpoint = os.environ["DOCUMENTINTELLIGENCE_ENDPOINT"]
key = os.environ["DOCUMENTINTELLIGENCE_API_KEY"]

document_analysis_client = DocumentIntelligenceClient(endpoint=endpoint, credential=AzureKeyCredential(key))
url = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/main/sdk/documentintelligence/azure-ai-documentintelligence/tests/sample_forms/receipt/contoso-receipt.png"
poller = document_analysis_client.begin_analyze_document("prebuilt-receipt", AnalyzeDocumentRequest(url_source=url))
receipts = poller.result()

A modellek kezelése

Kezelheti a fiókjához csatolt egyéni modelleket.

from azure.ai.documentintelligence import DocumentIntelligenceAdministrationClient
from azure.core.credentials import AzureKeyCredential
from azure.core.exceptions import ResourceNotFoundError

endpoint = "https://<my-custom-subdomain>.cognitiveservices.azure.com/"
credential = AzureKeyCredential("<api_key>")

document_model_admin_client = DocumentIntelligenceAdministrationClient(endpoint, credential)

account_details = document_model_admin_client.get_resource_info()
print("Our account has {} custom models, and we can have at most {} custom models".format(
    account_details.custom_document_models.count, account_details.custom_document_models.limit
))

# Here we get a paged list of all of our models
models = document_model_admin_client.list_models()
print("We have models with the following ids: {}".format(
    ", ".join([m.model_id for m in models])
))

# Replace with the custom model ID from the "Build a model" sample
model_id = "<model_id from the Build a Model sample>"

custom_model = document_model_admin_client.get_model(model_id=model_id)
print("Model ID: {}".format(custom_model.model_id))
print("Description: {}".format(custom_model.description))
print("Model created on: {}\n".format(custom_model.created_on))

# Finally, we will delete this model by ID
document_model_admin_client.delete_model(model_id=custom_model.model_id)

try:
    document_model_admin_client.get_model(model_id=custom_model.model_id)
except ResourceNotFoundError:
    print("Successfully deleted model with id {}".format(custom_model.model_id))

Bővítmény képességei

A Dokumentumintelligencia kifinomultabb elemzési képességeket támogat. Ezek a választható funkciók a dokumentum kinyerésének forgatókönyvétől függően engedélyezhetők és letilthatók.

A 2023-07-31-es (GA) és újabb kiadásokhoz a következő bővítmények érhetők el:

Vegye figyelembe, hogy egyes bővítményfunkciók további díjakat vonnak maga után. Lásd: díjszabás: https://azure.microsoft.com/pricing/details/ai-document-intelligence/.

Hibaelhárítás

Általános kérdések

A Dokumentumintelligencia-ügyfélkódtár kivételeket hoz létre az Azure Core-ban. A Dokumentumintelligencia szolgáltatás által létrehozott hibakódok és üzenetek a szolgáltatás dokumentációjában találhatók.

Naplózás

Ez a kódtár a szabványos naplózási kódtárat használja a naplózáshoz.

A HTTP-munkamenetekkel (URL-címekkel, fejlécekkel stb.) kapcsolatos alapvető információk naplózása a INFO szinten történik.

A részletes DEBUG szintű naplózás, beleértve a kérés-/választörzseket és a nem végrehajtott fejléceket is, engedélyezhető az ügyfélen vagy műveletenként a logging_enable kulcsszóargumentummal.

A teljes SDK-naplózási dokumentációt itt találja példákkal.

Választható konfiguráció

Az opcionális kulcsszóargumentumok az ügyfél és a művelet szintjén is átadhatók. Az Azure-Core referenciadokumentációja többek között az újrapróbálkozásokhoz, a naplózáshoz, az átviteli protokollokhoz és egyebekhez elérhető konfigurációkat ismerteti.

Következő lépések

További mintakód

A Dokumentumintelligencia Python API-ban használt gyakori mintákat bemutató kódrészletekért tekintse meg a MINTA README című cikket.

További dokumentáció

Az Azure AI-dokumentumintelligencia átfogóbb dokumentációjáért tekintse meg az docs.microsoft.com dokumentumintelligencia-dokumentációját .

Közreműködés

A projektben szívesen fogadjuk a hozzájárulásokat és a javaslatokat. A legtöbb hozzájáruláshoz el kell fogadnia egy Közreműködői licencszerződést (CLA-t), amelyben kijelenti, hogy jogosult arra, hogy ránk ruházza hozzájárulása felhasználási jogát, és ezt ténylegesen meg is teszi. További részletekért lásd: https://cla.microsoft.com.

A lekéréses kérelmek elküldésekor egy CLA-robot automatikusan meghatározza, hogy kell-e biztosítania CLA-t, és megfelelően kitölti a lekéréses kérelmet (például címke, megjegyzés). Egyszerűen csak kövesse a robot által megadott utasításokat. Ezt csak egyszer kell elvégeznie az összes olyan tárházban, amely a CLA-t használja.

A projekt a Microsoft nyílt forráskódú projekteket szabályozó etikai kódexe, a Microsoft Open Source Code of Conduct hatálya alá esik. További információkért keresse fel a Viselkedési szabályzattal kapcsolatos gyakori kérdések oldalát, illetve küldje el kérdéseit vagy észrevételeit a következő címre: opencode@microsoft.com.