Add JSON-based AI reviewer with workflow automation #20
Workflow file for this run
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: AI Code Reviewer | |
| on: | |
| pull_request: | |
| types: [labeled] | |
| jobs: | |
| comprehensive-review: | |
| name: 🤖 AI Code Review | |
| runs-on: ubuntu-latest | |
| if: github.event.action == 'labeled' && github.event.label.name == 'ai_code_review' | |
| permissions: | |
| contents: read | |
| pull-requests: write | |
| issues: write | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| - name: Install dependencies | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y jq | |
| - name: Get PR diff | |
| run: | | |
| # Fetch the base branch (works for any target branch, not just main) | |
| git fetch origin ${{ github.event.pull_request.base.ref }} | |
| git diff origin/${{ github.event.pull_request.base.ref }}...HEAD --no-color > diff.txt | |
| - name: AI Code Review | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }} | |
| AI_MODEL: z-ai/glm-4.6 | |
| AI_TEMPERATURE: 0.1 | |
| AI_MAX_TOKENS: 2000 | |
| MAX_DIFF_SIZE: 800000 | |
| PR_NUMBER: ${{ github.event.pull_request.number }} | |
| REPO_FULL_NAME: ${{ github.repository }} | |
| FAIL_ON_REQUESTED_CHANGES: ${{ vars.FAIL_ON_REQUESTED_CHANGES || 'false' }} | |
| run: | | |
| # Run the AI reviewer and save response to file | |
| echo "Running AI code review..." | |
| AI_RESPONSE=$(cat diff.txt | bash ai-reviewer.sh) | |
| # Debug: Show what AI returned | |
| echo "=== AI RESPONSE START ===" | |
| echo "$AI_RESPONSE" | |
| echo "=== AI RESPONSE END ===" | |
| # Save response for debugging | |
| echo "$AI_RESPONSE" > ai_response.txt | |
| # Check if AI_RESPONSE is empty | |
| if [ -z "$AI_RESPONSE" ]; then | |
| echo "❌ AI response is empty" | |
| exit 1 | |
| fi | |
| # Parse JSON response | |
| if ! echo "$AI_RESPONSE" | jq . >/dev/null 2>&1; then | |
| echo "⚠️ AI response is not valid JSON. Posting raw response for debugging." | |
| echo "$AI_RESPONSE" | gh pr comment ${{ github.event.pull_request.number }} --repo ${{ github.repository }} -F - | |
| exit 1 | |
| fi | |
| # Extract fields from JSON | |
| REVIEW=$(echo "$AI_RESPONSE" | jq -r '.review // "No review provided"') | |
| DECISION=$(echo "$AI_RESPONSE" | jq -r '.fail_pass_workflow // "uncertain"') | |
| LABELS=$(echo "$AI_RESPONSE" | jq -r '.labels_added[]? // empty') | |
| # Post the review as PR comment | |
| echo "$REVIEW" | gh pr comment ${{ github.event.pull_request.number }} --repo ${{ github.repository }} -F - | |
| # Add labels to PR | |
| for label in $LABELS; do | |
| gh label create "$label" --color "0366d6" --description "Auto-created by AI reviewer" 2>/dev/null || true | |
| gh issue edit ${{ github.event.pull_request.number }} --add-label "$label" 2>/dev/null || true | |
| done | |
| # Handle workflow decision | |
| echo "AI decision: $DECISION" | |
| if [ "$FAIL_ON_REQUESTED_CHANGES" = "true" ] && [ "$DECISION" = "fail" ]; then | |
| echo "❌ AI requested changes and FAIL_ON_REQUESTED_CHANGES is enabled. Failing workflow." | |
| exit 1 | |
| fi | |
| echo "✅ AI review completed successfully" | |
| - name: Cleanup | |
| if: always() | |
| run: | | |
| rm -f diff.txt ai_response.txt |