DEV Community

TOMOAKI ishihara
TOMOAKI ishihara

Posted on

AI-Powered Code Reviews with OpenRouter - Complete PR-Agent Setup Guide

👋 Introduction

Code reviews take time, and large teams often struggle with PR . PR-Agent (now Qodo Merge) uses AI to automatically review pull requests, generate descriptions, and suggest improvements.

This guide shows you how to set up PR-Agent with OpenRouter, giving you cost-effective access to multiple AI models (GPT-4o, Claude, Gemini, etc.) through a unified API.

📌 Why OpenRouter?

Challenges with Direct OpenAI API

  • Single provider dependency (OpenAI models only)
  • Complex management of multiple provider APIs
  • Difficult to compare pricing across different model

OpenRouter Benefits

  • Unified Multi-Model API - Access GPT-4o, Claude, Gemini, Llama, etc. through one interface
  • Flexible Model Selection - Choose the right model for each task, optimizing cost-effectiveness
  • Early Access to Latest Models - Quick access to new models like GPT-5
  • Transparent Pricing - Clear pricing for each model (5.5% fee on credit purchases)

Prerequisites

  • GitHub repository (private or public)
  • OpenRouter account (free to create)
  • GitHub Actions permissions

Step 1: OpenRouter Setup

1.1 Account Creation and API Key

  1. Visit OpenRouter and create an account
  2. Purchase Credits (Important)
    • Go to the "Credits" page in your dashboard
    • Minimum purchase is $5 (5.5% fee applies to credit purchases)
    • Auto-recharge option available for convenience
    • ⚠️ Free Tier: New accounts receive a small free credit allowance, but additional purchases are needed for production use(FAQ: What free tier options exist?)
  3. In the dashboard, go to "API Keys" and generate a new key
  4. Copy and securely store the key

1.2 Available Models

OpenRouter provides access to models like:

openai/gpt-5 # Latest model (2025 release) openai/gpt-4o # Balanced performance anthropic/claude-3-opus-20240229 # High-quality analysis google/gemini-pro # Google's model meta-llama/llama-2-70b-chat # Open source 
Enter fullscreen mode Exit fullscreen mode

Check pricing at OpenRouter Models.

Step 2: GitHub Actions Workflow Setup

2.1 Configure Secrets

In your GitHub repository:

  1. Go to Settings → Secrets and variables → Actions
  2. Click "New repository secret"
  3. Add the following secret:
Name: OPENROUTER_API_KEY Value: or-xxxxxxxx (your OpenRouter API key) 
Enter fullscreen mode Exit fullscreen mode

2.2 Create Workflow File

Create .github/workflows/pr_agent.yml

name: Code Review(OpenRouter) on: pull_request: pull_request_review_comment: types: [created] # Concurrency control concurrency: group: ${{ github.repository }}-${{ github.event.number || github.head_ref || github.sha }}-${{ github.workflow }}-${{ github.event_name == 'pull_request_review_comment' && 'pr_comment' || 'pr' }} cancel-in-progress: ${{ github.event_name != 'pull_request_review_comment' }} jobs: pr_agent_job: if: | github.event.sender.type != 'Bot' && github.event_name == 'pull_request' && github.event.pull_request.changed_files < 50 runs-on: ubuntu-latest permissions: issues: write pull-requests: write contents: write id-token: write name: Run pr agent on every pull request steps: - name: PR Agent action step with OpenRouter id: pragent uses: qodo-ai/pr-agent@main env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} OPENROUTER.KEY: ${{ secrets.OPENROUTER_API_KEY }} # OpenRouter API認証 github_action_config.auto_review: "true" # enable\disable auto review github_action_config.auto_describe: "true" # enable\disable auto describe github_action_config.auto_improve: "true" # enable\disable auto improve 
Enter fullscreen mode Exit fullscreen mode

Step 3: Configuration File

Create .pr_agent.toml in your repository root.

[config] model = "openai/gpt-5" # I specified gpt-5, but an error occurred. The correct setting is "openai/gpt-5". fallback_models = ["openai/gpt-4o", "anthropic/claude-opus-4.1"] ai_timeout = 300 custom_model_max_tokens = 200000 # Critical! Errors without this response_language = "en-US" ignore_pr_title = ["^\\[Auto\\]", "^Auto"] ignore_pr_labels = ['invalid'] [ignore] glob = ['dist/**'] [github_action_config] # set as env var in .github/workflows/pr-agent.yaml #auto_review = true #auto_improve = true #auto_describe = true [pr_reviewer] extra_instructions = """\ (1) Act as a highly experienced software engineer (2) Provide thorough review of code, documents, and articles (3) Suggest concrete code snippets for improvement (4) **Never** comment on indentation, whitespace, blank lines, or other purely stylistic issues unless they change program semantics. (5) **Priority Review Areas - Check systematically:** - **Security**: Plaintext passwords, SQL injection, input validation, exception leaks - **Error Handling**: Bare except clauses, missing try-catch, silent error suppression - **Resource Management**: Missing context managers (with statements), unclosed connections/files - **Type Safety**: Missing type hints, incorrect type usage, unjustified Any types - **Performance**: Inefficient algorithms (O(n²) or worse), unnecessary loops, memory leaks - **Code Quality**: Magic numbers, unclear variable names, unused imports/variables - **API Design**: Missing input validation, no error responses, required field checks - **Architecture**: Single responsibility violations, tight coupling, global state usage (6) Focus on concrete, actionable issues with specific code examples and fix recommendations. """ num_code_suggestions = 5 inline_code_comments = true ask_and_reflect = true [pr_description] extra_instructions = "Generate clear and comprehensive descriptions" generate_ai_title = true add_original_user_description = false publish_description_as_comment = true [pr_code_suggestions] extra_instructions = "Provide actionable code suggestions with examples" commitable_code_suggestions = true demand_code_suggestions_self_review=true 
Enter fullscreen mode Exit fullscreen mode

Step 4: Testing the Setup

4.1 Create Test PR

Create a PR with intentionally problematic code.

# Missing type hints def fizz_buzz(n): for i in range(1, n): if i % 15 == 0: print("FizzBuzz") elif i % 3 == 0: print("Fizz") elif i % 5 == 0: print("Buzz") else: printo(i) # Intentional bug  # Security issue def add_user(name, password): users = [] user = {"name": name, "password": password} # Plaintext password  users.append(user) 
Enter fullscreen mode Exit fullscreen mode

4.2 Expected Output

PR-Agent will provide.

Auto-generated PR Description:

  • Summary of changes
  • File-by-file change details
  • Impact analysis

Code Review Comments:

  • Fix for printo(i)print(i)
  • Type hint suggestions
  • Security warning about plaintext passwords
  • Performance improvement suggestions

Step 5: Advanced Configuration

5.1 Cost Optimization

Use different models for different tasks.

[config] model = "openai/gpt-4o-mini" # For lightweight tasks model_turbo = "openai/gpt-5" # For complex analysis fallback_models = ["anthropic/claude-3.7-sonnet", "google/gemini-2.5-pro"] 
Enter fullscreen mode Exit fullscreen mode

5.2 Team-Specific Rules

[pr_reviewer] extra_instructions = """\ (1) Company-specific checks: - Use structured logging for all log outputs - External API calls must have timeout settings - Database access must use transactions - Never hardcode secrets (API keys, passwords, etc.) """ 
Enter fullscreen mode Exit fullscreen mode

5.3 File Exclusions

[ignore] glob = ['dist/**', '*.min.js', 'node_modules/**', '__pycache__/**'] [config] ignore_pr_title = ["^\\[Auto\\]", "^WIP:", "^Draft:"] ignore_pr_labels = ['work-in-progress', 'do-not-review'] 
Enter fullscreen mode Exit fullscreen mode

Troubleshooting

Common Issues and Solutions

1. Model not recognized

Error: Model openai/gpt-5 is not defined in MAX_TOKENS Solution: Add custom_model_max_tokens = 200000 to config 
Enter fullscreen mode Exit fullscreen mode

This error occurs when using a model that PR-Agent doesn't recognize. The models supported by PR-Agent are listed in this file. If your chosen model isn't in this list, you need to set the custom_model_max_tokens configuration.

2. Inconsistent language responses

[config] response_language = "en-US" # Be specific [pr_reviewer] extra_instructions = "Always respond in English and explain technical terms clearly" 
Enter fullscreen mode Exit fullscreen mode

3. GitHub Actions permission errors

permissions: issues: write pull-requests: write contents: write # Add this line id-token: write 
Enter fullscreen mode Exit fullscreen mode

4. Timeouts on large PRs

[config] ai_timeout = 600 # Extend to 10 minutes large_patch_policy = "clip" # Split large PRs 
Enter fullscreen mode Exit fullscreen mode

Cost Management Best Practices

1. Appropriate Model Selection

Task Recommended Model Pricing (approx.)
Simple reviews gpt-4o-mini $0.15/1M tokens
Detailed analysis gpt-4o $2.5/1M tokens
Highest quality openai/gpt-5 $1.25/1M tokens

2. PR Size Limits

if: github.event.pull_request.changed_files < 50 # Limit file count 
Enter fullscreen mode Exit fullscreen mode

3. Control Automatic Execution

[config] ignore_pr_labels = ['draft', 'wip', 'skip-ai-review'] ignore_pr_title = ["^\\[WIP\\]", "^Draft:", "^Auto"] 
Enter fullscreen mode Exit fullscreen mode

Impact Measurement

Before/After Comparison Metrics

Quantitative Metrics:

  • Reduced code review time
  • Increased bug detection
  • Earlier security issue identification
  • Faster PR merge times

Qualitative Metrics:

  • Reduced reviewer burden
  • Improved code quality
  • Learning effect (developer skill improvement)

Real-World Results Example

Before: Average review time 2 hours/PR After: Average review time 45 minutes/PR (62% reduction) Security issue detection: - Before: 2 issues/month average - After: 8 issues/month average (4x increase) 
Enter fullscreen mode Exit fullscreen mode

📝 Conclusion

Setting up PR-Agent with OpenRouter provides these benefits.

Cost Performance - Use multiple models through OpenRouter for cost optimization

Quality Improvement - Consistent review standards reduce oversights

Efficiency - Significant reduction in review time

Learning Effect - Developers learn best practices from AI feedback

Flexibility - Customizable for team-specific requirements

We recommend starting with a small project for testing and gradually expanding. The configuration file allows extensive customization to match your team's needs.


📚 References


Hope this guide helps improve your code review process! Feel free to share questions or suggestions in the comments.

Top comments (0)