Trợ lý học tập biến slide bài giảng tiếng Anh thành bản tóm tắt song ngữ, flashcard ôn tập và đề thi thử — cho sinh viên Việt Nam học chương trình tiếng Anh.
Định nghĩa và thuật ngữ giữ nguyên tiếng Anh (vì đi thi phải viết tiếng Anh). Giải thích và chú thích bằng tiếng Việt (vì phải hiểu mới nhớ).
📖 Đọc tech.md trước khi code. Đó là nguồn sự thật về kiến trúc, API, mô hình dữ liệu và lộ trình.
📝 Xem process.md để biết đã làm đến đâu — và ghi vào đó mỗi khi làm xong việc gì.
| Module | Trạng thái |
|---|---|
📚 Tóm tắt Slide — upload PDF/PPTX/ảnh → bản tóm tắt song ngữ, tải về .md hoặc in PDF |
✅ Chạy được |
| 🧠 Ôn tập SRS — flashcard tự sinh từ thuật ngữ, lặp lại ngắt quãng SM-2 | ✅ Chạy được |
| 📝 Quiz — sinh câu hỏi từ slide, chấm điểm, giải thích đáp án | ✅ Chạy được |
| 🎙️ Bài giảng — audio hoặc transcript → tóm tắt, khái niệm chính, câu hỏi thi | ✅ Backend xong, giao diện đã nối |
| 🤖 AI Tutor — chat có ngữ cảnh tài liệu | |
| ✍️ Essay Engine — sinh và chấm bài luận theo rubric |
- Frontend — Next.js 14 (App Router) · TypeScript · Tailwind · shadcn/ui → deploy trên Vercel
- Backend — NestJS 11 · TypeScript strict · Prisma → chạy trên máy cá nhân
- Database — PostgreSQL trên Supabase
- AI — model local qua Ollama (API tương thích OpenAI)
- Văn bản
qwen3:8b· Đọc ảnhqwen2.5vl:7b· Embeddingbge-m3 - Speech-to-text:
faster-whisperchạy tiến trình riêng
- Văn bản
- Auth — JWT (Passport) + bcryptjs
⚠️ Không dùng Redis, BullMQ, S3, Railway hay Docker Compose. README cũ có nhắc tới những thứ này nhưng chúng chưa bao giờ tồn tại trong mã nguồn. Đừng viết code dựa trên chúng.
Hai lý do, đều là điều kiện bắt buộc:
- Ollama chạy trên máy bạn. Hàm serverless của Vercel chạy trong đám mây —
localhost:11434ở đó không phải máy bạn. - Vercel giới hạn 60 giây mỗi request. Model local chậm hơn cloud vài lần. Tóm tắt một bộ slide dài, hay sinh một bài luận (5 lần gọi AI liên tiếp), đều vượt xa mốc đó.
Frontend vẫn ở Vercel (luôn online, miễn phí). Backend chạy ở nhà và ra internet qua Cloudflare Tunnel. Chi tiết: tech.md §4.
- macOS (Apple Silicon), Node.js 20+
- Ollama đã cài
- Một database PostgreSQL (Supabase miễn phí là đủ)
./scripts/setup-mac.shScript sẽ tự: kiểm tra Node và Ollama → tải 3 model AI (~12 GB) → đặt biến môi trường cho Ollama → tạo backend/.env → cài thư viện → cập nhật cấu trúc database.
Giữa chừng nó sẽ nhắc bạn điền 3 giá trị vào backend/.env:
| Giá trị | Lấy ở đâu |
|---|---|
DATABASE_URL |
Supabase → Project Settings → Database → Connection string → Transaction (cổng 6543) |
DIRECT_URL |
Cũng ở đó, nhưng bản Session (cổng 5432) |
JWT_SECRET |
Tự tạo: openssl rand -base64 48 |
Điền xong thì chạy lại ./scripts/setup-mac.sh một lần nữa.
./scripts/start.shMở http://localhost:3000. Bấm Ctrl+C để tắt.
Script tự kiểm tra Ollama, model, cấu hình, cổng — thiếu gì nó báo rõ bằng tiếng Việt kèm cách sửa. Nó cũng chỉ biên dịch lại khi bạn thực sự có sửa code.
| Lệnh | Dùng khi |
|---|---|
./scripts/start.sh |
Dùng một mình |
./scripts/start.sh --share |
Mở cho bạn bè truy cập từ xa |
./scripts/start.sh --api-only |
Chỉ backend, khi giao diện đã ở Vercel |
Log ghi vào .logs/.
brew install cloudflared # cài một lần
./scripts/start.sh --shareScript in ra một địa chỉ https://....trycloudflare.com. Sau đó:
- Vào Vercel → dự án frontend → Settings → Environment Variables → đặt
NEXT_PUBLIC_API_URL= địa chỉ đó +/v1, rồi deploy lại - Thêm địa chỉ frontend trên Vercel vào
CORS_ORIGINStrongbackend/.env
⚠️ Địa chỉ quick tunnel đổi mỗi lần bật lại, nên phải sửa Vercel mỗi lần. Muốn địa chỉ cố định miễn phí, dùng Tailscale Funnel — hướng dẫn ởtech.md§4.7.
Máy bạn phải bật thì bạn bè mới dùng được. Đây là đánh đổi có chủ đích cho một nhóm nhỏ — xem
tech.md§4.1.
Danh sách đầy đủ kèm giải thích: tech.md §4.4. Những biến quan trọng nhất:
| Biến | Mặc định | Ghi chú |
|---|---|---|
DATABASE_URL |
— | Supabase, cổng 6543 (pooled), kèm ?pgbouncer=true&connection_limit=1 |
DIRECT_URL |
— | Supabase, cổng 5432 — dùng cho migration |
JWT_SECRET |
— | Chuỗi ngẫu nhiên dài |
OPENAI_BASE_URL |
http://127.0.0.1:11434/v1 |
Ollama |
OPENAI_API_KEY |
ollama |
Ollama không kiểm tra, nhưng SDK bắt buộc có |
OPENAI_MODEL |
qwen3:8b |
Model sinh văn bản |
OPENAI_VISION_MODEL |
qwen2.5vl:7b |
Đọc slide dạng ảnh |
OPENAI_EMBEDDING_MODEL |
bge-m3 |
Embedding cho RAG |
WHISPER_URL |
— | Địa chỉ sidecar speech-to-text |
WHISPER_LANGUAGE |
auto |
Đừng đặt cứng en — giảng viên có thể nói tiếng Việt |
CORS_ORIGINS |
http://localhost:3000 |
Danh sách tên miền được phép, cách nhau bằng dấu phẩy |
backend/src/
├── ai/ Mọi lệnh gọi AI đi qua đây (+ lớp sửa JSON cho model local)
├── auth/ JWT, đăng ký, đăng nhập
├── slides/ ⭐ Module lõi: môn học + tóm tắt slide
├── learning/ Flashcard SRS, quiz, bảng điều khiển
├── lecture/ Audio → transcript → tài liệu học
├── essay/ Sinh và chấm bài luận theo rubric
├── tutor/ Chat RAG, giải thích, giải bài
└── common/ CORS, filter lỗi, interceptor, decorator
frontend/src/
├── app/ Các trang (App Router)
├── components/ AppShell, QuizRunner, thư viện ui/
└── lib/ Client gọi API, context đăng nhập
cd backend && npx tsc --noEmit # phải sạch
cd frontend && npx tsc --noEmit # phải sạch
cd frontend && npx next build # phải thành côngVà ghi lại thay đổi vào process.md — nếu không, lần làm việc sau sẽ phải audit lại toàn bộ sản phẩm từ đầu.