Logo PayFS CPPAI × EzyPlatform
Loạt bài · Bài 3

Sử dụng bộ công cụ của CPPAI để tạo trang web thử váy online

Từ một câu yêu cầu tới một phòng thử váy chạy trên EzyPlatform: chọn mẫu váy, tách nền ảnh ngay trên trình duyệt, tự khớp váy theo dáng người bằng MediaPipe Pose, sửa trải nghiệm trên điện thoại qua từng lần thử, rồi đăng nhập bằng EzyLogin CLI và đưa lên site bằng bộ công cụ ezy của CPPAI.

Ở bài 1 chúng ta đã cài bộ công cụ, ở bài 2 đã dùng nó để biến mã nguồn nginx thành một trò chơi. Bài này là một bài toán thương mại: một trang để khách hàng nữ chụp ảnh của mình rồi ướm thử các mẫu váy trước khi mua. Toàn bộ mã do agent viết. Người dùng đặt yêu cầu, thử trên điện thoại thật và phản hồi những chỗ chưa ổn.

Cảm ơn HOBB. Bài viết và phòng thử váy sử dụng ảnh sản phẩm và bộ nhận diện thương hiệu của HOBB. Chúng tôi xin chân thành cảm ơn HOBB. Đây là bài viết phục vụ mục đích học tập, minh hoạ cách dùng bộ công cụ của CPPAI, không nhằm mục đích thương mại. Phòng thử váy không bán hàng và không thu thập dữ liệu khách hàng; mọi giao dịch đều diễn ra trên trang chính thức của HOBB.

Kết quả: phòng thử váy cho HOBB

Giao diện phòng thử váy: ảnh người dùng đã được ướm đầm satin nâu, bên phải là danh sách mẫu váy và các thanh tinh chỉnh
Phòng thử váy theo bộ nhận diện của HOBB. Đầm satin nâu được tự đặt đúng vai dù người đứng khá xa máy. Ảnh người mẫu: Elijah Henderson, CC0, qua Wikimedia Commons.

Khách bật camera hoặc tải một tấm ảnh lên, chọn một trong sáu mẫu váy lấy từ hobb.vn, và váy tự nằm đúng vai, đúng cỡ. Ưng ý thì lưu ảnh, chia sẻ, hoặc bấm sang trang sản phẩm để mua.

AI trên máy

Tự khớp dáng

MediaPipe Pose tìm vai và hông, váy được đặt đúng vị trí, cỡ và độ nghiêng. Khi bật camera, váy bám theo người theo thời gian thực.

canvas

Tách nền tại chỗ

Ảnh sản phẩm nền trắng được tách nền ngay trên trình duyệt, không cần ảnh PNG trong suốt hay dịch vụ bên ngoài.

riêng tư

Ảnh không rời máy

Ảnh của khách chỉ được xử lý trong trình duyệt, không gửi lên máy chủ nào. Cả trang nằm trong một file content.html khoảng 47 KB.

Bạn có thể thử ngay trên điện thoại.

Chuẩn bị

  • Dự án site như ở bài 1, có environment.json trỏ tới trang quản trị.
  • Claude Code đã có plugin ezyplatform@cppai.
  • Site cài EzyArticle. Nếu muốn đăng nhập từ dòng lệnh thay cho việc sao chép access token, site cần EzyLogin và đã bật Cho phép quản trị viên đăng nhập từ dòng lệnh (CLI).

Bước 1: Chọn mẫu váy và tải ảnh

Yêu cầu ban đầu chỉ có một câu:

Làm một trang cho phép phụ nữ mua hàng chụp hình và ướm thử với các bộ váy. Hãy chọn một vài bộ váy ở hobb.vn, ảnh tải xuống thì để ở api/v1/media.

Agent đọc trang danh mục váy của hobb.vn, ghép từng sản phẩm với ảnh của nó, rồi xếp các ảnh thành một tấm để tự xem. Ảnh sản phẩm của HOBB chụp riêng chiếc váy trên nền trắng, rất hợp để ướm. Sáu mẫu được chọn sao cho đủ kiểu dáng và màu sắc: đen, đỏ, xanh navy, satin nâu, trắng, kem.

Giữa chừng người dùng nhắn thêm: “ảnh nào lớn hơn 1 MB phải giảm size nhé”. Không ảnh nào vượt 1 MB, nhưng agent vẫn thu hai ảnh gốc 2083×3125 về 1000×1500 để trang nhẹ hơn. Ảnh được đặt tên theo quy tắc của thư viện media, ví dụ hobb-vay-do-taffeta-trat-vai.jpg.

Bước 2: Dựng trang độc lập và tách nền ảnh váy

Phòng thử váy cần toàn bộ màn hình và giao diện riêng, nên agent chọn kiểu trang STANDALONE_PAGE giống trò chơi ở bài 2: HTML, CSS và JavaScript nằm gọn trong content.html.

pages/thu-vay-online/
├── content.html   # toàn bộ phòng thử váy
└── meta.json      # "pageType": "STANDALONE_PAGE", "contentType": "HTML"

Khung ướm thử là một canvas 900×1200. Váy được tách nền bằng thuật toán loang (flood fill) từ mép ảnh: pixel nào gần trắng và nối liền với mép thì thành trong suốt. Agent chụp màn hình kết quả trên nền màu để tự soát, và phát hiện hai lỗi:

Tách nền váy trắng ở ngưỡng 22 bị mất nửa váy, ở ngưỡng 10 thì sạch; váy satin nâu được xoá cả khe kín giữa tay và thân
Từ trái sang: ảnh gốc, ngưỡng 22 làm mất nửa váy trắng, ngưỡng 10 tách sạch, và váy satin nâu được xoá cả khe nền bị tay áo bao kín.
  • Váy trắng bị “ăn” mất nửa thân vì thân váy gần trùng màu nền. Cách sửa: mỗi mẫu váy có ngưỡng tách nền riêng (váy trắng dùng 10, các mẫu khác 22). Người dùng vẫn chỉnh được bằng thanh “Tách nền”.
  • Khe giữa tay áo và thân váy vẫn còn nền trắng, vì vùng đó bị tay áo bao kín nên thuật toán loang từ mép không chạm tới. Cách sửa: thêm một lượt tìm các vùng màu nền bị bao kín và đủ lớn rồi xoá luôn. Vùng nhỏ như hoạ tiết đính kết thì được giữ lại.

Bước 3: Thử trên điện thoại và sửa trải nghiệm

Để thử trên điện thoại thật, agent chạy một server tĩnh ngay trên máy, mở cho cả mạng LAN. Camera trên điện thoại chỉ hoạt động qua HTTPS, nên agent dựng thêm một server HTTPS dùng chứng chỉ tự ký. Từ đây, mọi phản hồi đều đến từ việc người dùng cầm máy thử:

Người dùng nóiAgent tìm ra và sửa
“Trên điện thoại không kéo vuốt được, kiểu bị treo.”Mỗi lần ngón tay nhích, canvas vẽ lại cả ảnh gốc lẫn bóng đổ mờ (shadowBlur). Agent vẽ sẵn bóng đổ vào ảnh váy một lần, và thu ảnh người dùng về đúng 900×1200 ngay khi nạp.
“Chạm vào khung ướm thử thì không cuộn trang được, mà khung khá to.”Khung đang đặt touch-action: none. Giờ chỉ khi chạm trúng chiếc váy mới kéo, phóng to, xoay; chạm ra ngoài váy thì trang cuộn bình thường.
“Cầm máy bằng một tay thì người luôn to hơn váy, cần một chế độ khác.”Thêm chế độ Tự khớp dáng (bước 4), đặt làm mặc định. Chế độ cũ đổi tên thành “Chỉnh tay”.
“Chụp sau 3 giây nhanh quá, người dùng cần thời gian đi ra xa.”Cho chọn hẹn giờ 3, 5 hoặc 10 giây, mặc định 10. Bấm lại để huỷ. Ba giây cuối có tiếng bíp để người đứng xa vẫn biết sắp chụp.

Bước 4: Chế độ tự khớp dáng

Váy có cỡ cố định thì không thể vừa với mọi khoảng cách chụp. Agent đề xuất dùng mô hình nhận dáng người @mediapipe/tasks-vision (Pose Landmarker bản lite), chạy hoàn toàn trên trình duyệt. Thư viện và mô hình chỉ được tải khi cần, khoảng 15 MB ở lần đầu.

Cùng chiếc đầm taffeta đỏ được tự khớp lên một người đứng gần máy và một người đứng rất xa
Cùng một chiếc đầm, tự khớp lên người đứng sát máy và người đứng rất xa. Ảnh người mẫu: The Hidden Collection (CC BY 2.0) và Elijah Henderson (CC0), qua Wikimedia Commons.
  • Cỡ váy tính theo khoảng cách hai vai, nhân với tỉ lệ vai riêng của từng mẫu (váy trễ vai rộng hơn váy có tay).
  • Hướng váy theo trục thân người, từ giữa hai vai xuống giữa hai hông. Phiên bản đầu dùng đường vai, nên khi người mẫu nghiêng vai thì cả thân váy bị văng sang một bên. Khi không thấy hông thì mới dùng đường vai.
  • Ảnh tĩnh và camera dùng hai chế độ khác nhau. Chế độ VIDEO bám theo vị trí người ở khung trước, rất hợp cho camera nhưng làm lệch kết quả khi đổi sang một ảnh khác hẳn. Ảnh chụp và ảnh tải lên dùng chế độ IMAGE, mỗi ảnh tìm lại từ đầu.
  • Nếu khách tự kéo váy trong lúc đang quay camera, trang tự chuyển sang “Chỉnh tay” để không giằng co với AI.

Bước 5: Để agent tự kiểm thử

Agent không chờ người dùng phát hiện lỗi. Sau mỗi thay đổi nó:

  • Kiểm tra cú pháp JavaScript bằng node --check.
  • Dùng Playwright mở trang thật, giả lập thao tác “Tải ảnh lên” với ảnh người mẫu có giấy phép tự do, chờ AI xong rồi chụp lại khung ướm thử để tự xem vị trí váy.
  • In toạ độ các điểm mốc (mũi, vai, khuỷu tay, hông) lên ảnh khi kết quả trông sai, để biết lỗi nằm ở mô hình hay ở cách tính.

Đừng chạy kiểm thử quá nặng. Có lúc agent mở liên tiếp nhiều phiên Chrome chạy mô hình AI, làm máy người dùng không chịu nổi. Từ đó mỗi lần kiểm thử chỉ dùng một trình duyệt, một vài ảnh. Một phát hiện khác: trong Chrome headless trên Mac, khoảng một phần ba số phiên MediaPipe không nhận ra người, dù trang không có lỗi. Khi ép Chrome dùng WebGL phần mềm (--use-angle=swiftshader) thì kết quả ổn định. Vì vậy vẫn nên thử lần cuối trên điện thoại thật.

Bước 6: Đăng nhập bằng EzyLogin CLI và publish

Site đích là freestyle.ezyplatform.com, và dự án chưa có access token. Thay vì mở trang quản trị để sao chép token, agent dùng luồng đăng nhập dòng lệnh của EzyLogin (OAuth 2.0 Authorization Code + PKCE):

  1. Mở một cổng tạm trên 127.0.0.1, tạo code_verifier ngẫu nhiên và mở trình duyệt tới /ezylogin/cli/authorize của trang quản trị.
  2. Người dùng đăng nhập và bấm Phê duyệt.
  3. Agent đổi mã uỷ quyền lấy access token qua POST /ezylogin/api/v1/cli/me/token, rồi ghi token thẳng vào environment.json (đã nằm trong .gitignore, chỉ chủ máy đọc được). Token không bao giờ được in ra màn hình.

Sau đó là các bước quen thuộc của bộ công cụ, mỗi bước ghi đều chạy thử trước:

ViệcCách làmKết quả
Kiểm tra quyềnezy_client.py whoamiToken mang vai trò super_admin
Đưa ảnh lênezy-media upload6 ảnh váy và logo HOBB vào thư viện media, ở chế độ công khai
Tạo trang lần đầuPOST /ezyarticle/api/v1/posts/save-simply qua ezy_clientTrang thu-vay-online được tạo, đọc lại thấy khớp từng ký tự với bản local
Cập nhật về sauezy-publish plan rồi applySao lưu, chỉ gửi phần thay đổi, đọc lại kiểm tra, in lệnh khôi phục

Như đã nói ở bài 2, ezy-publish trong plugin 0.5.0 chỉ cập nhật trang đã có. Lần này người dùng nhắn “bạn tự tạo qua API được mà”, nên agent dùng đúng API save-simply mà extension VS Code vẫn dùng: chạy thử trước, từ chối nếu trang đã tồn tại, và đọc lại để xác nhận sau khi tạo.

Đổi bộ nhận diện chỉ mất một lần publish. Bản đầu dùng tông màu tự chọn. Khi người dùng gửi logo của HOBB, agent đổi màu, font và header theo hobb.vn (Roboto, đen trắng, điểm nhấn xanh nhạt của logo), rồi ezy-publish cập nhật trang chỉ với một thay đổi ở phần nội dung, kèm bản sao lưu.

Bước 7: Mang sang dự án chạy Docker local

Cuối cùng, người dùng muốn lưu giải pháp vào dự án mmo-game, dự án tạo bằng ezy new --mode local ở bài 1 và cũng là nơi chứa trò chơi nginx của bài 2. Agent chép trang và ảnh sang, bật Docker Desktop, chạy docker compose up -d, chờ trang quản trị và website phản hồi, rồi publish đúng như với site thật:

cd mmo-game
docker compose up -d
# admin: http://127.0.0.1:9090   website: http://127.0.0.1:8080/thu-vay-online

Cùng một bộ file chạy được ở cả hai nơi, chỉ khác environment.json.

Những điều rút ra

thử thật

Điện thoại thật nói lên tất cả

Giật, không cuộn được, váy nhỏ hơn người, hẹn giờ quá ngắn: không lỗi nào lộ ra khi xem trên máy tính. Đưa trang lên điện thoại thật càng sớm càng tốt.

nhìn kết quả

Agent phải tự xem ảnh

Thông báo “đã khớp” không có nghĩa là váy đúng chỗ. Chỉ khi chụp màn hình và tự xem, agent mới thấy váy bị lệch do chế độ VIDEO và do đường vai nghiêng.

plan → duyệt → apply

Ghi lên site luôn có kiểm chứng

Đăng nhập bằng phê duyệt trên trình duyệt, chạy thử trước khi ghi, đọc lại sau khi ghi. Token chỉ nằm trong file đã bị git bỏ qua.

Tiếp theo

Một trang thương mại có AI chạy ngay trên trình duyệt, từ ý tưởng tới hai môi trường, chỉ qua những câu nhắn ngắn. Hãy thử phòng thử váy trên điện thoại của bạn, và xem các bài khác tại mục lục loạt bài.

Ảnh sản phẩm và bộ nhận diện thương hiệu thuộc về HOBB. Một lần nữa xin cảm ơn HOBB, những hình ảnh sản phẩm đẹp của HOBB đã giúp bài học trở nên sinh động. Bài viết và phòng thử váy chỉ phục vụ mục đích học tập, không phải thương mại. Nếu HOBB muốn chúng tôi gỡ hoặc thay đổi nội dung nào, chúng tôi sẵn sàng thực hiện ngay.

Bộ nhận diện thương hiệu của CPPAI, lời cảm ơn từ EzyPlatform