№ 24
OnBxrd là ứng dụng hỗ trợ vận hành khu dân cư, kết nối cư dân với ban quan lý trên một nền tảng duy nhất.
Ban quản lý khu dân cư thường vận hành nhiều kênh rời rạc: điện thoại, nhóm trò chuyện, biểu mẫu thủ công và thông báo giấy. Hệ quả là cư dân khó tìm đúng quy định hoặc hướng dẫn tiện ích; yêu cầu xử lý bị thiếu thông tin; lịch sử trao đổi không gắn với sự cố; và ban quản lý khó theo dõi trạng thái, người phụ trách hay mức độ tiếp cận của thông báo.
OnBxrd giải quyết bài toán này bằng một không gian làm việc chung cho cư dân và ban quản lý. Trọng tâm không phải là đưa chatbot vào mọi thao tác, mà là dùng AI để hỗ trợ tra cứu và thu thập thông tin, trong khi backend vẫn là nguồn quyết định cuối cùng cho quyền hạn, dữ liệu và hành động có tác động nghiệp vụ.
Các nhóm nhu cầu chính:
| Nhóm | Chức năng hiện có |
|---|---|
| Tài khoản | Đăng ký cư dân theo mã xác thực email, đăng nhập, refresh token, đăng xuất một hoặc tất cả phiên, đổi mật khẩu, quên và đặt lại mật khẩu. |
| Hồ sơ cư dân | Xem hồ sơ và các căn hộ được gán; chỉ có thể tạo phiếu yêu cầu cho căn hộ mà mình được phân quyền. |
| Hướng dẫn ban đầu | Xem checklist onboarding, cập nhật trạng thái từng mục và nhận nội dung tóm tắt theo từng bước. |
| Trợ lý sổ tay | Hỏi đáp quy định, tiện ích và thông tin vận hành dựa trên handbook; câu trả lời có citation khi retrieval tìm được nguồn. |
| Phiếu yêu cầu | Tạo từ biểu mẫu hoặc từ chat; có category, priority, vị trí, mô tả, căn hộ, idempotency key và file đính kèm. |
| Hội thoại phiếu | Mỗi phiếu có một conversation riêng chứa tin nhắn, trạng thái handoff, tệp đính kèm và lịch sử thay đổi. |
| Thông báo | Danh sách theo audience, lọc chưa đọc/loại/mức ưu tiên, xem chi tiết, đánh dấu đã đọc, đếm chưa đọc và tải tệp đính kèm. |
| Nhóm | Chức năng hiện có |
|---|---|
| Quản trị tài khoản | Bootstrap admin đầu tiên bằng token; admin tạo, cập nhật và xóa account management; manager có thể xóa account cư dân theo quyền đã định. |
| Cư dân và căn hộ | Danh sách cư dân, cập nhật hồ sơ, gán cư dân vào căn hộ và quản lý unit. |
| Hàng đợi phiếu | Danh sách/lọc phiếu; xem chi tiết, conversation, attachment, assignment, hạn xử lý, trạng thái và audit event. |
| Handoff hội thoại | Manager tiếp nhận conversation chờ hỗ trợ, phản hồi trong cùng thread và handback lại cho chatbot. Cơ chế assignment ngầm khi phản hồi đầu tiên, kết hợp version để tránh ghi đè. |
| Thông báo | Tạo/sửa draft, publish, archive, xóa draft, chọn audience theo toàn bộ cư dân/dự án/tòa nhà/căn hộ, attachment, audit và thống kê đọc. |
| Trợ lý tạo thông báo | Manager tạo conversation AI, mô tả yêu cầu tự nhiên, bổ sung trường thiếu, xác nhận tạo draft và xác nhận publish ở bước riêng. |
| Kho tri thức | Upload và quản lý metadata tài liệu handbook/regulation/amenity guide/notice; có script ingest để xử lý tài liệu vào vector store. |
| Onboarding | Xem tiến độ onboarding theo cư dân để theo dõi vận hành, không yêu cầu xác nhận hai phía. |
Hai workflow được model hóa rõ ràng trong AIWorkflow:
resident_ticket: thu thập unit_id, category, priority, title, description, location và attachment; chỉ tạo ticket sau xác nhận.manager_announcement: thu thập title, content, type, priority, expiry, scopes và attachment; tạo draft sau xác nhận, sau đó yêu cầu xác nhận publish riêng.Agent chỉ đề xuất intent, draft, missing fields và action. Service backend xác thực role, ownership, trạng thái workflow, version, attachment ID và dữ liệu nghiệp vụ trước khi tạo hoặc publish. Thiết kế này giảm nguy cơ LLM gọi hành động có tác động trực tiếp hoặc tạo dữ liệu sai thẩm quyền.
Hệ thống đang là modular monolith gồm ba phần chính:
Next.js frontend
|
| HTTPS / REST + SSE, Bearer JWT
v
FastAPI modular backend
|- Auth, RBAC, resident, unit, ticket, conversation
|- announcement, onboarding, attachment, realtime
|- AI workflow orchestration và knowledge adapter
|
+--> PostgreSQL (Alembic)
+--> S3 private bucket (presigned URL)
+--> ChromaDB/Qdrant (RAG vector store)
+--> LLM provider: OpenAI, Qwen hoặc Groq
Backend tổ chức theo các boundary api -> application -> domain -> infrastructure. Các route FastAPI nhận request và dependency xác thực; application service xử lý nghiệp vụ; domain mô tả enum/lỗi/quy tắc; infrastructure chứa SQLAlchemy, repository, storage và database session.
Frontend nằm trong frontend/, dùng Next.js 15, React 19, TypeScript, TanStack Query, React Hook Form, Zod và Zustand. Có workspace riêng cho cư dân và ban quản lý.
401, và chuẩn hóa lỗi HTTP để UI hiển thị đúng lỗi quyền, validation hoặc conflict.NEXT_PUBLIC_USE_MOCKS=true; mặc định dùng backend thật.POST /attachments/presign, sau đó browser PUT trực tiếp vào S3 để tránh truyền file lớn qua backend.FastAPI expose API tại /api/v1. Các module API chính gồm auth, chat, tickets, conversations, management, residents, units, announcements, attachments, onboarding, knowledge, realtime, AI workflows và RAG.
Database dùng SQLAlchemy async và Alembic. DATABASE_URL hỗ trợ PostgreSQL qua asyncpg, đồng thời SQLite/aiosqlite cho local và test. Lớp VectorType dùng pgvector khi chạy PostgreSQL, JSON khi chạy SQLite.
Các thực thể nghiệp vụ chính:
UserAccount, Resident, ManagementProfile, RefreshSession, token reset password và token/mã xác thực email.Unit, ResidentUnit, Ticket, TicketEvent, Conversation, Message, TicketAttachment.Announcement, AnnouncementScope, AnnouncementRead, AnnouncementEvent.AIWorkflow, AIWorkflowAction, KnowledgeDocument, KnowledgeChunk.Ticket có state machine submitted -> approved -> in_progress -> resolved, với các nhánh rejected và cancelled. Announcement có vòng đời draft -> published -> archived. Update/publish announcement, conversation handoff và các thao tác đồng thời dùng optimistic locking/version để phát hiện ghi đè.
Hệ thống có role mức actor: resident, management, system; management profile có admin, manager, staff. Các API nghiệp vụ hiện chủ yếu cấp quyền thao tác quản lý cho admin/manager; staff tồn tại trong enum/schema nhưng chưa được mở rộng thành một bộ quyền vận hành riêng.
Bảo mật đăng nhập gồm:
RefreshSession, rotate mỗi lần refresh và có thể revoke theo phiên hoặc toàn bộ phiên.token_version.DEV_AUTH_ENABLED mặc định tắt và bị chặn khi APP_ENV=production.src/agents/graph.py là runtime LangGraph-compatible cho agent nghiệp vụ. Agent chọn provider theo cấu hình OpenAI, Qwen rồi Groq; nếu tất cả lỗi hoặc không có API key hợp lệ, code fallback sang xử lý offline mang tính giới hạn. LLM được gọi bằng structured output theo schema AgentStructuredResult, không trả về action tự do.
RAG hiện có ba tầng retrieval, theo thứ tự:
KnowledgeSearchService gọi src.services.rag.retrieve_context. Tầng này dùng LlamaIndex với ChromaDB hoặc Qdrant; Qdrant được chọn khi VECTOR_STORE_TYPE=qdrant hoặc có QDRANT_URL. Có metadata filter theo building.KnowledgeChunk có document status indexed bằng ILIKE, rồi xếp hạng theo mật độ từ khóa.Pipeline ingest nằm trong scripts/ingest_handbook.py, có thể parse tài liệu thành nội dung xử lý, tạo embedding và index vào Chroma/Qdrant. API upload knowledge lưu file và metadata; việc ingest vector hiện là flow script riêng, chưa phải job nền tự động khi upload.
Guardrail xử lý input/output, giới hạn hành động theo role/workflow, gắn citation từ dữ liệu truy xuất và kiểm tra content policy cho announcement. Đây là lớp bảo vệ bổ sung; backend validation mới là cơ chế quyết định cuối cùng.
Attachment metadata được lưu database; object nằm trong S3 private bucket. Backend tạo object key UUID và presigned upload/download URL, validate MIME type, dung lượng, role, ownership và parent ticket/announcement/workflow/message.
Realtime dùng Server-Sent Events tại GET /realtime/stream. Sau commit, backend phát event tin nhắn, handoff, assignment, ticket status và announcement. Connection manager là asyncio.Queue trong memory, phù hợp MVP một process; browser phải reconnect và refetch khi mất kết nối.
Giải pháp phù hợp để chạy pilot cho một hoặc một số tòa nhà vì:
Để hệ thống chạy production ổn định, cần cấu hình đầy đủ:
DATABASE_URL PostgreSQL, JWT_SECRET_KEY riêng có tối thiểu 32 ký tự và APP_ENV=production.s3:PutObject, s3:GetObject, s3:DeleteObject theo prefix attachment nếu cần dọn file.CORS_ORIGINS chứa đúng frontend production domain; frontend phải đặt NEXT_PUBLIC_API_BASE_URL và NEXT_PUBLIC_USE_MOCKS=false khi deploy.| Hạng mục | Đánh giá thực tế |
|---|---|
| Realtime đa instance | Chưa phù hợp. SSE dùng memory của một backend process; nhiều instance sẽ không chia sẻ event. |
| Upload knowledge | Upload document và ingest vector chưa liên thông tự động; cần chạy script ingest hoặc bổ sung worker/job. |
| RAG chất lượng | Có vector retrieval và fallback, nhưng chất lượng phụ thuộc handbook được chuẩn hóa, embedding, metadata building và bộ eval. Không nên cam kết độ chính xác hoặc latency cố định khi chưa benchmark môi trường production. |
| Tải LLM | Chat hiện là request/response có structured output; không có token streaming cho câu trả lời LLM. SSE chỉ là kênh đẩy event nghiệp vụ. |
| Tác vụ nền | Không có outbox/queue/worker riêng cho email, scheduled publish hoặc retry. FastAPI background execution phù hợp tác vụ nhẹ nhưng không thay thế hàng đợi bền vững. |
| Attachment lifecycle | Có upload/download và metadata; cần chính sách dọn object upload dở hoặc object mồ côi khi vận hành dài hạn. |
| CI | CI hiện chạy ruff và pytest Python. Frontend có lint/typecheck/build/Vitest nhưng chưa thấy được gọi trong workflow CI hiện tại. |
staff: hoặc định nghĩa quyền cụ thể, hoặc không expose các thao tác quản trị cho role này.OnBxrd đã vượt phạm vi chatbot hỏi đáp: codebase có mô hình vận hành cư dân tương đối đầy đủ với auth/RBAC, ticket conversation, announcement theo audience, onboarding, S3 attachment, audit, SSE và workflow AI có human-in-the-loop.
Kiến trúc modular monolith là lựa chọn phù hợp cho MVP vì giảm chi phí vận hành trong khi vẫn giữ boundary rõ ràng để phát triển. Để chuyển từ demo/pilot sang vận hành rộng hơn, ưu tiên đúng là tự động ingestion và đo chất lượng RAG, tăng độ bền realtime/background jobs, đưa frontend vào CI, rồi mới mở rộng tích hợp hoặc scale ngang.