Automated PR code review powered by AI — supports GitHub Models, GitHub Copilot, OpenAI, Anthropic, Google Gemini, xAI, OpenRouter, Ollama, Azure, AWS, and more.
Zero-config setup using GitHub Models — works with GITHUB_TOKEN, no extra secrets needed:
name: AI Code Review
on:
pull_request:
types: [opened, synchronize, reopened]
permissions:
pull-requests: write
contents: read
models: read
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: n-devs/ai-code-review@v2
with:
gh_pat: ${{ secrets.GITHUB_TOKEN }}
repo: ${{ github.repository }}
pr_number: ${{ github.event.pull_request.number }}
api_key: ${{ secrets.GITHUB_TOKEN }}| Input | Required | Default | Description |
|---|---|---|---|
gh_pat |
✅ | — | GitHub PAT for GitHub API (fetching diff, posting comments) |
repo |
✅ | — | Repository in owner/repo format |
pr_number |
✅ | — | Pull request number to review |
api_key |
✅ | — | API key for the provider. For github-models: use GITHUB_TOKEN. For copilot: use a personal PAT with Copilot subscription |
provider |
github-azure-models |
AI provider shorthand (see Providers) | |
model |
gpt-4o |
Model name (see Providers for naming convention per provider) | |
title |
AI Code Review |
Title shown in the PR comment header | |
api_url |
— | Full endpoint URL — overrides provider + api_type defaults | |
api_type |
chat |
API format: chat, responses, or messages |
|
max_tokens |
2048 |
Maximum tokens in AI response | |
max_diff_chars |
10000 |
Maximum characters of diff sent to AI | |
language |
English |
Language for the review response |
provider |
api_type default |
Base URL | Auth | Model naming |
|---|---|---|---|---|
github-azure-models (default) |
chat |
https://models.inference.ai.azure.com |
GITHUB_TOKEN ✅ |
Plain name, e.g. gpt-4o |
github-models |
chat |
https://models.github.ai/inference |
GITHUB_TOKEN ✅ |
Publisher-prefixed, e.g. openai/gpt-4o-mini |
copilot |
chat |
https://api.githubcopilot.com |
Personal PAT with Copilot subscription | Plain name, e.g. gpt-4o |
openai |
chat |
https://api.openai.com/v1 |
API key | Plain name, e.g. gpt-4o |
anthropic |
messages |
https://api.anthropic.com/v1 |
API key | e.g. claude-3-5-sonnet-20241022 |
openrouter |
chat |
https://openrouter.ai/api/v1 |
API key | e.g. meta-llama/llama-3.3-70b-instruct |
ollama |
chat |
http://localhost:11434/v1 |
— | e.g. llama3 |
xai |
chat |
https://api.x.ai/v1 |
API key (Grok) | e.g. grok-3 |
zai |
chat |
https://api.z.ai/api/coding/paas/v4 |
API key (GLM) | provider-specific |
google |
chat |
https://generativelanguage.googleapis.com/v1beta/openai |
API key | e.g. gemini-2.0-flash |
azure |
chat |
api_url |
api-key header |
your deployment name |
aws |
chat |
api_url |
API key | provider-specific |
custom |
chat |
api_url |
API key | provider-specific |
Note:
copilotprovider exchanges a personal PAT for a short-lived session token automatically.GITHUB_TOKENfrom GitHub Actions will not work for Copilot — usegithub-azure-models/github-modelsinstead for zero-config setups.GitHub Models has two provider shorthands:
github-azure-models(default) uses the legacymodels.inference.ai.azure.comendpoint with plain model names (gpt-4o).github-modelsuses the currentmodels.github.ai/inferenceendpoint documented in GitHub's Quickstart, which requires publisher-prefixed model names (openai/gpt-4o-mini,openai/gpt-5-mini, etc.).If
github-azure-modelsever stops responding, switch toprovider: github-modelswith a publisher-prefixedmodel.
api_type |
Path appended | Compatible with |
|---|---|---|
chat |
/chat/completions |
GitHub Models, Copilot, OpenAI, OpenRouter, Ollama, xAI, Google, Azure |
responses |
/responses |
OpenAI Responses API |
messages |
/messages |
Anthropic Claude |
text |
/completions |
Legacy completions endpoint |
- uses: n-devs/ai-code-review@v2
with:
gh_pat: ${{ secrets.GITHUB_TOKEN }}
repo: ${{ github.repository }}
pr_number: ${{ github.event.pull_request.number }}
api_key: ${{ secrets.GITHUB_TOKEN }}- uses: n-devs/ai-code-review@v2
with:
gh_pat: ${{ secrets.GITHUB_TOKEN }}
repo: ${{ github.repository }}
pr_number: ${{ github.event.pull_request.number }}
provider: github-models
api_key: ${{ secrets.GITHUB_TOKEN }}
model: openai/gpt-4o-miniRequires a personal PAT with Copilot subscription stored as
COPILOT_PATsecret.
- uses: n-devs/ai-code-review@v2
with:
gh_pat: ${{ secrets.GITHUB_TOKEN }}
repo: ${{ github.repository }}
pr_number: ${{ github.event.pull_request.number }}
provider: copilot
api_key: ${{ secrets.COPILOT_PAT }}
model: gpt-4o- uses: n-devs/ai-code-review@v2
with:
gh_pat: ${{ secrets.GITHUB_TOKEN }}
repo: ${{ github.repository }}
pr_number: ${{ github.event.pull_request.number }}
provider: openai
api_key: ${{ secrets.OPENAI_API_KEY }}
model: gpt-4o- uses: n-devs/ai-code-review@v2
with:
gh_pat: ${{ secrets.GITHUB_TOKEN }}
repo: ${{ github.repository }}
pr_number: ${{ github.event.pull_request.number }}
provider: anthropic
api_key: ${{ secrets.ANTHROPIC_API_KEY }}
model: claude-3-5-sonnet-20241022
max_tokens: "8192"- uses: n-devs/ai-code-review@v2
with:
gh_pat: ${{ secrets.GITHUB_TOKEN }}
repo: ${{ github.repository }}
pr_number: ${{ github.event.pull_request.number }}
provider: google
api_key: ${{ secrets.GOOGLE_API_KEY }}
model: gemini-2.0-flash- uses: n-devs/ai-code-review@v2
with:
gh_pat: ${{ secrets.GITHUB_TOKEN }}
repo: ${{ github.repository }}
pr_number: ${{ github.event.pull_request.number }}
provider: xai
api_key: ${{ secrets.XAI_API_KEY }}
model: grok-3- uses: n-devs/ai-code-review@v2
with:
gh_pat: ${{ secrets.GITHUB_TOKEN }}
repo: ${{ github.repository }}
pr_number: ${{ github.event.pull_request.number }}
provider: openrouter
api_key: ${{ secrets.OPENROUTER_API_KEY }}
model: meta-llama/llama-3.3-70b-instruct- uses: n-devs/ai-code-review@v2
with:
gh_pat: ${{ secrets.GITHUB_TOKEN }}
repo: ${{ github.repository }}
pr_number: ${{ github.event.pull_request.number }}
provider: ollama
api_key: ""
api_url: http://my-server:11434/v1/chat/completions
model: llama3- uses: n-devs/ai-code-review@v2
with:
gh_pat: ${{ secrets.GITHUB_TOKEN }}
repo: ${{ github.repository }}
pr_number: ${{ github.event.pull_request.number }}
provider: azure
api_key: ${{ secrets.AZURE_OPENAI_API_KEY }}
api_url: https://my-resource.openai.azure.com/openai/deployments/gpt-4o/chat/completions?api-version=2024-02-01
model: gpt-4o- uses: n-devs/ai-code-review@v2
with:
gh_pat: ${{ secrets.GITHUB_TOKEN }}
repo: ${{ github.repository }}
pr_number: ${{ github.event.pull_request.number }}
provider: openai
api_key: ${{ secrets.OPENAI_API_KEY }}
api_type: responses
model: gpt-4o- uses: n-devs/ai-code-review@v2
with:
gh_pat: ${{ secrets.GITHUB_TOKEN }}
repo: ${{ github.repository }}
pr_number: ${{ github.event.pull_request.number }}
provider: custom
api_key: ${{ secrets.MY_API_KEY }}
api_url: https://my-llm-proxy.internal/v1/chat/completions
model: my-model- uses: n-devs/ai-code-review@v2
with:
gh_pat: ${{ secrets.GITHUB_TOKEN }}
repo: ${{ github.repository }}
pr_number: ${{ github.event.pull_request.number }}
api_key: ${{ secrets.GITHUB_TOKEN }}
language: Thainpm install
npm run build # outputs dist/index.js via @vercel/ncc
npm test # runs unit tests via vitest