feat(ai): stream validated structured cell completions #20801
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: Test BE | |
| on: | |
| push: | |
| branches: [main] | |
| pull_request: | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.ref || github.run_id }} | |
| cancel-in-progress: ${{ github.event_name == 'pull_request' }} | |
| permissions: | |
| contents: read | |
| env: | |
| MARIMO_SKIP_UPDATE_CHECK: 1 | |
| UV_EXCLUDE_NEWER: "7 days" | |
| jobs: | |
| changes: | |
| runs-on: ubuntu-latest | |
| outputs: | |
| backend: ${{ steps.filter.outputs.backend }} | |
| docs: ${{ steps.filter.outputs.docs }} | |
| steps: | |
| - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | |
| - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3 | |
| id: filter | |
| with: | |
| filters: | | |
| backend: | |
| - 'marimo/**' | |
| - 'tests/**' | |
| - 'pyproject.toml' | |
| docs: | |
| - 'docs/**' | |
| test_docs: | |
| needs: changes | |
| if: ${{ needs.changes.outputs.docs == 'true' }} | |
| name: Test docs | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: ⬇️ Checkout repo | |
| uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | |
| - name: 🐍 Setup uv | |
| uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7 | |
| - name: 📚 Build docs | |
| id: docs | |
| run: uv run --group docs mkdocs build --strict | |
| - name: Summarize docs failure | |
| if: failure() && steps.docs.outcome == 'failure' | |
| uses: ./.github/actions/pr-comment-on-failure | |
| continue-on-error: true | |
| with: | |
| check-name: "docs build" | |
| command: "uv run --group docs mkdocs build --strict" | |
| test_check: | |
| needs: changes | |
| if: ${{ needs.changes.outputs.backend == 'true' }} | |
| name: Test lint and typecheck | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: ⬇️ Checkout repo | |
| uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | |
| - name: 🐍 Setup uv | |
| uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7 | |
| - name: 🧹 Lint | |
| id: lint | |
| run: uv run ruff check --fix --output-format=github | |
| - name: 📋 Register mypy problem matcher | |
| run: echo "::add-matcher::.github/problemMatchers/mypy.json" | |
| - name: 🔍 Typecheck | |
| id: typecheck | |
| run: uv run --only-group typecheck mypy marimo --exclude=marimo/_tutorials/ | |
| - name: Summarize lint failure | |
| if: failure() && steps.lint.outcome == 'failure' | |
| continue-on-error: true | |
| uses: ./.github/actions/pr-comment-on-failure | |
| with: | |
| check-name: "lint" | |
| command: "uv run ruff check --fix" | |
| - name: Summarize typecheck failure | |
| if: failure() && steps.typecheck.outcome == 'failure' | |
| continue-on-error: true | |
| uses: ./.github/actions/pr-comment-on-failure | |
| with: | |
| check-name: "typecheck" | |
| command: "uv run --only-group typecheck mypy marimo --exclude=marimo/_tutorials/" | |
| # For PRs, we only run the tests for the changed files. | |
| # If there is a `test-all` label, we run the tests across unchanged files as well. | |
| # | |
| # Split by OS so that a failure on one runner does not cancel sibling jobs on | |
| # other runners (each job has its own matrix and therefore its own fail-fast | |
| # scope). Within a single OS, the default fail-fast behavior is preserved. | |
| test_python_ubuntu: | |
| needs: changes | |
| if: ${{ needs.changes.outputs.backend == 'true' || (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'test-all')) }} | |
| name: ubuntu-latest / Py ${{ matrix.python-version }} / ${{ matrix.dependencies }} deps | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 25 | |
| strategy: | |
| matrix: | |
| python-version: ["3.10"] | |
| dependencies: ["core", "core,optional"] | |
| include: | |
| - python-version: "3.10" | |
| dependencies: "minimal" | |
| - python-version: "3.11" | |
| dependencies: "core" | |
| - python-version: "3.12" | |
| dependencies: "core" | |
| - python-version: "3.13" | |
| dependencies: "core" | |
| - python-version: "3.14" | |
| dependencies: "core" | |
| - python-version: "3.11" | |
| dependencies: "core,optional" | |
| - python-version: "3.12" | |
| dependencies: "core,optional" | |
| - python-version: "3.13" | |
| dependencies: "core,optional" | |
| # TODO: Add in 3.14 optional once there is broader wheel support | |
| steps: | |
| - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | |
| with: | |
| fetch-depth: 0 # Fetch all history for git diff | |
| - uses: ./.github/actions/test-python | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| dependencies: ${{ matrix.dependencies }} | |
| test_python_macos: | |
| needs: changes | |
| if: ${{ needs.changes.outputs.backend == 'true' || (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'test-all')) }} | |
| name: macos-latest / Py ${{ matrix.python-version }} / ${{ matrix.dependencies }} deps | |
| runs-on: macos-latest | |
| timeout-minutes: 25 | |
| strategy: | |
| matrix: | |
| python-version: ["3.10"] | |
| dependencies: ["core", "core,optional"] | |
| steps: | |
| - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | |
| with: | |
| fetch-depth: 0 # Fetch all history for git diff | |
| - uses: ./.github/actions/test-python | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| dependencies: ${{ matrix.dependencies }} | |
| test_python_windows: | |
| needs: changes | |
| if: ${{ needs.changes.outputs.backend == 'true' || (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'test-all')) }} | |
| name: windows-latest / Py ${{ matrix.python-version }} / ${{ matrix.dependencies }} deps | |
| runs-on: windows-latest | |
| timeout-minutes: 25 | |
| strategy: | |
| matrix: | |
| python-version: ["3.10"] | |
| dependencies: ["core", "core,optional"] | |
| steps: | |
| - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | |
| with: | |
| fetch-depth: 0 # Fetch all history for git diff | |
| - uses: ./.github/actions/test-python | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| dependencies: ${{ matrix.dependencies }} | |
| # Only run coverage on `main` so it is not blocking | |
| test_coverage: | |
| needs: changes | |
| if: ${{ needs.changes.outputs.backend == 'true' && github.ref == 'refs/heads/main' && github.event_name == 'push' }} | |
| name: Test coverage | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 35 | |
| permissions: | |
| contents: read | |
| id-token: write # required for Doppler OIDC | |
| steps: | |
| - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | |
| - name: 🐍 Setup uv | |
| uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7 | |
| # This step is needed since some of our tests rely on the index.html file | |
| - name: Create assets directory, copy over index.html | |
| run: | | |
| mkdir -p marimo/_static/assets | |
| cp frontend/index.html marimo/_static/index.html | |
| cp frontend/public/favicon.ico marimo/_static/favicon.ico | |
| - name: Test with optional dependencies | |
| run: | | |
| uv run --group test-optional pytest \ | |
| -v \ | |
| tests/ \ | |
| -k "not test_cli" \ | |
| --durations=10 \ | |
| --picked=first \ | |
| --inline-snapshot=disable \ | |
| --cov=marimo --cov-report=xml --junitxml=junit.xml -o junit_family=legacy | |
| - name: 🔐 Fetch Doppler secrets | |
| if: ${{ !cancelled() }} | |
| uses: dopplerhq/secrets-fetch-action@cd2efbf9a404504316435873eff298b82f7e0562 # v1.3.0 | |
| id: secrets | |
| with: | |
| auth-method: oidc | |
| doppler-identity-id: ${{ vars.DOPPLER_IDENTITY_ID }} | |
| doppler-project: marimo-oss | |
| doppler-config: ci_test | |
| # Only upload coverage on `main` so it is not blocking | |
| # and only on `3.13`, `ubuntu-latest`, with optional deps since it will cover | |
| # the most surface area. | |
| - name: Upload coverage reports to Codecov | |
| if: ${{ !cancelled() }} | |
| uses: codecov/codecov-action@75cd11691c0faa626561e295848008c8a7dddffe # v5 | |
| with: | |
| files: ./coverage.xml | |
| env: | |
| CODECOV_TOKEN: ${{ steps.secrets.outputs.CODECOV_TOKEN }} | |
| - name: Upload test results to Codecov | |
| if: ${{ !cancelled() }} | |
| uses: codecov/test-results-action@0fa95f0e1eeaafde2c782583b36b28ad0d8c77d3 # v1 | |
| env: | |
| CODECOV_TOKEN: ${{ steps.secrets.outputs.CODECOV_TOKEN }} |