ConfigMap volumes are read-only in K8s, causing EROFS when saving config. Replace ConfigMap-mounted config-overrides.json with a writable emptyDir at /app/data/ and set CONFIG_OVERRIDES_PATH accordingly. The app handles missing override files gracefully (starts with empty overrides). Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)
Gitea AI Assistant
AI-powered code review assistant for Gitea. Automatically reviews Pull Requests and commits using OpenAI, providing intelligent code quality analysis with both summary comments and line-level feedback.
Features
- 🤖 AI Code Review - Automatic review of PRs and commits using OpenAI models
- 📝 Line-Level Comments - Precise feedback on specific code changes
- 🔄 Dual Review Engines - Legacy (simple) or Agent-based (multi-agent) review modes
- 🔔 Feishu Notifications - Integrated notification system for PR events
- 🎛️ Admin Dashboard - Web UI for managing repository webhooks and configuration
- 🔐 Secure Webhooks - HMAC-SHA256 signature verification
Architecture
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Gitea Server │────▶│ Gitea Assistant │────▶│ OpenAI API │
│ (Webhooks) │ │ (Hono + Bun) │ │ │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│
▼
┌──────────────────┐
│ Admin Dashboard │
│ (React SPA) │
└──────────────────┘
Review Engines
| Engine | Description | Use Case |
|---|---|---|
legacy |
Single-pass AI review with summary + line comments | Simple, fast reviews |
agent |
Multi-agent orchestration with specialists, reflection, and debate | Deep, comprehensive analysis |
Quick Start
Prerequisites
- Bun >= 1.2.5
- Gitea instance with API access
- OpenAI API key
Installation
git clone https://github.com/user/gitea-ai-assistant.git
cd gitea-ai-assistant
bun install
cp .env.example .env
Configuration
Edit .env with your settings:
# Gitea
GITEA_API_URL=https://your-gitea-instance.com/api/v1
GITEA_ACCESS_TOKEN=your_gitea_token
# OpenAI
OPENAI_API_KEY=your_openai_key
OPENAI_MODEL=gpt-4o-mini
# Security
WEBHOOK_SECRET=your_webhook_secret # openssl rand -hex 32
# Admin Dashboard
ADMIN_PASSWORD=your_admin_password
See Configuration Reference for all options.
Running
bun run dev # Development mode
bun run start # Production mode
Setting Up Webhooks
Option 1: Admin Dashboard (Recommended)
- Access
http://your-server:3000 - Log in with
ADMIN_PASSWORD - Click "Enable" on repositories to auto-configure webhooks
Option 2: Manual Configuration
In Gitea repository settings, add a webhook:
- URL:
http://your-server:3000/webhook/gitea - Content Type:
application/json - Secret: Same as
WEBHOOK_SECRET - Events: "Pull Request" and "Status"
Configuration Reference
Core Settings
| Variable | Description | Default |
|---|---|---|
GITEA_API_URL |
Gitea API endpoint | Required |
GITEA_ACCESS_TOKEN |
Token for code review (read + comment permissions) | Required |
GITEA_ADMIN_TOKEN |
Token for webhook management (optional) | - |
OPENAI_BASE_URL |
OpenAI API base URL | https://api.openai.com/v1 |
OPENAI_API_KEY |
OpenAI API key | Required |
OPENAI_MODEL |
Model to use | gpt-4o-mini |
PORT |
Server port | 3000 |
WEBHOOK_SECRET |
Webhook signature secret | Required |
Custom Prompts
| Variable | Description |
|---|---|
CUSTOM_SUMMARY_PROMPT |
Override the default summary review prompt |
CUSTOM_LINE_COMMENT_PROMPT |
Override the default line comment prompt |
Admin Dashboard
| Variable | Description | Default |
|---|---|---|
ADMIN_PASSWORD |
Dashboard login password | password |
JWT_SECRET |
JWT signing secret | Auto-generated |
Feishu Integration
| Variable | Description |
|---|---|
FEISHU_WEBHOOK_URL |
Feishu bot webhook URL |
FEISHU_WEBHOOK_SECRET |
Feishu webhook secret (optional) |
Agent Review Engine
Enable with REVIEW_ENGINE=agent for advanced multi-agent reviews:
| Variable | Description | Default |
|---|---|---|
REVIEW_ENGINE |
Engine mode (legacy or agent) |
legacy |
REVIEW_WORKDIR |
Working directory for repo clones | /tmp/gitea-assistant |
REVIEW_MODEL_PLANNER |
Planner model | gpt-4o-mini |
REVIEW_MODEL_SPECIALIST |
Specialist model | gpt-4o-mini |
REVIEW_MODEL_JUDGE |
Judge model | gpt-4o-mini |
REVIEW_MAX_PARALLEL_RUNS |
Max concurrent tasks | 2 |
REVIEW_MAX_FILES_PER_RUN |
Max files per review | 200 |
REVIEW_AUTO_PUBLISH_MIN_CONFIDENCE |
Min confidence for auto-publish | 0.8 |
REVIEW_ENABLE_HUMAN_GATE |
Enable human approval | true |
Memory & Learning (Experimental)
| Variable | Description | Default |
|---|---|---|
QDRANT_URL |
Qdrant vector database URL | - |
ENABLE_MEMORY |
Enable memory system | false |
ENABLE_REFLECTION |
Enable self-critique | false |
ENABLE_DEBATE |
Enable multi-agent debate | false |
Deployment
Docker
docker build -t gitea-assistant .
docker run -d -p 3000:3000 --env-file .env gitea-assistant
Docker Compose
docker-compose up -d
Kubernetes
Kubernetes manifests are located in the k8s/ directory.
1. Configure Secrets
Encode your credentials as base64 and update k8s/gitea-assistant.yaml:
echo -n "your_gitea_token" | base64
echo -n "your_openai_key" | base64
echo -n "your_webhook_secret" | base64
echo -n "your_admin_password" | base64
2. Configure Application
Edit the ConfigMap in k8s/gitea-assistant.yaml:
- Set
GITEA_API_URLto your Gitea instance API endpoint - Adjust model and review engine settings as needed
3. Deploy
# Using Kustomize (recommended)
kubectl apply -k k8s/
# Or apply individually
kubectl apply -f k8s/namespace.yaml
kubectl apply -f k8s/qdrant.yaml
kubectl apply -f k8s/gitea-assistant.yaml
4. Verify
kubectl -n gitea-assistant get pods
kubectl -n gitea-assistant get svc
5. Expose the Service (optional)
By default, services use ClusterIP. To expose externally, use an Ingress or change the Service type:
kubectl -n gitea-assistant patch svc gitea-assistant -p '{"spec":{"type":"NodePort"}}'
License
MIT License