name: 'Evals: PR Impact' on: pull_request: paths: - 'packages/core/src/prompts/**' - 'packages/core/src/tools/**' - 'packages/core/src/agents/**' - 'evals/**' permissions: contents: 'read' checks: 'write' pull-requests: 'write' jobs: eval-impact: name: 'Eval Impact Analysis' runs-on: 'gemini-cli-ubuntu-16-core' if: "github.repository == 'google-gemini/gemini-cli'" steps: - name: 'Checkout' uses: 'actions/checkout@v4' - name: 'Set up Node.js' uses: 'actions/setup-node@v4' with: node-version-file: '.nvmrc' cache: 'npm' - name: 'Install dependencies' run: 'npm ci' - name: 'Build project' run: 'npm run build' - name: 'Run Evals (3 Attempts)' env: GEMINI_API_KEY: '${{ secrets.GEMINI_API_KEY }}' RUN_EVALS: 'true' run: | MODELS=("gemini-3.1-pro-preview-customtools" "gemini-3-flash-preview") mkdir -p evals/logs for model in "${MODELS[@]}"; do for attempt in {1..3}; do echo "::group::Running $model (Attempt $attempt)" DIR_NAME="eval-logs-$model-$attempt" mkdir -p "evals/logs/$DIR_NAME" # Run sequentially to keep one clean job in the UI GEMINI_MODEL=$model npm run test:all_evals -- --outputFile.json="evals/logs/$DIR_NAME/report.json" || true echo "::endgroup::" done done - name: 'Generate Impact Report' id: 'generate-report' if: 'always()' env: GH_TOKEN: '${{ secrets.GITHUB_TOKEN }}' run: | if [ ! -d "evals/logs" ]; then echo "No logs found, skipping report generation." exit 0 fi echo "" > report.md node scripts/aggregate_evals.js evals/logs --compare-main --pr-comment >> report.md cat report.md >> "$GITHUB_STEP_SUMMARY" - name: 'Comment on PR' if: 'always()' env: GH_TOKEN: '${{ secrets.GITHUB_TOKEN }}' run: | if [ ! -f "report.md" ]; then exit 0 fi PR_NUMBER=${{ github.event.pull_request.number }} EXISTING_COMMENT=$(gh pr view $PR_NUMBER --json comments --jq '.comments[] | select(.body | contains("eval-impact-report")) | .id' | head -n 1) if [ -n "$EXISTING_COMMENT" ]; then gh pr comment $PR_NUMBER --body-file report.md else gh pr comment $PR_NUMBER --body-file report.md fi