Skill Tracer
Skills › Scientific Agent Skills › markitdown › cloud_and_ocr.md

cloud_and_ocr.md

351 lines · skills/markitdown/references/cloud_and_ocr.md at 5f2bc03

Open on GitHub
1# Vision, OCR, and Azure Extraction
2
3This guide distinguishes four different features that are often conflated:
4
51. Built-in image metadata/description
62. Official `markitdown-ocr` vision plugin
73. Azure Document Intelligence
84. Azure Content Understanding
9
10All examples target MarkItDown 0.1.8. Hosted examples are illustrative: October 1, 2026 verification used installed SDKs, official source, and synthetic mocked requests, not authenticated service calls.

Vision, OCR, and Azure Extraction

This guide distinguishes four different features that are often conflated:

  1. Built-in image metadata/description
  2. Official markitdown-ocr vision plugin
  3. Azure Document Intelligence
  4. Azure Content Understanding

All examples target MarkItDown 0.1.8. Hosted examples are illustrative: October 1, 2026 verification used installed SDKs, official source, and synthetic mocked requests, not authenticated service calls.

Raw lines 1 to 11
12## Decision Guide
14| Requirement | Best fit |
15|---|---|
16| Describe a standalone JPEG/PNG or images on PPTX slides | Built-in `llm_client` path |
17| Read text from PDF/DOCX/PPTX/XLSX embedded images | `markitdown-ocr` |
18| OCR scanned PDFs with Azure layout extraction | Document Intelligence |
19| Custom fields, YAML front matter, video, or richer multimodal analysis | Content Understanding |
20| Data must remain local | Use a separate local OCR/layout parser |
22None of the first four options is a local Tesseract workflow.

Decision Guide

RequirementBest fit
Describe a standalone JPEG/PNG or images on PPTX slidesBuilt-in llm_client path
Read text from PDF/DOCX/PPTX/XLSX embedded imagesmarkitdown-ocr
OCR scanned PDFs with Azure layout extractionDocument Intelligence
Custom fields, YAML front matter, video, or richer multimodal analysisContent Understanding
Data must remain localUse a separate local OCR/layout parser

None of the first four options is a local Tesseract workflow.

Raw lines 12 to 23
24## Data-Handling Rule
26Before using an external service:
28- Identify the exact provider, endpoint, region, account, and model/analyzer.
29- Tell the user which source bytes, images, audio, video, and prompts will leave the machine.
30- Confirm that the provider is approved for the source's classification and regulatory requirements.
31- Estimate cost and retention implications.
32- Send only the required files/pages.
33- Never log API keys, bearer tokens, source bytes, or full base64 payloads.

Data-Handling Rule

Before using an external service:

  • Identify the exact provider, endpoint, region, account, and model/analyzer.
  • Tell the user which source bytes, images, audio, video, and prompts will leave the machine.
  • Confirm that the provider is approved for the source's classification and regulatory requirements.
  • Estimate cost and retention implications.
  • Send only the required files/pages.
  • Never log API keys, bearer tokens, source bytes, or full base64 payloads.
Raw lines 24 to 34
35## Built-in Image Descriptions
37The built-in JPEG/PNG and PPTX paths can call an OpenAI-compatible client. MarkItDown encodes image bytes as a data URI and calls:
39```text
40client.chat.completions.create(model=..., messages=...)
41```
43Install a reviewed client version:
45```bash
46uv pip install "markitdown[pptx]==0.1.8" "openai==3.22.1"
47```
49```python
50import os
52from markitdown import MarkItDown
53from openai import OpenAI
55# The SDK obtains only its named provider credential through its normal
56# configuration. The image and prompt are sent to that provider.
57client = OpenAI()
59converter = MarkItDown(
60 llm_client=client,
61 llm_model=os.environ["MARKITDOWN_VISION_MODEL"],
62 llm_prompt=(
63 "Describe the scientific figure. Transcribe visible labels, identify "
64 "axes and units, and report trends without inventing missing values."
65 ),
68result = converter.convert_local("figure.png")
69print(result.markdown)
70```
72Set `MARKITDOWN_VISION_MODEL` to an approved model supporting image input on Chat Completions. This variable belongs to the example, not MarkItDown itself. Client/model availability is provider-specific. With `OpenAI()`, the SDK reads `OPENAI_API_KEY` and sends `POST https://api.openai.com/v1/chat/completions` using bearer authentication. The body contains `model` and one user message with `text` plus `image_url.url="data:image/png;base64,..."`; MarkItDown reads `choices[0].message.content`. It does not use the image-generation or Responses endpoints. Empty/refused responses require explicit quality checks.

Built-in Image Descriptions

The built-in JPEG/PNG and PPTX paths can call an OpenAI-compatible client. MarkItDown encodes image bytes as a data URI and calls:

client.chat.completions.create(model=..., messages=...)

Install a reviewed client version:

uv pip install "markitdown[pptx]==0.1.8" "openai==3.22.1"
import os

from markitdown import MarkItDown
from openai import OpenAI

# The SDK obtains only its named provider credential through its normal
# configuration. The image and prompt are sent to that provider.
client = OpenAI()

converter = MarkItDown(
    llm_client=client,
    llm_model=os.environ["MARKITDOWN_VISION_MODEL"],
    llm_prompt=(
        "Describe the scientific figure. Transcribe visible labels, identify "
        "axes and units, and report trends without inventing missing values."
    ),
)

result = converter.convert_local("figure.png")
print(result.markdown)

Set MARKITDOWN_VISION_MODEL to an approved model supporting image input on Chat Completions. This variable belongs to the example, not MarkItDown itself. Client/model availability is provider-specific. With OpenAI(), the SDK reads OPENAI_API_KEY and sends POST https://api.openai.com/v1/chat/completions using bearer authentication. The body contains model and one user message with text plus image_url.url="data:image/png;base64,..."; MarkItDown reads choices[0].message.content. It does not use the image-generation or Responses endpoints. Empty/refused responses require explicit quality checks.

Raw lines 35 to 73
74### Limitations
76- Built-in image conversion accepts JPEG and PNG.
77- Without ExifTool or an LLM client, output can be empty.
78- A description is not guaranteed OCR or quantitative chart extraction.
79- Generated descriptions can hallucinate labels, values, or relationships.
80- Always compare critical claims with the original image.

Limitations

  • Built-in image conversion accepts JPEG and PNG.
  • Without ExifTool or an LLM client, output can be empty.
  • A description is not guaranteed OCR or quantitative chart extraction.
  • Generated descriptions can hallucinate labels, values, or relationships.
  • Always compare critical claims with the original image.
Raw lines 74 to 81
82## Official `markitdown-ocr` Plugin
84Core 0.1.6 introduced the official monorepo plugin. The current plugin is 0.1.1 and requires `markitdown>=0.1.8,<0.2.0`; it reuses the core Office image-rendering hooks.
86Install exact versions:
88```bash
89uv pip install \
90 "markitdown==0.1.8" \
91 "markitdown-ocr==0.1.1" \
92 "openai==3.22.1"
93```
95Review discovery before activation:
97```bash
98markitdown --list-plugins
99```
101Configure through Python:
103```python
104import os
106from markitdown import MarkItDown
107from openai import OpenAI
109converter = MarkItDown(
110 enable_plugins=True,
111 llm_client=OpenAI(),
112 llm_model=os.environ["MARKITDOWN_VISION_MODEL"],
113 llm_prompt=(
114 "Extract all visible text exactly. Preserve table rows, columns, "
115 "symbols, signs, decimal points, and units. Do not summarize."
116 ),
119result = converter.convert_local("scanned-paper.pdf")
120print(result.markdown)
121```

Official markitdown-ocr Plugin

Core 0.1.6 introduced the official monorepo plugin. The current plugin is 0.1.1 and requires markitdown>=0.1.8,<0.2.0; it reuses the core Office image-rendering hooks.

Install exact versions:

uv pip install \
  "markitdown==0.1.8" \
  "markitdown-ocr==0.1.1" \
  "openai==3.22.1"

Review discovery before activation:

markitdown --list-plugins

Configure through Python:

import os

from markitdown import MarkItDown
from openai import OpenAI

converter = MarkItDown(
    enable_plugins=True,
    llm_client=OpenAI(),
    llm_model=os.environ["MARKITDOWN_VISION_MODEL"],
    llm_prompt=(
        "Extract all visible text exactly. Preserve table rows, columns, "
        "symbols, signs, decimal points, and units. Do not summarize."
    ),
)

result = converter.convert_local("scanned-paper.pdf")
print(result.markdown)
Raw lines 82 to 122
123### Supported plugin paths
125- PDF embedded images, interleaved by page position
126- Full-page rendering fallback for scanned PDF pages without extractable text
127- PyMuPDF rendering fallback for some malformed PDFs
128- DOCX embedded images
129- PPTX image shapes, placeholders, and grouped images: native LLM captions run first; OCR is the fallback when no caption is returned
130- XLSX worksheet images after each sheet's table, not interleaved with cell rows; legacy XLS has no image OCR
132OCR blocks are inserted using markers similar to:
134```text
135*[Image OCR]
136<extracted text>
137[End OCR]*
138```

Supported plugin paths

  • PDF embedded images, interleaved by page position
  • Full-page rendering fallback for scanned PDF pages without extractable text
  • PyMuPDF rendering fallback for some malformed PDFs
  • DOCX embedded images
  • PPTX image shapes, placeholders, and grouped images: native LLM captions run first; OCR is the fallback when no caption is returned
  • XLSX worksheet images after each sheet's table, not interleaved with cell rows; legacy XLS has no image OCR

OCR blocks are inserted using markers similar to:

*[Image OCR]
<extracted text>
[End OCR]*
Raw lines 123 to 139
140### Operational behavior
142- The plugin registers enhanced converters at priority `-1.0`, ahead of built-ins.
143- Selected images/pages can become provider calls. Office OCR caches repeated image bytes per conversion; native PPTX caption calls precede that OCR cache. Do not assume one call per document.
144- If a provider call fails, conversion can continue without that image's OCR.
145- If no `llm_client` is supplied, the plugin loads but silently falls back to standard conversion.
146- Large scanned documents can be expensive and slow because pages are rendered at 300 DPI.

Operational behavior

  • The plugin registers enhanced converters at priority -1.0, ahead of built-ins.
  • Selected images/pages can become provider calls. Office OCR caches repeated image bytes per conversion; native PPTX caption calls precede that OCR cache. Do not assume one call per document.
  • If a provider call fails, conversion can continue without that image's OCR.
  • If no llm_client is supplied, the plugin loads but silently falls back to standard conversion.
  • Large scanned documents can be expensive and slow because pages are rendered at 300 DPI.
Raw lines 140 to 147
148### CLI discrepancy in 0.1.8
150The plugin README shows `--llm-client` and `--llm-model`, but MarkItDown 0.1.8's core CLI parser does not define those options. Use the Python API above rather than copying that CLI example.

CLI discrepancy in 0.1.8

The plugin README shows --llm-client and --llm-model, but MarkItDown 0.1.8's core CLI parser does not define those options. Use the Python API above rather than copying that CLI example.

Raw lines 148 to 151
152## Azure Document Intelligence
154Install:
156```bash
157uv pip install "markitdown[az-doc-intel]==0.1.8"
158```
160The converter sends the complete file to Azure's `prebuilt-layout` analyzer and requests Markdown output. For PDF/images it enables formula extraction, high-resolution OCR, and font-style analysis.

Azure Document Intelligence

Install:

uv pip install "markitdown[az-doc-intel]==0.1.8"

The converter sends the complete file to Azure's prebuilt-layout analyzer and requests Markdown output. For PDF/images it enables formula extraction, high-resolution OCR, and font-style analysis.

Raw lines 152 to 161
162### Authentication
164If no explicit credential is supplied, MarkItDown:
1661. Uses the named `AZURE_API_KEY` value with `AzureKeyCredential` when present.
1672. Otherwise uses `DefaultAzureCredential`.
169Prefer workload identity, managed identity, or another `DefaultAzureCredential` source over long-lived keys.

Authentication

If no explicit credential is supplied, MarkItDown:

  1. Uses the named AZURE_API_KEY value with AzureKeyCredential when present.
  2. Otherwise uses DefaultAzureCredential.

Prefer workload identity, managed identity, or another DefaultAzureCredential source over long-lived keys.

Raw lines 162 to 170
171### CLI
173```bash
174markitdown report.pdf \
175 --use-docintel \
176 --endpoint "https://RESOURCE.cognitiveservices.azure.com/" \
177 -o report.md
178```
180The CLI requires a filename; stdin is not accepted with this mode.

CLI

markitdown report.pdf \
  --use-docintel \
  --endpoint "https://RESOURCE.cognitiveservices.azure.com/" \
  -o report.md

The CLI requires a filename; stdin is not accepted with this mode.

Raw lines 171 to 181
182### Python
184```python
185from azure.identity import DefaultAzureCredential
186from markitdown import MarkItDown
188converter = MarkItDown(
189 docintel_endpoint="https://RESOURCE.cognitiveservices.azure.com/",
190 docintel_credential=DefaultAzureCredential(),
193result = converter.convert_local("report.pdf")
194print(result.markdown)
195```
197Restrict routing:
199```python
200from markitdown import MarkItDown
201from markitdown.converters import DocumentIntelligenceFileType
203converter = MarkItDown(
204 docintel_endpoint="https://RESOURCE.cognitiveservices.azure.com/",
205 docintel_file_types=[
206 DocumentIntelligenceFileType.PDF,
207 DocumentIntelligenceFileType.PNG,
208 ],
210```
212Supported enum values include DOCX, PPTX, XLSX, HTML, PDF, JPEG, PNG, BMP, and TIFF. The default list excludes HTML.
214MarkItDown 0.1.8 sets `docintel_api_version=None` by default and lets the installed SDK choose. Tested `azure-ai-documentintelligence==1.0.2` uses `2024-11-30`; set `docintel_api_version="2024-11-30"` for an explicit service pin. The CLI has no API-version flag. Its endpoint also accepts `MARKITDOWN_DOCINTEL_ENDPOINT` as a fallback.
216The SDK submits `POST {endpoint}/documentintelligence/documentModels/prebuilt-layout:analyze?api-version=2024-11-30` with a JSON `base64Source` (serialized from `AnalyzeDocumentRequest(bytes_source=...)`), `outputContentFormat=markdown`, and applicable `features`. It polls the response's `Operation-Location` after HTTP 202 and returns `AnalyzeResult.content`. The converter removes HTML comments, including page comments: keep separate page provenance when required. API-key authentication uses `Ocp-Apim-Subscription-Key`; token credentials use the Azure Cognitive Services scope.

Python

from azure.identity import DefaultAzureCredential
from markitdown import MarkItDown

converter = MarkItDown(
    docintel_endpoint="https://RESOURCE.cognitiveservices.azure.com/",
    docintel_credential=DefaultAzureCredential(),
)

result = converter.convert_local("report.pdf")
print(result.markdown)

Restrict routing:

from markitdown import MarkItDown
from markitdown.converters import DocumentIntelligenceFileType

converter = MarkItDown(
    docintel_endpoint="https://RESOURCE.cognitiveservices.azure.com/",
    docintel_file_types=[
        DocumentIntelligenceFileType.PDF,
        DocumentIntelligenceFileType.PNG,
    ],
)

Supported enum values include DOCX, PPTX, XLSX, HTML, PDF, JPEG, PNG, BMP, and TIFF. The default list excludes HTML.

MarkItDown 0.1.8 sets docintel_api_version=None by default and lets the installed SDK choose. Tested azure-ai-documentintelligence==1.0.2 uses 2024-11-30; set docintel_api_version="2024-11-30" for an explicit service pin. The CLI has no API-version flag. Its endpoint also accepts MARKITDOWN_DOCINTEL_ENDPOINT as a fallback.

The SDK submits POST {endpoint}/documentintelligence/documentModels/prebuilt-layout:analyze?api-version=2024-11-30 with a JSON base64Source (serialized from AnalyzeDocumentRequest(bytes_source=...)), outputContentFormat=markdown, and applicable features. It polls the response's Operation-Location after HTTP 202 and returns AnalyzeResult.content. The converter removes HTML comments, including page comments: keep separate page provenance when required. API-key authentication uses Ocp-Apim-Subscription-Key; token credentials use the Azure Cognitive Services scope.

Raw lines 182 to 217
218## Azure Content Understanding
220Install:
222```bash
223uv pip install "markitdown[az-content-understanding]==0.1.8" "azure-ai-contentunderstanding==1.2.0b3"
224```
226This core release requires `azure-ai-contentunderstanding>=1.2.0b1` for the
227`to_llm_input()` helper. The tested 1.2.0b3 SDK defaults to service API
228`2026-06-01-preview`. MarkItDown exposes **no `cu_api_version` option** and
229constructs the SDK client itself; passing that unknown keyword does not pin the
230API. If GA-only service API `2025-11-01` is required, use the Azure SDK directly
231with an explicit API version and `to_llm_input()` instead of claiming this
232MarkItDown wrapper is pinned to GA.
234Use the exact Foundry resource endpoint from Azure (typically
235`https://RESOURCE.services.ai.azure.com/`). Provision model deployments and the
236required prebuilt-analyzer model aliases on that resource before conversion;
237MarkItDown does not configure deployments or default model mappings.
239Content Understanding provides:
241- Document/image/audio/video analyzers
242- Prebuilt analyzer auto-routing
243- Optional custom analyzers
244- Structured fields serialized as YAML front matter
245- One endpoint across supported modalities
247Every routed `convert()`/`convert_local()` call is an Azure API call and may be billable. An unknown/custom analyzer also triggers `get_analyzer()` during construction to resolve modality; known prebuilt IDs use the local routing table. Credentials follow the same explicit credential / `AZURE_API_KEY` / `DefaultAzureCredential` order as Document Intelligence.

Azure Content Understanding

Install:

uv pip install "markitdown[az-content-understanding]==0.1.8" "azure-ai-contentunderstanding==1.2.0b3"

This core release requires azure-ai-contentunderstanding>=1.2.0b1 for the to_llm_input() helper. The tested 1.2.0b3 SDK defaults to service API 2026-06-01-preview. MarkItDown exposes **no cu_api_version option** and constructs the SDK client itself; passing that unknown keyword does not pin the API. If GA-only service API 2025-11-01 is required, use the Azure SDK directly with an explicit API version and to_llm_input() instead of claiming this MarkItDown wrapper is pinned to GA.

Use the exact Foundry resource endpoint from Azure (typically https://RESOURCE.services.ai.azure.com/). Provision model deployments and the required prebuilt-analyzer model aliases on that resource before conversion; MarkItDown does not configure deployments or default model mappings.

Content Understanding provides:

  • Document/image/audio/video analyzers
  • Prebuilt analyzer auto-routing
  • Optional custom analyzers
  • Structured fields serialized as YAML front matter
  • One endpoint across supported modalities

Every routed convert()/convert_local() call is an Azure API call and may be billable. An unknown/custom analyzer also triggers get_analyzer() during construction to resolve modality; known prebuilt IDs use the local routing table. Credentials follow the same explicit credential / AZURE_API_KEY / DefaultAzureCredential order as Document Intelligence.

Raw lines 218 to 248
249### CLI
251```bash
252markitdown interview.mp4 \
253 --use-cu \
254 --cu-endpoint "https://RESOURCE.services.ai.azure.com/" \
255 --cu-file-types mp4 \
256 -o interview.md
257```
259With a custom analyzer:
261```bash
262markitdown invoice.pdf \
263 --use-cu \
264 --cu-endpoint "https://RESOURCE.services.ai.azure.com/" \
265 --cu-analyzer "my-invoice-analyzer" \
266 --cu-file-types pdf \
267 -o invoice.md
268```

CLI

markitdown interview.mp4 \
  --use-cu \
  --cu-endpoint "https://RESOURCE.services.ai.azure.com/" \
  --cu-file-types mp4 \
  -o interview.md

With a custom analyzer:

markitdown invoice.pdf \
  --use-cu \
  --cu-endpoint "https://RESOURCE.services.ai.azure.com/" \
  --cu-analyzer "my-invoice-analyzer" \
  --cu-file-types pdf \
  -o invoice.md
Raw lines 249 to 269
270### Python
272```python
273from azure.identity import DefaultAzureCredential
274from markitdown import MarkItDown
275from markitdown.converters import ContentUnderstandingFileType
277converter = MarkItDown(
278 cu_endpoint="https://RESOURCE.services.ai.azure.com/",
279 cu_credential=DefaultAzureCredential(),
280 cu_file_types=[
281 ContentUnderstandingFileType.PDF,
282 ContentUnderstandingFileType.PNG,
283 ],
286result = converter.convert_local("report.pdf")
287print(result.markdown)
288```
290Custom analyzer:
292```python
293converter = MarkItDown(
294 cu_endpoint="https://RESOURCE.services.ai.azure.com/",
295 cu_credential=DefaultAzureCredential(),
296 cu_analyzer_id="my-contract-analyzer",
297 cu_file_types=[ContentUnderstandingFileType.PDF],
299```
301When the custom analyzer's modality is incompatible with an input, the converter falls back to the matching prebuilt analyzer.

Python

from azure.identity import DefaultAzureCredential
from markitdown import MarkItDown
from markitdown.converters import ContentUnderstandingFileType

converter = MarkItDown(
    cu_endpoint="https://RESOURCE.services.ai.azure.com/",
    cu_credential=DefaultAzureCredential(),
    cu_file_types=[
        ContentUnderstandingFileType.PDF,
        ContentUnderstandingFileType.PNG,
    ],
)

result = converter.convert_local("report.pdf")
print(result.markdown)

Custom analyzer:

converter = MarkItDown(
    cu_endpoint="https://RESOURCE.services.ai.azure.com/",
    cu_credential=DefaultAzureCredential(),
    cu_analyzer_id="my-contract-analyzer",
    cu_file_types=[ContentUnderstandingFileType.PDF],
)

When the custom analyzer's modality is incompatible with an input, the converter falls back to the matching prebuilt analyzer.

Raw lines 270 to 302
303### SDK request contract
305For the tested SDK, `begin_analyze_binary(analyzer_id=..., binary_input=bytes,
306content_type=...)` submits `POST {endpoint}/contentunderstanding/analyzers/{id}:analyzeBinary?api-version=2026-06-01-preview` with the actual file bytes and a matching media type. An HTTP 202 result is polled using `Operation-Location`; the result is formatted with `to_llm_input(result)`, including available fields, warnings, and page/time metadata. Unknown analyzer lookup is `GET {endpoint}/contentunderstanding/analyzers/{id}` with the same API version. These are single operations/polling, not paginated list calls. The SDK controls retries and polling; the wrapper does not expose response objects or per-call polling settings.
308The CLI accepts `MARKITDOWN_CU_ENDPOINT` as its endpoint fallback and supports binary stdin with format hints. It does not expose an LLM/model/API-version flag.

SDK request contract

For the tested SDK, begin_analyze_binary(analyzer_id=..., binary_input=bytes, content_type=...) submits POST {endpoint}/contentunderstanding/analyzers/{id}:analyzeBinary?api-version=2026-06-01-preview with the actual file bytes and a matching media type. An HTTP 202 result is polled using Operation-Location; the result is formatted with to_llm_input(result), including available fields, warnings, and page/time metadata. Unknown analyzer lookup is GET {endpoint}/contentunderstanding/analyzers/{id} with the same API version. These are single operations/polling, not paginated list calls. The SDK controls retries and polling; the wrapper does not expose response objects or per-call polling settings.

The CLI accepts MARKITDOWN_CU_ENDPOINT as its endpoint fallback and supports binary stdin with format hints. It does not expose an LLM/model/API-version flag.

Raw lines 303 to 309
310### Default prebuilt routing
312| Modality | Analyzer |
313|---|---|
314| Document | `prebuilt-documentSearch` |
315| Image | `prebuilt-documentSearch` |
316| Audio | `prebuilt-audioSearch` |
317| Video | `prebuilt-videoSearch` |

Default prebuilt routing

ModalityAnalyzer
Documentprebuilt-documentSearch
Imageprebuilt-documentSearch
Audioprebuilt-audioSearch
Videoprebuilt-videoSearch
Raw lines 310 to 318
319## Choosing Between Azure Services
321| Capability | Built-in | Document Intelligence | Content Understanding |
322|---|---|---|---|
323| Local text extraction | Yes | No | No |
324| Scanned PDF OCR | No | Yes | Yes |
325| Office conversion | Yes | Yes | Yes |
326| Structured custom fields | No | Not exposed by this integration | Yes |
327| Video | No | No | Yes |
328| Custom analyzer | No | Not exposed by this integration | Yes |
329| YAML field front matter | No | No | Yes |
330| External cost | No for local-only paths | Yes | Yes |

Choosing Between Azure Services

CapabilityBuilt-inDocument IntelligenceContent Understanding
Local text extractionYesNoNo
Scanned PDF OCRNoYesYes
Office conversionYesYesYes
Structured custom fieldsNoNot exposed by this integrationYes
VideoNoNoYes
Custom analyzerNoNot exposed by this integrationYes
YAML field front matterNoNoYes
External costNo for local-only pathsYesYes
Raw lines 319 to 331
332## Validation for OCR/Cloud Output
3341. Record the package/plugin version, provider, model/analyzer, endpoint region, and date.
3352. Compare a sample of pages against the source.
3363. Check minus signs, decimal points, Greek letters, superscripts, units, and table boundaries.
3374. Flag uncertain or illegible spans instead of silently normalizing them.
3385. Reconcile page counts and section headings.
3396. Keep the original artifact and provider response provenance.

Validation for OCR/Cloud Output

  1. Record the package/plugin version, provider, model/analyzer, endpoint region, and date.
  2. Compare a sample of pages against the source.
  3. Check minus signs, decimal points, Greek letters, superscripts, units, and table boundaries.
  4. Flag uncertain or illegible spans instead of silently normalizing them.
  5. Reconcile page counts and section headings.
  6. Keep the original artifact and provider response provenance.
Raw lines 332 to 340
341## Sources
343- MarkItDown 0.1.8 guide: https://github.com/microsoft/markitdown/blob/v0.1.8/README.md
344- OCR plugin 0.1.1: https://github.com/microsoft/markitdown/tree/v0.1.8/packages/markitdown-ocr
345- Document Intelligence converter: https://github.com/microsoft/markitdown/blob/v0.1.8/packages/markitdown/src/markitdown/converters/_doc_intel_converter.py
346- Content Understanding converter: https://github.com/microsoft/markitdown/blob/v0.1.8/packages/markitdown/src/markitdown/converters/_cu_converter.py
348- OpenAI Chat Completions contract: https://developers.openai.com/api/reference/resources/chat
349- Azure Document Intelligence analyze: https://learn.microsoft.com/en-us/rest/api/aiservices/document-models/analyze-document?view=rest-aiservices-v4.0+(2024-11-30)
350- Azure CU SDK versions/setup: https://learn.microsoft.com/en-us/python/api/overview/azure/ai-contentunderstanding-readme?view=azure-python-preview
351- Azure CU SDK source (preview contract): https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-contentunderstanding_1.2.0b3/sdk/contentunderstanding/azure-ai-contentunderstanding

Sources

  • MarkItDown 0.1.8 guide: https://github.com/microsoft/markitdown/blob/v0.1.8/README.md
  • OCR plugin 0.1.1: https://github.com/microsoft/markitdown/tree/v0.1.8/packages/markitdown-ocr
  • Document Intelligence converter: https://github.com/microsoft/markitdown/blob/v0.1.8/packages/markitdown/src/markitdown/converters/_doc_intel_converter.py
  • Content Understanding converter: https://github.com/microsoft/markitdown/blob/v0.1.8/packages/markitdown/src/markitdown/converters/_cu_converter.py
  • OpenAI Chat Completions contract: https://developers.openai.com/api/reference/resources/chat
  • Azure Document Intelligence analyze: https://learn.microsoft.com/en-us/rest/api/aiservices/document-models/analyze-document?view=rest-aiservices-v4.0+(2024-11-30)
  • Azure CU SDK versions/setup: https://learn.microsoft.com/en-us/python/api/overview/azure/ai-contentunderstanding-readme?view=azure-python-preview
  • Azure CU SDK source (preview contract): https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-contentunderstanding_1.2.0b3/sdk/contentunderstanding/azure-ai-contentunderstanding
Raw lines 341 to 351