Propagate IModel API changes across Python, JS, Rust SDKs and update C# docs #35
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Samples Build Check | |
| on: | |
| pull_request: | |
| paths: | |
| - 'samples/**' | |
| - '.github/workflows/samples-integration-test.yml' | |
| push: | |
| paths: | |
| - 'samples/**' | |
| - '.github/workflows/samples-integration-test.yml' | |
| branches: | |
| - main | |
| workflow_dispatch: | |
| permissions: | |
| contents: read | |
| jobs: | |
| # ── Python Samples ────────────────────────────────────────────────── | |
| python-samples: | |
| runs-on: ${{ matrix.platform }}-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| platform: [windows, macos] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| clean: true | |
| - name: Setup Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.12' | |
| - name: Configure pip for Azure Artifacts | |
| run: | | |
| pip config set global.index-url https://pkgs.dev.azure.com/aiinfra/PublicPackages/_packaging/ORT-Nightly/pypi/simple/ | |
| pip config set global.extra-index-url https://pypi.org/simple/ | |
| pip config set global.pre true | |
| - name: Build and install SDK from source | |
| working-directory: sdk/python | |
| shell: pwsh | |
| run: | | |
| python -m pip install build | |
| echo '__version__ = "0.0.0-dev"' > src/version.py | |
| python -m build --wheel --outdir dist/ | |
| $wheel = (Get-ChildItem dist/*.whl | Select-Object -First 1).FullName | |
| pip install $wheel | |
| - name: Install sample dependencies | |
| shell: pwsh | |
| run: | | |
| Get-ChildItem samples/python/*/requirements.txt -ErrorAction SilentlyContinue | ForEach-Object { | |
| Write-Host "Installing dependencies for $($_.Directory.Name)..." | |
| pip install -r $_.FullName | |
| } | |
| - name: Syntax check Python samples | |
| shell: pwsh | |
| run: | | |
| $failed = @() | |
| $samples = Get-ChildItem samples/python/*/src/app.py -ErrorAction SilentlyContinue | |
| foreach ($sample in $samples) { | |
| $name = $sample.Directory.Parent.Name | |
| Write-Host "=== Checking: $name ===" | |
| python -m py_compile $sample.FullName | |
| if ($LASTEXITCODE -ne 0) { | |
| Write-Host "FAILED: $name" | |
| $failed += $name | |
| } else { | |
| Write-Host "OK: $name" | |
| } | |
| } | |
| if ($failed.Count -gt 0) { | |
| Write-Error "Failed syntax checks: $($failed -join ', ')" | |
| exit 1 | |
| } | |
| # ── JavaScript Samples ────────────────────────────────────────────── | |
| js-samples: | |
| runs-on: ${{ matrix.platform }}-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| platform: [windows, macos] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| clean: true | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20.x' | |
| - name: Setup .NET SDK for NuGet authentication | |
| uses: actions/setup-dotnet@v5 | |
| with: | |
| dotnet-version: '10.0.x' | |
| - name: Build SDK from source | |
| working-directory: sdk/js | |
| run: | | |
| npm install | |
| npm run build | |
| npm link | |
| - name: Syntax check JS samples | |
| shell: pwsh | |
| run: | | |
| $failed = @() | |
| # Find all sample app.js files (either in root or src/) | |
| $samples = @() | |
| $samples += Get-ChildItem samples/js/*/app.js -ErrorAction SilentlyContinue | |
| $samples += Get-ChildItem samples/js/*/src/app.js -ErrorAction SilentlyContinue | |
| foreach ($sample in $samples) { | |
| $dir = if ($sample.Directory.Name -eq 'src') { $sample.Directory.Parent } else { $sample.Directory } | |
| $name = $dir.Name | |
| Write-Host "=== Checking: $name ===" | |
| # Link SDK and install dependencies | |
| Push-Location $dir.FullName | |
| npm link foundry-local-sdk 2>$null | |
| if (Test-Path "package.json") { npm install 2>$null } | |
| Pop-Location | |
| # Syntax check | |
| node --check $sample.FullName 2>&1 | |
| if ($LASTEXITCODE -ne 0) { | |
| Write-Host "FAILED: $name" | |
| $failed += $name | |
| } else { | |
| Write-Host "OK: $name" | |
| } | |
| } | |
| if ($failed.Count -gt 0) { | |
| Write-Error "Failed syntax checks: $($failed -join ', ')" | |
| exit 1 | |
| } | |
| # ── C# Samples ───────────────────────────────────────────────────── | |
| cs-samples: | |
| runs-on: ${{ matrix.platform }}-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| platform: [windows, macos] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| clean: true | |
| - name: Setup .NET SDK | |
| uses: actions/setup-dotnet@v5 | |
| with: | |
| dotnet-version: | | |
| 8.0.x | |
| 10.0.x | |
| - name: Build SDK from source | |
| shell: pwsh | |
| run: | | |
| # Build cross-platform SDK package | |
| # Note: /p:TreatWarningsAsErrors=false avoids failing on SDK doc warnings | |
| dotnet pack sdk/cs/src/Microsoft.AI.Foundry.Local.csproj ` | |
| -o local-packages ` | |
| /p:Version=0.9.0-dev ` | |
| /p:IsPacking=true ` | |
| /p:TreatWarningsAsErrors=false ` | |
| --configuration Release | |
| # Build WinML SDK package (Windows only) | |
| if ($IsWindows) { | |
| dotnet pack sdk/cs/src/Microsoft.AI.Foundry.Local.csproj ` | |
| -o local-packages ` | |
| /p:Version=0.9.0-dev-20260324 ` | |
| /p:UseWinML=true ` | |
| /p:IsPacking=true ` | |
| /p:TreatWarningsAsErrors=false ` | |
| --configuration Release | |
| } | |
| Write-Host "Local packages:" | |
| Get-ChildItem local-packages/*.nupkg | ForEach-Object { Write-Host " $($_.Name)" } | |
| - name: Build C# samples | |
| shell: pwsh | |
| run: | | |
| $failed = @() | |
| $projects = Get-ChildItem samples/cs -Recurse -Filter "*.csproj" | |
| foreach ($proj in $projects) { | |
| $name = $proj.BaseName | |
| Write-Host "`n=== Building: $name ===" | |
| dotnet build $proj.FullName --configuration Debug 2>&1 | |
| if ($LASTEXITCODE -ne 0) { | |
| Write-Host "BUILD FAILED: $name" | |
| $failed += $name | |
| } else { | |
| Write-Host "BUILD PASSED: $name" | |
| } | |
| } | |
| if ($failed.Count -gt 0) { | |
| Write-Error "Failed builds: $($failed -join ', ')" | |
| exit 1 | |
| } | |
| # ── Rust Samples ──────────────────────────────────────────────────── | |
| rust-samples: | |
| runs-on: ${{ matrix.platform }}-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| platform: [windows, macos] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| clean: true | |
| - name: Install Rust toolchain | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| components: clippy | |
| - name: Cache cargo dependencies | |
| uses: Swatinem/rust-cache@v2 | |
| with: | |
| workspaces: samples/rust -> target | |
| - name: Use crates.io directly | |
| shell: pwsh | |
| run: | | |
| # Remove crates-io redirect in SDK (points to Azure Artifacts) | |
| $configPath = "sdk/rust/.cargo/config.toml" | |
| if (Test-Path $configPath) { | |
| Remove-Item $configPath | |
| Write-Host "Removed sdk/rust/.cargo/config.toml" | |
| } | |
| # Remove crates-io redirect in samples | |
| $configPath = "samples/rust/.cargo/config.toml" | |
| if (Test-Path $configPath) { | |
| Remove-Item $configPath | |
| Write-Host "Removed samples/rust/.cargo/config.toml" | |
| } | |
| - name: Build Rust samples workspace | |
| working-directory: samples/rust | |
| run: cargo build --workspace | |
| - name: Clippy check | |
| working-directory: samples/rust | |
| run: cargo clippy --workspace -- -D warnings |