Italiano | English
Una GitHub Action che analizza automaticamente le Pull Request tramite un LLM e pubblica una code review strutturata come commento sulla PR. Supporta Groq, Gemini, Anthropic e OpenAI, con fallback automatico tra provider.
%%{init: {'theme': 'default'}}%%
graph LR
gh_actions["GitHub Actions<br/>Evento PR"]
review["review.py<br/>Orchestratore"]
config["config.py<br/>Parsing Env"]
filters["filters.py<br/>Filtro File"]
prompt_mod["prompt.py<br/>Costruzione Prompt"]
gh_client["github_client.py<br/>Wrapper API"]
providers["providers.py<br/>Strategia LLM"]
gh_api[("GitHub API")]
llm_api["API LLM<br/>Groq / Gemini /<br/>Anthropic / OpenAI"]
gh_actions -->|"env vars"| review
review --> config
review --> gh_client
review --> filters
review --> prompt_mod
review --> providers
gh_client -->|"REST"| gh_api
providers -->|"HTTP"| llm_api
classDef core fill:#2563eb,stroke:#1d4ed8,color:#fff
classDef engine fill:#059669,stroke:#047857,color:#fff
classDef data fill:#d97706,stroke:#b45309,color:#fff
classDef ext fill:#6b7280,stroke:#4b5563,color:#fff
class review core
class config,filters,prompt_mod,providers engine
class gh_client data
class gh_actions,gh_api,llm_api ext
Vai su Settings → Secrets and variables → Actions e crea un secret per il provider scelto (es. GROQ_API_KEY).
Aggiungi .github/workflows/ai-review.yml al tuo repository:
name: AI PR Review
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
review:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v4
- uses: AndreaBonn/ai-pr-reviewer@v1
with:
llm_provider: 'groq'
llm_api_key: ${{ secrets.GROQ_API_KEY }}
github_token: ${{ secrets.GITHUB_TOKEN }}
language: 'italian'L'action pubblica un commento di review sulla PR. Pushando nuovi commit, il commento esistente viene aggiornato senza crearne un duplicato.
| Input | Obbligatorio | Default | Descrizione |
|---|---|---|---|
llm_provider |
No | groq |
Provider LLM, separati da virgola per il fallback (es. groq,gemini) |
llm_api_key |
Si | — | API key, separate da virgola, una per ogni provider |
llm_model |
No | Default del provider | Override del modello (es. llama-3.1-8b, gpt-4o) |
github_token |
Si | — | Token GitHub per pubblicare i commenti |
language |
No | english |
Lingua della review: english, italian, french, spanish, german |
max_files |
No | 20 |
Numero massimo di file da analizzare |
ignore_patterns |
No | *.lock,*.min.js,... |
Pattern glob da ignorare, separati da virgola |
| Provider | Costo | Modello Default | Velocità | Qualità |
|---|---|---|---|---|
| Groq | Gratis | llama-3.3-70b-versatile |
Veloce | Buona |
| Gemini | Gratis | gemini-2.0-flash |
Media | Buona |
| Anthropic | A pagamento | claude-sonnet-4-5 |
Media | Migliore |
| OpenAI | A pagamento | gpt-4o-mini |
Media | Buona |
- Groq (gratis): console.groq.com
- Gemini (gratis): aistudio.google.com
- Anthropic (a pagamento): console.anthropic.com
- OpenAI (a pagamento): platform.openai.com
Se un provider fallisce (rate limit, downtime), l'action prova automaticamente il successivo nella lista. Ogni provider ha il proprio ciclo di retry prima del fallback.
%%{init: {'theme': 'default'}}%%
graph TD
start_node(["call_llm_with_fallback"])
pick_provider["Prossimo provider<br/>dalla catena"]
call_retry["call_llm_with_retry"]
attempt["Invio richiesta a LLM API"]
check_result{"Successo?"}
check_retryable{"Errore<br/>ritentabile?"}
backoff["Attesa 2s / 4s<br/>backoff esponenziale"]
check_attempts{"Tentativi<br/>< 3?"}
more_providers{"Altri provider<br/>nella catena?"}
success_node(["Ritorna testo review"])
fail_node(["Lancia ProviderError"])
non_retryable["Non ritentabile<br/>401 / 403 / 413"]
start_node --> pick_provider
pick_provider --> call_retry
call_retry --> attempt
attempt --> check_result
check_result -->|"Si"| success_node
check_result -->|"No"| check_retryable
check_retryable -->|"No"| non_retryable
non_retryable --> more_providers
check_retryable -->|"Si"| check_attempts
check_attempts -->|"Si"| backoff
backoff --> attempt
check_attempts -->|"No"| more_providers
more_providers -->|"Si"| pick_provider
more_providers -->|"No"| fail_node
classDef core fill:#2563eb,stroke:#1d4ed8,color:#fff
classDef engine fill:#059669,stroke:#047857,color:#fff
classDef ext fill:#6b7280,stroke:#4b5563,color:#fff
classDef data fill:#d97706,stroke:#b45309,color:#fff
class start_node,success_node core
class call_retry,attempt,backoff engine
class check_result,check_retryable,check_attempts,more_providers data
class non_retryable,fail_node,pick_provider ext
llm_provider: 'groq,gemini'
llm_api_key: '${{ secrets.GROQ_API_KEY }},${{ secrets.GEMINI_API_KEY }}'Usa più API key per lo stesso provider per aggirare i limiti di rate per singola chiave:
llm_provider: 'groq,groq,gemini'
llm_api_key: '${{ secrets.GROQ_KEY_1 }},${{ secrets.GROQ_KEY_2 }},${{ secrets.GEMINI_API_KEY }}'L'override di llm_model si applica solo al primo provider. I provider di fallback usano il loro modello di default.
La review generata copre:
| Sezione | Cosa verifica |
|---|---|
| Summary | Valutazione complessiva della PR |
| Bugs & Logic Issues | Bug verificati, errori logici, edge case non gestiti |
| Security | Secret esposti, injection, deserializzazione non sicura |
| Performance & Scalability | Query N+1, I/O bloccante, paginazione mancante |
| Breaking Changes | API pubbliche rimosse/rinominate, tipi di ritorno modificati |
| Testing Gaps | Scenari specifici non testati nel codice nuovo/modificato |
| What's Done Well | Aspetti positivi |
Quando l'action viene eseguita, un commento come questo appare sulla PR:
| Secret | Quando serve |
|---|---|
GROQ_API_KEY |
Se usi Groq |
GEMINI_API_KEY |
Se usi Gemini |
ANTHROPIC_API_KEY |
Se usi Anthropic |
OPENAI_API_KEY |
Se usi OpenAI |
GITHUB_TOKEN è disponibile automaticamente, non serve configurarlo.
Per configurazioni multi-chiave, nomina i secret liberamente (es. GROQ_KEY_1, GROQ_KEY_2) e referenziali in ordine in llm_api_key.
Il workflow richiede questi permessi:
permissions:
contents: read
pull-requests: writeOppure abilita globalmente: Settings → Actions → General → Workflow permissions → Read and write permissions.
Questa action invia titoli, descrizioni e diff delle PR al provider LLM configurato. Nessun dato viene memorizzato o raccolto da questa action. Nessuna credenziale o secret viene inclusa nel prompt. Consulta la privacy policy del tuo provider LLM per dettagli su come gestisce i dati inviati.
Consulta SECURITY.it.md per tutti i dettagli sulle misure di sicurezza implementate.
- Le review sono generate dall'AI e possono contenere imprecisioni — verifica sempre i suggerimenti prima di applicarli
- Questa action esegue solo analisi statica — non esegue codice e non lancia test
- Diff molto grandi (>100 file) sono limitate a
max_filesper evitare limiti di token - Le patch dei singoli file sono troncate a 200 righe
- La qualità delle review dipende dal provider LLM e dal modello scelto
- I file binari vengono automaticamente ignorati
Hai trovato un problema? Segnalalo qui.
Se questa action ti è utile, considera di lasciare una stella su GitHub.
AI PR Reviewer è gratuita. Se ti è utile e vuoi contribuire, puoi lasciare un'offerta tramite PayPal. L'importo lo scegli tu ed è del tutto facoltativo.
