Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
2311c1d
Add preview document extraction provider packages
luisquintanilla Nov 1, 2026
a5b38d0
Simplify preview provider native inspection contracts
luisquintanilla Nov 2, 2026
de2ee76
Migrate extraction providers to abstract client and preserve mixed cells
luisquintanilla Nov 4, 2026
db67441
Align extraction bootstrap with locked Documents and abstract client
luisquintanilla Nov 4, 2026
068010f
docs: write consumer-focused extraction provider guides
luisquintanilla Nov 5, 2026
d2669c5
feat: add optional ONNX layout extraction and uniform provider names
luisquintanilla Nov 5, 2026
cd6917d
feat: support direct and Foundry Mistral OCR in one client
luisquintanilla Nov 5, 2026
caf5ac4
refactor: configure extraction clients and select native runtime expl…
luisquintanilla Nov 5, 2026
069e9bd
Replace PDFium rendering and streamline Azure extraction adapters
luisquintanilla Nov 5, 2026
5e38e58
Forward original PDF inputs through Vision chat adapters
luisquintanilla Nov 5, 2026
e483fe6
Narrow extraction provider review to five independent packages
luisquintanilla Nov 6, 2026
22da273
Add PdfPig ONNX companion with grouped options and fluent builder
luisquintanilla Nov 6, 2026
c3c60d9
Validate hidden model download temporaries across platforms
luisquintanilla Nov 6, 2026
dd25c16
Normalize companion setup package paths across platforms
luisquintanilla Nov 6, 2026
c496328
Add portable extraction assets and explicit experimental API opt-in
luisquintanilla Nov 6, 2026
bfe1d72
Merge portable extraction provider base into ONNX companion
luisquintanilla Nov 6, 2026
7aaf93d
Add netstandard companion assets and actual-package runtime checks
luisquintanilla Nov 6, 2026
ec97836
Separate companion package feed from upstream core bootstrap
luisquintanilla Nov 6, 2026
52932a3
Bundle provider-specific document extraction skills
luisquintanilla Nov 6, 2026
0f7cc76
Add packaged PdfPig ONNX extraction skill
luisquintanilla Nov 6, 2026
9f18729
Add task-specific official references to provider skills
luisquintanilla Nov 6, 2026
8edcb9c
Rename Vision provider to VisionLanguageModel
luisquintanilla Nov 6, 2026
fac9188
Fix extraction provider reading order, figure text and image mapping
luisquintanilla Nov 7, 2026
2939447
Remove dedicated .NET 8 extraction provider support
luisquintanilla Nov 7, 2026
7089d55
Use .NET 10 for companion runtime support
luisquintanilla Nov 7, 2026
7951e8c
Merge revised DocumentExtraction runtime policy base
luisquintanilla Nov 7, 2026
1c71a32
Build extraction dependencies from pinned canonical upstream
luisquintanilla Nov 7, 2026
1e5a6ea
Validate companion against canonical upstream core
luisquintanilla Nov 7, 2026
0fae787
Merge canonical upstream DocumentExtraction validation base
luisquintanilla Nov 7, 2026
c30c817
Match selected provider archives without package-prefix collisions
luisquintanilla Nov 7, 2026
46043c7
Preserve companion dependency sources and package hash guards
luisquintanilla Nov 7, 2026
c074b27
Merge exact provider archive guard correction
luisquintanilla Nov 7, 2026
18cfc95
Reuse NuGet.org source identity for companion dependencies
luisquintanilla Nov 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 112 additions & 0 deletions .github/workflows/document-extraction.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
name: Document extraction

on:
push:
branches: [main]
paths:
- 'DocumentExtraction/**'
- 'Directory.Build.props'
- 'Directory.Build.targets'
- 'Directory.Packages.props'
- 'CommunityToolkit.AI.slnx'
- 'global.json'
- 'eng/Bootstrap-DocumentExtractionCore.ps1'
- 'eng/New-DocumentExtractionNuGetConfig.ps1'
- 'eng/Test-DocumentExtractionPackages.ps1'
- 'eng/DocumentExtraction.PackageSmoke/**'
- 'eng/LegacySupport.props'
- 'Shared/**'
- 'nuget.config'
- '.github/workflows/document-extraction.yml'
pull_request:
branches: [main, 'copilot/*']
paths:
- 'DocumentExtraction/**'
- 'Directory.Build.props'
- 'Directory.Build.targets'
- 'Directory.Packages.props'
- 'CommunityToolkit.AI.slnx'
- 'global.json'
- 'eng/Bootstrap-DocumentExtractionCore.ps1'
- 'eng/New-DocumentExtractionNuGetConfig.ps1'
- 'eng/Test-DocumentExtractionPackages.ps1'
- 'eng/DocumentExtraction.PackageSmoke/**'
- 'eng/LegacySupport.props'
- 'Shared/**'
- 'nuget.config'
- '.github/workflows/document-extraction.yml'
workflow_dispatch:

permissions:
contents: read

env:
DOTNET_NOLOGO: true
DOTNET_CLI_TELEMETRY_OPTOUT: true

jobs:
bootstrap-core:
name: Pack pinned public upstream core
runs-on: windows-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-dotnet@v5
env:
DOTNET_INSTALL_DIR: ${{ runner.temp }}/document-extraction-sdk
with:
dotnet-version: 11.0.100-rc.3.26522.148
- name: Pack original owning upstream projects
shell: pwsh
env:
# Match the verified ordinary owning-project recipe rather than
# enabling upstream CI-only build defaults.
CI: 'false'
run: ./eng/Bootstrap-DocumentExtractionCore.ps1 -OutputDirectory "${{ runner.temp }}/document-extraction-core" -DotnetPath "${{ runner.temp }}/document-extraction-sdk/dotnet.exe"
- uses: actions/upload-artifact@v6
with:
name: document-extraction-core-source-packages
path: |
${{ runner.temp }}/document-extraction-core/*.11.0.0-review.20261106.1.nupkg
${{ runner.temp }}/document-extraction-core/core-bootstrap.json
if-no-files-found: error

build-test-pack:
name: Offline acceptance (${{ matrix.os }})
runs-on: ${{ matrix.os }}
needs: bootstrap-core
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
steps:
- uses: actions/checkout@v6
- uses: actions/setup-dotnet@v5
with:
global-json-file: global.json
- uses: actions/download-artifact@v7
with:
name: document-extraction-core-source-packages
path: ${{ runner.temp }}/document-extraction-core
- name: Configure isolated source-built core feed
shell: pwsh
run: ./eng/New-DocumentExtractionNuGetConfig.ps1 -CorePackageDirectory "${{ runner.temp }}/document-extraction-core" -OutputPath "${{ runner.temp }}/document-extraction-nuget.config"
- name: Restore exact dependencies
run: dotnet restore DocumentExtraction/DocumentExtraction.slnf --configfile "${{ runner.temp }}/document-extraction-nuget.config"
- name: Build
run: dotnet build DocumentExtraction/DocumentExtraction.slnf --no-restore -c Release
- name: Offline tests
run: dotnet test DocumentExtraction/DocumentExtraction.slnf --no-build --no-restore -c Release
- name: Restore portable test dependency closure
run: dotnet restore DocumentExtraction/DocumentExtraction.slnf -p:DocumentExtractionTestAsset=netstandard2.0 --configfile "${{ runner.temp }}/document-extraction-nuget.config"
- name: Offline tests using actual netstandard assets
run: dotnet test DocumentExtraction/DocumentExtraction.slnf --no-restore -c Release -p:DocumentExtractionTestAsset=netstandard2.0
- name: Pack preview artifacts
run: dotnet pack DocumentExtraction/DocumentExtraction.slnf --no-build --no-restore -c Release --output artifacts/document-extraction
- name: Verify packaged assets and experimental opt-in
shell: pwsh
run: ./eng/Test-DocumentExtractionPackages.ps1 -PackageDirectory artifacts/document-extraction -CorePackageDirectory "${{ runner.temp }}/document-extraction-core" -NuGetConfig "${{ runner.temp }}/document-extraction-nuget.config" -OutputDirectory "${{ runner.temp }}/document-extraction-package-checks"
- uses: actions/upload-artifact@v6
with:
name: document-extraction-preview-packages-${{ matrix.os }}
path: artifacts/document-extraction/*.nupkg
if-no-files-found: error
158 changes: 158 additions & 0 deletions .github/workflows/pdfpig-onnx.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
name: PdfPig ONNX companion

on:
pull_request:
branches: [main, luisquintanilla-toolkit-extraction-providers]
paths:
- 'DocumentExtraction/**'
- 'Directory.Build.*'
- 'Directory.Packages.props'
- 'CommunityToolkit.AI.slnx'
- 'global.json'
- 'Shared/LegacySupport/**'
- 'Shared/Throw/**'
- 'eng/LegacySupport.props'
- 'eng/Bootstrap-DocumentExtractionCore.ps1'
- 'eng/New-DocumentExtractionNuGetConfig.ps1'
- 'eng/Test-DocumentExtractionPackages.ps1'
- 'nuget.config'
- '.github/workflows/pdfpig-onnx.yml'
push:
branches: [main]
paths:
- 'DocumentExtraction/**'
- 'Directory.Build.*'
- 'Directory.Packages.props'
- 'CommunityToolkit.AI.slnx'
- 'global.json'
- 'Shared/LegacySupport/**'
- 'Shared/Throw/**'
- 'eng/LegacySupport.props'
- 'eng/Bootstrap-DocumentExtractionCore.ps1'
- 'eng/New-DocumentExtractionNuGetConfig.ps1'
- 'eng/Test-DocumentExtractionPackages.ps1'
- 'nuget.config'
- '.github/workflows/pdfpig-onnx.yml'
workflow_dispatch:

permissions:
contents: read

env:
DOTNET_NOLOGO: true
DOTNET_CLI_TELEMETRY_OPTOUT: true

jobs:
bootstrap-core:
name: Pack pinned public upstream core
runs-on: windows-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-dotnet@v5
env:
DOTNET_INSTALL_DIR: ${{ runner.temp }}/pdfpig-onnx-sdk
with:
dotnet-version: 11.0.100-rc.3.26522.148
- name: Pack original owning upstream projects
shell: pwsh
env:
CI: 'false'
run: ./eng/Bootstrap-DocumentExtractionCore.ps1 -OutputDirectory "${{ runner.temp }}/pdfpig-onnx-core" -DotnetPath "${{ runner.temp }}/pdfpig-onnx-sdk/dotnet.exe"
- uses: actions/upload-artifact@v6
with:
name: pdfpig-onnx-core-source-packages
path: |
${{ runner.temp }}/pdfpig-onnx-core/*.11.0.0-review.20261106.1.nupkg
${{ runner.temp }}/pdfpig-onnx-core/core-bootstrap.json
if-no-files-found: error

companion:
name: Companion contracts and package (${{ matrix.os }})
needs: bootstrap-core
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest]
steps:
- uses: actions/checkout@v6
- uses: actions/setup-dotnet@v5
with:
global-json-file: global.json
- uses: actions/download-artifact@v7
with:
name: pdfpig-onnx-core-source-packages
path: ${{ runner.temp }}/pdfpig-onnx-core
- name: Configure isolated public-source core feed
shell: pwsh
run: |
$configPath = "${{ runner.temp }}/pdfpig-onnx-nuget.config"
./eng/New-DocumentExtractionNuGetConfig.ps1 -CorePackageDirectory "${{ runner.temp }}/pdfpig-onnx-core" -OutputPath "$configPath"
[xml] $config = Get-Content "$configPath" -Raw
$mapping = $config.configuration.packageSourceMapping.packageSource |
Where-Object key -EQ 'document-intelligence-dependency'
foreach ($id in @('PdfPig.Rendering.Skia', 'PdfPig.Filters.*', 'Clipper2')) {
$pattern = $config.CreateElement('package')
$pattern.SetAttribute('pattern', $id)
[void] $mapping.AppendChild($pattern)
}
$config.Save("$configPath")
- name: Restore companion, contracts and example
run: dotnet restore DocumentExtraction/PdfPig.OnnxLayoutAnalysis.slnf --configfile "${{ runner.temp }}/pdfpig-onnx-nuget.config"
- name: Build all library assets and modern applications
run: dotnet build DocumentExtraction/PdfPig.OnnxLayoutAnalysis.slnf --no-restore -c Release
- name: Deterministic tests without curated weights
run: dotnet test DocumentExtraction/test/PdfPig.OnnxLayoutAnalysis.UnitTests --no-build --no-restore -c Release
- name: Run the same contracts against actual netstandard assets on .NET 10
run: |
dotnet restore DocumentExtraction/test/PdfPig.OnnxLayoutAnalysis.UnitTests --configfile "${{ runner.temp }}/pdfpig-onnx-nuget.config" -p:DocumentExtractionTestAsset=netstandard2.0
dotnet test DocumentExtraction/test/PdfPig.OnnxLayoutAnalysis.UnitTests --no-restore -c Release -p:DocumentExtractionTestAsset=netstandard2.0
- name: Offline provisioning checks
shell: pwsh
run: ./DocumentExtraction/src/PdfPig.OnnxLayoutAnalysis/Test-ModelProvisioning.ps1
- name: Pack, inspect archive and run actual package assets with a synthetic graph
shell: pwsh
run: |
$ErrorActionPreference = 'Stop'
dotnet pack DocumentExtraction/src/PdfPig.OnnxLayoutAnalysis --no-build --no-restore -c Release --output "${{ runner.temp }}/pdfpig-onnx-packages"
if ($LASTEXITCODE -ne 0) { throw 'Companion pack failed.' }
$packagePath = Join-Path "${{ runner.temp }}/pdfpig-onnx-packages" 'CommunityToolkit.DocumentExtraction.PdfPig.OnnxLayoutAnalysis.1.0.0-preview.2.nupkg'
$archive = [IO.Compression.ZipFile]::OpenRead($packagePath)
try {
foreach ($name in @(
'tools/Get-Models.ps1', 'tools/models.json',
'README.md', 'CuratedPipeline.NOTICES.txt', 'PdfRendering.NOTICES.txt',
'lib/netstandard2.0/CommunityToolkit.DocumentExtraction.PdfPig.OnnxLayoutAnalysis.dll',
'lib/net10.0/CommunityToolkit.DocumentExtraction.PdfPig.OnnxLayoutAnalysis.dll',
'skills/ctk-document-extraction-pdfpig-onnx-layout-analysis/SKILL.md',
'skills/ctk-document-extraction-pdfpig-onnx-layout-analysis/references/setup.md',
'skills/ctk-document-extraction-pdfpig-onnx-layout-analysis/references/extraction.md',
'skills/ctk-document-extraction-pdfpig-onnx-layout-analysis/references/results.md'
)) {
$entry = $archive.GetEntry($name)
if ($null -eq $entry -or $entry.Length -eq 0) { throw "Missing exact packed asset: $name" }
}
foreach ($entry in $archive.Entries) {
if ($entry.FullName.Contains('//') -or $entry.FullName.Contains('\')) { throw "Noncanonical packed path: $($entry.FullName)" }
if ($entry.FullName -match '\.(onnx|safetensors)$') { throw "Unexpected model weights: $($entry.FullName)" }
if ($entry.FullName -match '^lib/([^/]+)/' -and $Matches[1] -notin @('net10.0', 'netstandard2.0')) { throw "Unexpected library framework: $($entry.FullName)" }
}
Write-Host 'Exact packed setup, notices, skill and both TFM assets verified; no weights.'
}
finally {
$archive.Dispose()
}
$configPath = "${{ runner.temp }}/pdfpig-onnx-nuget.config"
./eng/Test-DocumentExtractionPackages.ps1 -PackageDirectory "${{ runner.temp }}/pdfpig-onnx-packages" -CorePackageDirectory "${{ runner.temp }}/pdfpig-onnx-core" -NuGetConfig "$configPath" -OutputDirectory "${{ runner.temp }}/pdfpig-onnx-consumers" -ConsumerProject ./DocumentExtraction/samples/PdfPigOnnx.PackageSmoke/PdfPigOnnx.PackageSmoke.csproj
- uses: actions/upload-artifact@v6
with:
name: pdfpig-onnx-consumers-${{ matrix.os }}
path: |
${{ runner.temp }}/pdfpig-onnx-consumers/*.json
${{ runner.temp }}/pdfpig-onnx-consumers/*.log
if-no-files-found: error
- uses: actions/upload-artifact@v6
with:
name: pdfpig-onnx-preview-${{ matrix.os }}
path: ${{ runner.temp }}/pdfpig-onnx-packages/CommunityToolkit.DocumentExtraction.PdfPig.OnnxLayoutAnalysis.*.nupkg
if-no-files-found: error
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,7 @@ examples/perl/**/local/*
**cpanfile.snapshot
**/.modules/
**/*.AppHost.TypeScript/nuget.config

# Private review inputs and local test-generation reports.
/.review-inputs/
/.testagent/
21 changes: 21 additions & 0 deletions CommunityToolkit.AI.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,27 @@
<Project Path="MEVD/src/SqlServer/SqlServer.csproj" />
<Project Path="MEVD/src/Weaviate/Weaviate.csproj" />
</Folder>
<Folder Name="/DocumentExtraction/src/">
<File Path="DocumentExtraction/src/Directory.Build.props" />
<Project Path="DocumentExtraction/src/PdfPig/PdfPig.csproj" />
<Project Path="DocumentExtraction/src/PdfPig.OnnxLayoutAnalysis/PdfPig.OnnxLayoutAnalysis.csproj" />
<Project Path="DocumentExtraction/src/AzureContentUnderstanding/AzureContentUnderstanding.csproj" />
<Project Path="DocumentExtraction/src/AzureDocumentIntelligence/AzureDocumentIntelligence.csproj" />
<Project Path="DocumentExtraction/src/Mistral/Mistral.csproj" />
<Project Path="DocumentExtraction/src/VisionLanguageModel/VisionLanguageModel.csproj" />
</Folder>
<Folder Name="/DocumentExtraction/test/">
<File Path="DocumentExtraction/test/Directory.Build.props" />
<Project Path="DocumentExtraction/test/PdfPig.UnitTests/PdfPig.UnitTests.csproj" />
<Project Path="DocumentExtraction/test/PdfPig.OnnxLayoutAnalysis.UnitTests/PdfPig.OnnxLayoutAnalysis.UnitTests.csproj" />
<Project Path="DocumentExtraction/test/AzureContentUnderstanding.UnitTests/AzureContentUnderstanding.UnitTests.csproj" />
<Project Path="DocumentExtraction/test/AzureDocumentIntelligence.UnitTests/AzureDocumentIntelligence.UnitTests.csproj" />
<Project Path="DocumentExtraction/test/Mistral.UnitTests/Mistral.UnitTests.csproj" />
<Project Path="DocumentExtraction/test/VisionLanguageModel.UnitTests/VisionLanguageModel.UnitTests.csproj" />
</Folder>
<Folder Name="/DocumentExtraction/samples/">
<Project Path="DocumentExtraction/samples/PdfPigOnnx/PdfPigOnnx.csproj" />
</Folder>
<Folder Name="/MEVD/test/">
<File Path="MEVD/test/Directory.Build.props" />
<Project Path="MEVD/test/AzureAISearch.UnitTests/AzureAISearch.UnitTests.csproj" />
Expand Down
18 changes: 18 additions & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,24 @@
<PackageVersion Include="sqlite-vec" Version="0.1.7-alpha.2.1" />
</ItemGroup>

<ItemGroup Label="DocumentExtraction">
<PackageVersion Update="Microsoft.Extensions.AI.Abstractions" Version="11.0.0-review.20261106.1" Condition="'$(DocumentExtractionBuild)' == 'true'" />
<PackageVersion Update="System.Text.Json" Version="11.0.0-rc.3.26522.148" Condition="'$(DocumentExtractionBuild)' == 'true'" />
<PackageVersion Include="Microsoft.Extensions.Documents.Abstractions" Version="11.0.0-review.20261106.1" />
<PackageVersion Include="Microsoft.Extensions.DocumentExtraction.Abstractions" Version="11.0.0-review.20261106.1" />
<PackageVersion Include="Azure.AI.ContentUnderstanding" Version="1.1.0" />
<PackageVersion Include="Azure.AI.DocumentIntelligence" Version="1.0.0" />
<PackageVersion Include="Azure.Core" Version="1.53.0" />
<PackageVersion Include="PdfPig" Version="0.1.15" />
<PackageVersion Include="PdfPig.Rendering.Skia" Version="0.1.15.4" />
<PackageVersion Include="Clipper2" Version="1.5.4" />
<PackageVersion Include="Microsoft.ML.OnnxRuntime" Version="1.23.2" />
<PackageVersion Include="Microsoft.ML.OnnxRuntime.Managed" Version="1.23.2" />
<PackageVersion Include="SkiaSharp" Version="3.119.1" />
<PackageVersion Include="SkiaSharp.NativeAssets.Linux.NoDependencies" Version="3.119.1" />
<PackageVersion Include="HarfBuzzSharp.NativeAssets.Linux" Version="8.3.1.2" />
</ItemGroup>

<ItemGroup Label="Build">
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="10.0.401" />
</ItemGroup>
Expand Down
17 changes: 17 additions & 0 deletions DocumentExtraction/DocumentExtraction.slnf
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"solution": {
"path": "../CommunityToolkit.AI.slnx",
"projects": [
"DocumentExtraction/src/PdfPig/PdfPig.csproj",
"DocumentExtraction/src/AzureContentUnderstanding/AzureContentUnderstanding.csproj",
"DocumentExtraction/src/AzureDocumentIntelligence/AzureDocumentIntelligence.csproj",
"DocumentExtraction/src/Mistral/Mistral.csproj",
"DocumentExtraction/src/VisionLanguageModel/VisionLanguageModel.csproj",
"DocumentExtraction/test/PdfPig.UnitTests/PdfPig.UnitTests.csproj",
"DocumentExtraction/test/AzureContentUnderstanding.UnitTests/AzureContentUnderstanding.UnitTests.csproj",
"DocumentExtraction/test/AzureDocumentIntelligence.UnitTests/AzureDocumentIntelligence.UnitTests.csproj",
"DocumentExtraction/test/Mistral.UnitTests/Mistral.UnitTests.csproj",
"DocumentExtraction/test/VisionLanguageModel.UnitTests/VisionLanguageModel.UnitTests.csproj"
]
}
}
10 changes: 10 additions & 0 deletions DocumentExtraction/PdfPig.OnnxLayoutAnalysis.slnf
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"solution": {
"path": "../CommunityToolkit.AI.slnx",
"projects": [
"DocumentExtraction/src/PdfPig.OnnxLayoutAnalysis/PdfPig.OnnxLayoutAnalysis.csproj",
"DocumentExtraction/test/PdfPig.OnnxLayoutAnalysis.UnitTests/PdfPig.OnnxLayoutAnalysis.UnitTests.csproj",
"DocumentExtraction/samples/PdfPigOnnx/PdfPigOnnx.csproj"
]
}
}
Loading
Loading