--- name: list-entities description: Liệt kê các hồ sơ (TBMT/KHLCNT/KQLCNT) có trong kho dữ liệu. Dùng khi user muốn tổng quan "có những tài liệu nào" hoặc đếm số lượng theo trạng thái. --- # List Entities ## Khi nào dùng - "Có những hồ sơ nào trong hệ thống?" - "Liệt kê các TBMT đã upload" - "Bao nhiêu hồ sơ đang ở trạng thái indexed?" - "Cho tôi xem 10 record mới nhất" - "Gói nào đang mở / sắp đóng thầu?" ## Workflow 1. Gọi `list_entities()` — không tham số nếu user hỏi chung. 2. Lọc theo `entity_type` nếu user nêu loại cụ thể. **Giá trị phải LOWERCASE**: `"tbmt"` / `"khlcnt"` / `"kqlcnt"`. Filter là exact-match — gọi `"TBMT"` (hoa) trả về **0 kết quả**. - Corpus hiện tại chủ yếu là `tbmt`; ngoài ra còn `tbmst_pre` (thông báo mời sơ tuyển / pre-notice). `khlcnt`/`kqlcnt` được hỗ trợ nhưng có thể chưa có dữ liệu. 3. Lọc theo `status` nếu user nêu trạng thái. Giá trị `index_status` thực tế: `"indexed"`, `"changed"`, `"indexing"`, `"converting"`, `"converted"`, `"uploaded"`, `"deleted"`. (Không có `"failed"` ở mức entity — `failed` chỉ tồn tại ở mức chunk.) 4. Mặc định `limit=50` — đủ cho hầu hết câu hỏi. 5. Mỗi row trả về `SELECT *` nên giàu metadata. Surface các cột có ý nghĩa: `entity_code` | `entity_type` | `title` (tên gói) | `investor_name` (chủ đầu tư) | `status_code` | `bid_close_date` (đóng thầu) | `index_status` | `updated_at`. ## Ví dụ **User:** "Cho tôi xem danh sách TBMT đã indexed" **Agent:** ``` → list_entities(entity_type="tbmt", status="indexed") ← [{entity_code: "IB2600250575-00", title: "...", investor_name: "...", bid_close_date: "2026-06-12T09:00:00", index_status: "indexed", ...}, ...] ``` **Reply:** bảng markdown — cột `Mã` | `Tên gói` | `Chủ đầu tư` | `Đóng thầu` | `Trạng thái` + tổng số. ## Đóng/mở thầu (bid status) `bid_close_date` / `bid_open_date` là **ISO giờ Việt Nam (UTC+7, không có hậu tố tz)**. Khi user hỏi "gói nào đang mở / đã đóng", tính trạng thái theo **giờ VN** (Asia/Ho_Chi_Minh), không dùng giờ máy chủ: `đang mở` (deadline tương lai) · `sắp đóng` (~trong 48h) · `đã đóng` (đã qua) · `không xác định` (null/invalid). ## Anti-patterns - ❌ Đừng gọi `entity_type` viết HOA — DB lưu lowercase, sẽ trả rỗng. - ❌ Đừng bịa mã kiểu `TBMT-2026-001` — mã thật là eGP `IB-` (vd. `IB2600250575-00`). - ❌ Đừng dùng `list_entities` rồi tự duyệt trả lời nội dung — đó là việc của `search_procurement_docs`. - ❌ Đừng dump toàn bộ raw row cho user — chỉ surface các cột có ý nghĩa ở trên. - ❌ Đừng kết luận đóng/mở thầu bằng giờ máy chủ — luôn tính theo giờ VN. - ❌ Đừng tăng `limit` lên rất lớn (>200) — gây nhiễu cho user. Nếu cần xem nhiều hơn, page bằng cách lọc theo `entity_type`.