👋 Giới thiệu
Đánh giá mã là một phần quan trọng trong quy trình phát triển phần mềm, nhưng nó có thể tốn nhiều thời gian, đặc biệt là đối với các đội ngũ lớn. PR-Agent (hiện là Qodo Merge) sử dụng trí tuệ nhân tạo để tự động đánh giá các pull request, tạo mô tả và đề xuất cải tiến. Hướng dẫn này sẽ hướng dẫn bạn cách thiết lập PR-Agent với OpenRouter, cung cấp cách tiếp cận tiết kiệm chi phí để sử dụng nhiều mô hình AI (GPT-4o, Claude, Gemini, v.v.) thông qua một API thống nhất.
📌 Tại sao chọn OpenRouter?
Những thách thức với API OpenAI Trực Tiếp
- Phụ thuộc vào một nhà cung cấp duy nhất (chỉ mô hình OpenAI)
- Quản lý phức tạp các API của nhiều nhà cung cấp
- Khó khăn trong việc so sánh giá cả giữa các mô hình khác nhau
Lợi ích của OpenRouter
- API Đa Mô Hình Thống Nhất - Truy cập GPT-4o, Claude, Gemini, Llama, v.v. thông qua một giao diện duy nhất
- Lựa Chọn Mô Hình Linh Hoạt - Chọn mô hình phù hợp cho từng tác vụ, tối ưu hóa hiệu quả chi phí
- Truy Cập Sớm Các Mô Hình Mới Nhất - Truy cập nhanh đến các mô hình mới như GPT-5
- Giá Cả Minh Bạch - Giá rõ ràng cho từng mô hình (phí 5.5% cho các giao dịch mua tín dụng)
Các yêu cầu trước khi bắt đầu
- Kho lưu trữ GitHub (riêng tư hoặc công khai)
- Tài khoản OpenRouter (miễn phí để tạo)
- Quyền truy cập GitHub Actions
Bước 1: Thiết lập OpenRouter
1.1 Tạo tài khoản và khóa API
- Truy cập OpenRouter và tạo một tài khoản
- Mua Tín Dụng (Quan trọng)
- Vào trang "Tín dụng" trong bảng điều khiển của bạn
- Mua tối thiểu là $5 (phí 5.5% áp dụng cho các giao dịch mua tín dụng)
- Tùy chọn tự động nạp tiền có sẵn để tiện lợi
- ⚠️ Miễn Phí: Tài khoản mới nhận được một số tín dụng miễn phí nhỏ, nhưng cần thêm giao dịch mua cho việc sử dụng sản xuất (Câu hỏi thường gặp: Các tùy chọn miễn phí nào có sẵn?)
- Trong bảng điều khiển, vào "Khóa API" và tạo một khóa mới
- Sao chép và lưu trữ khóa một cách an toàn
1.2 Các mô hình có sẵn
OpenRouter cung cấp quyền truy cập vào các mô hình như:
openai/gpt-5 # Mô hình mới nhất (phát hành 2025)
openai/gpt-4o # Hiệu suất cân bằng
anthropic/claude-3-opus-20240229 # Phân tích chất lượng cao
google/gemini-pro # Mô hình của Google
meta-llama/llama-2-70b-chat # Mã nguồn mở
Kiểm tra giá tại OpenRouter Models.
Bước 2: Thiết lập Workflow GitHub Actions
2.1 Cấu hình Bí mật
Trong kho lưu trữ GitHub của bạn:
- Vào Cài đặt → Bí mật và biến → Hành động
- Nhấp vào "Bí mật kho lưu trữ mới"
- Thêm bí mật sau đây:
Tên: OPENROUTER_API_KEY
Giá trị: or-xxxxxxxx (khóa API OpenRouter của bạn)
2.2 Tạo Tệp Workflow
Tạo tệp .github/workflows/pr_agent.yml
name: Đánh Giá Mã (OpenRouter)
on:
pull_request:
pull_request_review_comment:
types: [created]
# Kiểm soát độ đồng thời
concurrency:
group: ${{ github.repository }}-${{ github.event.number || github.head_ref || github.sha }}-${{ github.workflow }}-${{ github.event_name == 'pull_request_review_comment' && 'pr_comment' || 'pr' }}
cancel-in-progress: ${{ github.event_name != 'pull_request_review_comment' }}
jobs:
pr_agent_job:
if: |
github.event.sender.type != 'Bot' &&
github.event_name == 'pull_request' &&
github.event.pull_request.changed_files < 50
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
contents: write
id-token: write
name: Chạy tác vụ PR agent trên mỗi pull request
steps:
- name: Bước hành động PR Agent với OpenRouter
id: pragent
uses: qodo-ai/pr-agent@main
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
OPENROUTER.KEY: ${{ secrets.OPENROUTER_API_KEY }} # Xác thực OpenRouter API
github_action_config.auto_review: "true" # kích hoạt/tắt đánh giá tự động
github_action_config.auto_describe: "true" # kích hoạt/tắt mô tả tự động
github_action_config.auto_improve: "true" # kích hoạt/tắt cải tiến tự động
Bước 3: Tệp Cấu hình
Tạo tệp .pr_agent.toml
trong thư mục gốc của kho lưu trữ.
[config]
model = "openai/gpt-5" # Tôi đã chỉ định gpt-5, nhưng có lỗi xảy ra. Cài đặt đúng là "openai/gpt-5".
fallback_models = ["openai/gpt-4o", "anthropic/claude-opus-4.1"]
ai_timeout = 300
custom_model_max_tokens = 200000 # Quan trọng! Lỗi nếu không có điều này
response_language = "en-US"
ignore_pr_title = ["^\\[Auto\\]", "^Auto"]
ignore_pr_labels = ['invalid']
[ignore]
glob = ['dist/**']
[github_action_config]
# đặt là biến môi trường trong .github/workflows/pr-agent.yaml
#auto_review = true
#auto_improve = true
#auto_describe = true
[pr_reviewer]
extra_instructions = """\
(1) Hành động như một kỹ sư phần mềm có kinh nghiệm cao
(2) Cung cấp đánh giá kỹ lưỡng về mã, tài liệu và bài viết
(3) Đề xuất các đoạn mã cụ thể để cải tiến
(4) **Không bao giờ** bình luận về thụt lề, khoảng trắng, dòng trống hoặc các vấn đề chỉ mang tính chất thẩm mỹ trừ khi chúng thay đổi ngữ nghĩa của chương trình.
(5) **Khu vực đánh giá ưu tiên - Kiểm tra một cách hệ thống:**
- **Bảo mật**: Mật khẩu dạng văn bản, SQL injection, xác thực đầu vào, rò rỉ ngoại lệ
- **Xử lý lỗi**: Các điều khoản except trống, thiếu try-catch, ẩn lỗi im lặng
- **Quản lý tài nguyên**: Thiếu trình quản lý ngữ cảnh (câu lệnh với), kết nối/tệp chưa đóng
- **An toàn kiểu dữ liệu**: Thiếu gợi ý kiểu dữ liệu, sử dụng kiểu dữ liệu không chính xác, kiểu Any không hợp lý
- **Hiệu suất**: Thuật toán không hiệu quả (O(n²) hoặc tệ hơn), vòng lặp không cần thiết, rò rỉ bộ nhớ
- **Chất lượng mã**: Số ma thuật, tên biến không rõ ràng, nhập/xuất biến không sử dụng
- **Thiết kế API**: Thiếu xác thực đầu vào, không có phản hồi lỗi, kiểm tra trường bắt buộc
- **Kiến trúc**: Vi phạm nguyên tắc trách nhiệm đơn, ràng buộc chặt chẽ, sử dụng trạng thái toàn cục
(6) Tập trung vào các vấn đề cụ thể, có thể hành động với các ví dụ mã cụ thể và đề xuất sửa chữa.
"""
num_code_suggestions = 5
inline_code_comments = true
ask_and_reflect = true
[pr_description]
extra_instructions = "Tạo mô tả rõ ràng và toàn diện"
generate_ai_title = true
add_original_user_description = false
publish_description_as_comment = true
[pr_code_suggestions]
extra_instructions = "Cung cấp các gợi ý mã có thể hành động với ví dụ"
commitable_code_suggestions = true
demand_code_suggestions_self_review=true
Bước 4: Kiểm tra Cài đặt
4.1 Tạo PR thử nghiệm
Tạo một PR với mã có vấn đề cố ý.
# Thiếu gợi ý kiểu dữ liệu
def fizz_buzz(n):
for i in range(1, n):
if i % 15 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
printo(i) # Lỗi cố ý
# Vấn đề bảo mật
def add_user(name, password):
users = []
user = {"name": name, "password": password} # Mật khẩu dạng văn bản
users.append(user)
4.2 Kết quả dự kiến
PR-Agent sẽ cung cấp.
Mô Tả PR Tự Động Tạo:
- Tóm tắt các thay đổi
- Chi tiết thay đổi theo tệp
- Phân tích tác động
Nhận xét Đánh Giá Mã:
- Sửa chữa cho
printo(i)
→print(i)
- Đề xuất gợi ý kiểu dữ liệu
- Cảnh báo bảo mật về mật khẩu dạng văn bản
- Đề xuất cải tiến hiệu suất
Bước 5: Cấu hình Nâng Cao
5.1 Tối Ưu Hóa Chi Phí
Sử dụng các mô hình khác nhau cho các tác vụ khác nhau.
[config]
model = "openai/gpt-4o-mini" # Đối với các tác vụ nhẹ
model_turbo = "openai/gpt-5" # Đối với phân tích phức tạp
fallback_models = ["anthropic/claude-3.7-sonnet", "google/gemini-2.5-pro"]
5.2 Quy Tắc Cụ Thể Đội Ngũ
[pr_reviewer]
extra_instructions = """\
(1) Kiểm tra theo quy tắc công ty:
- Sử dụng ghi nhật ký có cấu trúc cho tất cả đầu ra nhật ký
- Các cuộc gọi API bên ngoài phải có cài đặt thời gian chờ
- Truy cập cơ sở dữ liệu phải sử dụng giao dịch
- Không bao giờ mã hóa cứng các bí mật (khóa API, mật khẩu, v.v.)
"""
5.3 Loại Bỏ Tệp
[ignore]
glob = ['dist/**', '*.min.js', 'node_modules/**', '__pycache__/**']
[config]
ignore_pr_title = ["^\\[Auto\\]", "^WIP:", "^Draft:"]
ignore_pr_labels = ['work-in-progress', 'do-not-review']
Khắc Phục Sự Cố
Các Vấn Đề Thường Gặp và Giải Pháp
1. Mô hình không được công nhận
Error: Model openai/gpt-5 is not defined in MAX_TOKENS
Giải pháp: Thêm custom_model_max_tokens = 200000 vào cấu hình
Lỗi này xảy ra khi sử dụng một mô hình mà PR-Agent không công nhận. Các mô hình được hỗ trợ bởi PR-Agent được liệt kê trong tệp này. Nếu mô hình bạn chọn không có trong danh sách này, bạn cần thiết lập cấu hình custom_model_max_tokens.
2. Phản hồi ngôn ngữ không nhất quán
[config]
response_language = "en-US" # Nên cụ thể
[pr_reviewer]
extra_instructions = "Luôn phản hồi bằng tiếng Anh và giải thích các thuật ngữ kỹ thuật một cách rõ ràng"
3. Lỗi quyền GitHub Actions
permissions:
issues: write
pull-requests: write
contents: write # Thêm dòng này
id-token: write
4. Thời gian chờ trên các PR lớn
[config]
ai_timeout = 600 # Mở rộng đến 10 phút
large_patch_policy = "clip" # Chia nhỏ các PR lớn
Các Thực Hành Tối Ưu Quản Lý Chi Phí
1. Lựa Chọn Mô Hình Phù Hợp
Tác vụ | Mô hình Đề xuất | Giá (khoảng) |
---|---|---|
Đánh giá đơn giản | gpt-4o-mini | $0.15/1M tokens |
Phân tích chi tiết | gpt-4o | $2.5/1M tokens |
Chất lượng cao nhất | openai/gpt-5 | $1.25/1M tokens |
2. Giới Hạn Kích Thước PR
if: github.event.pull_request.changed_files < 50 # Giới hạn số lượng tệp
3. Kiểm Soát Thực Thi Tự Động
[config]
ignore_pr_labels = ['draft', 'wip', 'skip-ai-review']
ignore_pr_title = ["^\\[WIP\\]", "^Draft:", "^Auto"]
Đo Lường Tác Động
So Sánh Trước/Sau
Chỉ Số Định Lượng:
- Thời gian đánh giá mã giảm
- Tăng cường phát hiện lỗi
- Xác định vấn đề bảo mật sớm hơn
- Thời gian hợp nhất PR nhanh hơn
Chỉ Số Định Tính:
- Giảm gánh nặng cho người đánh giá
- Cải thiện chất lượng mã
- Hiệu ứng học tập (cải thiện kỹ năng lập trình viên)
Ví Dụ Kết Quả Thực Tế
Trước: Thời gian đánh giá trung bình 2 giờ/PR
Sau: Thời gian đánh giá trung bình 45 phút/PR (giảm 62%)
Phát hiện vấn đề bảo mật:
- Trước: 2 vấn đề/tháng trung bình
- Sau: 8 vấn đề/tháng trung bình (tăng 4 lần)
📝 Kết luận
Thiết lập PR-Agent với OpenRouter mang lại những lợi ích sau:
✅ Hiệu Suất Chi Phí - Sử dụng nhiều mô hình thông qua OpenRouter để tối ưu hóa chi phí
✅ Cải Thiện Chất Lượng - Tiêu chuẩn đánh giá nhất quán giảm thiểu sai sót
✅ Hiệu Quả - Giảm đáng kể thời gian đánh giá
✅ Hiệu Ứng Học Tập - Các lập trình viên học hỏi các thực hành tốt từ phản hồi AI
✅ Linh Hoạt - Có thể tùy chỉnh cho yêu cầu cụ thể của đội
Chúng tôi khuyên bạn nên bắt đầu với một dự án nhỏ để thử nghiệm và dần mở rộng. Tệp cấu hình cho phép tùy biến rộng rãi để phù hợp với nhu cầu của đội bạn.
📚 Tài nguyên tham khảo
- Tài liệu Chính thức của PR-Agent
- OpenRouter
- Ví dụ về GitHub Actions
- Các tùy chọn cấu hình
Hy vọng hướng dẫn này giúp cải thiện quy trình đánh giá mã của bạn! Hãy chia sẻ câu hỏi hoặc ý kiến trong phần bình luận.