🎉 NEW: v3.0 - OpenRouter Integration! Now supports multiple AI providers through OpenRouter API. Easily switch between models like Grok, Claude, GPT-4, Gemini, and more by just changing a config parameter. No more vendor lock-in!
Đơn giản là: Mỗi khi bạn tạo Pull Request (PR) trên GitHub, một AI sẽ tự động đọc code của bạn và đưa ra nhận xét, giống như một senior developer review code.
Chi tiết hơn:
- Đây là một GitHub Action (tự động chạy khi có PR)
- Sử dụng AI (như ChatGPT, Claude, Gemini...) để phân tích code bạn viết trong PR
- Kiểm tra theo các quy tắc như Clean Architecture, GetX patterns, chuẩn code...
- Đưa ra 1 comment tổng hợp trên PR với các góp ý cụ thể
Ví dụ thực tế:
Bạn tạo PR thêm tính năng login
↓
AI tự động review trong vài phút
↓
Bạn nhận được comment:
"❌ File login_controller.dart: Nên dùng Get.find() thay vì Get.put()..."
"✅ File login_screen.dart: Code đạt chuẩn"
- ✅ 200+ AI Models Support: Use any model from OpenRouter (Grok, Claude, GPT-4, Gemini, Llama, Mistral, etc.)
- ✅ Easy Model Switching: Change AI provider with just one config parameter - no code changes needed
- ✅ Free & Paid Options: Choose from free models (Grok 4.1, Gemini 2.0) or premium ones (Claude 3.5, GPT-4)
- ✅ Reasoning Support: Enable advanced reasoning for supported models (e.g., Grok 4.1)
- ✅ Request Tracking: Automatically sends project name in
X-Titleheader for usage tracking on OpenRouter dashboard - ✅ Intelligent Chunking: Automatically splits large PRs (>5 files, >30k chars) into reviewable chunks to ensure complete coverage
- ✅ Clean Architecture Review: Validates layer dependencies and architectural patterns
- ✅ GetX Best Practices: Checks controller lifecycle and instance management
- ✅ Type Safety: Detects hardcoded assets and translation strings
- ✅ Multi-language Support: Review comments in Vietnamese or English
- ✅ Modular Rule System: Coding standards organized in separate rule files for easy maintenance
- ✅ Single Consolidated Comment: Posts one comprehensive review per PR to minimize noise
- ✅ Automatic Retry: Handles rate limits with exponential backoff
GitHub Action = Một đoạn code tự động chạy khi có sự kiện trên GitHub
Trong dự án này:
- Sự kiện: Khi có Pull Request mới hoặc cập nhật PR
- Hành động: Chạy script Python để review code bằng AI
- Kết quả: Đăng comment review lên PR
Không cần biết Python! Chỉ cần làm theo:
-
Tạo file mới trong repo của bạn:
.github/workflows/ai-review.yml- Nếu chưa có thư mục
.github/workflows, tạo mới nó
- Nếu chưa có thư mục
-
Copy và paste nội dung bên dưới vào file đó
-
Lưu lại - Xong! Không cần cài đặt gì thêm.
File cấu hình (Copy toàn bộ đoạn này):
# Đây là file workflow mẫu cho AI Code Review
# Sao chép file này vào file .github/workflows/ai-review.yml của dự án bạn
name: AI Code Review
# Khi nào chạy? → Khi có PR mới hoặc cập nhật PR trên nhánh main/dev.
on:
pull_request:
types: [opened, synchronize, reopened]
branches: [main, dev]
# Quyền cần thiết để thực hiện review và comment trên PR
permissions:
contents: read # Đọc code
pull-requests: write # Viết comment vào PR
issues: write # Viết comment (backup)
jobs:
ai_review:
name: AI Code Review
runs-on: ubuntu-latest
steps:
# Step 1: Checkout source code để AI có thể phân tích
- name: Checkout source code
uses: actions/checkout@v4
# Step 2: Chạy AI Code Reviewer action đã được tạo sẵn (pubstar-io/ai-review-bot)
- name: Run OpenRouter AI Code Reviewer
uses: pubstar-io/ai-review-bot@main
with:
openrouter-api-key: ${{ secrets.OPENROUTER_API_KEY }} # OpenRouter API key (gán giá trị trong secrets của repository)
github-token: ${{ secrets.GITHUB_TOKEN }} # GitHub token (giá trị này sẽ được tự động cung cấp bởi GitHub Actions)
stack: "mobile-ios" # Stack của công nghệ mà dự án sử dụng (giá trị của stack là các folder nằm bên trong scripts/stacks)
review-language: "vietnamese" # Ngôn ngữ cho comment review: 'vietnamese' hoặc 'english' (mặc định: vietnamese)
rules-path: "pubstar-ios" # Đường dẫn đến thư mục chứa các file .md rules review
openrouter-model: "google/gemini-3.1-flash-lite" # OpenRouter model to use (default: google/gemini-3.1-flash-lite)3.1. Lấy OpenRouter API Key
- Vào OpenRouter Keys
- Đăng ký tài khoản (miễn phí)
- Click "Create Key" → Tạo API key mới
- Copy key này (chỉ hiển thị 1 lần, nếu mất phải tạo lại)
- (Tùy chọn) Nạp tiền nếu dùng AI trả phí, hoặc dùng AI miễn phí (Grok, Gemini)
3.2. Lưu API Key vào GitHub Secret
- Vào repo của bạn trên GitHub
- Click Settings → Secrets and variables → Actions
- Click nút "New repository secret"
- Điền:
- Name:
OPENROUTER_API_KEY(phải đúng tên này) - Value: Paste API key bạn copy ở bước 3.1
- Name:
- Click "Add secret"
3.3. Tạo Pull Request để test
- Tạo 1 PR bất kỳ → Action sẽ tự động chạy và review
- Xem kết quả trong tab "Checks" hoặc comment của PR
Mỗi model có:
- Độ thông minh khác nhau (model đắt tiền thường thông minh hơn)
- Chi phí khác nhau (có model miễn phí, có model trả phí)
- Tốc độ khác nhau
Dự án đang dùng: Grok 4.1 Fast (Free)
- ✅ Miễn phí
- ✅ Nhanh
- ✅ Hỗ trợ reasoning (suy luận nâng cao)
Lưu ý: Chỉ người quản lý dự án mới có thể đổi model (user thường không đổi được)
Bước 1: Mở file scripts/reviewer/config.py
Bước 2: Tìm dòng 28, sửa giá trị OPENROUTER_MODEL:
# Dòng 28 trong config.py
OPENROUTER_MODEL = "x-ai/grok-4.1-fast:free" # ← Đổi giá trị này
# Ví dụ các model có thể dùng:
# ┌─────────────────────────────────────┬──────────┬───────────────┐
# │ Model │ Loại │ Đặc điểm │
# ├─────────────────────────────────────┼──────────┼───────────────┤
# │ "x-ai/grok-4.1-fast:free" │ FREE │ Nhanh │
# │ "google/gemini-2.0-flash-exp:free" │ FREE │ Thông minh │
# │ "anthropic/claude-3.5-sonnet" │ PAID │ Rất thông minh│
# │ "openai/gpt-4-turbo" │ PAID │ Đa năng │
# └─────────────────────────────────────┴──────────┴───────────────┘Bước 3: Lưu file và commit
Bước 4: Xem danh sách đầy đủ tại OpenRouter Model List
Trong file .github/workflows/ai-review.yml, phần with: có các tham số sau:
| Tham số | Bắt buộc? | Mặc định | Giải thích |
|---|---|---|---|
openrouter-api-key |
✅ Bắt buộc | - | API key của OpenRouter (đã setup ở bước 3) |
github-token |
✅ Bắt buộc | - | Token GitHub (dùng ${{ secrets.GITHUB_TOKEN }} - tự động có) |
stack |
✅ Bắt buộc | - | Đường dẫn đến thư mục chứa các file .md stack công nghệ |
rules-path |
⭕ Tùy chọn | - | Đường dẫn đến thư mục chứa các file .md rules review |
review-language |
⭕ Tùy chọn | vietnamese |
Ngôn ngữ review: vietnamese hoặc english |
openrouter-model |
⭕ Tùy chọn | google/gemini-3.1-flash-lite |
OpenRouter model được sử dụng |
Giá trị stack chính là tên thư mục bên trong scripts/stacks/. AI sẽ đọc TẤT CẢ file .md nằm trực tiếp trong thư mục đó để biết đang review cho công nghệ nào. Với biến thể TypeScript, thư mục đã gộp sẵn cả quy tắc framework + quy tắc TypeScript strict.
Giá trị stack |
Công nghệ | File quy tắc được nạp |
|---|---|---|
expressjs |
Express.js (JavaScript) | express.md |
expressjs/typescript |
Express.js + TypeScript | express.md, typescript.md |
reactjs |
React (JavaScript) | react.md |
reactjs/typescript |
React + TypeScript | react.md, typescript.md |
nextjs |
Next.js (JavaScript) | next.md |
nextjs/typescript |
Next.js + TypeScript | next.md, typescript.md |
backend-node |
Node.js (quản lý package) | node.md, typescript.md |
mobile-ios |
iOS / Swift | swift.md |
Ví dụ dùng cho dự án Next.js + TypeScript:
with:
stack: "nextjs/typescript"Sửa file .github/workflows/ai-review.yml:
- uses: pubstar-io/ios-sdk-ai-review-bot@main
with:
openrouter-api-key: ${{ secrets.OPENROUTER_API_KEY }}
github-token: ${{ secrets.GITHUB_TOKEN }}
rules-path: "pubstar-ios" # Đường dẫn đến thư mục chứa các file .md rules review
stack: "mobile-ios"
review-language: "vietnamese"
openrouter-model: "google/gemini-3.1-flash-lite" # ← Đổi model nếu cầnAI được huấn luyện để kiểm tra code bạn viết theo các tiêu chí sau:
Là gì? Cách tổ chức code thành các tầng (layers) rõ ràng
AI kiểm tra:
- ❌ Tầng Domain có import code từ tầng Data/Presentation không?
- ❌ Có vi phạm nguyên tắc phụ thuộc giữa các tầng không?
Ví dụ lỗi:
// File: domain/usecases/login_usecase.dart
import '../../data/repositories/user_repo.dart'; // ❌ SAI: Domain không được import DataLà gì? Cách quản lý state với GetX framework
AI kiểm tra:
- ❌ Dùng
Get.put()sai chỗ (nên dùngGet.find()) - ❌ Controller lifecycle không đúng
Ví dụ lỗi:
// Trong Widget build()
final controller = Get.put(LoginController()); // ❌ SAI: Sẽ tạo instance mới mỗi lần build
// ✅ ĐÚNG: Get.find<LoginController>()AI kiểm tra:
- ❌ Hardcode đường dẫn assets → Nên dùng
Assets.icons.iconName - ❌ Hardcode text UI → Nên dùng
context.tr()để hỗ trợ đa ngôn ngữ
Ví dụ lỗi:
Image.asset('assets/icons/logo.png') // ❌ SAI: Hardcode
Image.asset(Assets.icons.logo) // ✅ ĐÚNG
Text('Login') // ❌ SAI: Hardcode
Text(context.tr('login')) // ✅ ĐÚNGAI kiểm tra:
- ❌ Thiếu pattern
Either<Failure, T>(functional programming) - ❌ Throw exception thô thay vì dùng Failure types
Ví dụ:
// ❌ SAI
User getUser() {
throw Exception('User not found');
}
// ✅ ĐÚNG
Either<Failure, User> getUser() {
return Left(UserNotFoundFailure());
}AI kiểm tra:
- File names:
snake_case(vd:user_profile.dart) - Class names:
PascalCase(vd:UserProfile) - Variables/methods:
camelCase(vd:userName,getUserName())
AI kiểm tra:
- 🐛 Bugs và lỗi logic
- 📖 Dễ đọc, dễ maintain không
- ⚡ Performance có vấn đề không
┌─────────────────────────────────────────────────────────────┐
│ 1. User tạo Pull Request trên GitHub │
└────────────────────┬────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 2. GitHub Actions tự động kích hoạt │
│ → Chạy file .github/workflows/ai-review.yml │
└────────────────────┬────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 3. Action gọi script Python: scripts/ai_review.py │
└────────────────────┬────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 4. Script Python làm gì? │
│ a) Lấy code diff từ PR (github_client.py) │
│ b) Đọc các quy tắc review (prompt_builder.py) │
│ c) Gửi code + quy tắc cho AI (openrouter_client.py) │
│ d) Nhận kết quả review từ AI │
│ e) Post comment lên PR (github_client.py) │
└────────────────────┬────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 5. User thấy comment AI review trên PR │
└─────────────────────────────────────────────────────────────┘
ai-review-bot/
│
├── action.yml # ← File định nghĩa GitHub Action
│
├── .github/workflows/
│ └── ai-review.yml # ← File workflow mẫu (user sẽ copy file này)
│
├── scripts/ # ← Code Python (core của dự án)
│ │
│ ├── ai_review.py # ← File chính - điều phối toàn bộ
│ │
│ ├── reviewer/ # ← Package chứa các modules
│ │ ├── config.py # → Đọc cấu hình (API key, model...)
│ │ ├── github_client.py # → Tương tác với GitHub API
│ │ ├── openrouter_client.py # → Gọi AI qua OpenRouter
│ │ ├── prompt_builder.py # → Xây dựng prompt gửi cho AI
│ │ ├── diff_chunker.py # → Chia nhỏ PR lớn thành chunks
│ │ └── utils.py # → Các hàm tiện ích
│ │
│ ├── stacks/ # ← Stack công nghệ
│ │ └── [folder stack] # → Quy tắc review code cho từng nền tảng công nghệ (Ví dụ: mobile-ios)
│ │ └── CODING_RULES.md # → Quy tắc code chung của ngôn ngũ
│ │
│ ├── requirements.txt # ← Danh sách thư viện Python cần cài
│ │
│ ├── rules/ # ← Các quy tắc review (có thể edit)
│ │ └── [folder code rules] # → Quy tắc review code cho từng project (Ví dụ: pubstar-ios)
│ │ ├── CLEAN_ARCHITECTURE_RULES.md # → Quy tắc Clean Architecture
│ │ └── CODING_RULES.md # → Quy tắc code chung của ngôn ngũ
│ │
│ └── system-prompts/ # ← System prompts chung trong hệ thống
│ ├── review_prompt_vi.txt # → Prompt tiếng Việt
│ ├── review_prompt_en.txt # → Prompt tiếng Anh
│ └── README.md # → Hướng dẫn edit prompts
│
└── README.md # ← File này (hướng dẫn sử dụng)
Giải thích từng phần:
| Thư mục/File | Chức năng | Có thể chỉnh sửa? |
|---|---|---|
scripts/rules/[folder code rule]/*.md |
Quy tắc review | ✅ Có - Edit để thay đổi cách AI review |
scripts/stacks/[folder stack]/*.md |
Quy tắc review | ✅ Có - Edit để thay đổi cách AI review |
scripts/system-prompts/*.txt |
Template prompt AI | ✅ Có - Edit để thay đổi tone/style của AI |
.github/workflows/ai-review.yml |
File mẫu để user copy | ✅ Có (user copy và tùy chỉnh) |
action.yml |
Định nghĩa GitHub Action | ❌ Không (trừ khi bạn là maintainer) |
scripts/ai_review.py |
Code Python chính | ❌ Không cần (trừ khi fix bug) |
scripts/reviewer/*.py |
Các module Python | ❌ Không cần (trừ khi fix bug) |
Dự án được tổ chức thành 6 modules nhỏ, mỗi module làm 1 nhiệm vụ riêng:
- ai_review.py - File điều phối chính
- Gọi các module khác theo thứ tự
- Xử lý workflow tổng thể
- Code ngắn gọn, dễ đọc
-
config.py - Quản lý cấu hình
- Đọc biến môi trường (API keys, tokens...)
- Kiểm tra cấu hình hợp lệ
- Định nghĩa các hằng số (giới hạn kích thước, token...)
-
github_client.py - Làm việc với GitHub
- Lấy thông tin PR (metadata, code diff)
- Đăng comment review lên PR
- Kiểm tra cấu trúc diff hợp lệ
-
openrouter_client.py - Gọi AI
- Kết nối với OpenRouter API
- Hỗ trợ 200+ AI models
- Xử lý retry khi bị rate limit
- Hỗ trợ reasoning cho model nâng cao
- Tự động gửi tên project trong header
X-Titleđể tracking usage
-
prompt_builder.py - Xây dựng prompt
- Load template prompt (tiếng Việt/Anh)
- Load các quy tắc coding
- Kết hợp thành prompt hoàn chỉnh gửi AI
- Cắt ngắn diff nếu quá dài
-
diff_chunker.py - Chia nhỏ PR lớn
- Tự động phát hiện PR quá lớn (>5 files, >30k ký tự)
- Chia diff thành các chunks nhỏ (theo file)
- Đảm bảo AI không bỏ sót code
-
utils.py - Hàm tiện ích
- Parse số PR từ GitHub ref
- Format error messages
- Các helper functions khác
- ✅ Modular: Mỗi module làm 1 việc, dễ hiểu
- ✅ Dễ test: Test từng module riêng biệt
- ✅ Dễ maintain: Sửa bug dễ dàng, biết bug ở module nào
- ✅ Dễ mở rộng: Thêm AI provider mới chỉ cần sửa 1 file
- ✅ Tương thích ngược: User cũ không cần thay đổi gì
Nếu bạn muốn hiểu sâu hơn hoặc đóng góp code:
- 📖 Module Documentation - Chi tiết từng module
- 📖 Architecture Diagrams - Sơ đồ kiến trúc
- Bạn muốn thử nghiệm trước khi push lên GitHub
- Bạn đang sửa code Python và muốn test
- Bạn muốn hiểu cách script hoạt động
Bước 1: Cài đặt Python dependencies
# Cài các thư viện Python cần thiết
pip install -r scripts/requirements.txtBước 2: Set biến môi trường
# Các thông tin cần thiết cho script
export OPENROUTER_API_KEY='sk-or-v1-xxxxxx' # ← API key OpenRouter
export GITHUB_TOKEN='ghp_xxxxxxxxxxxxx' # ← GitHub Personal Access Token
export STACK='backend-node' # ← stack công nghệ của dự án
export RULES_PATH='pubstar' # ← Thư mục chức luật review code
export GITHUB_REPOSITORY='owner/repo' # ← Tên repo (vd: facebook/react)
export GITHUB_REF='refs/pull/1/merge' # ← Số PR (ví dụ: PR #1)
export REVIEW_LANGUAGE='vietnamese' # ← Ngôn ngữ (vietnamese hoặc english)
exprot OPENROUTER_MODEL='google/gemini-3.1-flash-lite' # ← Modal dùng để review codeLấy GitHub Token ở đâu?
- Vào GitHub → Settings → Developer settings → Personal access tokens
- Generate new token với quyền:
repo,pull_request
Bước 3: Chạy script
# Chạy file Python chính
python scripts/ai_review.pyKết quả: Script sẽ review PR và in ra kết quả (hoặc post comment nếu có quyền)
Tất cả quy tắc được lưu trong thư mục scripts/rule/ dưới dạng file Markdown (.md)
Hiện có 3 file quy tắc:
- CLEAN_ARCHITECTURE_RULES.md - Quy tắc Clean Architecture
- GETX_CONTROLLER_RULES.md - Quy tắc GetX
- CODING_RULES.md - Quy tắc code chung (naming, assets, i18n...)
Cách 1: Sửa file quy tắc có sẵn
Ví dụ muốn thay đổi quy tắc:
- Mở file
scripts/rules/[folder code rules]/*.md - Sửa nội dung theo ý muốn (bằng tiếng Việt hoặc tiếng Anh đều được)
- Lưu file
- Lần review sau AI sẽ dùng quy tắc mới
Cách 2: Thêm file quy tắc mới
Ví dụ muốn thêm quy tắc về testing:
-
Tạo file mới:
scripts/rules/TESTING_RULES.md -
Viết quy tắc:
# Testing Rules - Every feature must have unit tests - Coverage must be > 80% - Use mockito for mocking
-
Lưu file → Tự động được load vào prompt gửi AI
Lưu ý: Tất cả file
.mdtrong thư mụcrules/sẽ được AI đọc và áp dụng
Thư mục scripts/system-prompts/ có 2 file:
review_prompt_vi.txt- Prompt tiếng Việtreview_prompt_en.txt- Prompt tiếng Anh
Ví dụ: Muốn AI review strict hơn
- Mở file
scripts/system-prompts/review_prompt_vi.txt - Tìm đoạn:
Bạn là một senior software engineer... - Sửa thành:
Bạn là một SUPER STRICT senior software engineer. Hãy tìm MỌI lỗi, dù là nhỏ nhất. Đánh giá rất khắt khe... - Lưu file
Biến template có thể dùng:
Trong prompt, bạn có thể dùng các biến này (sẽ được thay thế tự động):
{coding_rules}→ Nội dung từ các file trongscripts/rules/{code_diff}→ Code diff của PR
Ví dụ prompt:
Bạn là AI reviewer.
Review code sau theo các quy tắc:
{coding_rules}
Code cần review:
{code_diff}Chi tiết: Xem hướng dẫn đầy đủ tại scripts/system-prompts/README.md
- Grok 4.1 Fast (đang dùng) - Hoàn toàn miễn phí
- Gemini 2.0 Flash - Miễn phí
- Llama 3.2 - Miễn phí
→ Bạn có thể dùng KHÔNG MẤT TIỀN nếu chọn model free
- Claude 3.5 Sonnet - ~$0.01-0.02 mỗi lần review (rất rẻ)
- GPT-4 Turbo - ~$0.02-0.05 mỗi lần review
→ Nếu chọn model trả phí, phải nạp tiền vào OpenRouter trước
Action tự động:
- ✅ Retry khi bị rate limit (giới hạn số lần gọi)
- ✅ Xử lý lỗi API một cách graceful
- ✅ Hỗ trợ reasoning cho model có tính năng này
- Dashboard: OpenRouter Activity
- So sánh model: OpenRouter Models
Khuyến nghị: Dùng model miễn phí cho dự án cá nhân, model trả phí cho production
Action tự động gửi thông tin project trong mỗi API request để giúp bạn tracking và phân loại usage trên OpenRouter dashboard.
Mỗi request gửi đến OpenRouter sẽ bao gồm header X-Title với tên repository và số PR:
POST https://openrouter.ai/api/v1/chat/completions
Headers:
Authorization: Bearer sk-or-v1-...
Content-Type: application/json
X-Title: your-company/your-app - PR #123 ← Tên repo + PR number- 📊 Theo dõi usage theo project và PR: Xem chi tiêu của từng repo và từng PR riêng biệt trên OpenRouter Activity
- 🔍 Debug dễ dàng: Biết request nào thuộc PR nào khi có lỗi
- 💰 Quản lý chi phí: Phân tích cost breakdown theo từng dự án và PR cụ thể
Nếu muốn thay đổi tên hiển thị (mặc định là GITHUB_REPOSITORY - PR #<number>):
- Mở file
scripts/ai_review.py - Tìm dòng 56-60:
openrouter_client = OpenRouterClient( Config.OPENROUTER_API_KEY, project_name=Config.GITHUB_REPOSITORY or "AI Code Review Bot", pr_number=pr_number )
- Thay đổi theo ý muốn:
- Bỏ PR number: Xóa dòng
pr_number=pr_number - Đổi project name: Thay
Config.GITHUB_REPOSITORYthành tên tùy chỉnh
- Bỏ PR number: Xóa dòng
Action tự động chia nhỏ PR lớn thành các chunks (phần)
- PR có >5 files VÀ >30,000 ký tự
- Tự động chia theo file (không bao giờ cắt giữa file)
- Review từng chunk riêng, sau đó gộp lại
- ✅ Review đầy đủ: Tất cả file đều được review, không bỏ sót
- ✅ Tránh "Lost in the Middle": AI tập trung tốt hơn khi context ngắn
- ✅ Chất lượng cao hơn: AI chỉ focus vào 2-4 files mỗi lần
- ✅ Theo dõi tiến độ: Log hiển thị "Reviewing chunk 2/5..."
Với PR lớn, bạn sẽ thấy comment như sau:
## 📋 Tổng Hợp Code Review
_PR này được review theo 3 phần do kích thước lớn._
---
### Phần 1: lib/features/auth/login.dart, logout.dart
🔴 Lỗi Nghiêm Trọng
- File login.dart dòng 42: Dùng Get.put() trong build()
...
---
### Phần 2: lib/features/profile/user_profile.dart
⚠️ Cảnh báo
- File user_profile.dart dòng 15: Hardcode string 'Profile'
...
---
### Phần 3: lib/core/utils/...
✅ Tốt
...Lưu ý: Chunking sẽ gọi API nhiều lần hơn (1 lần mỗi chunk), nhưng đảm bảo review đầy đủ
Nguyên nhân: Chưa thêm API key vào GitHub Secrets
Cách fix:
- Vào repo → Settings → Secrets and variables → Actions
- Thêm secret tên
OPENROUTER_API_KEY - Paste API key vào
Nguyên nhân: API key sai hoặc hết hạn
Cách fix:
- Kiểm tra lại API key tại OpenRouter Keys
- Đảm bảo tên secret là chính xác:
OPENROUTER_API_KEY(không có dấu cách, đúng chữ hoa/thường) - Tạo API key mới nếu cần
Nguyên nhân: Hết tiền (khi dùng model trả phí)
Cách fix:
- Option 1: Nạp tiền tại OpenRouter Credits
- Option 2: Đổi sang model miễn phí (xem phần Cách đổi AI Model)
Nguyên nhân: PR không có thay đổi code nào
Giải thích: Bình thường, không phải lỗi. PR trống nên không có gì để review.
Nguyên nhân: Gọi API quá nhiều lần trong thời gian ngắn
Cách fix:
- Đợi 1-2 phút rồi thử lại (action tự động retry)
- Kiểm tra rate limit tại OpenRouter Settings
Đã fix trong version mới:
- ✅ Smart Truncation: Cắt diff theo file, không cắt giữa file
- ✅ Intelligent Chunking: PR lớn tự động chia nhỏ
- ✅ Tăng giới hạn: Từ 12k → 100k ký tự
Nếu vẫn gặp lỗi:
- Kiểm tra GitHub Actions logs (tab "Actions" trong repo)
- Tìm thông tin về chunking
- Báo lỗi tại GitHub Issues
MIT License - Feel free to use and modify for your projects
Contributions welcome! Please open an issue or PR.
Built with:
- OpenRouter API - Unified access to 200+ AI models
- GitHub Actions
If you're upgrading from the Gemini version (v2.x), just update your workflow:
Old (Gemini):
- uses: pubstar-io/ios-sdk-ai-review-bot@v2
with:
gemini-api-key: ${{ secrets.GEMINI_API_KEY }}
github-token: ${{ secrets.GITHUB_TOKEN }}New (OpenRouter):
- uses: pubstar-io/ios-sdk-ai-review-bot@main
with:
openrouter-api-key: ${{ secrets.OPENROUTER_API_KEY }}
github-token: ${{ secrets.GITHUB_TOKEN }}Note: Model selection is now controlled by project maintainers in config.py, not by workflow configuration. This ensures consistent review quality across all PRs.