К основному содержанию
скилл

azure-ai-document-intelligence-dotnet — скилл для Claude Code

Скилл для Claude и GitHub Copilot: помогает писать код на C# с Azure AI Document Intelligence — извлекать текст, таблицы и поля из счетов, чеков и удостоверений.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add microsoft/skills --skill azure-ai-document-intelligence-dotnet -a claude-code
Открыть на GitHub

Что делает azure-ai-document-intelligence-dotnet

Скилл описывает работу с пакетом Azure.AI.DocumentIntelligence для .NET. Внутри — готовые примеры кода: анализ счёта через prebuilt-invoice, разбор структуры документа через prebuilt-layout, извлечение полей из чека и сборка собственной модели. Агент подставляет эти шаблоны, когда вы просите написать код распознавания.

Есть два клиента. DocumentIntelligenceClient анализирует и классифицирует документы, DocumentIntelligenceAdministrationClient строит и ведёт кастомные модели и классификаторы. Аутентификация — либо DefaultAzureCredential из Azure.Identity, либо ключ через AzureKeyCredential. Для Entra ID нужен кастомный поддомен вида https://<resource-name>.cognitiveservices.azure.com/, региональный эндпоинт не подойдёт.

Перед началом задайте переменные окружения: DOCUMENT_INTELLIGENCE_ENDPOINT обязателен, DOCUMENT_INTELLIGENCE_API_KEY нужен только при аутентификации по ключу. Для обучения кастомной модели понадобится SAS-ссылка на контейнер блоба. Пакеты ставятся командами dotnet add package Azure.AI.DocumentIntelligence и dotnet add package Azure.Identity.

Какие задачи решает

  • написать код извлечения реквизитов из счетов на C#
  • разобрать таблицы и структуру PDF через prebuilt-layout
  • вытащить поля чека: продавца, сумму, дату
  • собрать кастомную модель под свои бланки
  • подключить аутентификацию Azure через DefaultAzureCredential

Примеры запросов агенту

  • Напиши на C# разбор счёта через prebuilt-invoice и выведи имя поставщика с уверенностью
  • Покажи, как извлечь таблицы из PDF моделью prebuilt-layout
  • Собери кастомную модель my-custom-model из контейнера блоба

Как установить azure-ai-document-intelligence-dotnet

1Через Skills CLI (Vercel)

npx skills add microsoft/skills --skill azure-ai-document-intelligence-dotnet -a claude-code

2Вручную: положить файлы

~/.claude/skills/azure-ai-document-intelligence-dotnet/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/azure-ai-document-intelligence-dotnet/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о azure-ai-document-intelligence-dotnet

Как установить azure-ai-document-intelligence-dotnet в Claude Code?

Выполните npx skills add microsoft/skills --skill azure-ai-document-intelligence-dotnet -a claude-code. Скилл появится в ~/.claude/skills/azure-ai-document-intelligence-dotnet/SKILL.md.

Что делает azure-ai-document-intelligence-dotnet?

Даёт агенту примеры кода на C# для Azure AI Document Intelligence: анализ счетов, чеков, удостоверений и разбор структуры документов готовыми и кастомными моделями.

Какие переменные окружения нужны для работы?

DOCUMENT_INTELLIGENCE_ENDPOINT обязателен. DOCUMENT_INTELLIGENCE_API_KEY нужен только при аутентификации по ключу, а BLOB_CONTAINER_SAS_URL — если обучаете кастомную модель на своих данных.

Исходный текст

SKILL.md · MIT
---
name: azure-ai-document-intelligence-dotnet
description: |
  Azure AI Document Intelligence SDK for .NET. Extract text, tables, and structured data from documents using prebuilt and custom models. Use for invoice processing, receipt extraction, ID document analysis, and custom document models. Triggers: "Document Intelligence", "DocumentIntelligenceClient", "form recognizer", "invoice extraction", "receipt OCR", "document analysis .NET".
license: MIT
metadata:
  author: Microsoft
  version: "1.0.0"
  package: Azure.AI.DocumentIntelligence
---

# Azure.AI.DocumentIntelligence (.NET)

Extract text, tables, and structured data from documents using prebuilt and custom models.

## Installation

```bash
dotnet add package Azure.AI.DocumentIntelligence
dotnet add package Azure.Identity
```

**Current Version**: v1.0.0 (GA)

## Environment Variables

```bash
DOCUMENT_INTELLIGENCE_ENDPOINT=https://<resource-name>.cognitiveservices.azure.com/  # Required: Document Intelligence endpoint
DOCUMENT_INTELLIGENCE_API_KEY=<your-api-key>  # Only required for AzureKeyCredential auth
BLOB_CONTAINER_SAS_URL=https://<storage>.blob.core.windows.net/<container>?<sas-token>  # Optional: blob container SAS URL for training data
AZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production
```

## Authentication

### Microsoft Entra Token Credential

```csharp
using Azure.Identity;
using Azure.AI.DocumentIntelligence;

string endpoint = Environment.GetEnvironmentVariable("DOCUMENT_INTELLIGENCE_ENDPOINT");
// Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
var credential = new DefaultAzureCredential(
    DefaultAzureCredential.DefaultEnvironmentVariableName
);
// Or use a specific credential directly in production:
// See https://learn.microsoft.com/dotnet/api/overview/azure/identity-readme?view=azure-dotnet#credential-classes
// var credential = new ManagedIdentityCredential();
var client = new DocumentIntelligenceClient(new Uri(endpoint), credential);
```

> **Note**: Entra ID requires a **custom subdomain** (e.g., `https://<resource-name>.cognitiveservices.azure.com/`), not a regional endpoint.

### API Key

```csharp
string endpoint = Environment.GetEnvironmentVariable("DOCUMENT_INTELLIGENCE_ENDPOINT");
string apiKey = Environment.GetEnvironmentVariable("DOCUMENT_INTELLIGENCE_API_KEY");
var client = new DocumentIntelligenceClient(new Uri(endpoint), new AzureKeyCredential(apiKey));
```

## Client Types

| Client | Purpose |
|--------|---------|
| `DocumentIntelligenceClient` | Analyze documents, classify documents |
| `DocumentIntelligenceAdministrationClient` | Build/manage custom models and classifiers |

## Prebuilt Models

| Model ID | Description |
|----------|-------------|
| `prebuilt-read` | Extract text, languages, handwriting |
| `prebuilt-layout` | Extract text, tables, selection marks, structure |
| `prebuilt-invoice` | Extract invoice fields (vendor, items, totals) |
| `prebuilt-receipt` | Extract receipt fields (merchant, items, total) |
| `prebuilt-idDocument` | Extract ID document fields (name, DOB, address) |
| `prebuilt-businessCard` | Extract business card fields |
| `prebuilt-tax.us.w2` | Extract W-2 tax form fields |
| `prebuilt-healthInsuranceCard.us` | Extract health insurance card fields |

## Core Workflows

### 1. Analyze Invoice

```csharp
using Azure.AI.DocumentIntelligence;

Uri invoiceUri = new Uri("https://example.com/invoice.pdf");

Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(
    WaitUntil.Completed, 
    "prebuilt-invoice", 
    invoiceUri);

AnalyzeResult result = operation.Value;

foreach (AnalyzedDocument document in result.Documents)
{
    if (document.Fields.TryGetValue("VendorName", out DocumentField vendorNameField)
        && vendorNameField.FieldType == DocumentFieldType.String)
    {
        string vendorName = vendorNameField.ValueString;
        Console.WriteLine($"Vendor Name: '{vendorName}', confidence: {vendorNameField.Confidence}");
    }

    if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField)
        && invoiceTotalField.FieldType == DocumentFieldType.Currency)
    {
        CurrencyValue invoiceTotal = invoiceTotalField.ValueCurrency;
        Console.WriteLine($"Invoice Total: '{invoiceTotal.CurrencySymbol}{invoiceTotal.Amount}'");
    }
    
    // Extract line items
    if (document.Fields.TryGetValue("Items", out DocumentField itemsField)
        && itemsField.FieldType == DocumentFieldType.List)
    {
        foreach (DocumentField item in itemsField.ValueList)
        {
            var itemFields = item.ValueDictionary;
            if (itemFields.TryGetValue("Description", out DocumentField descField))
                Console.WriteLine($"  Item: {descField.ValueString}");
        }
    }
}
```

### 2. Extract Layout (Text, Tables, Structure)

```csharp
Uri fileUri = new Uri("https://example.com/document.pdf");

Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(
    WaitUntil.Completed, 
    "prebuilt-layout", 
    fileUri);

AnalyzeResult result = operation.Value;

// Extract text by page
foreach (DocumentPage page in result.Pages)
{
    Console.WriteLine($"Page {page.PageNumber}: {page.Lines.Count} lines, {page.Words.Count} words");
    
    foreach (DocumentLine line in page.Lines)
    {
        Console.WriteLine($"  Line: '{line.Content}'");
    }
}

// Extract tables
foreach (DocumentTable table in result.Tables)
{
    Console.WriteLine($"Table: {table.RowCount} rows x {table.ColumnCount} columns");
    foreach (DocumentTableCell cell in table.Cells)
    {
        Console.WriteLine($"  Cell ({cell.RowIndex}, {cell.ColumnIndex}): {cell.Content}");
    }
}
```

### 3. Analyze Receipt

```csharp
Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(
    WaitUntil.Completed, 
    "prebuilt-receipt", 
    receiptUri);

AnalyzeResult result = operation.Value;

foreach (AnalyzedDocument document in result.Documents)
{
    if (document.Fields.TryGetValue("MerchantName", out DocumentField merchantField))
        Console.WriteLine($"Merchant: {merchantField.ValueString}");
        
    if (document.Fields.TryGetValue("Total", out DocumentField totalField))
        Console.WriteLine($"Total: {totalField.ValueCurrency.Amount}");
        
    if (document.Fields.TryGetValue("TransactionDate", out DocumentField dateField))
        Console.WriteLine($"Date: {dateField.ValueDate}");
}
```

### 4. Build Custom Model

```csharp
var adminClient = new DocumentIntelligenceAdministrationClient(
    new Uri(endpoint), 
    new AzureKeyCredential(apiKey));

string modelId = "my-custom-model";
Uri blobContainerUri = new Uri("<blob-container-sas-url>");

var blobSource = new BlobContentSource(blobContainerUri);
var options = new BuildDocumentModelOptions(modelId, DocumentBuildMode.Template, blobSource);

Operation<DocumentModelDetails> operation = await adminClient.BuildDocumentModelAsync(
    WaitUntil.Completed, 
    options);

DocumentModelDetails model = operation.Value;

Console.WriteLine($"Model ID: {model.ModelId}");
Console.WriteLine($"Created: {model.CreatedOn}");

foreach (var docType in model.DocumentTypes)
{
    Console.WriteLine($"Document type: {docType.Key}");
    foreach (var field in docType.Value.FieldSchema)
    {
        Console.WriteLine($"  Field: {field.Key}, Confidence: {docType.Value.FieldConfidence[field.Key]}");
    }
}
```

### 5. Build Document Classifier

```csharp
string classifierId = "my-classifier";
Uri blobContainerUri = new Uri("<blob-container-sas-url>");

var sourceA = new BlobContentSource(blobContainerUri) { Prefix = "TypeA/train" };
var sourceB = new BlobContentSource(blobContainerUri) { Prefix = "TypeB/train" };

var docTypes = new Dictionary<string, ClassifierDocumentTypeDetails>()
{
    { "TypeA", new ClassifierDocumentTypeDetails(sourceA) },
    { "TypeB", new ClassifierDocumentTypeDetails(sourceB) }
};

var options = new BuildClassifierOptions(classifierId, docTypes);

Operation<DocumentClassifierDetails> operation = await adminClient.BuildClassifierAsync(
    WaitUntil.Completed, 
    options);

DocumentClassifierDetails classifier = operation.Value;
Console.WriteLine($"Classifier ID: {classifier.ClassifierId}");
```

### 6. Classify Document

```csharp
string classifierId = "my-classifier";
Uri documentUri = new Uri("https://example.com/document.pdf");

var options = new ClassifyDocumentOptions(classifierId, documentUri);

Operation<AnalyzeResult> operation = await client.ClassifyDocumentAsync(
    WaitUntil.Completed, 
    options);

AnalyzeResult result = operation.Value;

foreach (AnalyzedDocument document in result.Documents)
{
    Console.WriteLine($"Document type: {document.DocumentType}, confidence: {document.Confidence}");
}
```

### 7. Manage Models

```csharp
// Get resource details
DocumentIntelligenceResourceDetails resourceDetails = await adminClient.GetResourceDetailsAsync();
Console.WriteLine($"Custom models: {resourceDetails.CustomDocumentModels.Count}/{resourceDetails.CustomDocumentModels.Limit}");

// Get specific model
DocumentModelDetails model = await adminClient.GetModelAsync("my-model-id");
Console.WriteLine($"Model: {model.ModelId}, Created: {model.CreatedOn}");

// List models
await foreach (DocumentModelDetails modelItem in adminClient.GetModelsAsync())
{
    Console.WriteLine($"Model: {modelItem.ModelId}");
}

// Delete model
await adminClient.DeleteModelAsync("my-model-id");
```

## Key Types Reference

| Type | Description |
|------|-------------|
| `DocumentIntelligenceClient` | Main client for analysis |
| `DocumentIntelligenceAdministrationClient` | Model management |
| `AnalyzeResult` | Result of document analysis |
| `AnalyzedDocument` | Single document within result |
| `DocumentField` | Extracted field with value and confidence |
| `DocumentFieldType` | String, Date, Number, Currency, etc. |
| `DocumentPage` | Page info (lines, words, selection marks) |
| `DocumentTable` | Extracted table with cells |
| `DocumentModelDetails` | Custom model metadata |
| `BlobContentSource` | Training data source |

## Build Modes

| Mode | Use Case |
|------|----------|
| `DocumentBuildMode.Template` | Fixed layout documents (forms) |
| `DocumentBuildMode.Neural` | Variable layout documents |

## Best Practices

1. **Use DefaultAzureCredential** for production
2. **Reuse client instances** — clients are thread-safe
3. **Handle long-running operations** — Use `WaitUntil.Completed` for simplicity
4. **Check field confidence** — Always verify `Confidence` property
5. **Use appropriate model** — Prebuilt for common docs, custom for specialized
6. **Use custom subdomain** — Required for Entra ID authentication

## Error Handling

```csharp
using Azure;

try
{
    var operation = await client.AnalyzeDocumentAsync(
        WaitUntil.Completed, 
        "prebuilt-invoice", 
        documentUri);
}
catch (RequestFailedException ex)
{
    Console.WriteLine($"Error: {ex.Status} - {ex.Message}");
}
```

## Related SDKs

| SDK | Purpose | Install |
|-----|---------|---------|
| `Azure.AI.DocumentIntelligence` | Document analysis (this SDK) | `dotnet add package Azure.AI.DocumentIntelligence` |
| `Azure.AI.FormRecognizer` | Legacy SDK (deprecated) | Use DocumentIntelligence instead |

## Reference Links

| Resource | URL |
|----------|-----|
| NuGet Package | https://www.nuget.org/packages/Azure.AI.DocumentIntelligence |
| API Reference | https://learn.microsoft.com/dotnet/api/azure.ai.documentintelligence |
| GitHub Samples | https://github.com/Azure/azure-sdk-for-net/tree/main/sdk/documentintelligence/Azure.AI.DocumentIntelligence/samples |
| Document Intelligence Studio | https://documentintelligence.ai.azure.com/ |
| Prebuilt Models | https://aka.ms/azsdk/formrecognizer/models |

© Microsoft · MIT · microsoft/skills

Похожие скиллы

Все скиллы по теме «Облака: AWS, Azure, GCP» →
azure-functions-csharp официальный github Правило для GitHub Copilot, которое задаёт стандарты разработки Azure Functions на C# в изолированной модели worker. Пригодится, если пишете функции и хотите единый стиль в проекте. ★ 40 451звёзд репо azure-durable-functions-csharp официальный github Задаёт стандарты разработки Azure Durable Functions на C# в изолированной модели воркера. Помогает писать детерминированные оркестраторы и настраивать очереди. ★ 40 451звёзд репо sentry-dotnet-sdk getsentry Скилл проводит через полную настройку Sentry в .NET-проекте: ошибки, трейсинг, логи, профилирование и кроны. Полезен, когда нужно подключить мониторинг в ASP.NET Core, MAUI, WPF или Blazor. CX Codex +1 2 300установок azure-speech-to-text calesthio Транскрибирует аудио в текст через REST API Azure AI Speech с таймкодами слов и разделением по спикерам. Помогает собирать субтитры в пайплайнах OpenMontage без долгой локальной обработки. CX Codex +1 783установок azure-text-to-speech calesthio Генерирует закадровую озвучку через Azure AI Speech REST API. Помогает озвучивать видео в OpenMontage качественными нейросетевыми голосами. CX Codex +1 609установок azure-architecture MicrosoftDocs Скилл помогает проектировать решения на Azure: подбирает архитектурные подходы и ориентирует по справочной документации. Пригодится при работе с AKS, App Service и другими Azure-нагрузками. CX Codex +1 413установок

Из того же набора143

Весь набор →
azure-resource-manager-cosmosdb-dotnet Скилл помогает управлять ресурсами Azure Cosmos DB через Azure Resource Manager в .NET. Он нужен для создания аккаунтов, баз, контейнеров и настройки пропускной способности. 1установок azure-maps-search-dotnet Скилл помогает работать с Azure Maps SDK for .NET: искать адреса, строить маршруты и получать картографические данные. Пригодится при разработке приложений на .NET с функциями геолокации. 1установок azure-eventgrid-dotnet Скилл помогает работать с Azure Event Grid SDK для .NET: публиковать события и разбирать сценарии получения сообщений. Пригодится для кода с EventGridEvent и CloudEvent. 1установок azure-ai-voicelive-dotnet Скилл по Azure AI Voice Live SDK для .NET: помогает собрать голосового ассистента с двусторонним обменом аудио по WebSocket. 1установок slack-to-teams Разбирает существующий Slack-бот и помогает перевести его на Teams или сделать сразу под две платформы. Нужен, когда бот уже работает и его пора тянуть дальше. ★ 3 149звёзд репо m365-agent-evaluator Скилл помогает создавать наборы проверок для декларативных агентов Microsoft 365 Copilot, запускать оценки и разбирать результаты. Пригодится при настройке тестов или поиске причин неудачных проверок. ★ 3 149звёзд репо install-atk Скилл проверяет работу CLI M365 Agents Toolkit и ставит расширение для VS Code. Пригодится, когда нужно развернуть ATK в проекте. ★ 3 149звёзд репо connect Субагент, который связывает один Prompt- или Hosted-агент с базой знаний в Microsoft Foundry, а при отсутствии агента может его создать. ★ 3 149звёзд репо

Спонсоры проекта

Компании, которые помогают держать аналитику открытой