The multi-agent PR reviewer that never misses a bug.
Open-source, self-hostable GitHub Action. Works with any LLM provider.
flowchart TD
subgraph GitHub["GitHub CI/CD"]
PR([Pull Request Opened / Updated])
GH[GitHub API\nFetch PR Diff]
CM[Post Inline Review\nComments with Fix Suggestions]
end
subgraph Action["AI Code Reviewer Action"]
TOON[TOON Encoder\nCompact token-efficient diff]
subgraph Orchestrator["Orchestrator Pipeline"]
A1["Agent 1 β Reviewer\nπ cheap / fast model\nDetects BUG Β· SECURITY\nPERF Β· BEST_PRACTICE"]
CHK{Issues found?}
A2["Agent 2 β Explainer + Fixer\nπ§ smarter model\nExplanation + fixed code\nper issue Β· runs in parallel"]
end
end
PR --> GH --> TOON --> A1 --> CHK
CHK -- No issues --> DONE([Done β zero fixer cost])
CHK -- Issues found --> A2 --> CM
- Triggers on PR open/update
- Fetches code diff from GitHub
- Encodes all changed chunks into token-efficient TOON format
- Agent 1 (Reviewer) β sends the full TOON diff to a cheap/fast model; detects
BUG,SECURITY,PERFORMANCE,BEST_PRACTICEissues and returns a typed list - If no issues are found β pipeline stops; Agent 2 is never called (zero extra cost)
- Agent 2 (Explainer+Fixer) β for each flagged chunk (not the full diff), generates an explanation and corrected code in a single LLM call; all issues are processed in parallel
- Posts inline PR comments with: issue type label, concise explanation, and a GitHub suggestion block with the fixed code
- π Open Source - Self-hostable, no vendor lock-in
- π BYOK - Bring Your Own API Key
- π Multi-Provider - OpenAI, Groq, Mistral, DeepSeek, Gemini, and more
- β‘ Token-Efficient - 50-70% cost reduction with TOON encoding
- π€ 2-Agent Pipeline - Cheap model detects issues; smarter model explains and fixes them
- π° Zero Downstream Cost - Fixer agent is skipped entirely when no issues are found
Works with any OpenAI-compatible API:
| Provider | Free Tier? | Base URL |
|---|---|---|
| OpenAI | No | (default) |
| Groq | β Yes | https://api.groq.com/openai/v1 |
| DeepSeek | β Yes | https://api.deepseek.com/v1 |
| Mistral | β Yes | https://api.mistral.ai/v1 |
| Together AI | β Yes | https://api.together.xyz/v1 |
| Fireworks | β Yes | https://api.fireworks.ai/inference/v1 |
| OpenRouter | No | https://openrouter.ai/api/v1 |
| Google Gemini | β Yes | https://generativelanguage.googleapis.com/v1beta/openai |
Pick any provider above. For free options, try Groq or DeepSeek.
Go to: Settings β Secrets β Actions β New repository secret
- Name:
LLM_API_KEY - Value: Your API key
Create .github/workflows/ai-review.yml:
name: AI Code Review
on:
pull_request:
types: [opened, synchronize]
permissions:
contents: read
pull-requests: write
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: tusharshah21/ai-code-reviewer@main
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
LLM_API_KEY: ${{ secrets.LLM_API_KEY }}
LLM_MODEL: "gpt-4o"
# Optional: Discord + Slack notifications
Add any of these optional secrets if you want commit-trigger and review-result notifications in chat:
- `DISCORD_WEBHOOK_URL` for Discord channel notifications
- `SLACK_BOT_TOKEN` + `SLACK_CHANNEL_ID` for threaded Slack notifications (recommended)
- `SLACK_WEBHOOK_URL` for basic Slack notifications (fallback, non-threaded)
Example:
```yaml
- uses: tusharshah21/ai-code-reviewer@main
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
LLM_API_KEY: ${{ secrets.LLM_API_KEY }}
LLM_MODEL: "gpt-4o"
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
SLACK_CHANNEL_ID: ${{ secrets.SLACK_CHANNEL_ID }}
That's it! PRs will now get AI reviews with explanation and fix suggestions.
#### Optional: Use separate models for detection vs. fixing
```yaml
- uses: tusharshah21/ai-code-reviewer@main
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
LLM_API_KEY: ${{ secrets.LLM_API_KEY }}
LLM_REVIEWER_MODEL: "gpt-4o-mini" # cheap & fast for triage
LLM_FIXER_MODEL: "gpt-4o" # smarter for explanations & fixes
LLM_API_KEY: ${{ secrets.OPENAI_API_KEY }}
LLM_MODEL: "gpt-4o"LLM_API_KEY: ${{ secrets.GROQ_API_KEY }}
LLM_MODEL: "llama-3.3-70b-versatile"
LLM_BASE_URL: "https://api.groq.com/openai/v1"LLM_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
LLM_MODEL: "deepseek-chat"
LLM_BASE_URL: "https://api.deepseek.com/v1"LLM_API_KEY: ${{ secrets.MISTRAL_API_KEY }}
LLM_MODEL: "mistral-large-latest"
LLM_BASE_URL: "https://api.mistral.ai/v1"LLM_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
LLM_MODEL: "gemini-1.5-flash"
LLM_BASE_URL: "https://generativelanguage.googleapis.com/v1beta/openai"LLM_API_KEY: ${{ secrets.TOGETHER_API_KEY }}
LLM_MODEL: "meta-llama/Llama-3.3-70B-Instruct-Turbo"
LLM_BASE_URL: "https://api.together.xyz/v1"LLM_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
LLM_MODEL: "anthropic/claude-3.5-sonnet"
LLM_BASE_URL: "https://openrouter.ai/api/v1"| Input | Required | Default | Description |
|---|---|---|---|
GITHUB_TOKEN |
Yes | - | Auto-provided by GitHub |
LLM_API_KEY |
Yes | - | Your provider's API key |
LLM_MODEL |
No | gpt-4o |
Model used by both agents. If you only set this, both agents run on the same model. Set LLM_REVIEWER_MODEL / LLM_FIXER_MODEL to split them. |
LLM_BASE_URL |
No | OpenAI | Provider's API endpoint |
LLM_REVIEWER_MODEL |
No | LLM_MODEL |
Fast/cheap model for issue detection (Agent 1). Overrides LLM_MODEL for Agent 1 only. |
LLM_FIXER_MODEL |
No | LLM_MODEL |
Smarter model for explanation and fix generation (Agent 2). Overrides LLM_MODEL for Agent 2 only. |
exclude |
No | - | Files to skip (glob patterns) |
DISCORD_WEBHOOK_URL |
No | - | Posts a start message (commit/PR context) and a reply with reviewer results to Discord. |
SLACK_BOT_TOKEN |
No | - | Slack bot token (xoxb-...) used for threaded messages via chat.postMessage. |
SLACK_CHANNEL_ID |
No | - | Slack channel ID for bot-thread notifications. Used with SLACK_BOT_TOKEN. |
SLACK_WEBHOOK_URL |
No | - | Slack incoming webhook fallback (non-threaded) when bot token/channel are not provided. |
TOON encoding saves 50-70% tokens. Example for reviewing 1000 lines:
| Provider | Model | Cost/Review |
|---|---|---|
| Groq | Llama 3.3 70B | FREE |
| DeepSeek | DeepSeek Chat | ~$0.001 |
| OpenAI | GPT-4o | ~$0.02 |
| OpenAI | GPT-4o-mini | ~$0.002 |
MIT - Free and open source #PRowl