Tổng › Cần sửa sớm
1. Cần sửa sớm
G1API + FEMở hoặc reload nhiều tab cùng lúc làm văng đăng nhập
- Vấn đề
-
- Mỗi tab tự gọi
POST /api/auth/refresh, cả khi mount lẫn theo hẹn giờ. - Server xoay refresh token. Khi một token đã thu hồi bị dùng lại, server thu hồi toàn bộ family.
- Hai tab gửi cùng cookie cũ thì request đến sau bị coi là dùng lại, và mọi tab mất phiên.
- Ngoài ra, chỉ cần một lỗi mạng tạm thời trong lúc refresh là client cũng chuyển về
anonymous.
- Mỗi tab tự gọi
- Vị trí
-
apps/api/src/auth/session.service.ts:74–80
apps/web/src/components/auth-provider.tsx:52 (hẹn giờ), :59–77 (refresh khi mount, lỗi nào cũng đăng xuất) - Thực hiện
-
- Server: trong vài giây ngay sau khi xoay, token vừa thu hồi vì
rotatedvẫn được chấp nhận và trả về đúng phiên mới, thay vì thu hồi cả family. - Client: mỗi lúc chỉ một tab được refresh (Web Locks hoặc BroadcastChannel); các tab khác dùng chung kết quả.
- Lỗi mạng hoặc 5xx thì thử lại. Chỉ
401mới đăng xuất.
- Server: trong vài giây ngay sau khi xoay, token vừa thu hồi vì
- Kiểm
-
- Gửi 2 request refresh song song bằng cùng một cookie: cả hai đều giữ được phiên.
- Mở 3 tab rồi reload cùng lúc: vẫn đăng nhập.
- Chặn mạng trong lúc refresh: không bị đăng xuất.
- Token cũ dùng lại sau khoảng ân hạn: vẫn bị thu hồi family như hiện tại.
G2APIQuote không có giới hạn tần suất phía server
- Vấn đề
-
quote()mở transaction DB và gọi Core compile tối đa 4 lần cho mỗi intent. Một group có thể tới 128 output.createcórateLimit.hit, cònquotethì không.- Debounce 250 ms ở client không thay được giới hạn server. Mở nhiều tab, đổi settings liên tục hoặc gọi API trực tiếp đều dồn tải lên Core và DB mà không cần tạo job.
- Vị trí
- apps/api/src/jobs/jobs.service.ts:178 (quote), :147 (preflightMode), :210 (limiter mẫu ở create)
- Thực hiện
-
- Giới hạn quote theo user. Với group, đếm theo số intent.
- Trả
429kèm mã lỗi riêng. FE hiển thị lỗi này riêng, không gộp vào lỗi chung.
- Kiểm
-
- Test vượt ngưỡng phải trả 429.
- Đếm số lần compile mỗi phút khi đổi settings liên tục ở 3 tab.
G3APILưu output: worker cũ và worker mới có thể cùng hoàn tất một job
- Vấn đề
-
- Job chuyển sang
savingvới hạn 180 s. - Hết hạn, reaper đưa job về
processing, và một worker khác nhận lưu lại. - Worker cũ vẫn chạy tiếp. Câu
UPDATE … succeededcuối chỉ kiểmstatus = 'saving', không có token phân biệt lượt lưu. safeFetchchỉ có timeout khi socket không hoạt động (30 s), không có hạn tổng. Stream chậm mà đều vẫn kéo quá 180 s.
- Job chuyển sang
- Vị trí
-
apps/api/src/jobs/job-lifecycle.service.ts:530 (vào saving),
:633–637 (UPDATE cuối),
:727 (reaper)
apps/api/src/common/http/safe-fetch.ts:73, :96 - Thực hiện
-
- Tạo token cho mỗi lượt lưu (ví dụ
save_attempt) khi chuyển sang saving. - UPDATE cuối và các bước ghi asset chỉ chạy khi token còn khớp.
- Thêm hạn tổng cho việc tải output, ngắn hơn hạn của lượt lưu.
- Tạo token cho mỗi lượt lưu (ví dụ
- Kiểm
-
- Fault test: worker A dừng quá 180 s, worker B lưu xong, rồi A chạy tiếp. Kết quả: A không ghi được gì.
- Số asset output đúng bằng số output của job.
G4APIHàng rào chi phí: trần guest chưa chạy, bộ đếm tăng trước khi job được nhận
- Vấn đề
-
assertGuestSpendAllowedkhông có nơi nào gọi. Setting trần chi tiêu guest theo ngày vẫn tồn tại nên dễ bị hiểu là đang có hiệu lực.assertSpendAllowedtăng bộ đếm Redis trước bước moderation và trước transaction tạo job. Request bị từ chối sau bước tăng (content_policy, quote hết hạn…) vẫn bị tính vào trần ngày.- Hậu quả: user có thể chạm
user_daily_capdù chưa chạy job nào.
- Vị trí
-
apps/api/src/jobs/cost-guard.service.ts:61 (không có caller),
:51 (tăng counter)
apps/api/src/jobs/jobs.service.ts:242–245 - Thực hiện
-
- Gọi trần guest trong đường Run của trial, hoặc bỏ setting nếu không dùng.
- Chỉ tăng bộ đếm sau khi transaction tạo job commit; hoặc hoàn lại bộ đếm khi request bị từ chối sau bước tăng.
- Kiểm
-
- Request bị content_policy hoặc quote_expired không làm tăng bộ đếm.
- Guest vượt trần bị chặn trước khi dispatch lên provider.
G5CoreDefault và VIP Sunburst ở 2K/4K gửi field background mà provider chỉ hỗ trợ ở 1K
- Vấn đề
-
room.editđặt mặc địnhbackground = 'auto'và luôn thêm field này vào payload Sunburst.- Khi chuyển sang Flare (mode Default), adapter chép nguyên input nên vẫn giữ field.
- Schema KIE của Flare và Sunburst ghi rõ
backgroundchỉ hỗ trợ khiresolution = 1K, trong khi UI cho chọn 2K và 4K. - Ảnh hưởng cả 6 workflow phòng: Virtual Staging, Renovation, Furniture Removal, Sketch to Image, Floor Plan AI, Style Transfer.
- Vị trí
-
services/core-engine/src/engine.mjs:714,
:736
services/core-engine/src/model-adapters.mjs:49–56 - Thực hiện
-
- Chỉ thêm
backgroundkhi resolution là 1K. Payload 1K giữ nguyên. - Không hạ 2K/4K xuống 1K, không đổi model.
- Cập nhật compiler version/digest theo cơ chế hiện có.
- Chỉ thêm
- Kiểm
-
- Test payload: 1K có
background; 2K và 4K không có, ở cả Default lẫn VIP Sunburst. - Digest lúc preflight trùng với digest lúc Run.
- Test payload: 1K có