Zum Inhalt

GitHub

Detaillierter Leitfaden für die Integration mit GitHub Actions.


Berechtigungen

Mindestberechtigungen

permissions:
  contents: read        # Code lesen
  pull-requests: write  # Kommentare posten

GITHUB_TOKEN in Actions

In GitHub Actions ist GITHUB_TOKEN automatisch verfügbar:

env:
  GITHUB_TOKEN: ${{ github.token }}

Automatische Token-Berechtigungen:

Berechtigung Status Hinweis
contents: read ✅ Standard
pull-requests: write ✅ Muss in permissions angegeben werden

Fork-PRs

Für PRs aus Fork-Repositories hat GITHUB_TOKEN nur Leseberechtigungen.

AI Review kann keine Kommentare für Fork-PRs posten.

Personal Access Token erhalten

Für lokale Ausführungen benötigen Sie einen Personal Access Token (PAT):

  1. Gehen Sie zu Settings → Developer settings → Personal access tokens
  2. Wählen Sie Fine-grained tokens (empfohlen) oder Classic
  3. Klicken Sie auf Generate new token

Fine-grained Token (empfohlen):

Einstellung Wert
Repository access Only select repositories → Ihr Repository
Permissions Pull requests: Read and write

Classic Token:

Scope Beschreibung
repo Voller Zugriff auf Repository
  1. Klicken Sie auf Generate token
  2. Kopieren Sie den Token und speichern Sie ihn als GITHUB_TOKEN

Token speichern

GitHub zeigt den Token nur einmal an. Speichern Sie ihn sofort.


Trigger

Empfohlener Trigger

on:
  pull_request:
    types: [opened, synchronize, reopened]
Typ Wann ausgelöst
opened PR erstellt
synchronize Neue Commits im PR
reopened PR wieder geöffnet

Dateifilterung

Review nur für bestimmte Dateien ausführen:

on:
  pull_request:
    paths:
      - '**.py'
      - '**.js'
      - '**.ts'

Branch-Filterung

on:
  pull_request:
    branches:
      - main
      - develop

Secrets

Secrets hinzufügen

Settings → Secrets and variables → Actions → New repository secret

Secret Erforderlich Beschreibung
AI_REVIEWER_GOOGLE_API_KEY ✅ Gemini API-Schlüssel

Verwendung

env:
  AI_REVIEWER_GOOGLE_API_KEY: ${{ secrets.AI_REVIEWER_GOOGLE_API_KEY }}

Secrets niemals hartcodieren

# ❌ FALSCH
env:
  AI_REVIEWER_GOOGLE_API_KEY: AIza...

# ✅ RICHTIG
env:
  AI_REVIEWER_GOOGLE_API_KEY: ${{ secrets.AI_REVIEWER_GOOGLE_API_KEY }}

Workflow-Beispiele

Minimal

name: AI Code Review

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
    steps:
      - uses: KonstZiv/ai-code-reviewer@v1
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          google_api_key: ${{ secrets.AI_REVIEWER_GOOGLE_API_KEY }}

Über GITHUB_TOKEN

secrets.GITHUB_TOKEN ist ein automatisches Token, das GitHub für jeden Workflow-Lauf erstellt. Sie müssen es nicht manuell zu den Secrets hinzufügen — es ist bereits verfügbar.

Token-Berechtigungen werden durch den permissions-Abschnitt in der Workflow-Datei definiert.

GitHub Docs: Automatic token authentication

Mit Concurrency (empfohlen)

name: AI Code Review

on:
  pull_request:
    types: [opened, synchronize, reopened]

concurrency:
  group: ai-review-${{ github.event.pull_request.number }}
  cancel-in-progress: true

jobs:
  review:
    runs-on: ubuntu-latest
    if: github.event.pull_request.head.repo.full_name == github.repository
    permissions:
      contents: read
      pull-requests: write

    steps:
      - uses: KonstZiv/ai-code-reviewer@v1
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          google_api_key: ${{ secrets.AI_REVIEWER_GOOGLE_API_KEY }}
          language: uk
          language_mode: adaptive

Was Concurrency bewirkt:

  • Wenn ein neuer Commit gepusht wird, während das Review noch läuft — wird das alte Review abgebrochen
  • Spart Ressourcen und API-Aufrufe

Mit Fork-PR-Filterung

jobs:
  review:
    runs-on: ubuntu-latest
    # Nicht für Fork-PRs ausführen (kein Zugriff auf Secrets)
    if: github.event.pull_request.head.repo.full_name == github.repository

GitHub Action Inputs

Input Beschreibung Standard
google_api_key Gemini API-Schlüssel erforderlich
github_token GitHub-Token ${{ github.token }}
language Antwortsprache en
language_mode Sprachmodus adaptive
gemini_model Gemini-Modell gemini-2.5-flash
log_level Log-Level INFO
review_max_comment_chars Max. MR-Kommentarzeichen im Prompt 3000
review_include_bot_comments Bot-Kommentare in Prompt einbeziehen true
review_post_inline_comments Inline-Kommentare an Codezeilen posten true
gemini_model_fallback Fallback-Modellkette (durch Komma getrennt) gemini-3-flash-preview
review_enable_dialogue Kommentare in Dialoge gruppieren true
discovery_enabled Project Discovery aktivieren true
discovery_verbose Discovery-Kommentar immer posten false
discovery_timeout Discovery-Timeout in Sekunden 30

Umgebungsvariablen

Die Action ordnet Inputs intern AI_REVIEWER_*-Umgebungsvariablen zu. Beim Ausführen außerhalb der Action verwenden Sie AI_REVIEWER_*-Variablen direkt (alte Namen wie GOOGLE_API_KEY funktionieren weiterhin als Fallback).


Variable-gesteuerte Konfiguration

Verwenden Sie Repository Variables, um zwischen LLM-Anbietern und Modellen zu wechseln, ohne die Workflow-Datei zu ändern. Dies ist nützlich, um die Review-Qualität verschiedener Modelle am selben PR zu vergleichen.

Einrichtung

Secrets (einmalig festlegen):

Secret Beschreibung
AI_REVIEWER_GOOGLE_API_KEY Gemini API-Schlüssel
AI_REVIEWER_MISTRAL_API_KEY Mistral API-Schlüssel

Variables (Settings → Secrets and variables → Actions → Variables):

Variable Beschreibung Standard
LLM_PROVIDER Primärer Anbieter (google, mistral) google
LLM_FALLBACK_PROVIDER Fallback-Anbieter (keine)
MISTRAL_MODEL Mistral-Modell mistral-large-latest
MISTRAL_API_URL Benutzerdefinierte API-URL (für Codestral Free Tier) (keine)

Workflow

name: AI Code Review

on:
  pull_request:
    types: [opened, synchronize, reopened]

concurrency:
  group: ai-review-${{ github.event.pull_request.number }}
  cancel-in-progress: true

jobs:
  review:
    runs-on: ubuntu-latest
    if: github.event.pull_request.head.repo.full_name == github.repository
    permissions:
      contents: read
      pull-requests: write

    steps:
      - uses: KonstZiv/ai-code-reviewer@v1
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          google_api_key: ${{ secrets.AI_REVIEWER_GOOGLE_API_KEY }}
          mistral_api_key: ${{ secrets.AI_REVIEWER_MISTRAL_API_KEY }}
          llm_provider: ${{ vars.LLM_PROVIDER || 'google' }}
          llm_fallback_provider: ${{ vars.LLM_FALLBACK_PROVIDER || '' }}
          mistral_model: ${{ vars.MISTRAL_MODEL || 'mistral-large-latest' }}
          mistral_api_url: ${{ vars.MISTRAL_API_URL || '' }}

Presets umschalten

Ändern Sie die Variables in der GitHub-Oberfläche und führen Sie den Workflow am selben PR erneut aus (Re-run):

Preset LLM_PROVIDER MISTRAL_MODEL MISTRAL_API_URL LLM_FALLBACK_PROVIDER
Gemini (Standard) google (leer) (leer) (leer)
Mistral Large mistral mistral-large-latest (leer) google
Codestral Free mistral codestral-latest https://codestral.mistral.ai google
Devstral mistral devstral-latest (leer) google

Codestral Free Tier Schlüssel

Für das Preset „Codestral Free" muss AI_REVIEWER_MISTRAL_API_KEY einen Schlüssel von codestral.mistral.ai enthalten, nicht von console.mistral.ai.

Variables vs Secrets

Secrets — verschlüsselt, in Logs verborgen — für API-Schlüssel. Variables — in Logs sichtbar — für nicht-sensible Konfiguration (Modellnamen).


Review-Ergebnis

Inline-Kommentare

AI Review postet Kommentare direkt an Code-Zeilen:

  • 🔴 CRITICAL — kritische Probleme (Sicherheit, Bugs)
  • 🟡 WARNING — Empfehlungen
  • 🔵 INFO — lehrreiche Hinweise

Apply Suggestion

Jeder Kommentar mit einem Code-Vorschlag hat einen "Apply suggestion"-Button:

fixed_code_here

GitHub rendert dies automatisch als interaktiven Button.

Zusammenfassung

Am Ende des Reviews wird eine Zusammenfassung gepostet mit:

  • Gesamtstatistik der Probleme
  • Metriken (Zeit, Tokens, Kosten)
  • Gute Praktiken (positives Feedback)

Fehlerbehebung

Review postet keine Kommentare

Überprüfen:

  1. permissions: pull-requests: write ist im Workflow
  2. AI_REVIEWER_GOOGLE_API_KEY-Secret ist gesetzt
  3. PR ist nicht aus einem Fork-Repository

"Resource not accessible by integration"

Ursache: Unzureichende Berechtigungen.

Lösung: Berechtigungen hinzufügen:

permissions:
  contents: read
  pull-requests: write

Rate Limit von Gemini

Ursache: Free-Tier-Limit überschritten (15 RPM).

Lösung:

  • Eine Minute warten
  • concurrency hinzufügen, um alte Läufe abzubrechen
  • Kostenpflichtiges Tier in Betracht ziehen

Best Practices

1. Immer Concurrency verwenden

concurrency:
  group: ai-review-${{ github.event.pull_request.number }}
  cancel-in-progress: true

2. Fork-PRs filtern

if: github.event.pull_request.head.repo.full_name == github.repository

3. Timeout setzen

jobs:
  review:
    timeout-minutes: 10

4. Job nicht-blockierend machen

jobs:
  review:
    continue-on-error: true

Nächster Schritt