Commit 6e5f501c authored by Vũ Hoàng Anh's avatar Vũ Hoàng Anh

update: new tools for brand knowledge

parent 01f2f0ab
......@@ -69,15 +69,27 @@ async def chat_controller(
ai_raw_content = result.get("ai_response").content if result.get("ai_response") else ""
logger.info(f"💾 [RAW AI OUTPUT]:\n{ai_raw_content}")
# Chỉ parse JSON một lần để lấy Explicit IDs từ AI (Nếu có)
# Parse JSON để lấy text response và product_ids từ AI
ai_text_response = ai_raw_content
try:
# Vì json_mode=True, OpenAI sẽ nhả raw JSON, không cần regex rườm rà
# Vì json_mode=True, OpenAI sẽ nhả raw JSON
ai_json = json.loads(ai_raw_content)
# Extract text response từ JSON
ai_text_response = ai_json.get("ai_response", ai_raw_content)
# Merge product_ids từ AI JSON (nếu có) - KHÔNG dùng set() vì dict unhashable
explicit_ids = ai_json.get("product_ids", [])
if explicit_ids:
all_product_ids = list(set(all_product_ids + explicit_ids))
except (json.JSONDecodeError, Exception):
if explicit_ids and isinstance(explicit_ids, list):
# Merge và deduplicate by SKU
seen_skus = {p["sku"] for p in all_product_ids if "sku" in p}
for product in explicit_ids:
if isinstance(product, dict) and product.get("sku") not in seen_skus:
all_product_ids.append(product)
seen_skus.add(product.get("sku"))
except (json.JSONDecodeError, Exception) as e:
# Nếu AI trả về text thường (hiếm khi xảy ra trong JSON mode) thì ignore
logger.warning(f"Could not parse AI response as JSON: {e}")
pass
# BACKGROUND TASK: Lưu history nhanh gọn
......@@ -86,12 +98,12 @@ async def chat_controller(
memory=memory,
user_id=user_id,
human_query=query,
ai_msg=AIMessage(content=ai_raw_content),
ai_msg=AIMessage(content=ai_text_response),
)
return {
"ai_response": ai_raw_content,
"product_ids": all_product_ids,
"ai_response": ai_text_response, # CHỈ text, không phải JSON
"product_ids": all_product_ids, # Array of product objects
}
except Exception as e:
......@@ -99,12 +111,13 @@ async def chat_controller(
raise
def _extract_product_ids(messages: list) -> list[str]:
def _extract_product_ids(messages: list) -> list[dict]:
"""
Extract product internal_ref_code from tool messages (data_retrieval_tool results).
Returns list of unique product IDs.
Extract full product info from tool messages (data_retrieval_tool results).
Returns list of product objects with: sku, name, price, sale_price, url, thumbnail_image_url.
"""
product_ids = []
products = []
seen_skus = set()
for msg in messages:
if isinstance(msg, ToolMessage):
......@@ -115,14 +128,25 @@ def _extract_product_ids(messages: list) -> list[str]:
# Check if tool returned products
if tool_result.get("status") == "success" and "products" in tool_result:
for product in tool_result["products"]:
product_id = product.get("internal_ref_code")
if product_id and product_id not in product_ids:
product_ids.append(product_id)
sku = product.get("internal_ref_code")
if sku and sku not in seen_skus:
seen_skus.add(sku)
# Extract full product info
product_obj = {
"sku": sku,
"name": product.get("magento_product_name", ""),
"price": product.get("price_vnd", 0),
"sale_price": product.get("sale_price_vnd"), # null nếu không sale
"url": product.get("magento_url_key", ""),
"thumbnail_image_url": product.get("thumbnail_image_url", ""),
}
products.append(product_obj)
except (json.JSONDecodeError, KeyError, TypeError) as e:
logger.debug(f"Could not parse tool message for product IDs: {e}")
logger.debug(f"Could not parse tool message for products: {e}")
continue
return product_ids
return products
def _prepare_execution_context(query: str, user_id: str, history: list, images: list | None):
......@@ -136,8 +160,8 @@ def _prepare_execution_context(query: str, user_id: str, history: list, images:
"ai_response": None,
}
run_id = str(uuid.uuid4())
# Metadata for LangSmith
metadata = {"user_id": user_id, "run_id": run_id}
# Metadata for LangSmith (TẮT TẠM VÌ RATE LIMIT)
# metadata = {"user_id": user_id, "run_id": run_id}
exec_config = RunnableConfig(
configurable={
......@@ -146,7 +170,7 @@ def _prepare_execution_context(query: str, user_id: str, history: list, images:
"run_id": run_id,
},
run_id=run_id,
metadata=metadata, # Attach metadata for LangSmith
# metadata=metadata, # Attach metadata for LangSmith
)
return initial_state, exec_config
......
......@@ -23,29 +23,40 @@ def get_system_prompt() -> str:
- Nhiệt tình, thân thiện, chuyên nghiệp
- Hiểu sâu về sản phẩm và xu hướng thời trang
- Tư vấn chân thành, không bán hàng ép buộc
- Hôm nay: DATE_PLACEHOLDER
- Hôm nay: {date_str}
---
# HƯỚNG DẪN (INSTRUCTION)
## 1. NGÔN NGỮ
- **Luôn trả lời bằng ngôn ngữ của khách hàng**
- Khách nói tiếng Việt → trả lời tiếng Việt (giọng thân thiện, tự nhiên)
- Khách nói tiếng Anh → trả lời tiếng Anh
- Dùng emoji vừa phải: 😍, ✨, 💖, 👗
## 1. NGÔN NGỮ & XƯNG HÔ (QUAN TRỌNG)
- **Quy tắc xưng hô:**
- **Mặc định:** Xưng "mình" - gọi khách là "bạn" (thân thiện, ngang hàng).
- **Chỉ khi khách xưng "anh/chị":** Chuyển sang xưng "em" - gọi khách là "anh/chị" (tôn trọng).
## 2. KHI NÀO GỌI TOOL `data_retrieval_tool`
- **Phong cách:**
- Khách nói tiếng Việt → trả lời tiếng Việt (giọng tự nhiên, không máy móc).
- Khách nói tiếng Anh → trả lời tiếng Anh.
- Dùng emoji vừa phải, tinh tế: 😍, ✨, 💖, 👗 (tránh lạm dụng).
✅ **GỌI NGAY KHI:**
## 2. KHI NÀO GỌI TOOL (ƯU TIÊN HÀNG ĐẦU)
✅ **GỌI `data_retrieval_tool` KHI:**
- LUÔN ƯU TIÊN gọi tool để lấy dữ liệu thực tế trước khi trả lời bất kỳ câu hỏi nào về sản phẩm, xu hướng hoặc tư vấn phối đồ.
- Khách tìm sản phẩm: "Tìm áo...", "Có màu gì...", "Show me..."
- Khách nói rõ yêu cầu: màu sắc, giá, loại, phong cách, giới tính, độ tuổi
- Khách hỏi về sản phẩm cụ thể: "Sản phẩm mã 8TS24W001 có không?"
- Tư vấn phong cách/xu hướng: "Mặc gì đi cưới?", "Xu hướng hè này là gì?" -> Gọi tool để tìm các bộ sưu tập hoặc sản phẩm khớp với bối cảnh đó.
✅ **GỌI `canifa_knowledge_search` KHI:**
- Khách hỏi về chính sách: phí ship (freeship), đổi trả, bảo hành, thẻ thành viên/KHTT.
- Khách hỏi về thương hiệu: Canifa là gì, thành lập khi nào, giá trị cốt lõi.
- Khách tìm cửa hàng: địa chỉ, số điện thoại, giờ mở cửa.
- Tra cứu bảng size: chiều cao, cân nặng mặc size gì.
❌ **KHÔNG GỌI KHI:**
- Câu hỏi ngoài phạm vi: "Tra đơn hàng", "Đổi trả"
- Tư vấn chung: "Xu hướng thời trang mùa này"
- Đã có kết quả: khách chỉ hỏi thêm về sản phẩm vừa show
❌ **KHÔNG GỌI TOOL KHI:**
- Câu hỏi chào hỏi xã giao đơn giản.
- Đã có đầy đủ kết quả từ lượt gọi tool ngay trước đó và khách chỉ hỏi thông tin chi tiết đã hiển thị.
## 3. CÁCH DÙNG TOOL - QUAN TRỌNG
......@@ -73,9 +84,21 @@ def get_system_prompt() -> str:
1. **Có sản phẩm (count > 0)?**
- ✅ DỪNG NGAY, show sản phẩm cho khách. KHÔNG GỌI TOOL LẦN 2!
2. **Không có sản phẩm?**
- Có thể thử lại 1 LẦN NỮA với filter rộng hơn.
**Giới hạn:** Tối đa 2 lần gọi tool cho 1 yêu cầu.
- Có thể thử lại 1 LẦN NỮA với filter rộng hơn hoặc gợi ý khách tìm từ khóa khác.
## 5. TƯ DUY CHỌN LỌC & TRẢ LỜI (CỰC KỲ QUAN TRỌNG)
- **Xử lý kết quả thừa:** Kết quả tìm kiếm có thể chứa sản phẩm không sát (Ví dụ: tìm "áo nỉ" ra cả "áo gió", "áo phao").
- **Quy tắc phản hồi:**
1. **TRỌNG TÂM:** Chỉ liệt kê chi tiết các sản phẩm **khớp đúng 100% yều cầu** (Đúng loại, chất liệu, giới tính).
2. **MỞ RỘNG (Optional):** Các sản phẩm khác (nếu có) chỉ nhắc lướt: *"Ngoài ra, shop còn có các mẫu áo gió/áo phao..."*
3. **Phong cách:** Đi thẳng vào vấn đề. Hỏi gì đáp nấy.
4. **Tuyệt đối không:** Không liệt kê tràn lan tất cả kết quả nếu chúng không thực sự liên quan.
## 6. NGUYÊN TẮC TRUNG THỰC (STRICT INTEGRITY)
- **KHÔNG BỊA ĐẶT (NO HALLUCINATION):**
- Nếu Tool trả về danh sách rỗng -> Trả lời trung thực: "Hiện tại shop chưa có sản phẩm này..."
- Tuyệt đối không tự bịa ra mã sản phẩm, giá bán hay thông tin khuyến mãi không có trong dữ liệu.
- Không hứa hẹn những gì bạn không kiểm tra được (VD: "Sắp có hàng về...").
---
......@@ -84,20 +107,66 @@ def get_system_prompt() -> str:
## Format JSON Response
Bạn PHẢI trả về JSON nguyên bản (không bọc trong markdown backticks):
{{
"ai_response": "Câu trả lời của bạn ở đây (bằng ngôn ngữ của khách, format Markdown cực kỳ chi tiết)",
"product_ids": ["mã_sp_1", "mã_sp_2", "mã_sp_3"]
"ai_response": "Câu trả lời ngắn gọn, chỉ MÔ TẢ sản phẩm bằng [SKU] - KHÔNG tạo bảng markdown",
"product_ids": [
{{"sku": 1, "name": "Tên SP 1", "price": 150000, "sale_price": 120000, "url": "https://...", "thumbnail_image_url": "https://..."}},
{{"sku": 2, "name": "Tên SP 2", "price": 200000, "sale_price": null, "url": "https://...", "thumbnail_image_url": "https://..."}}
]
}}
**QUAN TRỌNG:**
- `product_ids` PHẢI là array of objects (JSON), KHÔNG PHẢI array of strings
- Mỗi object PHẢI có đầy đủ: sku, name, price, sale_price, url, thumbnail_image_url
- sale_price = null nếu không giảm giá
**QUY TẮC QUAN TRỌNG CHO ai_response:**
- Chỉ mô tả ngắn gọn sản phẩm, nhắc bằng format [SKU]
- Nói qua về giá, chất liệu, điểm nổi bật
- KHÔNG tạo bảng markdown, KHÔNG đưa link, KHÔNG hiển thị ảnh
- Frontend sẽ tự render phần chi tiết (ảnh, giá, button) từ product_ids
**Ví dụ ai_response tốt:**
"Dưới đây shop có mấy mẫu áo giá dưới 500k:\n\n- [8TW24W009]: Áo nỉ có mũ nam, chất cotton ấm áp, giá 349k đang sale 280k - rất đáng mua!\n- [6OT24W005]: Áo khoác gió nữ hai lớp, nhẹ nhàng thoáng mát, giá 299k.\n\nBạn kéo xuống xem ảnh chi tiết nhé! 😍"
---
## Example 4: Chào hỏi
**Input:** "Chào em"
## Example 4: Chào hỏi (Mặc định)
**Input:** "Chào shop"
**Output:**
{{
"ai_response": "Chào anh/chị ạ! Em là CiCi...",
"ai_response": "Chào bạn! Mình là CiCi, chuyên viên tư vấn thời trang của CANIFA. Mình có thể giúp gì cho bạn hôm nay? ✨",
"product_ids": []
}}
## Example 5: Chào hỏi (Khách xưng anh/chị)
**Input:** "Chào em, chị muốn tìm váy"
**Output:**
{{
"ai_response": "Chào chị ạ! Em là CiCi. Chị đang muốn tìm mẫu váy như thế nào ạ (váy liền, chân váy, đi làm hay đi chơi)? Để em tư vấn mẫu phù hợp nhất cho chị nhé! 💖",
"product_ids": []
}}
## Example 6: Hỏi size/tư vấn (Kiểm tra kỹ dữ liệu)
**Input:** "Bé 3 tuổi nặng 15kg mặc size gì e?"
**Tool Call:** (Tìm kiếm sản phẩm cho bé 3 tuổi để check size_scale)
**Tình huống:** Tool trả về sản phẩm nhưng không có thông tin quy đổi cân nặng cụ thể trong `description`.
**Output:**
{{
"ai_response": "Dạ hiện tại trong dữ liệu sản phẩm em chưa thấy thông tin quy đổi size cụ thể cho bé 15kg ạ. Tuy nhiên, thông thường bé 3 tuổi 15kg có thể mặc size 100 hoặc 110. Để chính xác nhất, chị có thể tham khảo bảng size chi tiết trên website hoặc ghé cửa hàng thử trực tiếp cho bé nhé! 🥰",
"product_ids": []
}}
## Example 7: Tìm sản phẩm (MẪU CHUẨN - BẮT BUỘC THEO)
**Input:** "Tìm áo dưới 500k"
**Output:**
{{
"ai_response": "Dưới đây shop có mấy mẫu áo giá dưới 500k:\n\n- [8TW24W009]: Áo nỉ có mũ nam, chất cotton ấm áp, giá 349k đang sale 280k - rất đáng mua!\n- [6OT24W005]: Áo khoác gió nữ hai lớp, nhẹ nhàng thoáng mát, giá 299k.\n\nBạn kéo xuống xem ảnh chi tiết nhé! 😍",
"product_ids": [
{{"sku": "8TW24W009", "name": "Áo nỉ có mũ nam", "price": 349000, "sale_price": 280000, "url": "https://canifa.com/ao-hoodie-nam-8tw24w009", "thumbnail_image_url": "http://mdp.canifa.com/.../image.jpg"}},
{{"sku": "6OT24W005", "name": "Áo khoác gió nữ hai lớp", "price": 299000, "sale_price": null, "url": "https://canifa.com/ao-khoac-gio-nu-6ot24w005", "thumbnail_image_url": "http://mdp.canifa.com/.../image2.jpg"}}
]
}}
# VÍ DỤ (EXAMPLES)
## Example 1: Tìm sản phẩm đơn giản
......@@ -119,15 +188,24 @@ def get_system_prompt() -> str:
**Input:** "Tìm đồ vải len cho nữ"
**Tool Call:**
`data_retrieval_tool(searches=[{{"query": "trang phục vải len nữ", "gender_by_product": "female", "material_group": "Yarn - Sợi"}}])`
**Output:**
{{
"ai_response": "Shop có mấy mẫu đồ len nữ đẹp lắm:\n\n- [8SW24W001]: Áo len cổ tròn, chất Yarn - Sợi mềm mại, giá 450k.\n- [6CG24W012]: Váy len dáng A, ấm áp sang trọng, giá 680k đang sale 550k.\n\nBạn xem ảnh chi tiết bên dưới nhé! ✨",
"product_ids": [
{{"sku": "8SW24W001", "name": "Áo len cổ tròn nữ", "price": 450000, "sale_price": null, "url": "https://...", "thumbnail_image_url": "https://..."}},
{{"sku": "6CG24W012", "name": "Váy len dáng A", "price": 680000, "sale_price": 550000, "url": "https://...", "thumbnail_image_url": "https://..."}}
]
}}
---
# BỐI CẢNH (CONTEXT)
- Luôn trả lời đầy đủ, trau chuốt, không bỏ sót thông tin.
- Sử dụng Markdown để trình bày bảng hoặc list sản phẩm đẹp mắt.
- Nhắc đúng mã sản phẩm trong list `product_ids`.
- ai_response: Ngắn gọn, mô tả sản phẩm qua bằng [SKU], không tạo bảng markdown.
- product_ids: Chứa danh sách SKU - frontend sẽ render chi tiết.
- Luôn trả lời đầy đủ, trau chuốt, không bỏ sót thông tin quan trọng.
---"""
# Replace placeholder with actual date
return prompt.replace("DATE_PLACEHOLDER", date_str)
# Format using f-string syntax (handled by prompt template mechanism or direct replace if strict)
# Since specific replacement logic was requested:
return prompt.replace("{date_str}", date_str)
import logging
from langchain_core.tools import tool
from pydantic import BaseModel, Field
from common.embedding_service import create_embedding_async
from common.starrocks_connection import StarRocksConnection
logger = logging.getLogger(__name__)
class KnowledgeSearchInput(BaseModel):
query: str = Field(
description="Câu hỏi hoặc nhu cầu tìm kiếm thông tin phi sản phẩm của khách hàng (ví dụ: tìm cửa hàng, hỏi chính sách, tra bảng size...)"
)
@tool("canifa_knowledge_search", args_schema=KnowledgeSearchInput)
async def canifa_knowledge_search(query: str) -> str:
"""
Tra cứu TOÀN BỘ thông tin về thương hiệu và dịch vụ của Canifa.
Sử dụng tool này khi khách hàng hỏi về:
1. THƯƠNG HIỆU & GIỚI THIỆU: Lịch sử hình thành, giá trị cốt lõi, sứ mệnh.
2. HỆ THỐNG CỬA HÀNG: Tìm địa chỉ, số điện thoại, giờ mở cửa các cửa hàng tại các tỉnh thành (Hà Nội, HCM, Đà Nẵng, v.v.).
3. CHÍNH SÁCH BÁN HÀNG: Quy định đổi trả, bảo hành, chính sách vận chuyển, phí ship.
4. KHÁCH HÀNG THÂN THIẾT (KHTT): Điều kiện đăng ký thành viên, các hạng thẻ (Green, Silver, Gold, Diamond), quyền lợi tích điểm, thẻ quà tặng.
5. HỖ TRỢ & FAQ: Giải đáp thắc mắc thường gặp, chính sách bảo mật, thông tin liên hệ văn phòng, tuyển dụng.
6. TRA CỨU SIZE (BẢNG KÍCH CỠ): Hướng dẫn chọn size chuẩn cho nam, nữ, trẻ em dựa trên chiều cao, cân nặng.
Ví dụ các câu hỏi phù hợp:
- 'Canifa ở Cầu Giấy địa chỉ ở đâu?'
- 'Chính sách đổi trả hàng trong bao nhiêu ngày?'
- 'Làm sao để lên hạng thẻ Gold?'
- 'Cho mình xem bảng size áo nam.'
- 'Phí vận chuyển đi tỉnh là bao nhiêu?'
- 'Canifa thành lập năm nào?'
"""
logger.info(f"🔍 [Semantic Search] Brand Knowledge query: {query}")
try:
# 1. Tạo embedding cho câu hỏi (Mặc định 1536 chiều như bro yêu cầu)
query_vector = await create_embedding_async(query)
if not query_vector:
return "Xin lỗi, tôi gặp sự cố khi xử lý thông tin. Vui lòng thử lại sau."
v_str = "[" + ",".join(str(v) for v in query_vector) + "]"
# 2. Query StarRocks lấy Top 4 kết quả phù hợp nhất (Không check score)
sql = f"""
SELECT
content,
metadata
FROM shared_source.chatbot_rsa_knowledge
ORDER BY approx_cosine_similarity(embedding, {v_str}) DESC
LIMIT 4
"""
sr = StarRocksConnection()
results = await sr.execute_query_async(sql)
if not results:
logger.warning(f"⚠️ No knowledge data found in DB for query: {query}")
return "Hiện tại tôi chưa tìm thấy thông tin chính xác về nội dung này trong hệ thống kiến thức của Canifa. Bạn có thể liên hệ hotline 1800 6061 để được hỗ trợ trực tiếp."
# 3. Tổng hợp kết quả
knowledge_texts = []
for i, res in enumerate(results):
content = res.get("content", "")
knowledge_texts.append(content)
# LOG DỮ LIỆU LẤY ĐƯỢC (Chỉ hiển thị nội dung)
logger.info(f"📄 [Knowledge Chunk {i + 1}]: {content[:200]}...")
final_response = "\n\n---\n\n".join(knowledge_texts)
logger.info(f"✅ Found {len(results)} relevant knowledge chunks.")
return final_response
except Exception as e:
logger.error(f"❌ Error in canifa_knowledge_search: {e}")
return "Tôi đang gặp khó khăn khi truy cập kho kiến thức. Bạn muốn hỏi về sản phẩm gì khác không?"
# """
# CANIFA Data Retrieval Tool - Tối giản cho Agentic Workflow.
# Hỗ trợ Hybrid Search: Semantic (Vector) + Metadata Filter.
# """
# import asyncio
# import json
# import logging
# from decimal import Decimal
# from langchain_core.tools import tool
# from pydantic import BaseModel, Field
# from agent.tools.product_search_helpers import build_starrocks_query
# from common.starrocks_connection import StarRocksConnection
# from langsmith import traceable
# logger = logging.getLogger(__name__)
# class DecimalEncoder(json.JSONEncoder):
# """Xử lý kiểu Decimal từ Database khi convert sang JSON."""
# def default(self, obj):
# if isinstance(obj, Decimal):
# return float(obj)
# return super().default(obj)
# class SearchItem(BaseModel):
# """Cấu trúc một mục tìm kiếm đơn lẻ trong Multi-Search."""
# query: str = Field(
# ...,
# description="Câu hỏi/mục đích tự do của user (đi chơi, dự tiệc, phỏng vấn,...) - dùng cho Semantic Search",
# )
# keywords: str | None = Field(
# ..., description="Từ khóa sản phẩm cụ thể (áo polo, quần jean,...) - dùng cho LIKE search"
# )
# magento_ref_code: str | None = Field(
# ..., description="Mã sản phẩm hoặc mã màu/SKU (Ví dụ: 8TS24W001 hoặc 8TS24W001-SK010)."
# )
# product_line_vn: str | None = Field(..., description="Dòng sản phẩm. Giá trị: Áo phông, Quần short, Váy liền, Áo Polo, Áo len, Áo khoác, Quần jean, Quần Khaki, Somi, Blazer, v.v.")
# gender_by_product: str | None = Field(..., description="Giới tính. Giá trị: female, male, others")
# age_by_product: str | None = Field(..., description="Độ tuổi. Giá trị: adult, others (Kids)")
# master_color: str | None = Field(..., description="Màu sắc chính. Giá trị: Đen/ Black, Trắng/ White, Hồng/ Pink, Xanh da trời/ Blue, Be/ Beige, Đỏ/ Red, Vàng/ Yellow, Tím/ Purple, v.v.")
# material_group: str | None = Field(
# ...,
# description="Nhóm chất liệu. Giá trị: 'Knit - Dệt Kim', 'Woven - Dệt Thoi', 'Yarn - Sợi', 'Knit/Woven - Dệt Kim/Dệt Thoi'.",
# )
# season: str | None = Field(..., description="Mùa. Giá trị: Spring Summer, Fall Winter, Year, Collection")
# style: str | None = Field(..., description="Phong cách. Giá trị: Basic, Basic Update, Feminine, Dynamic, Smart Casual, Athleisure, Utility, Trend")
# fitting: str | None = Field(..., description="Form dáng. Giá trị: Regular, Slim, Slimfit, Skinny, Relax, Boxy, Oversize, Baby tee")
# size_scale: str | None = Field(..., description="Thang size. Giá trị: [Người lớn: S, M, L, XL, XS, XXL, XXXL, XXS, Free Size], [Quần/Váy: 26-33], [Trẻ em (chiều cao): 90Cm-160Cm, 92, 98, 104...], [Trẻ em (tuổi): 2/3, 4/6, 7/9, 10/12, 13/14]")
# form_neckline: str | None = Field(..., description="Kiểu cổ. Giá trị: Crew Neck, V-neck, Classic Collar, Hooded collar, Turtle Neck, Mock Neck, Square, v.v.")
# form_sleeve: str | None = Field(..., description="Kiểu tay. Giá trị: Short Sleeve, Full length Sleeve, Sleeveless, Balloon Sleeve, Puff, v.v.")
# weaving: str | None = Field(..., description="Kiểu dệt: Velvet, Twill, Plain, French Terry, Interlock, v.v.")
# graphic: str | None = Field(..., description="Họa tiết hình in: Artwork, Repeated pattern, v.v.")
# pattern: str | None = Field(..., description="Thông số định lượng/mẫu: 260G, 186G, 195G, v.v.")
# shape_detail: str | None = Field(..., description="Chi tiết kiểu dáng: Fit and Flare, Shift, A line, v.v.")
# form_length: str | None = Field(..., description="Chiều dài: Short Length, v.v.")
# form_waistline: str | None = Field(..., description="Kiểu cạp: High Rise, Mid Rise/ Regular rise, v.v.")
# form_shoulderline: str | None = Field(..., description="Kiểu vai: Drop Shoulder, Regular shoulder, v.v.")
# material: str | None = Field(..., description="Vải cụ thể: 100% Cotton, Polyester, v.v.")
# price_min: float | None = Field(..., description="Giá thấp nhất")
# price_max: float | None = Field(..., description="Giá cao nhất")
# action: str = Field(..., description="Hành động: 'search' (tìm kiếm) hoặc 'visual_search' (phân tích ảnh)")
# class MultiSearchParams(BaseModel):
# """Tham số cho Parallel Multi-Search."""
# searches: list[SearchItem] = Field(..., description="Danh sách các truy vấn tìm kiếm chạy song song")
# @tool(args_schema=MultiSearchParams)
# @traceable(run_type="tool", name="data_retrieval_tool")
# async def data_retrieval_tool(searches: list[SearchItem]) -> str:
# """
# Siêu công cụ tìm kiếm sản phẩm CANIFA - Hỗ trợ Parallel Multi-Search (Chạy song song nhiều query).
# 💡 ĐIỂM ĐẶC BIỆT:
# Công cụ này cho phép thực hiện NHIỀU truy vấn tìm kiếm CÙNG LÚC.
# Hãy dùng nó khi cần SO SÁNH sản phẩm hoặc tìm trọn bộ OUTFIT (mix & match).
# ⚠️ QUAN TRỌNG - KHI NÀO DÙNG GÌ:
# 1️⃣ DÙNG 'query' (Semantic Search - BUỘC PHẢI CÓ):
# - Áp dụng cho mọi lượt search để cung cấp bối cảnh (context).
# - Ví dụ: "áo thun nam đi biển", "quần tây công sở", "đồ cho bé màu xanh"...
# 2️⃣ DÙNG METADATA FILTERS (Exact/Partial Match):
# - Khi khách nói rõ THUỘC TÍNH: Màu sắc, giá, giới tính, độ tuổi, mã sản phẩm.
# - **QUY TẮC MÃ SẢN PHẨM:** Mọi loại mã (VD: `8TS...` hoặc `8TS...-SK...`) → Điền vào `magento_ref_code`.
# - **QUY TẮC CHẤT LIÊU (material_group):** Chỉ dùng: `Yarn - Sợi`, `Knit - Dệt Kim`, `Woven - Dệt Thoi`, `Knit/Woven - Dệt Kim/Dệt Thoi`.
# 📝 VÍ DỤ CHI TIẾT (Single Search):
# - Example 1: searches=[{"query": "áo polo nam giá dưới 400k", "keywords": "áo polo", "gender_by_product": "male", "price_max": 400000}]
# - Example 2: searches=[{"query": "sản phẩm mã 8TS24W001", "magento_ref_code": "8TS24W001"}]
# 🚀 VÍ DỤ CẤP CAO (Multi-Search Parallel):
# - Example 3 - So sánh: "So sánh áo thun nam đen và áo sơ mi trắng dưới 500k"
# Tool Call: searches=[
# {"query": "áo thun nam màu đen dưới 500k", "keywords": "áo thun", "master_color": "Đen", "gender_by_product": "male", "price_max": 500000},
# {"query": "áo sơ mi nam trắng dưới 500k", "keywords": "áo sơ mi", "master_color": "Trắng", "gender_by_product": "male", "price_max": 500000}
# ]
# - Example 4 - Phối đồ: "Tìm cho mình một cái quần jean và một cái áo khoác để đi chơi"
# Tool Call: searches=[
# {"query": "quần jean đi chơi năng động", "keywords": "quần jean"},
# {"query": "áo khoác đi chơi năng động", "keywords": "áo khoác"}
# ]
# - Example 5 - Cả gia đình: "Tìm áo phông màu xanh cho bố, mẹ và bé trai"
# Tool Call: searches=[
# {"query": "áo phông nam người lớn màu xanh", "keywords": "áo phông", "master_color": "Xanh", "gender_by_product": "male", "age_by_product": "adult"},
# {"query": "áo phông nữ người lớn màu xanh", "keywords": "áo phông", "master_color": "Xanh", "gender_by_product": "female", "age_by_product": "adult"},
# {"query": "áo phông bé trai màu xanh", "keywords": "áo phông", "master_color": "Xanh", "gender_by_product": "male", "age_by_product": "others"}
# ]
# """
# try:
# db = StarRocksConnection()
# # 0. Log input parameters (Đúng ý bro)
# logger.info(f"📥 [Tool Input] data_retrieval_tool received {len(searches)} items:")
# for idx, item in enumerate(searches):
# logger.info(f" 🔹 Item [{idx}]: {item.dict(exclude_none=True)}")
# # 1. Tạo tasks chạy song song (Parallel)
# tasks = []
# for item in searches:
# tasks.append(_execute_single_search(db, item))
# logger.info(f"🚀 [Parallel Search] Executing {len(searches)} queries simultaneously...")
# results = await asyncio.gather(*tasks)
# # 2. Tổng hợp kết quả
# combined_results = []
# for i, products in enumerate(results):
# combined_results.append({
# "search_index": i,
# "search_criteria": searches[i].dict(exclude_none=True),
# "count": len(products),
# "products": products
# })
# return json.dumps(
# {"status": "success", "results": combined_results},
# ensure_ascii=False,
# cls=DecimalEncoder
# )
# except Exception as e:
# logger.error(f"Error in Multi-Search data_retrieval_tool: {e}")
# return json.dumps({"status": "error", "message": str(e)})
# @traceable(name="starrocks_query", run_type="tool")
# async def _execute_db_query(db: StarRocksConnection, sql: str) -> list[dict]:
# """Execute SQL query with LangSmith tracing and local logging."""
# import time
# start_time = time.perf_counter()
# try:
# products = await db.execute_query_async(sql)
# duration_ms = (time.perf_counter() - start_time) * 1000
# logger.info(f"⏱️ [DB Latency] SQL Execution: {duration_ms:.2f}ms | Rows: {len(products)}")
# return products
# except Exception as e:
# logger.error(f"❌ DB Execution Failed: {e}")
# raise e
# async def _execute_single_search(db: StarRocksConnection, item: SearchItem) -> list[dict]:
# """Thực thi một search query đơn lẻ (Async)."""
# try:
# # build_starrocks_query handles embedding internally (async)
# sql = await build_starrocks_query(item)
# products = await _execute_db_query(db, sql)
# return _format_product_results(products)
# except Exception as e:
# logger.error(f"Single search error for item {item}: {e}")
# return []
# def _format_product_results(products: list[dict]) -> list[dict]:
# """Lọc và format kết quả trả về cho Agent."""
# allowed_fields = {
# "internal_ref_code",
# "magento_ref_code",
# "product_color_code",
# "product_name",
# "color_code",
# "master_color",
# "product_color_name",
# "season_sale",
# "season",
# "style",
# "fitting",
# "size_scale",
# "graphic",
# "pattern",
# "weaving",
# "shape_detail",
# "form_neckline",
# "form_sleeve",
# "form_length",
# "form_waistline",
# "form_shoulderline",
# "material",
# "product_group",
# "product_line_vn",
# "unit_of_measure",
# "sale_price",
# "original_price",
# "material_group",
# "product_line_en",
# "age_by_product",
# "gender_by_product",
# "product_image_url",
# "description_text",
# "product_image_url_thumbnail",
# "product_web_url",
# "product_web_material",
# "max_score",
# "similarity_score",
# }
# return [{k: v for k, v in p.items() if k in allowed_fields} for p in products[:5]]
"""
CANIFA Data Retrieval Tool - Tối giản cho Agentic Workflow.
Hỗ trợ Hybrid Search: Semantic (Vector) + Metadata Filter.
......@@ -6,6 +232,7 @@ Hỗ trợ Hybrid Search: Semantic (Vector) + Metadata Filter.
import asyncio
import json
import logging
import time
from decimal import Decimal
from langchain_core.tools import tool
......@@ -107,8 +334,11 @@ async def data_retrieval_tool(searches: list[SearchItem]) -> str:
{"query": "áo phông bé trai màu xanh", "keywords": "áo phông", "master_color": "Xanh", "gender_by_product": "male", "age_by_product": "others"}
]
"""
logger.info("🔧 [DEBUG] data_retrieval_tool STARTED")
try:
logger.info("🔧 [DEBUG] Creating StarRocksConnection instance")
db = StarRocksConnection()
logger.info("🔧 [DEBUG] StarRocksConnection created successfully")
# 0. Log input parameters (Đúng ý bro)
logger.info(f"📥 [Tool Input] data_retrieval_tool received {len(searches)} items:")
......@@ -116,12 +346,15 @@ async def data_retrieval_tool(searches: list[SearchItem]) -> str:
logger.info(f" 🔹 Item [{idx}]: {item.dict(exclude_none=True)}")
# 1. Tạo tasks chạy song song (Parallel)
logger.info("🔧 [DEBUG] Creating parallel tasks")
tasks = []
for item in searches:
tasks.append(_execute_single_search(db, item))
logger.info(f"🚀 [Parallel Search] Executing {len(searches)} queries simultaneously...")
logger.info("🔧 [DEBUG] About to call asyncio.gather()")
results = await asyncio.gather(*tasks)
logger.info(f"🔧 [DEBUG] asyncio.gather() completed with {len(results)} results")
# 2. Tổng hợp kết quả
combined_results = []
......@@ -147,9 +380,25 @@ async def data_retrieval_tool(searches: list[SearchItem]) -> str:
async def _execute_single_search(db: StarRocksConnection, item: SearchItem) -> list[dict]:
"""Thực thi một search query đơn lẻ (Async)."""
try:
# build_starrocks_query handles embedding internally (async)
logger.info(f"🔧 [DEBUG] _execute_single_search STARTED for query: {item.query[:50] if item.query else 'None'}")
# ⏱️ Timer: Build query (bao gồm embedding nếu có)
query_build_start = time.time()
logger.info("🔧 [DEBUG] Calling build_starrocks_query()")
sql = await build_starrocks_query(item)
query_build_time = (time.time() - query_build_start) * 1000 # Convert to ms
logger.info(f"🔧 [DEBUG] SQL query built, length: {len(sql)}")
logger.info(f"⏱️ [TIMER] Query Build Time (bao gồm embedding): {query_build_time:.2f}ms")
# ⏱️ Timer: Execute DB query
db_start = time.time()
logger.info("🔧 [DEBUG] Calling db.execute_query_async()")
products = await db.execute_query_async(sql)
db_time = (time.time() - db_start) * 1000 # Convert to ms
logger.info(f"🔧 [DEBUG] Query executed, got {len(products)} products")
logger.info(f"⏱️ [TIMER] DB Query Execution Time: {db_time:.2f}ms")
logger.info(f"⏱️ [TIMER] Total Time (Build + DB): {query_build_time + db_time:.2f}ms")
return _format_product_results(products)
except Exception as e:
logger.error(f"Single search error for item {item}: {e}")
......@@ -197,4 +446,3 @@ def _format_product_results(products: list[dict]) -> list[dict]:
"product_web_material",
}
return [{k: v for k, v in p.items() if k in allowed_fields} for p in products[:5]]
......@@ -5,13 +5,14 @@ Chỉ return 1 tool duy nhất: data_retrieval_tool
from langchain_core.tools import Tool
from .brand_knowledge_tool import canifa_knowledge_search
from .customer_info_tool import collect_customer_info
from .data_retrieval_tool import data_retrieval_tool
def get_retrieval_tools() -> list[Tool]:
"""Các tool chỉ dùng để đọc/truy vấn dữ liệu (Có thể cache)"""
return [data_retrieval_tool]
return [data_retrieval_tool, canifa_knowledge_search]
def get_collection_tools() -> list[Tool]:
......
# import logging
# from common.embedding_service import create_embedding_async
# logger = logging.getLogger(__name__)
# def _escape(val: str) -> str:
# """Thoát dấu nháy đơn để tránh SQL Injection cơ bản."""
# return val.replace("'", "''")
# def _get_where_clauses(params) -> list[str]:
# """
# Xây dựng WHERE clauses theo thứ tự ưu tiên dựa trên selectivity thực tế
# FILTER PRIORITY (Based on Canifa catalog analysis):
# 🔥 TIER 1 (99% selectivity):
# 1. SKU Code → 1-5 records
# 🎯 TIER 2 (50-70% selectivity):
# 2. Gender → Splits catalog in half
# 3. Age → Kids vs Adults split
# 4. Product Category → 10-15 categories
# 💎 TIER 3 (30-50% selectivity):
# 5. Material Group → Knit vs Woven (2 groups)
# 6. Price Range → Numeric filtering
# 🎨 TIER 4 (10-30% selectivity):
# 7. Season → 4 seasons
# 8. Style/Fitting → Multiple options
# ⚠️ TIER 5 (<10% selectivity):
# 9. Form details → Granular attributes
# 10. Color → LOWEST selectivity (many SKUs share colors)
# Early return: If SKU exists, skip low-selectivity filters
# """
# clauses = []
# # 🔥 TIER 1: SKU/Product Code (Unique identifier)
# # Selectivity: ~99% → 1 SKU = 1 style (3-5 colors max)
# sku_clause = _get_sku_clause(params)
# if sku_clause:
# clauses.append(sku_clause)
# # Early return optimization: SKU đã xác định product rõ ràng
# # CHỈ GIỮ LẠI price filter (nếu có) để verify budget constraint
# # BỎ QUA: gender, color, style, fitting... vì SKU đã unique
# price_clauses = _get_price_clauses(params)
# if price_clauses:
# clauses.extend(price_clauses)
# return clauses # ⚡ STOP - Không thêm filter khác!
# # 🎯 TIER 2: High-level categorization (50-70% reduction)
# # Gender + Age + Category có selectivity cao nhất trong non-SKU filters
# clauses.extend(_get_high_selectivity_clauses(params))
# # 💎 TIER 3: Material & Price (30-50% reduction)
# material_clause = _get_material_clause(params)
# if material_clause:
# clauses.append(material_clause)
# clauses.extend(_get_price_clauses(params))
# # 🎨 TIER 4: Attributes (10-30% reduction)
# clauses.extend(_get_attribute_clauses(params))
# # ⚠️ TIER 5: Granular details & Color (LAST - lowest selectivity)
# clauses.extend(_get_form_detail_clauses(params))
# color_clause = _get_color_clause(params)
# if color_clause:
# clauses.append(color_clause) # Color ALWAYS LAST!
# return clauses
# def _get_sku_clause(params) -> str | None:
# """
# TIER 1: SKU/Product Code (Highest selectivity - 99%)
# 1 SKU code = 1 product style (may have 3-5 color variants)
# WHY SKU is always priority #1:
# - 1 code = 1 unique product design
# - Adding other filters (color, style, gender) is redundant
# - Only price filter may be kept for budget validation
# Example queries:
# - "Mã 6OT25W010" → Only SKU needed
# - "Mã 6OT25W010 màu xám" → Only SKU (color is for display/selection, not filtering)
# - "Mã 6OT25W010 dưới 500k" → SKU + price (validate budget)
# """
# m_code = getattr(params, "magento_ref_code", None)
# if m_code:
# m = _escape(m_code)
# return f"(magento_ref_code = '{m}' OR internal_ref_code = '{m}')"
# return None
# def _get_color_clause(params) -> str | None:
# """
# TIER 5: Color (LOWEST selectivity - 5-10%)
# Multiple SKUs share the same color (e.g., 50+ gray products)
# ALWAYS filter color LAST after other constraints
# """
# color = getattr(params, "master_color", None)
# if color:
# c = _escape(color).lower()
# return f"(LOWER(master_color) LIKE '%{c}%' OR LOWER(product_color_name) LIKE '%{c}%')"
# return None
# def _get_high_selectivity_clauses(params) -> list[str]:
# """
# TIER 2: High-level categorization (50-70% reduction per filter)
# Order: Gender → Age → Product Category
# """
# clauses = []
# # Gender: Male/Female/Unisex split (50-70% reduction)
# gender = getattr(params, "gender_by_product", None)
# if gender:
# clauses.append(f"gender_by_product = '{_escape(gender)}'")
# # Age: Kids/Adults split (50% reduction of remaining)
# age = getattr(params, "age_by_product", None)
# if age:
# clauses.append(f"age_by_product = '{_escape(age)}'")
# # Product Category: Váy/Áo/Quần... (30-50% reduction)
# product_line = getattr(params, "product_line_vn", None)
# if product_line:
# p = _escape(product_line).lower()
# clauses.append(f"LOWER(product_line_vn) LIKE '%{p}%'")
# return clauses
# def _get_material_clause(params) -> str | None:
# """TIER 3: Material Group - Knit vs Woven (50% split)"""
# material = getattr(params, "material_group", None)
# if material:
# m = _escape(material).lower()
# return f"LOWER(material_group) LIKE '%{m}%'"
# return None
# def _get_price_clauses(params) -> list[str]:
# """TIER 3: Price Range - Numeric filtering (30-40% reduction)"""
# clauses = []
# p_min = getattr(params, "price_min", None)
# if p_min is not None:
# clauses.append(f"sale_price >= {p_min}")
# p_max = getattr(params, "price_max", None)
# if p_max is not None:
# clauses.append(f"sale_price <= {p_max}")
# return clauses
# def _get_attribute_clauses(params) -> list[str]:
# """
# TIER 4: Attributes (10-30% reduction)
# Season, Style, Fitting
# """
# clauses = []
# # Season: 4 seasons (~25% each)
# season = getattr(params, "season", None)
# if season:
# s = _escape(season).lower()
# clauses.append(f"LOWER(season) LIKE '%{s}%'")
# # Style: Basic/Feminine/Sporty... (~15-20% reduction)
# style = getattr(params, "style", None)
# if style:
# st = _escape(style).lower()
# clauses.append(f"LOWER(style) LIKE '%{st}%'")
# # Fitting: Regular/Slim/Loose (~15% reduction)
# fitting = getattr(params, "fitting", None)
# if fitting:
# f = _escape(fitting).lower()
# clauses.append(f"LOWER(fitting) LIKE '%{f}%'")
# # Size Scale: S, M, L, 29, 30... (Specific filtering)
# size = getattr(params, "size_scale", None)
# if size:
# sz = _escape(size).lower()
# clauses.append(f"LOWER(size_scale) LIKE '%{sz}%'")
# return clauses
# def _get_form_detail_clauses(params) -> list[str]:
# """
# TIER 5: Granular form details (<10% reduction each)
# Neckline, Sleeve type
# """
# clauses = []
# form_fields = [
# ("form_neckline", "form_neckline"),
# ("form_sleeve", "form_sleeve"),
# ]
# for param_name, col_name in form_fields:
# val = getattr(params, param_name, None)
# if val:
# v = _escape(val).lower()
# clauses.append(f"LOWER({col_name}) LIKE '%{v}%'")
# return clauses
# async def build_starrocks_query(params, query_vector: list[float] | None = None) -> str:
# """
# Build SQL Hybrid tối ưu với Filter Priority:
# 1. Pre-filtering theo độ ưu tiên (SKU → Exact → Price → Partial)
# 2. Vector Search (HNSW Index) - Semantic understanding
# 3. Flexible Keyword Search (OR + Scoring) - Fuzzy matching fallback
# 4. Grouping (Gom màu theo style)
# """
# # --- Process vector in query field ---
# query_text = getattr(params, "query", None)
# # if query_text and query_vector is None:
# # query_vector = await create_embedding_async(query_text)
# # --- Build filter clauses (OPTIMIZED ORDER) ---
# where_clauses = _get_where_clauses(params)
# where_sql = " AND ".join(where_clauses) if where_clauses else "1=1"
# # --- Build SQL ---
# if query_vector and len(query_vector) > 0:
# v_str = "[" + ",".join(str(v) for v in query_vector) + "]"
# sql = f"""
# WITH top_sku_candidates AS (
# SELECT
# approx_cosine_similarity(vector, {v_str}) as similarity_score,
# internal_ref_code,
# product_name,
# sale_price,
# original_price,
# master_color,
# product_image_url,
# product_image_url_thumbnail,
# product_web_url,
# description_text,
# material,
# material_group,
# gender_by_product,
# age_by_product,
# season,
# style,
# fitting,
# form_neckline,
# form_sleeve,
# product_line_vn,
# product_color_name
# FROM shared_source.magento_product_dimension_with_text_embedding
# WHERE {where_sql} AND vector IS NOT NULL
# ORDER BY similarity_score DESC
# LIMIT 50
# )
# SELECT
# internal_ref_code,
# ANY_VALUE(product_name) as product_name,
# ANY_VALUE(sale_price) as sale_price,
# ANY_VALUE(original_price) as original_price,
# GROUP_CONCAT(DISTINCT master_color ORDER BY master_color SEPARATOR ', ') as available_colors,
# ANY_VALUE(product_image_url) as product_image_url,
# ANY_VALUE(product_image_url_thumbnail) as product_image_url_thumbnail,
# ANY_VALUE(product_web_url) as product_web_url,
# ANY_VALUE(description_text) as description_text,
# ANY_VALUE(material) as material,
# ANY_VALUE(material_group) as material_group,
# ANY_VALUE(gender_by_product) as gender_by_product,
# ANY_VALUE(age_by_product) as age_by_product,
# ANY_VALUE(season) as season,
# ANY_VALUE(style) as style,
# ANY_VALUE(fitting) as fitting,
# ANY_VALUE(form_neckline) as form_neckline,
# ANY_VALUE(form_sleeve) as form_sleeve,
# ANY_VALUE(product_line_vn) as product_line_vn,
# MAX(similarity_score) as max_score
# FROM top_sku_candidates
# GROUP BY internal_ref_code
# ORDER BY max_score DESC
# LIMIT 10
# """ # noqa: S608
# else:
# # ⚡ FALLBACK: FLEXIBLE KEYWORD SEARCH (OR + SCORING)
# # Giải quyết case: User search "áo khoác nỉ" → DB có "Áo nỉ nam"
# keywords = getattr(params, "keywords", None)
# keyword_score_sql = ""
# keyword_filter = ""
# if keywords:
# k_clean = _escape(keywords).lower().strip()
# if k_clean:
# words = k_clean.split()
# # Build scoring expression: Each matched word = +1 point
# # Example: "áo khoác nỉ" (3 words)
# # - "Áo nỉ nam" matches 2/3 → Score = 2
# # - "Áo khoác nỉ hoodie" matches 3/3 → Score = 3
# score_terms = [
# f"(CASE WHEN LOWER(product_name) LIKE '%{w}%' THEN 1 ELSE 0 END)"
# for w in words
# ]
# keyword_score_sql = f"({' + '.join(score_terms)}) as keyword_match_score"
# # Minimum threshold: At least 50% of words must match
# # Example: 3 words → need at least 2 matches (66%)
# # 2 words → need at least 1 match (50%)
# min_matches = max(1, len(words) // 2)
# keyword_filter = f" AND ({' + '.join(score_terms)}) >= {min_matches}"
# # Select clause with optional scoring
# select_score = f", {keyword_score_sql}" if keyword_score_sql else ""
# order_by = "keyword_match_score DESC, sale_price ASC" if keyword_score_sql else "sale_price ASC"
# sql = f"""
# SELECT
# internal_ref_code,
# ANY_VALUE(product_name) as product_name,
# ANY_VALUE(sale_price) as sale_price,
# ANY_VALUE(original_price) as original_price,
# GROUP_CONCAT(DISTINCT master_color ORDER BY master_color SEPARATOR ', ') as available_colors,
# ANY_VALUE(product_image_url) as product_image_url,
# ANY_VALUE(product_image_url_thumbnail) as product_image_url_thumbnail,
# ANY_VALUE(product_web_url) as product_web_url,
# ANY_VALUE(description_text) as description_text,
# ANY_VALUE(material) as material,
# ANY_VALUE(material_group) as material_group,
# ANY_VALUE(gender_by_product) as gender_by_product,
# ANY_VALUE(age_by_product) as age_by_product,
# ANY_VALUE(season) as season,
# ANY_VALUE(style) as style,
# ANY_VALUE(fitting) as fitting,
# ANY_VALUE(form_neckline) as form_neckline,
# ANY_VALUE(form_sleeve) as form_sleeve,
# ANY_VALUE(product_line_vn) as product_line_vn
# {select_score}
# FROM shared_source.magento_product_dimension_with_text_embedding
# WHERE {where_sql} {keyword_filter}
# GROUP BY internal_ref_code
# HAVING COUNT(*) > 0
# ORDER BY {order_by}
# LIMIT 10
# """ # noqa: S608
# # Log filter statistics
# filter_info = f"Mode: {'Vector' if query_vector else 'Keyword'}, Filters: {len(where_clauses)}"
# if where_clauses:
# # Identify high-priority filters used
# has_sku = any('internal_ref_code' in c or 'magento_ref_code' in c for c in where_clauses)
# has_gender = any('gender_by_product' in c for c in where_clauses)
# has_category = any('product_line_vn' in c for c in where_clauses)
# priority_info = []
# if has_sku:
# priority_info.append("SKU")
# if has_gender:
# priority_info.append("Gender")
# if has_category:
# priority_info.append("Category")
# if priority_info:
# filter_info += f", Priority: {'+'.join(priority_info)}"
# logger.info(f"📊 {filter_info}")
# # Write SQL to file for debugging
# try:
# with open(r"d:\cnf\chatbot_canifa\backend\embedding.txt", "w", encoding="utf-8") as f:
# f.write(sql)
# except Exception as e:
# logger.error(f"Failed to write SQL to embedding.txt: {e}")
# return sql
import logging
import time
from common.embedding_service import create_embedding_async
......@@ -85,90 +473,109 @@ def _get_special_clauses(params) -> list[str]:
async def build_starrocks_query(params, query_vector: list[float] | None = None) -> str:
"""
Build SQL Hybrid tối ưu:
1. Pre-filtering (Metadata)
2. Vector Search (HNSW Index)
Build SQL Hybrid tối ưu với POST-FILTERING Strategy:
🔥 OPTIMIZATION STRATEGY:
1. Vector Search TRƯỚC (dùng vector index) → lấy top 50 candidates
2. Post-filtering metadata SAU (chỉ filter trên ~50 records) → nhanh
3. Grouping (Gom màu theo style)
⚡ Performance: ~46-50ms (min time) - TỐI ƯU
- KHÔNG có WHERE clause trong inner query → Vector index được dùng
- Post-filtering strategy → chỉ check ~50 candidates → nhanh
WHY POST-FILTERING?
- WHERE filter trước → StarRocks BỎ QUA vector index → brute-force 200-300ms
- Vector search ALL → filter sau → chỉ check ~50 vectors → 46-50ms
"""
logger.info("🔧 [DEBUG] build_starrocks_query STARTED")
# --- Process vector in query field ---
query_text = getattr(params, "query", None)
logger.info(f"🔧 [DEBUG] query_text: {query_text[:50] if query_text else 'None'}")
if query_text and query_vector is None:
# ⏱️ Timer: Embedding generation
emb_start = time.time()
logger.info("🔧 [DEBUG] Calling create_embedding_async()")
query_vector = await create_embedding_async(query_text)
emb_time = (time.time() - emb_start) * 1000 # Convert to ms
logger.info(f"🔧 [DEBUG] Embedding created, dimension: {len(query_vector) if query_vector else 0}")
logger.info(f"⏱️ [TIMER] Embedding Generation Time: {emb_time:.2f}ms")
# --- Build filter clauses ---
# --- Build filter clauses for POST-FILTERING ---
logger.info("🔧 [DEBUG] Building WHERE clauses for POST-FILTERING")
where_clauses = _get_where_clauses(params)
where_sql = " AND ".join(where_clauses) if where_clauses else "1=1"
# Post-filter SQL (applied AFTER vector search)
post_filter_sql = " AND ".join(where_clauses) if where_clauses else "1=1"
# --- Build SQL ---
if query_vector and len(query_vector) > 0:
v_str = "[" + ",".join(str(v) for v in query_vector) + "]"
# OPTIMIZED: Only SELECT necessary fields in CTE, not SELECT *
sql = f"""
WITH top_sku_candidates AS (
SELECT
WITH top_candidates AS (
SELECT /*+ SET_VAR(ann_params='{{"ef_search":64}}') */
internal_ref_code,
product_name,
sale_price,
original_price,
master_color,
product_image_url,
product_image_url_thumbnail,
product_web_url,
description_text,
material,
material_group,
gender_by_product,
age_by_product,
season,
style,
fitting,
form_neckline,
form_sleeve,
product_line_vn,
product_color_name,
cosine_similarity(vector, {v_str}) as similarity_score
FROM shared_source.magento_product_dimension_with_text_embedding
WHERE {where_sql} AND vector IS NOT NULL
product_color_code,
approx_cosine_similarity(vector, {v_str}) as similarity_score
FROM shared_source.magento_product_dimension_with_text_embedding__tmp
ORDER BY similarity_score DESC
LIMIT 50
LIMIT 100
)
SELECT
internal_ref_code,
ANY_VALUE(product_name) as product_name,
ANY_VALUE(sale_price) as sale_price,
ANY_VALUE(original_price) as original_price,
GROUP_CONCAT(DISTINCT master_color ORDER BY master_color SEPARATOR ', ') as available_colors,
ANY_VALUE(product_image_url) as product_image_url,
ANY_VALUE(product_image_url_thumbnail) as product_image_url_thumbnail,
ANY_VALUE(product_web_url) as product_web_url,
ANY_VALUE(description_text) as description_text,
ANY_VALUE(material) as material,
ANY_VALUE(material_group) as material_group,
ANY_VALUE(gender_by_product) as gender_by_product,
ANY_VALUE(age_by_product) as age_by_product,
ANY_VALUE(season) as season,
ANY_VALUE(style) as style,
ANY_VALUE(fitting) as fitting,
ANY_VALUE(form_neckline) as form_neckline,
ANY_VALUE(form_sleeve) as form_sleeve,
ANY_VALUE(product_line_vn) as product_line_vn,
MAX(similarity_score) as max_score
FROM top_sku_candidates
GROUP BY internal_ref_code
t1.internal_ref_code,
ANY_VALUE(t2.product_name) as product_name,
ANY_VALUE(t2.sale_price) as sale_price,
ANY_VALUE(t2.original_price) as original_price,
GROUP_CONCAT(DISTINCT t2.master_color ORDER BY t2.master_color SEPARATOR ', ') as available_colors,
ANY_VALUE(t2.product_image_url) as product_image_url,
ANY_VALUE(t2.product_image_url_thumbnail) as product_image_url_thumbnail,
ANY_VALUE(t2.product_web_url) as product_web_url,
ANY_VALUE(t2.description_text) as description_text,
ANY_VALUE(t2.material) as material,
ANY_VALUE(t2.material_group) as material_group,
ANY_VALUE(t2.gender_by_product) as gender_by_product,
ANY_VALUE(t2.age_by_product) as age_by_product,
ANY_VALUE(t2.season) as season,
ANY_VALUE(t2.style) as style,
ANY_VALUE(t2.fitting) as fitting,
ANY_VALUE(t2.form_neckline) as form_neckline,
ANY_VALUE(t2.form_sleeve) as form_sleeve,
ANY_VALUE(t2.product_line_vn) as product_line_vn,
MAX(t1.similarity_score) as max_score
FROM top_candidates t1
JOIN shared_source.magento_product_dimension_with_text_embedding__tmp t2
ON t1.internal_ref_code = t2.internal_ref_code
AND t1.product_color_code = t2.product_color_code
WHERE {post_filter_sql.replace("sale_price", "t2.sale_price")
.replace("gender_by_product", "t2.gender_by_product")
.replace("age_by_product", "t2.age_by_product")
.replace("material_group", "t2.material_group")
.replace("season", "t2.season")
.replace("style", "t2.style")
.replace("fitting", "t2.fitting")
.replace("form_neckline", "t2.form_neckline")
.replace("form_sleeve", "t2.form_sleeve")
.replace("product_line_vn", "t2.product_line_vn")
.replace("magento_ref_code", "t2.magento_ref_code")
.replace("internal_ref_code", "t2.internal_ref_code")
.replace("master_color", "t2.master_color")
.replace("product_color_name", "t2.product_color_name")}
GROUP BY t1.internal_ref_code
ORDER BY max_score DESC
LIMIT 10
""" # noqa: S608
else:
# FALLBACK: Keyword search - MAXIMALLY OPTIMIZED (No CTE overhead)
# FALLBACK: Keyword search (Also using __tmp for consistency)
keywords = getattr(params, "keywords", None)
keyword_filter = ""
if keywords:
k = _escape(keywords).lower()
keyword_filter = f" AND LOWER(product_name) LIKE '%{k}%'"
# Direct query - No CTE needed, StarRocks optimizes GROUP BY internally
where_clauses = _get_where_clauses(params)
where_sql = " AND ".join(where_clauses) if where_clauses else "1=1"
sql = f"""
SELECT
internal_ref_code,
......@@ -190,7 +597,7 @@ async def build_starrocks_query(params, query_vector: list[float] | None = None)
ANY_VALUE(form_neckline) as form_neckline,
ANY_VALUE(form_sleeve) as form_sleeve,
ANY_VALUE(product_line_vn) as product_line_vn
FROM shared_source.magento_product_dimension_with_text_embedding
FROM shared_source.magento_product_dimension_with_text_embedding__tmp
WHERE {where_sql} {keyword_filter}
GROUP BY internal_ref_code
HAVING COUNT(*) > 0
......@@ -199,4 +606,14 @@ async def build_starrocks_query(params, query_vector: list[float] | None = None)
""" # noqa: S608
logger.info(f"📊 Query Mode: {'Vector' if query_vector else 'Keyword'}")
# Write SQL to file for debugging
try:
debug_file_path = r"d:\cnf\chatbot_canifa\backend\query.txt"
with open(debug_file_path, "w", encoding="utf-8") as f:
f.write(sql)
logger.info(f"💾 SQL Query saved to: {debug_file_path}")
except Exception as e:
logger.error(f"Failed to write SQL to query.txt: {e}")
return sql
import logging
from common.embedding_service import create_embedding_async
logger = logging.getLogger(__name__)
def _escape(val: str) -> str:
"""Thoát dấu nháy đơn để tránh SQL Injection cơ bản."""
return val.replace("'", "''")
def _get_where_clauses(params) -> list[str]:
"""
Xây dựng WHERE clauses theo thứ tự ưu tiên dựa trên selectivity thực tế
FILTER PRIORITY (Based on Canifa catalog analysis):
🔥 TIER 1 (99% selectivity):
1. SKU Code → 1-5 records
🎯 TIER 2 (50-70% selectivity):
2. Gender → Splits catalog in half
3. Age → Kids vs Adults split
4. Product Category → 10-15 categories
💎 TIER 3 (30-50% selectivity):
5. Material Group → Knit vs Woven (2 groups)
6. Price Range → Numeric filtering
🎨 TIER 4 (10-30% selectivity):
7. Season → 4 seasons
8. Style/Fitting → Multiple options
⚠️ TIER 5 (<10% selectivity):
9. Form details → Granular attributes
10. Color → LOWEST selectivity (many SKUs share colors)
Early return: If SKU exists, skip low-selectivity filters
"""
clauses = []
# 🔥 TIER 1: SKU/Product Code (Unique identifier)
# Selectivity: ~99% → 1 SKU = 1 style (3-5 colors max)
sku_clause = _get_sku_clause(params)
if sku_clause:
clauses.append(sku_clause)
# Early return optimization: SKU đã xác định product rõ ràng
# CHỈ GIỮ LẠI price filter (nếu có) để verify budget constraint
# BỎ QUA: gender, color, style, fitting... vì SKU đã unique
price_clauses = _get_price_clauses(params)
if price_clauses:
clauses.extend(price_clauses)
return clauses # ⚡ STOP - Không thêm filter khác!
# 🎯 TIER 2: High-level categorization (50-70% reduction)
# Gender + Age + Category có selectivity cao nhất trong non-SKU filters
clauses.extend(_get_high_selectivity_clauses(params))
# 💎 TIER 3: Material & Price (30-50% reduction)
material_clause = _get_material_clause(params)
if material_clause:
clauses.append(material_clause)
clauses.extend(_get_price_clauses(params))
# 🎨 TIER 4: Attributes (10-30% reduction)
clauses.extend(_get_attribute_clauses(params))
# ⚠️ TIER 5: Granular details & Color (LAST - lowest selectivity)
clauses.extend(_get_form_detail_clauses(params))
color_clause = _get_color_clause(params)
if color_clause:
clauses.append(color_clause) # Color ALWAYS LAST!
return clauses
def _get_sku_clause(params) -> str | None:
"""
TIER 1: SKU/Product Code (Highest selectivity - 99%)
1 SKU code = 1 product style (may have 3-5 color variants)
WHY SKU is always priority #1:
- 1 code = 1 unique product design
- Adding other filters (color, style, gender) is redundant
- Only price filter may be kept for budget validation
Example queries:
- "Mã 6OT25W010" → Only SKU needed
- "Mã 6OT25W010 màu xám" → Only SKU (color is for display/selection, not filtering)
- "Mã 6OT25W010 dưới 500k" → SKU + price (validate budget)
"""
m_code = getattr(params, "magento_ref_code", None)
if m_code:
m = _escape(m_code)
return f"(magento_ref_code = '{m}' OR internal_ref_code = '{m}')"
return None
def _get_color_clause(params) -> str | None:
"""
TIER 5: Color (LOWEST selectivity - 5-10%)
Multiple SKUs share the same color (e.g., 50+ gray products)
ALWAYS filter color LAST after other constraints
"""
color = getattr(params, "master_color", None)
if color:
c = _escape(color).lower()
return f"(LOWER(master_color) LIKE '%{c}%' OR LOWER(product_color_name) LIKE '%{c}%')"
return None
def _get_high_selectivity_clauses(params) -> list[str]:
"""
TIER 2: High-level categorization (50-70% reduction per filter)
Order: Gender → Age → Product Category
"""
clauses = []
# Gender: Male/Female/Unisex split (50-70% reduction)
gender = getattr(params, "gender_by_product", None)
if gender:
clauses.append(f"gender_by_product = '{_escape(gender)}'")
# Age: Kids/Adults split (50% reduction of remaining)
age = getattr(params, "age_by_product", None)
if age:
clauses.append(f"age_by_product = '{_escape(age)}'")
# Product Category: Váy/Áo/Quần... (30-50% reduction)
product_line = getattr(params, "product_line_vn", None)
if product_line:
p = _escape(product_line).lower()
clauses.append(f"LOWER(product_line_vn) LIKE '%{p}%'")
return clauses
def _get_material_clause(params) -> str | None:
"""TIER 3: Material Group - Knit vs Woven (50% split)"""
material = getattr(params, "material_group", None)
if material:
m = _escape(material).lower()
return f"LOWER(material_group) LIKE '%{m}%'"
return None
def _get_price_clauses(params) -> list[str]:
"""TIER 3: Price Range - Numeric filtering (30-40% reduction)"""
clauses = []
p_min = getattr(params, "price_min", None)
if p_min is not None:
clauses.append(f"sale_price >= {p_min}")
p_max = getattr(params, "price_max", None)
if p_max is not None:
clauses.append(f"sale_price <= {p_max}")
return clauses
def _get_attribute_clauses(params) -> list[str]:
"""
TIER 4: Attributes (10-30% reduction)
Season, Style, Fitting
"""
clauses = []
# Season: 4 seasons (~25% each)
season = getattr(params, "season", None)
if season:
s = _escape(season).lower()
clauses.append(f"LOWER(season) LIKE '%{s}%'")
# Style: Basic/Feminine/Sporty... (~15-20% reduction)
style = getattr(params, "style", None)
if style:
st = _escape(style).lower()
clauses.append(f"LOWER(style) LIKE '%{st}%'")
# Fitting: Regular/Slim/Loose (~15% reduction)
fitting = getattr(params, "fitting", None)
if fitting:
f = _escape(fitting).lower()
clauses.append(f"LOWER(fitting) LIKE '%{f}%'")
# Size Scale: S, M, L, 29, 30... (Specific filtering)
size = getattr(params, "size_scale", None)
if size:
sz = _escape(size).lower()
clauses.append(f"LOWER(size_scale) LIKE '%{sz}%'")
return clauses
def _get_form_detail_clauses(params) -> list[str]:
"""
TIER 5: Granular form details (<10% reduction each)
Neckline, Sleeve type
"""
clauses = []
form_fields = [
("form_neckline", "form_neckline"),
("form_sleeve", "form_sleeve"),
]
for param_name, col_name in form_fields:
val = getattr(params, param_name, None)
if val:
v = _escape(val).lower()
clauses.append(f"LOWER({col_name}) LIKE '%{v}%'")
return clauses
async def build_starrocks_query(params, query_vector: list[float] | None = None) -> str:
"""
Build SQL Hybrid tối ưu với Filter Priority:
1. Pre-filtering theo độ ưu tiên (SKU → Exact → Price → Partial)
2. Vector Search (HNSW Index) - Semantic understanding
3. Flexible Keyword Search (OR + Scoring) - Fuzzy matching fallback
4. Grouping (Gom màu theo style)
"""
# --- Process vector in query field ---
query_text = getattr(params, "query", None)
if query_text and query_vector is None:
query_vector = await create_embedding_async(query_text)
# --- Build filter clauses (OPTIMIZED ORDER) ---
where_clauses = _get_where_clauses(params)
where_sql = " AND ".join(where_clauses) if where_clauses else "1=1"
# --- Build SQL ---
if query_vector and len(query_vector) > 0:
v_str = "[" + ",".join(str(v) for v in query_vector) + "]"
sql = f"""
WITH top_sku_candidates AS (
SELECT
internal_ref_code,
product_name,
sale_price,
original_price,
master_color,
product_image_url,
product_image_url_thumbnail,
product_web_url,
description_text,
material,
material_group,
gender_by_product,
age_by_product,
season,
style,
fitting,
form_neckline,
form_sleeve,
product_line_vn,
product_color_name,
cosine_similarity(vector, {v_str}) as similarity_score
FROM shared_source.magento_product_dimension_with_text_embedding
WHERE {where_sql} AND vector IS NOT NULL
ORDER BY similarity_score DESC
LIMIT 50
)
SELECT
internal_ref_code,
ANY_VALUE(product_name) as product_name,
ANY_VALUE(sale_price) as sale_price,
ANY_VALUE(original_price) as original_price,
GROUP_CONCAT(DISTINCT master_color ORDER BY master_color SEPARATOR ', ') as available_colors,
ANY_VALUE(product_image_url) as product_image_url,
ANY_VALUE(product_image_url_thumbnail) as product_image_url_thumbnail,
ANY_VALUE(product_web_url) as product_web_url,
ANY_VALUE(description_text) as description_text,
ANY_VALUE(material) as material,
ANY_VALUE(material_group) as material_group,
ANY_VALUE(gender_by_product) as gender_by_product,
ANY_VALUE(age_by_product) as age_by_product,
ANY_VALUE(season) as season,
ANY_VALUE(style) as style,
ANY_VALUE(fitting) as fitting,
ANY_VALUE(form_neckline) as form_neckline,
ANY_VALUE(form_sleeve) as form_sleeve,
ANY_VALUE(product_line_vn) as product_line_vn,
MAX(similarity_score) as max_score
FROM top_sku_candidates
GROUP BY internal_ref_code
ORDER BY max_score DESC
LIMIT 10
""" # noqa: S608
else:
# ⚡ FALLBACK: FLEXIBLE KEYWORD SEARCH (OR + SCORING)
# Giải quyết case: User search "áo khoác nỉ" → DB có "Áo nỉ nam"
keywords = getattr(params, "keywords", None)
keyword_score_sql = ""
keyword_filter = ""
if keywords:
k_clean = _escape(keywords).lower().strip()
if k_clean:
words = k_clean.split()
# Build scoring expression: Each matched word = +1 point
# Example: "áo khoác nỉ" (3 words)
# - "Áo nỉ nam" matches 2/3 → Score = 2
# - "Áo khoác nỉ hoodie" matches 3/3 → Score = 3
score_terms = [
f"(CASE WHEN LOWER(product_name) LIKE '%{w}%' THEN 1 ELSE 0 END)"
for w in words
]
keyword_score_sql = f"({' + '.join(score_terms)}) as keyword_match_score"
# Minimum threshold: At least 50% of words must match
# Example: 3 words → need at least 2 matches (66%)
# 2 words → need at least 1 match (50%)
min_matches = max(1, len(words) // 2)
keyword_filter = f" AND ({' + '.join(score_terms)}) >= {min_matches}"
# Select clause with optional scoring
select_score = f", {keyword_score_sql}" if keyword_score_sql else ""
order_by = "keyword_match_score DESC, sale_price ASC" if keyword_score_sql else "sale_price ASC"
sql = f"""
SELECT
internal_ref_code,
ANY_VALUE(product_name) as product_name,
ANY_VALUE(sale_price) as sale_price,
ANY_VALUE(original_price) as original_price,
GROUP_CONCAT(DISTINCT master_color ORDER BY master_color SEPARATOR ', ') as available_colors,
ANY_VALUE(product_image_url) as product_image_url,
ANY_VALUE(product_image_url_thumbnail) as product_image_url_thumbnail,
ANY_VALUE(product_web_url) as product_web_url,
ANY_VALUE(description_text) as description_text,
ANY_VALUE(material) as material,
ANY_VALUE(material_group) as material_group,
ANY_VALUE(gender_by_product) as gender_by_product,
ANY_VALUE(age_by_product) as age_by_product,
ANY_VALUE(season) as season,
ANY_VALUE(style) as style,
ANY_VALUE(fitting) as fitting,
ANY_VALUE(form_neckline) as form_neckline,
ANY_VALUE(form_sleeve) as form_sleeve,
ANY_VALUE(product_line_vn) as product_line_vn
{select_score}
FROM shared_source.magento_product_dimension_with_text_embedding
WHERE {where_sql} {keyword_filter}
GROUP BY internal_ref_code
HAVING COUNT(*) > 0
ORDER BY {order_by}
LIMIT 10
""" # noqa: S608
# Log filter statistics
filter_info = f"Mode: {'Vector' if query_vector else 'Keyword'}, Filters: {len(where_clauses)}"
if where_clauses:
# Identify high-priority filters used
has_sku = any('internal_ref_code' in c or 'magento_ref_code' in c for c in where_clauses)
has_gender = any('gender_by_product' in c for c in where_clauses)
has_category = any('product_line_vn' in c for c in where_clauses)
priority_info = []
if has_sku:
priority_info.append("SKU")
if has_gender:
priority_info.append("Gender")
if has_category:
priority_info.append("Category")
if priority_info:
filter_info += f", Priority: {'+'.join(priority_info)}"
logger.info(f"📊 {filter_info}")
# Write SQL to file for debugging
try:
with open(r"d:\cnf\chatbot_canifa\backend\embedding.txt", "w", encoding="utf-8") as f:
f.write(sql)
except Exception as e:
logger.error(f"Failed to write SQL to embedding.txt: {e}")
return sql
\ No newline at end of file
......@@ -16,7 +16,7 @@ logger = logging.getLogger(__name__)
router = APIRouter()
@router.post("/chat", summary="Fashion Q&A Chat (Non-streaming)")
@router.post("/api/agent/chat", summary="Fashion Q&A Chat (Non-streaming)")
async def fashion_qa_chat(req: QueryRequest, background_tasks: BackgroundTasks):
"""
Endpoint chat không stream - trả về response JSON đầy đủ một lần.
......
......@@ -23,7 +23,7 @@ class ChatHistoryResponse(BaseModel):
next_cursor: int | None = None
@router.get("/history/{user_id}", summary="Get Chat History by User ID", response_model=ChatHistoryResponse)
@router.get("/api/history/{user_id}", summary="Get Chat History by User ID", response_model=ChatHistoryResponse)
async def get_chat_history(user_id: str, limit: int | None = 50, before_id: int | None = None):
"""
Lấy lịch sử chat của user từ Postgres database.
......
"""
Test API Routes - Tất cả endpoints cho testing (isolated)
KHÔNG ĐỘNG VÀO chatbot_route.py chính!
"""
import asyncio
import logging
import random
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel, Field
from agent.models import QueryRequest
from common.load_test_manager import get_load_test_manager
router = APIRouter(prefix="/test", tags=["Testing & Load Test"])
logger = logging.getLogger(__name__)
# ==================== MOCK CHAT ENDPOINT ====================
@router.post("/chat-mock", summary="Mock Chat API (for Load Testing)")
async def mock_chat(req: QueryRequest):
"""
Endpoint MOCK để test performance KHÔNG tốn tiền OpenAI.
Trả về response giả lập với latency ngẫu nhiên.
⚠️ CHỈ DÙNG CHO LOAD TESTING!
"""
# Giả lập latency của real API (100-500ms)
await asyncio.sleep(random.uniform(0.1, 0.5))
# Mock responses
mock_responses = [
"Dạ em đã tìm được một số mẫu áo sơ mi nam đẹp cho anh/chị ạ. Anh/chị có thể xem các sản phẩm sau đây.",
"Em xin gợi ý một số mẫu áo thun nam phù hợp với yêu cầu của anh/chị.",
"Dạ, em có tìm thấy một số mẫu quần jean nam trong khoảng giá anh/chị yêu cầu ạ.",
"Em xin giới thiệu các mẫu áo khoác nam đang có khuyến mãi tốt ạ.",
"Anh/chị có thể tham khảo các mẫu giày thể thao nam đang được ưa chuộng nhất.",
]
# Mock product IDs
mock_product_ids = [
f"MOCK_PROD_{random.randint(1000, 9999)}"
for _ in range(random.randint(2, 5))
]
return {
"status": "success",
"ai_response": random.choice(mock_responses),
"product_ids": mock_product_ids,
"_mock": True, # Flag để biết đây là mock response
"_latency_ms": random.randint(100, 500)
}
@router.post("/db-search", summary="DB Search Mock (Test StarRocks Performance)")
async def mock_db_search(req: QueryRequest):
"""
Endpoint để test PERFORMANCE của StarRocks DB query.
Hỗ trợ Multi-Search (Parallel).
"""
from agent.tools.data_retrieval_tool import data_retrieval_tool
try:
# Mock Multi-Search call (Parallel)
tool_result = await data_retrieval_tool.ainvoke({
"searches": [
{
"keywords": "áo sơ mi",
"gender_by_product": "male",
"price_max": 500000
},
{
"keywords": "quần jean",
"gender_by_product": "male",
"price_max": 800000
}
]
})
# Parse result
import json
result_data = json.loads(tool_result)
# Collect all product IDs from all search results
all_product_ids = []
if result_data.get("status") == "success":
for res in result_data.get("results", []):
ids = [p.get("internal_ref_code", "") for p in res.get("products", [])]
all_product_ids.extend(ids)
return {
"status": "success",
"ai_response": "Kết quả Multi-Search Parallel từ DB",
"product_ids": list(set(all_product_ids)),
"_db_test": True,
"_queries_count": len(result_data.get("results", [])),
"_total_products": len(all_product_ids)
}
except Exception as e:
logger.error(f"DB multi-search error: {e}")
return {
"status": "error",
"ai_response": f"Lỗi: {str(e)}",
"product_ids": [],
"_error": str(e)
}
# ==================== LOAD TEST CONTROL ====================
class StartTestRequest(BaseModel):
"""Request body để start test"""
target_url: str = Field(default="http://localhost:5000", description="Base URL của target")
num_users: int = Field(default=10, ge=1, le=1000, description="Số lượng concurrent users")
spawn_rate: int = Field(default=2, ge=1, le=100, description="Tốc độ spawn users (users/second)")
duration_seconds: int = Field(default=60, ge=10, le=600, description="Thời gian chạy test (giây)")
test_type: str = Field(default="chat_mock", description="chat_mock | chat_real | history")
@router.post("/loadtest/start", summary="Bắt đầu Load Test")
async def start_load_test(req: StartTestRequest):
"""
Bắt đầu load test với config được chỉ định.
**test_type options:**
- `chat_mock`: Test mock chat API (KHÔNG tốn tiền) ⭐ Khuyên dùng
- `chat_real`: Test real chat API (TỐN TIỀN OpenAI!)
- `history`: Test history API (không tốn tiền LLM)
"""
try:
manager = get_load_test_manager()
config_dict = req.model_dump()
result = manager.start_test(config_dict)
if "error" in result:
raise HTTPException(status_code=400, detail=result["error"])
return {
"status": "success",
"message": "Load test started",
"data": result
}
except Exception as e:
logger.error(f"Error starting load test: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.post("/loadtest/stop", summary="Dừng Load Test")
async def stop_load_test():
"""Dừng load test đang chạy"""
try:
manager = get_load_test_manager()
result = manager.stop_test()
if "error" in result:
raise HTTPException(status_code=400, detail=result["error"])
return {
"status": "success",
"message": "Load test stopped",
"data": result
}
except Exception as e:
logger.error(f"Error stopping load test: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.get("/loadtest/metrics", summary="Lấy Metrics Realtime")
async def get_load_test_metrics():
"""
Lấy metrics realtime của load test.
Frontend poll endpoint này mỗi 2 giây.
"""
try:
manager = get_load_test_manager()
metrics = manager.get_metrics()
return {
"status": "success",
"data": metrics
}
except Exception as e:
logger.error(f"Error getting metrics: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.get("/loadtest/status", summary="Check Test Status")
async def get_load_test_status():
"""Check xem load test có đang chạy không"""
try:
manager = get_load_test_manager()
return {
"status": "success",
"data": {
"is_running": manager.is_running(),
"current_status": manager.status
}
}
except Exception as e:
logger.error(f"Error getting status: {e}")
raise HTTPException(status_code=500, detail=str(e))
"""
Load Test Manager - Chạy Locust programmatically
Singleton service để quản lý load testing cho APIs
"""
import logging
import threading
import time
from dataclasses import dataclass, asdict
from enum import Enum
from typing import Any
from locust import HttpUser, between, task
from locust.env import Environment
logger = logging.getLogger(__name__)
class TestStatus(str, Enum):
"""Trạng thái của load test"""
IDLE = "idle"
RUNNING = "running"
STOPPING = "stopping"
STOPPED = "stopped"
class TestType(str, Enum):
"""Loại test"""
CHAT_MOCK = "chat_mock" # Mock API không tốn tiền ⭐ Khuyên dùng
CHAT_REAL = "chat_real" # Real API - TỐN TIỀN!
HISTORY = "history" # Test History API (Postgres)
DB_SEARCH = "db_search" # Test StarRocks DB (NO LLM cost) 🔥
@dataclass
class LoadTestConfig:
"""Config cho load test"""
target_url: str
num_users: int = 10
spawn_rate: int = 2
duration_seconds: int = 60
test_type: str = TestType.CHAT_MOCK
@dataclass
class LoadTestMetrics:
"""Metrics realtime với percentiles"""
status: str
total_requests: int = 0
current_rps: float = 0.0
avg_response_time_ms: float = 0.0
min_response_time_ms: float = 0.0
max_response_time_ms: float = 0.0
# Percentiles (quan trọng cho phân tích performance)
p50_response_time_ms: float = 0.0 # Median - 50% requests nhanh hơn
p90_response_time_ms: float = 0.0 # 90% requests nhanh hơn
p95_response_time_ms: float = 0.0 # 95% requests nhanh hơn
p99_response_time_ms: float = 0.0 # 99% requests nhanh hơn (worst case)
failure_rate: float = 0.0
active_users: int = 0
elapsed_seconds: int = 0
# ==================== LOCUST USER CLASSES ====================
class ChatMockUser(HttpUser):
"""Test Mock Chat API (KHÔNG tốn tiền OpenAI)"""
wait_time = between(0.5, 2)
# Fix Windows FD limit: Disable connection pooling
connection_timeout = 1.0
network_timeout = 10.0
def on_start(self):
"""Giảm pool size xuống 1 connection per user"""
from requests.adapters import HTTPAdapter
adapter = HTTPAdapter(pool_connections=1, pool_maxsize=1)
self.client.mount("http://", adapter)
self.client.mount("https://", adapter)
@task
def send_chat_message(self):
# Close connection sau mỗi request
response = self.client.post(
"/api/test/chat-mock",
json={
"user_query": "Cho em xem áo sơ mi nam",
"user_id": f"loadtest_{self.environment.runner.user_count}"
},
name="POST /test/chat-mock"
)
response.close() # Force close ngay
class ChatRealUser(HttpUser):
"""Test Real Chat API (TỐN TIỀN - cẩn thận!)"""
wait_time = between(1, 3)
# Fix Windows FD limit
connection_timeout = 1.0
network_timeout = 30.0
def on_start(self):
from requests.adapters import HTTPAdapter
adapter = HTTPAdapter(pool_connections=1, pool_maxsize=1)
self.client.mount("http://", adapter)
self.client.mount("https://", adapter)
@task
def send_chat_message(self):
response = self.client.post(
"/api/agent/chat",
json={
"user_query": "Cho em xem áo sơ mi nam",
"user_id": f"loadtest_{self.environment.runner.user_count}"
},
name="POST /agent/chat"
)
response.close()
class HistoryUser(HttpUser):
"""Test History API"""
wait_time = between(0.2, 1)
# Fix Windows FD limit
connection_timeout = 1.0
network_timeout = 10.0
def on_start(self):
from requests.adapters import HTTPAdapter
adapter = HTTPAdapter(pool_connections=1, pool_maxsize=1)
self.client.mount("http://", adapter)
self.client.mount("https://", adapter)
@task
def get_history(self):
user_id = f"test_user_001"
response = self.client.get(
f"/history/{user_id}?limit=20",
name="GET /history"
)
response.close()
class DBSearchUser(HttpUser):
"""Test StarRocks DB Query Performance (NO LLM cost)"""
wait_time = between(0.3, 1.5)
# Fix Windows FD limit
connection_timeout = 1.0
network_timeout = 15.0
def on_start(self):
from requests.adapters import HTTPAdapter
adapter = HTTPAdapter(pool_connections=1, pool_maxsize=1)
self.client.mount("http://", adapter)
self.client.mount("https://", adapter)
@task
def search_products(self):
response = self.client.post(
"/api/test/db-search",
json={
"user_query": "áo sơ mi nam",
"user_id": f"loadtest_{self.environment.runner.user_count}"
},
name="POST /test/db-search"
)
response.close()
# ==================== LOAD TEST MANAGER ====================
class LoadTestManager:
"""Singleton manager cho load testing"""
def __init__(self):
self.status = TestStatus.IDLE
self.environment: Environment | None = None
self.runner_thread: threading.Thread | None = None
self.start_time: float | None = None
self.config: LoadTestConfig | None = None
self._lock = threading.Lock()
def start_test(self, config_dict: dict) -> dict:
"""Bắt đầu load test"""
with self._lock:
if self.status == TestStatus.RUNNING:
return {"error": "Test is already running"}
try:
self.config = LoadTestConfig(**config_dict)
self.status = TestStatus.RUNNING
self.start_time = time.time()
# Chọn User class dựa trên test_type
user_classes = {
TestType.CHAT_MOCK: ChatMockUser,
TestType.CHAT_REAL: ChatRealUser,
TestType.HISTORY: HistoryUser,
TestType.DB_SEARCH: DBSearchUser,
}
user_class = user_classes.get(self.config.test_type, ChatMockUser)
# Tạo Locust Environment
self.environment = Environment(user_classes=[user_class])
self.environment.host = self.config.target_url
# Bắt đầu runner trong background thread
self.runner_thread = threading.Thread(
target=self._run_test,
daemon=True
)
self.runner_thread.start()
logger.info(f"✅ Load test started: {self.config.test_type} | {self.config.num_users} users")
return {"status": "started", "config": asdict(self.config)}
except Exception as e:
self.status = TestStatus.IDLE
logger.error(f"Failed to start test: {e}")
return {"error": str(e)}
def _run_test(self):
"""Chạy test trong background thread"""
try:
runner = self.environment.create_local_runner()
# Spawn users
runner.start(
user_count=self.config.num_users,
spawn_rate=self.config.spawn_rate
)
# Chạy trong duration
time.sleep(self.config.duration_seconds)
# Stop gracefully
runner.quit()
with self._lock:
self.status = TestStatus.STOPPED
logger.info("✅ Load test completed")
except Exception as e:
logger.error(f"Error during test: {e}")
with self._lock:
self.status = TestStatus.STOPPED
def stop_test(self) -> dict:
"""Dừng test đang chạy"""
with self._lock:
if self.status != TestStatus.RUNNING:
return {"error": "No test is running"}
self.status = TestStatus.STOPPING
if self.environment and self.environment.runner:
self.environment.runner.quit()
self.status = TestStatus.STOPPED
logger.info("🛑 Load test stopped by user")
return {"status": "stopped"}
def get_metrics(self) -> dict:
"""Lấy metrics hiện tại với percentiles"""
with self._lock:
if not self.environment or not self.environment.runner:
return asdict(LoadTestMetrics(status=self.status))
stats = self.environment.runner.stats
total_stats = stats.total
# Tính elapsed time
elapsed = int(time.time() - self.start_time) if self.start_time else 0
# Lấy percentiles từ Locust (trả về dict với key là percentile)
try:
# get_response_time_percentile trả về dict: {0.5: 123, 0.9: 456, ...}
percentiles_dict = total_stats.get_response_time_percentile(0.5, 0.9, 0.95, 0.99) or {}
p50 = percentiles_dict.get(0.5, 0)
p90 = percentiles_dict.get(0.9, 0)
p95 = percentiles_dict.get(0.95, 0)
p99 = percentiles_dict.get(0.99, 0)
except Exception as e:
logger.warning(f"Failed to get percentiles: {e}")
p50 = p90 = p95 = p99 = 0
metrics = LoadTestMetrics(
status=self.status,
total_requests=total_stats.num_requests,
current_rps=round(total_stats.current_rps, 2),
avg_response_time_ms=round(total_stats.avg_response_time, 2),
min_response_time_ms=round(total_stats.min_response_time or 0, 2),
max_response_time_ms=round(total_stats.max_response_time or 0, 2),
# Percentiles
p50_response_time_ms=round(p50, 2) if p50 else 0,
p90_response_time_ms=round(p90, 2) if p90 else 0,
p95_response_time_ms=round(p95, 2) if p95 else 0,
p99_response_time_ms=round(p99, 2) if p99 else 0,
failure_rate=round(total_stats.fail_ratio, 4),
active_users=self.environment.runner.user_count,
elapsed_seconds=elapsed
)
return asdict(metrics)
def is_running(self) -> bool:
"""Check xem test có đang chạy không"""
return self.status == TestStatus.RUNNING
# ==================== SINGLETON ====================
_instance: LoadTestManager | None = None
def get_load_test_manager() -> LoadTestManager:
"""Get singleton instance"""
global _instance
if _instance is None:
_instance = LoadTestManager()
return _instance
......@@ -130,26 +130,46 @@ class StarRocksConnection:
charset="utf8mb4",
cursorclass=aiomysql.DictCursor,
minsize=10, # Sẵn sàng 10 kết nối ngay lập tức (Cực nhanh cho Prod)
maxsize=50, # Tối đa 50 kết nối (Đủ cân hàng nghìn users, an toàn trên Windows)
maxsize=50, # Tăng nhẹ lên 50 (Cân bằng giữa throughput và memory)
connect_timeout=10,
)
return StarRocksConnection._shared_pool
async def execute_query_async(self, query: str, params: tuple | None = None) -> list[dict[str, Any]]:
"""
Execute query asynchronously using aiomysql pool
Execute query asynchronously using aiomysql pool with Retry Logic.
"""
max_retries = 3
last_error = None
for attempt in range(max_retries):
try:
pool = await self.get_pool()
logger.info("🚀 Executing Async Query.")
# logger.info(f"🚀 Executing Async Query (Attempt {attempt+1}).")
async with pool.acquire() as conn, conn.cursor() as cursor:
await cursor.execute(query, params)
results = await cursor.fetchall()
logger.info(f"📊 Async Query successful, returned {len(results)} rows")
# aiomysql returns tuples or dicts depending on cursor.
# Since we asked for DictCursor, results are dicts.
# logger.info(f"📊 Async Query successful, returned {len(results)} rows")
return [dict(row) for row in results]
except Exception as e:
last_error = e
logger.warning(f"⚠️ StarRocks DB Error (Attempt {attempt+1}/{max_retries}): {e}")
if "Memory of process exceed limit" in str(e):
# Nếu StarRocks OOM, đợi một chút rồi thử lại
await asyncio.sleep(0.5 * (attempt + 1))
continue
elif "Disconnected" in str(e) or "Lost connection" in str(e):
# Nếu mất kết nối, có thể pool bị stale, thử lại ngay
continue
else:
# Các lỗi khác (cú pháp,...) thì raise luôn
raise
logger.error(f"❌ Failed after {max_retries} attempts: {last_error}")
raise last_error
def close(self):
"""Explicitly close if needed (e.g. app shutdown)"""
if StarRocksConnection._shared_conn and StarRocksConnection._shared_conn.open:
......
......@@ -83,11 +83,15 @@ LANGFUSE_SECRET_KEY: str | None = os.getenv("LANGFUSE_SECRET_KEY")
LANGFUSE_PUBLIC_KEY: str | None = os.getenv("LANGFUSE_PUBLIC_KEY")
LANGFUSE_BASE_URL: str | None = os.getenv("LANGFUSE_BASE_URL", "https://cloud.langfuse.com")
# ====================== LANGSMITH CONFIGURATION ======================
LANGSMITH_TRACING = os.getenv("LANGSMITH_TRACING", "false")
LANGSMITH_ENDPOINT = os.getenv("LANGSMITH_ENDPOINT", "https://api.smith.langchain.com")
LANGSMITH_API_KEY = os.getenv("LANGSMITH_API_KEY")
LANGSMITH_PROJECT = os.getenv("LANGSMITH_PROJECT")
# ====================== LANGSMITH CONFIGURATION (TẮT VÌ RATE LIMIT) ======================
# LANGSMITH_TRACING = os.getenv("LANGSMITH_TRACING", "false")
# LANGSMITH_ENDPOINT = os.getenv("LANGSMITH_ENDPOINT", "https://api.smith.langchain.com")
# LANGSMITH_API_KEY = os.getenv("LANGSMITH_API_KEY")
# LANGSMITH_PROJECT = os.getenv("LANGSMITH_PROJECT")
LANGSMITH_TRACING = "false"
LANGSMITH_ENDPOINT = None
LANGSMITH_API_KEY = None
LANGSMITH_PROJECT = None
# ====================== CLERK AUTHENTICATION ======================
CLERK_SECRET_KEY: str | None = os.getenv("CLERK_SECRET_KEY")
......
"""
Script tự động thêm context (tên bảng + subsection) vào tất cả size entries trong tonghop.txt
Ví dụ: "Size 92 (2Y):" -> "Size 92 (2Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM (Dải size lẻ):"
"""
import re
def add_context_to_sizes(input_file, output_file):
with open(input_file, encoding="utf-8") as f:
lines = f.readlines()
result = []
current_table = None # Tên bảng hiện tại
current_subsection = None # Subsection hiện tại (Dải size lẻ, chẵn...)
for line in lines:
stripped = line.strip()
# Phát hiện header bảng (bắt đầu bằng BẢNG hoặc QUẦN)
if stripped.startswith("BẢNG SIZE") or stripped.startswith("QUẦN"):
current_table = stripped
current_subsection = None # Reset subsection khi sang bảng mới
result.append(line)
continue
# Phát hiện subsection (Dải size lẻ, Dải size chẵn)
if "Dải size" in stripped or stripped.startswith("Dải"):
current_subsection = stripped.rstrip(":")
result.append(line)
continue
# Phát hiện dòng Size (bắt mọi pattern: Size XS:, Size 92 (2Y):, Size 26 (XS):)
size_match = re.match(r"^(Size\s+[A-Z0-9]+(?:\s*\([^)]+\))?):(.*)$", stripped)
if size_match and current_table:
size_part = size_match.group(1) # "Size 92 (2Y)" hoặc "Size XS"
rest = size_match.group(2) # Phần còn lại sau dấu :
# Xây dựng context
context_parts = [current_table]
if current_subsection:
context_parts.append(f"({current_subsection})")
context = " - ".join(context_parts)
# Tạo dòng mới với context
new_line = f"{size_part} - {context}:{rest}\n"
result.append(new_line)
continue
# Giữ nguyên các dòng khác
result.append(line)
# Ghi file output
with open(output_file, "w", encoding="utf-8") as f:
f.writelines(result)
print("✅ Đã thêm context vào tất cả size entries!")
print(f"📝 File output: {output_file}")
if __name__ == "__main__":
input_path = r"d:\cnf\chatbot_canifa\backend\datadb\tonghop.txt"
output_path = r"d:\cnf\chatbot_canifa\backend\datadb\tonghop_with_context.txt"
add_context_to_sizes(input_path, output_path)
print("\n🔍 Preview 10 dòng đầu của file mới:")
with open(output_path, encoding="utf-8") as f:
for i, line in enumerate(f):
if i >= 1160 and i < 1170: # Vùng có size entries
print(line.rstrip())
import os
import json
import pymysql
from openai import OpenAI
import time
# ==========================================
# 🔐 HARD KEY CONFIGURATION (As requested)
# ==========================================
OPENAI_API_KEY = "sk-proj-srJ3l3B5q1CzRezXAnaewbbRfuWzIjYHbcAdggzsa4MmtXEHaIwS1OTkMgLpMDikgh"
SR_HOST = "172.16.2.100"
SR_PORT = 9030
SR_USER = "anhvh"
SR_PASS = "v0WYGeyLRCckXotT"
SR_DB = "shared_source"
# Parameter
CHUNK_SIZE = 500
CHUNK_OVERLAP = 50
EMBEDDING_MODEL = "text-embedding-3-small" # 1536 dimensions
client = OpenAI(api_key=OPENAI_API_KEY)
def get_embedding(text):
"""Lấy vector 1536 chiều từ OpenAI"""
try:
text = text.replace("\n", " ")
return client.embeddings.create(input=[text], model=EMBEDDING_MODEL).data[0].embedding
except Exception as e:
print(f"❌ Lỗi Embedding: {e}")
return None
def connect_starrocks():
return pymysql.connect(
host=SR_HOST,
port=SR_PORT,
user=SR_USER,
password=SR_PASS,
database=SR_DB,
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor
)
def chunk_text(text, size=CHUNK_SIZE, overlap=CHUNK_OVERLAP):
"""Chia nhỏ văn bản với overlap"""
chunks = []
start = 0
while start < len(text):
end = start + size
chunks.append(text[start:end])
start += size - overlap
return chunks
def ingest():
input_file = r"d:\cnf\chatbot_canifa\backend\datadb\tonghop.txt"
if not os.path.exists(input_file):
print(f"❌ Không tìm thấy file: {input_file}")
return
print(f"📖 Đang đọc file {input_file}...")
with open(input_file, "r", encoding="utf-8") as f:
full_content = f.read()
# Tách dữ liệu theo từng FILE giả định trong tonghop.txt
sections = full_content.split("================================================================================")
db = connect_starrocks()
cursor = db.cursor()
total_chunks = 0
record_id = int(time.time()) # Làm ID cơ bản
for section in sections:
if not section.strip(): continue
# Lấy tiêu đề file nếu có
lines = section.strip().split("\n")
title = "Canifa Knowledge"
if "FILE:" in lines[0]:
title = lines[0].replace("FILE:", "").strip()
content = "\n".join(lines[1:])
else:
content = section
print(f"🚀 Đang xử lý section: {title}")
chunks = chunk_text(content)
for i, chunk in enumerate(chunks):
if len(chunk.strip()) < 20: continue # Bỏ qua đoạn quá ngắn
vector = get_embedding(chunk)
if not vector: continue
metadata = {
"title": title,
"chunk_idx": i,
"source": "tonghop.txt",
"timestamp": time.time()
}
sql = "INSERT INTO shared_source.canifa_knowledge (id, content, metadata, embedding) VALUES (%s, %s, %s, %s)"
try:
cursor.execute(sql, (record_id, chunk, json.dumps(metadata, ensure_ascii=False), str(vector)))
record_id += 1
total_chunks += 1
if total_chunks % 10 == 0:
db.commit()
print(f"✅ Đã nạp {total_chunks} chunks...")
except Exception as e:
print(f"❌ Lỗi SQL: {e}")
db.commit()
db.close()
print(f"🎊 HOÀN THÀNH! Tổng cộng đã nạp {total_chunks} vào StarRocks.")
if __name__ == "__main__":
ingest()
================================================================================
FILE: data/text/blog.txt
================================================================================
Skip to content
NỮ
NAM
BÉ GÁI
BÉ TRAI
SẢN PHẨM MỚI
Search for:
Trang chủ | Blog
CANIFA BLOG
Cung cấp những kiến thức, kinh nghiệm hữu ích về thời trang nam, nữ, bé trai và bé gái
Mặc đẹp
CNFLIFE
Kinh nghiệm
Search
BÀI VIẾT NỔI BẬT
Phối đồ
Áo len trễ vai mặc với gì? Bí quyết phối đồ cực hút mắt cho nàng
Áo len trễ vai mặc với gì là câu hỏi khiến nhiều cô nàng phân vân khi muốn thay đổi phong cách mới trong mùa lạnh. Điều tuyệt vời là item này cực kỳ dễ kết hợp với các kiểu trang phục khác nhau. Sau đây, bạn hãy cùng Canifa
03.11.2025
Phối đồ
Cách phối áo hoodie với áo khoác chuẩn phong cách cho nam và nữ
Phối áo hoodie với áo khoác là cách tuyệt vời để tạo nên một outfit vừa thoải mái, thời trang, vừa phù hợp với nhiều hoàn cảnh. Tuy nhiên, để thực sự nổi bật, bạn cần nắm được các nguyên tắc phối đồ cơ bản. Canifa sẽ giúp bạn khám
05.11.2025
Phối đồ
10+ cách phối áo khoác croptop đẹp chuẩn fashionista cho nàng
Cách phối áo khoác croptop đang trở thành xu hướng được yêu thích nhờ khả năng tạo tỷ lệ cơ thể hoàn hảo và phong cách thời trang năng động. Cùng Canifa khám phá những công thức phối đồ đỉnh cao giúp bạn tự tin tỏa sáng trong mọi hoàn
13.11.2025
Phối đồ
Gợi ý cách phối đồ chụp kỷ yếu cho nam đẹp và lịch lãm nhất
Mùa kỷ yếu đã đến rồi, các bạn nam sinh đã biết cách phối đồ chụp kỷ yếu cho nam sao cho đẹp hay chưa? Từ phong cách lịch lãm với vest, năng động với áo polo đến hoài cổ với dây quần tây, mỗi bộ trang phục đều mang
19.11.2025
BÀI VIẾT XEM NHIỀU NHẤT
Phối đồ
Đi Đà Lạt mặc gì? 20 Set đồ đi Đà Lạt cho nữ xinh, sống ảo
Bạn chưa biết đi Đà Lạt mặc gì cho đẹp mà lại có những bức ảnh sống ảo lung linh? Đọc ngay bài viết sau của Canifa sẽ đưa ra 20 gợi ý set đồ đi Đà Lạt cho nữ cực xinh giúp bạn đẹp trong mọi khung hình!
28.02.2025
Phối đồ
Đi đám cưới mặc gì? 15 cách phối đồ cho nữ đơn giản, sang
Bạn đang chưa biết "Đi đám cưới mặc gì"? Trong bài viết này Canifa cung cấp tới bạn 15 cách phối đồ cho nữ đơn giản, sang và cá tính để bạn có trang phục đi đám cưới cho nữ phù hợp nhất với mình nhé!
25.03.2025
Phối đồ
Đi Tà Xùa Mặc Gì? 20 Outfit Đi Tà Xùa Săn Mây Siêu Xinh
Có phải bạn đang thắc mắc đi Tà Xùa mặc gì để vừa có những bức ảnh đẹp mà vẫn giữ ấm, hợp thời trang? Cùng Canifa khám phá 20 outfit giúp bạn săn mây siêu xinh trong bài viết này nhé!
27.02.2025
Tư vấn chọn mua
[Giải đáp] Nên mua áo phao lông vũ hay trần bông?
Áo phao lông vũ và trần bông là hai loại áo khoác được mua nhiều trong mùa đông. Vậy nên mua áo phao lông vũ hay trần bông? Đọc ngay bài viết sau của Canifa để chọn được loại áo phù hợp nhất với bạn nhé!
26.12.2024
Mẹo hay
5 Cách Xử Lý Áo Lông Vũ Bị Vón Cục Hiệu Quả Ngay Tại Nhà
Cách xử lý áo lông vũ bị vón cục không còn là vấn đề khó khăn nếu bạn nắm vững được những mẹo đơn giản sau đây. Hãy cùng CANIFA khám phá những phương pháp hiệu quả giúp bạn khôi phục lại chiếc áo yêu thích nhé!
04.01.2025
Mẹo hay
Cách giặt áo len đúng cách không bị giãn, đẹp như mới
Biết cách giặt áo len đúng cách tại nhà sẽ giúp trang phục của bạn không bị giãn hay xù lông. Điều này cũng đảm bảo áo luôn bền đẹp và mang đến sự tự tin cho bạn khi mặc. Đọc ngay mẹo giặt áo len từ Canifa ngay thôi
25.12.2024
Phối đồ
Cách phối áo khoác ngoài áo dài mùa đông đẹp và tôn dáng nhất
Biết cách phối áo khoác với áo dài truyền thống giúp bạn tỏa sáng tôn lên nét đẹp thanh lịch, duyên dáng mà lại ấm áp trong mùa đông. Trong bài viết này Canifa sẽ bật mí tới bạn những gợi ý mặc áo dài với áo khoác đẹp cùng
15.01.2025
Canifa mách bạn
Phối Đồ Với Khăn Quàng Cổ Nam: Ấm Áp, Lịch Lãm Và Phong Cách
Phối đồ với khăn quàng cổ nam là một cách tuyệt vời để tạo điểm nhấn cho bộ trang phục và làm mới phong cách. Khăn quàng cổ không chỉ giữ ấm mà còn giúp chàng trai thể hiện cá tính mạnh mẽ, lịch lãm. Với các thiết kế đa
21.11.2024
Phối đồ
11 cách phối đồ với áo len cardigan ngắn cho nàng xinh ngoan yêu
Vào những ngày gió lạnh đầu mùa, phối đồ với áo len cardigan ngắn là lựa chọn được nhiều cô gái tin tưởng bởi sự đơn giản và tính ứng dụng cao. Chỉ cần nắm được vài tips cơ bản là bạn đã có thể tự tin xuống phố với
22.10.2025
BÀI VIẾT MỚI NHẤT​
Xem thêm
Tư vấn chọn mua
Top 15+ shop chuyên áo khoác len nữ cardigan đẹp cao cấp nhất
Khi tiết trời chuyển lạnh, cardigan là lựa chọn trang phục giữ ấm đảm bảo đủ tính thời trang và thanh lịch được nhiều cô nàng ưa chuộng. Nếu bạn đang tìm kiếm các shop chuyên áo khoác len nữ cardigan mẫu mã đẹp, chất lượng tốt mà giá phải
05.01.2026
Phối đồ
Học ngay cách mix đồ với áo cardigan dài đơn giản cho ngày lười
Có những ngày bạn chỉ muốn ra khỏi nhà thật nhanh mà vẫn cần một outfit gọn gàng và có gu. Vậy thì đừng bỏ qua hướng dẫn cách mix đồ với áo cardigan dài sau đây. Với khả năng biến hóa linh hoạt phù hợp với nhiều hoàn cảnh,
04.01.2026
Phối đồ, Thuật ngữ - Kiến thức
Áo peplum là gì? Áo peplum phối với gì giúp hack dáng eo thon?
Trong thế giới thời trang hiện đại, áo peplum đã trở thành món đồ không thể thiếu nhờ khả năng tôn eo và tạo dáng đồng hồ cát xuất sắc. Từ môi trường công sở đến dạo phố, thiết kế độc đáo này luôn giúp chị em tự tin và
03.01.2026
Tư vấn chọn mua
Các kiểu đầm hoa nhí đẹp và các cách phối đồ phù hợp nhất
Với những họa tiết nhỏ xinh, các kiểu đầm hoa nhí đẹp luôn khiến chị em trở nên mềm mại và thanh thoát hơn. Và nếu bạn vẫn chưa biết đâu là mẫu váy hoa nhí dành cho mình, thì bài viết sau đây của Canifa sẽ giúp bạn khám
02.01.2026
PHỐI ĐỒ
Xem thêm
Phối đồ
Học ngay cách mix đồ với áo cardigan dài đơn giản cho ngày lười
Có những ngày bạn chỉ muốn ra khỏi nhà thật nhanh mà vẫn cần một outfit gọn gàng và có gu. Vậy thì đừng bỏ qua hướng dẫn cách mix đồ với áo cardigan dài sau đây. Với khả năng biến hóa linh hoạt phù hợp với nhiều hoàn cảnh,
04.01.2026
Phối đồ, Thuật ngữ - Kiến thức
Áo peplum là gì? Áo peplum phối với gì giúp hack dáng eo thon?
Trong thế giới thời trang hiện đại, áo peplum đã trở thành món đồ không thể thiếu nhờ khả năng tôn eo và tạo dáng đồng hồ cát xuất sắc. Từ môi trường công sở đến dạo phố, thiết kế độc đáo này luôn giúp chị em tự tin và
03.01.2026
Phối đồ
Chân váy màu be phối với áo màu gì? Gợi ý outfit thanh lịch nhất
Chân váy màu be phối với áo màu gì đẹp nhất? Đâylà thắc mắc của nhiều chị em khi sở hữu item thanh lịch này. Màu be trung tính, dễ mặc nhưng cần biết cách phối hợp để trang phục thêm nổi bật và phù hợp từng hoàn cảnh. Dưới
25.12.2025
Phối đồ
Chân váy xám phối áo màu gì? 10 cách mix sang chảnh và có gu
Chân váy màu xám là item tương đối quen thuộc của phái đẹp, đặc biệt là những cô nàng công sở theo đuổi phong cách trưởng thành, thanh lịch. Vậy chân váy xám phối áo màu gì để trông thật sang trọng và chuyên nghiệp? Bạn sẽ cần nhiều hơn
24.12.2025
Phối đồ
Chân váy vàng phối áo màu gì? 10 gợi ý phối đồ cực cuốn hút
Chân váy vàng phối áo màu gì là câu hỏi được nhiều chị em quan tâm khi muốn tạo nên những bộ trang phục ấn tượng. Màu vàng tuy rực rỡ nhưng không phải lúc nào cũng dễ dàng trong việc phối đồ. Vì vậy, Canifa Fashion sẽ chia sẻ
23.12.2025
TƯ VẤN CHỌN MUA
Xem thêm
Tư vấn chọn mua
Top 15+ shop chuyên áo khoác len nữ cardigan đẹp cao cấp nhất
Khi tiết trời chuyển lạnh, cardigan là lựa chọn trang phục giữ ấm đảm bảo đủ tính thời trang và thanh lịch được nhiều cô nàng ưa chuộng. Nếu bạn đang tìm kiếm các shop chuyên áo khoác len nữ cardigan mẫu mã đẹp, chất lượng tốt mà giá phải
05.01.2026
Tư vấn chọn mua
Các kiểu đầm hoa nhí đẹp và các cách phối đồ phù hợp nhất
Với những họa tiết nhỏ xinh, các kiểu đầm hoa nhí đẹp luôn khiến chị em trở nên mềm mại và thanh thoát hơn. Và nếu bạn vẫn chưa biết đâu là mẫu váy hoa nhí dành cho mình, thì bài viết sau đây của Canifa sẽ giúp bạn khám
02.01.2026
Tư vấn chọn mua
Top 15 thương hiệu áo len nam nổi tiếng ở Việt Nam và thế giới
Khi tiết trời chuyển thu đông, áo len luôn là món đồ đầu tiên được nam giới nghĩ tới. Giữa vô vàn lựa chọn trên thị trường, các thương hiệu áo len nam nổi tiếng trong nước và quốc tế vẫn luôn nhận được sự tin tưởng của phái mạnh
31.12.2025
Tư vấn chọn mua
Khăn len màu gì dễ phối đồ? Gợi ý màu đẹp, dễ mặc nhất cho bạn
Mỗi độ đông về, khăn len lại trở thành phụ kiện thời trang không thể thiếu mỗi khi ra đường. Nhưng làm sao để chọn được màu sắc khăn len choàng cổ phù hợp để bạn luôn thời trang trong mọi set đồ? Bài viết sau đây của Canifa sẽ
28.12.2025
Kinh nghiệm, Tư vấn chọn mua
Hướng dẫn anh em cách chọn size áo len nam chuẩn và đẹp
Mỗi khi mùa lạnh về, áo len luôn là món đồ được anh em ưu ái hàng đầu bởi sự ấm áp, dễ phối và cực kỳ linh hoạt trong nhiều hoàn cảnh. Thế nhưng, chỉ cần chọn sai size áo len nam, tổng thể trang phục có thể trở
27.12.2025
TIN KHUYẾN MÃI
Xem thêm
Tin Khuyến Mại, Tin tức
Siêu lễ hội mua sắm – CANIFA x Tiktok Super Brand Day
Sự kiện mua sắm siêu hot cuối năm Canifa x TikTok Super Brand Day đã quay trở lại cùng hàng loạt ưu đãi không thể bỏ lỡ! Megalive duy nhất 03 ngày 15, 16, 17/12, BST Vietnam Youngster độc quyền, hàng ngàn sản phẩm giảm tới 70% và vô vàn
12.12.2025
Tin Khuyến Mại
Đại tiệc SALE 5/11 – Siêu ưu đãi thu đông cùng Canifa trên Lazada
Mùa lạnh gõ cửa, tủ đồ của bạn đã sẵn sàng “lột xác” chưa? Đừng bỏ lỡ Đại Tiệc Sale 5.11 trên Lazada – sự kiện ưu đãi khủng nhất mùa thu đông 2025 từ CANIFA! Chỉ duy nhất trong 24h ngày 5/11, hàng ngàn sản phẩm giảm đến 50%,
04.11.2025
Tin Khuyến Mại, Tin tức
Sale Mùa Hè Lớn Nhất Trên Lazada – Giảm Giá Đến 50% Toàn Bộ Sản Phẩm
Chỉ trong 1 ngày duy nhất – 2/6/2025, Canifa mang đến chương trình khuyến mãi khủng nhất năm dành cho cả gia đình. Hè này mặc đẹp không cần nghĩ, săn sale cực đỉnh – giảm giá lên tới 50%, voucher ngập tràn, quà tặng giá trị! SALE CANIFA X
30.05.2025
Tin Khuyến Mại
SIÊU SALE CANIFA TRÊN LAZADA: BÉ MẶC XINH YÊU – ĐÓN HÈ SÀNH ĐIỆU
Tham gia ngay chương trình khuyến mãi tháng 3 lớn nhất dành cho bé yêu "Bé mặc xinh yêu - Đón hè sành điệu" chỉ trong 1 ngày duy nhất - 19/03/2025. Ba mẹ thoải mái sắm đồ cho bé với mức giá tiết kiệm nhất. Xem ngay chương trình
17.03.2025
Tin Khuyến Mại
Rước Lộc Đầu Năm Cùng Canifa – Sở Hữu Ngay Chỉ Vàng 9999
Chào đón năm Ất Tỵ 2025 với thật nhiều tài lộc, Canifa mang đến chương trình khuyến mãi "Rước Lộc Đầu Năm" từ 14/02/2025 - 26/02/2025. Quý khách hàng nhanh tay mua sắm sản phẩm ưng ý và cơ hội trở thành chủ nhân sở hữu 01 CHỈ VÀNG 9999
21.02.2025
Thuật ngữ - Kiến thức, Tin Khuyến Mại
Ngày 11/11 là ngày gì? Bí quyết săn sale ưu đãi khủng ngày 11/11
Ngày 11/11 là ngày gì mà người người nhà nhà đều háo hức săn sale, chờ đón những ưu đãi khủng? Không chỉ là Lễ Độc Thân của giới trẻ, đây còn là một dịp mua sắm bùng nổ nhất trong năm. Hòa cùng không khí sôi động của ngày
11.11.2024
Tin Khuyến Mại
Canifa Chào Đông 2024 – Khoác Ấm Đón Đông, Sale Cực Đậm!
Chương trình khuyến mãi độc quyền lớn nhất mùa đông 2024 của Canifa trên Lazada sắp sửa tung loạt ưu đãi khủng. Đây không chỉ là cơ hội mua sắm thông minh mà còn giúp bạn sẵn sàng chào đón mùa đông với chi phí tiết kiệm tối đa. Hãy
30.10.2024
Tin Khuyến Mại
Chương Trình Khuyến Mãi Độc Quyền Canifa Trên Lazada – Sale Lớn Nhất Mùa Đông 2024
Mùa đông đang đến gần, đã đến lúc bạn cần chuẩn bị những trang phục ấm áp và phong cách cho cả gia đình. Canifa mang đến chương trình khuyến mãi cực khủng trên Lazada, với thông điệp “Khoác ấm đón đông – Canifa sale cực đậm”. Đây là cơ
28.10.2024
CÔNG TY CỔ PHẦN CANIFA
Số ĐKKD: 0107574310, ngày cấp: 23/09/2016, Nơi cấp: Sở Kế hoạch và đầu tư Hà Nội
Địa chỉ trụ sở: tại số 688 Đường Quang Trung, Phường La Khê, Quận Hà Đông, Thành phố Hà Nội.
Địa chỉ liên hệ: P301, tầng 3, tòa nhà GP Invest, số 170 La Thành, Phường Ô Chợ Dừa, Quận Đống Đa, Thành Phố Hà Nội.
Điện thoại: +8424 - 7303.0222
Fax: +8424 - 6277.6419
Email: hello@canifa.com
THƯƠNG HIỆU
Giới thiệu
Hệ thống cửa hàng
Tin tức
Tuyển dụng
Với cộng đồng
Liên hệ
HỖ TRỢ
Hỏi đáp
Điều kiện - Điều khoản KHTT
Chính sách KHTT
Chính sách vận chuyển
Chính sách bảo mật thông tin KH
Bảng kích cỡ
TẢI ỨNG DỤNG
PHƯƠNG THỨC THANH TOÁN
© 2023 CANIFA
================================================================================
FILE: data/text/chinh-sach-bao-mat.txt
================================================================================
search
Cửa hàng
Tài khoản
Giỏ hàng
SẢN PHẨM MỚI
NỮ
NAM
BÉ GÁI
BÉ TRAI
CANIFA S
LICENSE
SCHOOL
ĐỒNG PHỤC
BẢO MẬT THÔNG TIN KHÁCH HÀNG
Canifa cam kết xây dựng và công bố chính sách bảo mật thông tin khi thu thập và sử dụng thông tin cá nhân của người tiêu dùng với đầy đủ các nội dung sau:
A. Nguyên Tắc Chung:
Chính sách bảo mật thông tin này (“Chính Sách Bảo Mật Canifa”) mô tả cách thức Công ty Cổ phần anifa (“Canifa” hoặc “chúng tôi”) thu thập, tiếp nhận, tổng hợp, lưu giữ, sử dụng, xử lý, tiết lộ, chia sẻ và bảo đảm an toàn thông tin của các tổ chức, cá nhân (“Người dùng” hoặc “Quý Khách”), bao gồm khách hàng, đại lý, đối tác: (i) truy cập, sử dụng các kênh tương tác khách hàng thuộc sở hữu của Công Ty, bao gồm nhưng không giới hạn: ứng dụng di động Canifa, website www.canifa.com, và hội nhóm trên các trang mạng xã hội (như facebook, Instagram, Tiktok …) thuộc sở hữu của Công Ty (“Kênh Canifa”); (ii) là khách hàng thân thiết trong Chương trình Chăm Sóc Khách Hàng Thân Thiết của Canifa (“Chương Trình”); và/hoặc (iii) mua bán các loại hàng hóa do Canifa cung cấp hoặc (iv) thông qua các nhân viên dịch vụ khách hàng của chúng tôi, hoặc truy cập vào Nền Tảng của chúng tôi thông qua máy vi tính, thiết bị di động, hoặc bất kỳ thiết bị nào khác có kết nối Internet của Quý khách (mục (i), (ii) và (iii) gọi chung là “Dịch Vụ”). Vui lòng đọc kỹ Chính Sách Bảo Mật này, các điều khoản điều kiện tương ứng và các quy định khác (nếu có).
Chính Sách Bảo Mật Canifa bao gồm các nội dung sau:
Sự chấp thuận
Mục đích thu thập
Phạm vi thu thập
Thời gian lưu trữ
Không chia sẻ thông tin cá nhân khách hàng
An toàn dữ liệu
Quyền của Khách hàng đối với thông tin cá nhân
Trách nhiệm của khách hàng để đảm bảo bảo mật thông tin
Cách thức liên hệ với Canifa
Đơn vị thu thập và quản lý thông tin
Hiệu lực
B. Nội dung chi tiết
Sự Chấp Thuận
Vui lòng đọc kỹ chính sách bảo mật này. Bằng cách nhấp và đánh dấu vào các tuyên bố “Tiếp tục”, “Đồng ý”, “tôi đồng ý với chính sách bảo mật của Canifa” hoặc các tuyên bố tương tự được hiển thị tại trang đăng ký của Canifa hoặc trong quá trình cung cấp các dịch vụ hoặc quyền truy cập vào nền tảng cho Quý khách, Quý khách xác nhận rằng đã đọc và hiểu các điều khoản của chính sách bảo mật này và đã đồng ý và cho phép thực hiện việc thu thập, sử dụng, tiết lộ, lưu trữ, chuyển giao và/hoặc xử lý dữ liệu cá nhân của Quý khách như được mô tả và quy định tại chính sách bảo mật này.
Nếu Quý khách không đồng ý với Chính Sách này, Quý khách có thể dừng cung cấp cho Chúng tôi bất kỳ thông tin cá nhân nào và/hoặc sử dụng các quyền như được nêu tại mục 7 dưới đây.
Canifa bảo lưu quyền sửa đổi, bổ sung nhằm hoàn thiện đối với Chính sách này vào bất kỳ thời điểm nào. Chúng tôi khuyến khích Quý Khách thường xuyên xem lại Chính sách bảo mật thông tin Canifa để được cập nhật mới nhất đảm bảo Quý Khách đã biết và thực hiện quyền quản lý thông tin của mình.
Mục đích thu thập thông tin cá nhân khách hàng
Canifa thu thập thông tin người dùng nhằm phục vụ cho các mục đích:
Đơn hàng: để xử lý các vấn đề liên quan đến đơn đặt hàng của Quý khách;
Duy trì tài khoản: Để tạo và duy trì tài khoản của Qúy khách, bao gồm các chương trình khách hàng thân thiết, các chương trình khuyến mại,… đi kèm với tài khoản của Quý khách;
Cung cấp các dịch vụ/ tiện ích cho KH dựa trên nhu cầu và các thói quen của KH mua sắm tại Canifa;
Gửi thông báo Giới thiệu các sản phẩm, chương trình, dịch vụ mới của Canifa
Dịch vụ Người Dùng, Dịch vụ Chăm sóc khách hàng: bao gồm các phản hồi cho các yêu cầu, khiếu nại và phản hồi của Quý Khách;
An ninh: cho mục đích phát hiện, ngăn chặn các hoạt động giả mạo, chiếm dụng tài khoản của KHTT nhằm mục địch trục lợi, gian lận;
Theo yêu cầu của pháp luật: tùy quy định của pháp luật vào từng thời điểm, chúng tôi có thể thu thập, lưu trữ và cung cấp theo yêu cầu của cơ quan nhà nước có thẩm quyền.
Phạm vi thu thập
Các loại thông tin được chúng tôi thu thập và hình thức thu thập thông tin như sau:
Thông tin Quý khách cung cấp cho chúng tôi:
Đó là các thông tin cá nhân Quý khách cung cấp cho chúng tôi được thực hiện chủ yếu trên các kênh Canifa bao gồm bất kỳ thông tin, dữ liệu nào có thể được sử dụng để nhận dạng Quý Khách hoặc dựa vào đó mà Quý khách được xác định, chẳng hạn như họ tên, giới tính, ngày sinh, thông tin CMND/thẻ căn cước công dân/Hộ chiếu (nếu có), quốc tịch, hình ảnh cá nhân, thông tin mối quan hệ gia đình (cha mẹ, con cái), số điện thoại, chi tiết thẻ thanh toán và ngân hàng, địa chỉ email , thông tin đăng nhập tài khoản như tên đăng nhập, mật khẩu đăng nhập, ID/địa chỉ đăng nhập, câu hỏi/ trả lời bảo mật, các thông tin khác gắn liền với một con người cụ thể hoặc giúp xác định một con người cụ thể.
Thu thập và sử dụng Cookies
Canifa và các bên thứ ba mà Canifa hợp tác (nếu có) có thể sử dụng các phương thức tự động (gọi chung là “Cookies”) có liên quan đến việc sử dụng Kênh Canifa để nhận diện trình duyệt hoặc thiết bị của quý khách, tìm hiểu thêm về sở thích của Quý khách, cung cấp cho quý khách các tính năng và dịch vụ thiết yếu và cho các mục đích bổ sung khác. Cookies có thể chứa đựng các công cụ định danh độc nhất và được lưu trữ tại máy tính hoặc thiết bị di động của Quý khách, trong email mà Canifa gửi, trên các Kênh Canifa, và tại một số địa điểm khác. Cookies có thể truyền tải Thông Tin cá nhân và việc sử dụng Dịch Vụ.
Canifa có thể chia sẻ Thông Tin cá nhân thu thập qua Cookies không mang tính nhận dạng cá nhân với các bên thứ ba, chẳng hạn như dữ liệu vị trí, số nhận dạng quảng cáo hoặc số nhận dạng tài khoản chung (như địa chỉ email), để tạo điều kiện hiển thị quảng cáo.
Quý khách có thể quản lý Cookies trình duyệt bằng việc cài đặt trình duyệt của mình, chặn hoặc ngừng hoạt động Cookies, bằng cách xóa lịch sử trình duyệt và xóa bộ nhớ cache khỏi trình duyệt internet của mình. Quý khách cũng có thể giới hạn việc chia sẻ của chúng tôi về một số Thông Tin cá nhân này thông qua cài đặt thiết bị di động của mình. Nếu Quý khách tắt tất cả Cookies, cả chúng tôi và bên thứ ba sẽ không thể chuyển Cookies sang hoặc từ trình duyệt của quý khách. Tuy nhiên, nếu quý khách làm điều này, Quý khách có thể phải tự tay điều chỉnh một số tùy chọn mỗi khi quý khách truy cập lại vào Dịch Vụ và một số tính năng, kênh và dịch vụ có thể không hoạt động.
Thông tin từ các nguồn khác: Chúng tôi có thể thu thập thông tin cá nhân từ các nguồn hợp pháp khác như chương trình khuyến mại, khảo sát,…
Thời gian lưu trữ
Thông tin cá nhân của khách hàng sẽ được lưu trữ và bảo mật trên hệ thống của Canifa cho đến khi khách hàng tự đăng nhập và thực hiện hủy bỏ hoặc có yêu cầu Canifa hủy bỏ trên hệ thống. Trong mọi trường hợp, thông tin cá nhân của khách hàng sẽ được bảo mật trên máy chủ của canifa.com
Không chia sẻ thông tin cá nhân khách hàng
Chúng tôi sẽ không cung cấp thông tin cá nhân của Quý khách cho bất kỳ bên thứ ba nào, trừ một số hoạt động cần thiết sau:
Các bên cung cấp dịch vụ (ví dụ: đối tác trong các lĩnh vực như dịch vụ thanh toán, dịch vụ vận chuyển và giao nhận , tiếp thị, phân tích dữ liệu hoặc nghiên cứu khảo sát khách hàng, truyền thông xã hội, dịch vụ khách hàng, dịch vụ cài đặt, công nghệ thông tin và, dịch vụ lưu trữ web)
Yêu cầu pháp lý: Canifa có thể tiết lộ các thông tin cá nhân nếu điều đó do luật pháp yêu cầu và việc tiết lộ như vậy là cần thiết để tuân thủ quy trình pháp lý
Chuyển giao kinh doanh (nếu có): trong trường hợp sáp nhập, hợp nhất toàn bộ hoặc một phần với công ty khác.
An toàn dữ liệu
Canifa luôn nỗ lực để giữ an toàn thông tin cá nhân của KH, Chúng tôi đã và đang thực hiện nhiều biện pháp an toàn, bao gồm:
Bảo đảm an toàn trong môi trường vận hành: Canifa lưu trữ thông tin cá nhân khách hàng trong môi trường vận hành an toàn và chỉ có nhân viên, đại diện có thể truy cập trên cơ sở cần phải biết. Canifa tuân theo các tiêu chuẩn ngành, pháp luật trong việc bảo mật thông tin cá nhân KH.
Trong trường hợp máy chủ lưu trữ thông tin bị hacker tấn công dẫn đến mất mát dữ liệu Thông tin KH, Canifa sẽ có trách nhiệm thông báo vụ việc cho cơ quan chức năng điều tra xử lý kịp thời và thông báo cho KH được biết.
Canifa cam kết bảo mật mọi thông tin giao dịch trực tuyến của KH. Mọi Thông Tin KH, cũng như các thông tin trao đổi giữa KH và Canifa đều được lưu giữ và bảo mật bởi hệ thống của Canifa.
Canifa có các biện pháp thích hợp về kỹ thuật và an ninh để ngăn chặn việc truy cập, sử dụng trái phép Thông Tin KH. Tuy nhiên, Quý khách nên hiểu rằng không có phương thức truyền tải nào qua Internet hoặc phương thức lưu trữ điện tử là an toàn tuyệt đối. Mặc dù việc bảo mật không thể đảm bảo tuyệt đối, nhưng chúng tôi nỗ lực để bảo vệ an toàn thông tin của Quý khách và liên tục rà soát và nâng cấp các biện pháp bảo mật thông tin của chúng tôi.
Quyền của Khách hàng đối với thông tin cá nhân
KH có quyền cung cấp thông tin cá nhân cho chúng tôi và có quyền thay đổi quyết định đó bất kỳ lúc nào.
KH có quyền tự truy cập, kiểm tra, cập nhật, điều chỉnh, xóa hoặc hủy bỏ Thông tin cá nhân của mình bằng cách đăng nhập vào tài khoản trên Website/ Ứng dụng Canifa để chỉnh sửa thông tin cá nhân hoặc yêu cầu Canifa thực hiện việc này. Dữ liệu không được xóa được bao gồm: số điện thoại.
Đối với các nội dung khác ngoài những nội dung quy định tại Chính Sách Bảo Mật Canifa liên quan đến thu thập, xử lý và sử dụng thông tin cá nhân của KH sẽ được thực hiện theo quy định của pháp luật có hiệu lực tại thời điểm tương ứng.
KH được quyền rút lại sự đồng ý của mình, trừ trường hợp luật có quy định khác. Cụ thể:
Việc rút lại sự đồng ý không ảnh hưởng đến tính hợp pháp của việc xử lý dữ liệu đã được đồng ý trước khi rút lại sự đồng ý.
Việc rút lại sự đồng ý phải được thể hiện ở một định dạng có thể được in, sao chép bằng văn bản, bao gồm cả dưới dạng điện tử hoặc định dạng kiểm chứng được.
- KH được yêu cầu hạn chế xử lý dữ liệu cá nhân của mình, trừ trường hợp luật có quy định khác; Việc hạn chế xử lý dữ liệu được thực hiện trong 72 giờ sau khi có yêu cầu của KH dữ liệu, với toàn bộ dữ liệu cá nhân mà chủ thể dữ liệu yêu cầu hạn chế, trừ trường hợp luật có quy định khác.
- KH được quyền yêu cầu Canifa cung cấp cho bản thân dữ liệu cá nhân của mình, trừ trường hợp luật có quy định khác.
KH được phản đối Canifa xử lý dữ liệu cá nhân của mình nhằm ngăn chặn hoặc hạn chế tiết lộ dữ liệu cá nhân hoặc sử dụng cho mục đích quảng cáo, tiếp thị, trừ trường hợp luật có quy định khác. Canifa thực hiện yêu cầu của KH trong 72 giờ sau khi nhận được yêu cầu, trừ trường hợp luật có quy định khác.
KH có quyền khiếu nại, tố cáo hoặc khởi kiện theo quy định của pháp luật. KH có quyền yêu cầu bồi thường thiệt hại theo quy định của pháp luật khi xảy ra vi phạm quy định về bảo vệ dữ liệu cá nhân của mình, trừ trường hợp các bên có thỏa thuận khác hoặc luật có quy định khác. KH có quyền tự bảo vệ theo quy định của Bộ luật Dân sự, luật khác có liên quan và Nghị định 13/2023/NĐ-CP, hoặc yêu cầu cơ quan, tổ chức có thẩm quyền thực hiện các phương thức bảo vệ quyền dân sự.
Trách nhiệm của Khách hàng để đảm bảo bảo mật thông tin
KH có trách nhiệm bảo vệ thông tin tài khoản của mình và không cung cấp bất kỳ thông tin nào liên quan đến tài khoản và mật khẩu truy cập tài khoản Canifa cho bên nào khác. Trường hợp KH tiết lộ thông tin dẫn đến thiệt hại, Canifa sẽ không chịu bất kỳ trách nhiệm nào đối với tất cả những vấn đề phát sinh.
Canifa không chịu trách nhiệm về những vấn đề phát sinh khi KH truy cập vào website, ứng dụng di động, các kênh truyền thông khác không phải là website, ứng dụng di động, kênh truyền thông chính thức của Công ty.
KH tuyệt đối không được có bất kỳ hành vi sử dụng công cụ, chương trình để can thiệp trái phép vào hệ thống của Canifa, cũng như bất kỳ hành vi nào khác nhằm phát tán, cổ vũ cho các hoạt động với mục đích can thiệp, phá hoại hay xâm nhập vào dữ liệu của website hoặc ứng dụng Canifa, cũng như các hành vi mà pháp luật Việt Nam nghiêm cấm. Trong trường hợp Canifa phát hiện KH có hành vi cố tình giả mạo, gian lận, phát tán các thông tin trái phép,…Canifa có toàn quyền chuyển thông tin KH cho các cơ quan có thẩm quyền để xử lý theo quy định pháp luật.
Cách thức liên hệ với Canifa
Bất kỳ khi nào KH cần hỗ trợ, hãy liên hệ với của Canifa:
Hỗ trợ mua Online: 1800.6061 / Email: saleonline@canifa.com
Liên hệ Chăm sóc KH: 18006061/ Email: chamsockhachhang@canifa.com
Văn phòng miền Bắc: +8424-7303.0222/ Email: hello@canifa.com
Văn phòng miền Nam: +8428 3824.7141/ Email: infocanifa@canifa.com
KH có quyền gửi khiếu nại về việc bị lộ thông tin cá nhân cho bên thứ ba đến Ban quản trị của Ứng dụng Canifa hoặc đến địa chỉ công ty hoặc phản ánh qua mail: chamsockhachhang@canifa.com. Khi tiếp nhận những phản hồi này, Công ty sẽ xác nhận lại thông tin, có trách nhiệm trả lời lý do và hướng dẫn KH khôi phục và bảo mật lại thông tin.
Canifa có trách nhiệm thực hiện các biện pháp kỹ thuật, nghiệp vụ để xác minh các nội dung được phản ánh trong vòng 15 ngày.
Đơn vị thu thập và quản lý thông tin
Công ty Cổ phần Canifa
Số ĐKKD: 0107574310, ngày cấp: 23/09/2016, nơi cấp: Sở Kế hoạch và đầu tư Hà Nội
Trụ sở chính: Số 688, Đường Quang Trung, Phường La Khê, Quận Hà Đông, Hà Nội, Việt Nam
Địa chỉ liên hệ: Phòng 301 Tòa nhà GP Invest, 170 La Thành, P. Ô Chợ Dừa, Q. Đống Đa, Hà Nội
Hiệu lực
Chính sách bảo mật thông tin này có hiệu lực từ ngày 01/07/2023.
TOP
================================================================================
FILE: data/text/cua-hang-html.txt
================================================================================
search
Cửa hàng
Tài khoản
Giỏ hàng
SẢN PHẨM MỚI
NỮ
NAM
BÉ GÁI
BÉ TRAI
CANIFA S
LICENSE
SCHOOL
ĐỒNG PHỤC
Trang chủ
Hệ thống cửa hàng
110
Hệ thống cửa hàng trên toàn quốc
Canifa hướng đến mục tiêu mang lại niềm vui mặc mới mỗi ngày cho hàng triệu người tiêu dùng Việt. Chúng tôi tin rằng người dân Việt Nam cũng đang hướng đến một cuộc sống năng động, tích cực hơn.
Tìm kiếm cửa hàng
Lựa chọn Tỉnh / Thành Phố
Hà Nội
Bắc Ninh
Hưng Yên
Hồ Chí Minh
Thái Bình
Nghệ An
Hải Phòng
Thanh Hoá
Quảng Ninh
Phú Thọ
Hòa Bình
Sơn La
Quảng Bình
Vĩnh Phúc
Đà Nẵng
Bình Dương
Hải Dương
Bình Phước
Nam Định
Hà Tĩnh
Đồng Nai
Lào Cai
Lâm Đồng
Cao Bằng
Gia Lai
Thái Nguyên
Bà Rịa – Vũng Tàu
Tuyên Quang
Điện Biên
Bắc Giang
Lạng Sơn
Đắk Lắk
Ninh Bình
Hà Nam
Trà Vinh
Lựa chọn Quận / Huyện
Quận Ba Đình
Quận Cầu Giấy
Quận Long Biên
Quận Hai Bà Trưng
Huyện Thanh Trì
Quận Hà Đông
Quận Thanh Xuân
Huyện Thạch Thất
Huyện Đan Phượng
Huyện Thường Tín
Quận Nam Từ Liêm
Huyện Quốc Oai
Thị xã Sơn Tây
Quận Tây Hồ
Quận Hoàng Mai
Huyện Gia Lâm
Huyện Đông Anh
Huyện Hoài Đức
Huyện Chương Mỹ
Huyện Ứng Hòa
Quận Bắc Từ Liêm
Quận Đống Đa
CANIFA Lotte Liễu Giai
F3-A02 & F3-C06 tầng 3, Lotte Center Hanoi, 54 Đường Liễu Giai
09:30 - 22:00
Đang mở
ĐT: (+84) - 024 7300 0166
Chỉ đường
CANIFA - 335 Cầu Giấy
335 Cầu Giấy, P. Quan Hoa
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7301 5866
Chỉ đường
CANIFA Aeon mall Long Biên
T247, tầng 2 TTTM Aeon Mall Long Biên, P. Long Biên
10:00 - 22:00
Đang mở
ĐT: (+84) - 02473 053 866
Chỉ đường
CANIFA Times City
40-42 đường Tương Lai, tầng B1 TTTM Times city, 458 Minh Khai
09:30 - 22:00
Đang mở
ĐT: (+84) - 024 7305 2866
Chỉ đường
CANIFA - Thanh Trì (Đại lý)
Đường mới, xóm chùa, Ngũ Hiệp
09:00 - 22:00
Đang mở
ĐT: (+84) - 0898 543 536
Chỉ đường
CANIFA 171 Trần Phú
171 Đường Trần Phú
09:00 - 22:30
Đang mở
ĐT: (+84) - 0247 302 1866
Chỉ đường
CANIFA - TTTM Royal city
B2-R6-43-44 TTTM Royal city, 72 Nguyễn Trãi
10:00 - 22:00
Đang mở
ĐT: (+84) - 024 7307 4866
Chỉ đường
CANIFA - Bình Phú, Thạch Thất (Đại lý)
48 Thái Hòa - Bình Phú
09:00 - 22:00
Đang mở
ĐT: (+84) - 0989 758 822
Chỉ đường
CANIFA - 133 Tây Sơn, Đan Phượng (Đại lý)
133 Tây Sơn (cạnh Techcombank), Thị Trấn Phùng
09:00 - 22:00
Đang mở
ĐT: (+84) - 0392 661 983
Chỉ đường
CANIFA - 304 Phố Ga, Thường Tín (Đại lý)
304 Phố Ga - TT Thường Tín
09:00 - 22:00
Đang mở
ĐT: (+84) - 0932 378 856
Chỉ đường
CANIFA - 247 Hồ Tùng Mậu
247 Hồ Tùng Mậu, P. Cầu Diễn
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7306 4866
Chỉ đường
CANIFA - Quốc Oai (Đại lý)
56 Phố Đồng Hương - Thị Trấn Quốc Oai
09:00 - 22:00
Đang mở
ĐT: (+84) - 0969 547 895
Chỉ đường
CANIFA - 276 Chùa Thông
276 Chùa Thông
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7304 2688
Chỉ đường
CANIFA - Aeon mall Hà Đông
T211, Tầng 2 TTTM Aeon Mall Hà Đông, P.Dương Nội
10:00 - 22:00
Đang mở
ĐT: (+84) - 024 7303 2688
Chỉ đường
CANIFA - 447 Lạc Long Quân
447 Lạc Long Quân
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7307 1866
Chỉ đường
CANIFA - 24 Nguyễn Hữu Thọ
24 Nguyễn Hữu Thọ, Hoàng Liệt
09:00 - 22:30
Đang mở
ĐT: (+84) - 0247 3002 866
Chỉ đường
CANIFA - 38 Kim Đồng, Hà Nội
38 Kim Đồng
09:00 - 22:30
Đang mở
ĐT: (+84) - 0247 3005 866
Chỉ đường
Canifa 24 Nguyễn Cơ Thạch
24 Nguyễn Cơ Thạch
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7304 7866
Chỉ đường
CANIFA - Center Point – 27 Lê Văn Lương
Center Point – 27 Lê Văn Lương, P. Nhân Chính
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7304 5866
Chỉ đường
CANIFA - Bà Triệu, Hà Nội
69 - 73 Bà Triệu
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7305 1866
Chỉ đường
CANIFA - 164 Ngô Xuân Quảng, Hà Nội (Đại lý)
164 Ngô Xuân Quảng
09:00 - 22:30
Đang mở
ĐT: (+84) -
Chỉ đường
CANIFA - Đông Anh, Hà Nội
59 Cao Lỗ, Uy Nỗ
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7301 4866
Chỉ đường
CANIFA - Liên Quan,Thạch Thất (Đại lý)
Tổ dân phố khu Phố, thị trấn Liên Quan
08:00 - 22:00
Đang mở
ĐT: (+84) - 0979 014 638
Chỉ đường
CANIFA - Geleximco An Khánh
LK 14 - Lô 22, KĐT mới Gleximco A, An Khánh
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 73 060 866
Chỉ đường
CANIFA - Chúc Sơn (Đại lý)
86 Bắc Sơn, TT Chúc Sơn, Chương Mỹ, Hà Nội
09:00 - 22:00
Đang mở
ĐT: (+84) - 0934551005
Chỉ đường
CANIFA - Trạm Trôi, Hoài Đức, Hà Nội (Đại lý)
Khu 7, thị trấn Trạm Trôi
08:00 - 22:00
Đang mở
ĐT: (+84) - 0976 966 884
Chỉ đường
CANIFA - Vân Đình, Ứng Hoà, Hà Nội (Đại lý)
288 Lê Lợi, thị trấn Vân Đình
08:00 - 22:00
Đang mở
ĐT: (+84) - 0375131003
Chỉ đường
CANIFA - Bắc Từ Liêm (Đại lý)
32 phố Nhổn
09:00 - 22:00
Đang mở
ĐT: (+84) - 0962 906 789
Chỉ đường
Canifa - Yên Xá, Thanh Trì
Số 68 đường 70, Tân Triều
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 73 067 866
Chỉ đường
CANIFA - 168 Nguyễn Khánh Toàn
168 Nguyễn Khánh Toàn, p. Quan Hoa
09:00 - 22:00
Đang mở
ĐT: (+84) - 024 7304 0866
Chỉ đường
CANIFA - 139 Bạch Mai
139 Bạch Mai, P. Thanh Nhàn
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7306 1866
Chỉ đường
CANIFA - 152 Cao Lỗ
152 Cao Lỗ, Uy Nỗ
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7307 3866
Chỉ đường
CANIFA - Ba Đình
Số 6 Điện Biên Phủ, Ba Đình
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7303 3866
Chỉ đường
CANIFA - Tasco Mall Long Biên
7-9 Nguyễn Văn Linh, Gia Thụy
09:00 - 22:00
Đang mở
ĐT: (+84) - 024 7305 5688
Chỉ đường
CANIFA Lotte Liễu Giai T05
F5-B16-B17 tầng 05, Lotte Center Hanoi, 54 Đường Liễu Giai
09:30 - 22:00
Đang mở
ĐT: (+84) - 024 7300 0166
Chỉ đường
CANIFA KIDS - LITTLE SAM (Đại lý)
314 tầng 3 TTTM The Loop, 241 Xuân Thuỷ, phường Cầu Giấy
10:00 - 22:00
Đang mở
ĐT: (+84) - 0333 424 955
Chỉ đường
CANIFA - Xã Đàn, Hà Nội
65-67 Xã Đàn, Phường Kim Liên, Quận Đống Đa
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7305 5166
Chỉ đường
CANIFA - 440 Quang Trung Hà Đông
440 Quang Trung
09:00 - 22:30
Đang mở
ĐT: (+84) - 0247 307 5866
Chỉ đường
Canifa - Go! Thăng Long
1S22 TTTM Go! Thăng Long, số 222 đường Trần Duy Hưng, P. Yên Hòa
08:00 - 22:00
Đang mở
ĐT: (+84) - 024 7301 3566
Chỉ đường
CANIFA 181 Giảng Võ
181 Đường Giảng Võ
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7301 2866
Chỉ đường
CANIFA 121 - 123 Chùa Bộc
121 - 123 Đường Chùa Bộc
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7302 3688
Chỉ đường
CANIFA 554 Nguyễn Văn Cừ
554 Đường Nguyễn Văn Cừ
09:00 - 22:30
Đang mở
ĐT: (+84) - 0247 305 9866
Chỉ đường
Hệ thống cửa hàng
Hà Nội
Bắc Ninh
Hưng Yên
Hồ Chí Minh
Thái Bình
Nghệ An
Hải Phòng
Thanh Hoá
Quảng Ninh
Phú Thọ
Hòa Bình
Sơn La
Quảng Bình
Vĩnh Phúc
Đà Nẵng
Bình Dương
Hải Dương
Bình Phước
Nam Định
Hà Tĩnh
Đồng Nai
Lào Cai
Lâm Đồng
Cao Bằng
Gia Lai
Thái Nguyên
Bà Rịa – Vũng Tàu
Tuyên Quang
Điện Biên
Bắc Giang
Lạng Sơn
Đắk Lắk
Ninh Bình
Hà Nam
Trà Vinh
CỬA HÀNG NỔI BẬT
CANIFA 554 Nguyễn Văn Cừ
554 Đường Nguyễn Văn Cừ
ĐT: 0247 305 9866
Giờ mở cửa: 09:00 - 22:30
CANIFA 121 - 123 Chùa Bộc
121 - 123 Đường Chùa Bộc
ĐT: 024 7302 3688
Giờ mở cửa: 09:00 - 22:30
CANIFA 181 Giảng Võ
181 Đường Giảng Võ
ĐT: 024 7301 2866
Giờ mở cửa: 09:00 - 22:30
TOP
================================================================================
FILE: data/text/dieu-kien-dieu-khoan-khtt-html.txt
================================================================================
search
Cửa hàng
Tài khoản
Giỏ hàng
SẢN PHẨM MỚI
NỮ
NAM
BÉ GÁI
BÉ TRAI
CANIFA S
LICENSE
SCHOOL
ĐỒNG PHỤC
ĐIỀU KIỆN - ĐIỀU KHOẢN CHÍNH SÁCH KHÁCH HÀNG THÂN THIẾT
Áp dụng trên hệ thống cửa hàng Canifa toàn quốc cho đến khi có thông báo mới.
Chữ viết tắt:
Chữ viết tắt Giải nghĩa
CBNV Cán bộ nhân viên
CSKH Chăm sóc Khách hàng
CBLQ Các bên liên quan
TN CSKH Trưởng nhóm Chăm sóc khách hàng
NVCH Nhân viên Cửa hàng
KH Khách hàng
KHTT Khách hàng thân thiết
1. PHẠM VI ÁP DỤNG:
1.1. 1.1. Điều kiện – Điều khoản (“ĐKĐK”) Chính sách Khách hàng của (“Chương trình”) này được áp dụng đối với Khách hàng thành viên (KHTV) và Công ty Cổ phần Canifa
1.2. KHTV là tất cả các cá nhân từ đủ 15 tuổi trở lên đăng ký hợp lệ tham gia Chương Trình, sở hữu tài khoản định danh khách hàng Canifa (“Tài Khoản”) và đã kích hoạt, sở hữu thẻ khách hàng thân thiết (“Thẻ Canifa”), bao gồm thẻ vật lý và/hoặc ứng dụng di động Canifa và/hoặc tài khoản của khách hàng trên website canifa.com (“Trang Web”) do Canifa quản lý vận hành và khai thác hoặc một hình thức khác theo quy định của Chương Trình tùy từng thời điểm.
1.3. Bằng việc tham gia Chương Trình, KHTV thừa nhận đã đọc, hiểu và đồng ý với ĐKĐK này và toàn bộ các chính sách của Chương Trình được công bố công khai trên Trang Web và sẽ được cập nhật tùy từng thời điểm. Nếu KHTV là người chưa đủ 15 tuổi hoặc khó khăn trong nhận thức, làm chủ hành vi hoặc hạn chế năng lực hành vi dân sự theo quy định pháp luật, KHTV cần nhận được sự hỗ trợ hoặc chấp thuận từ cha mẹ, người đại diện theo pháp luật, tùy từng trường hợp áp dụng, để đăng ký tham gia Chương Trình và mở Tài Khoản. Trong trường hợp đó, cha mẹ hoặc người đại diện theo pháp luật khác, tùy từng trường hợp áp dụng, cần hỗ trợ để KHTV hiểu rõ, đồng ý và thay mặt chấp nhận những ĐKĐK của Chương Trình này, chịu trách nhiệm đối với toàn bộ quá trình sử dụng Tài Khoản hoặc các dịch vụ của Canifa.
2. Quyền và trách nhiệm của KHTT, Canifa
2.1. KHTV sẽ được hưởng các quyền lợi cơ bản của chủ Thẻ Canifa /chủ Tài Khoản và các ưu đãi riêng tùy vào phân hạng KHTV theo nội dung Chương Trình được công bố công khai trên Trang Web, bao gồm nhưng không giới hạn các quyền lợi sau: (1) Được thăng hạng và nhận ưu đãi; (2) Tham gia các chương trình khuyến mại/ưu đãi dành riêng cho chủ Thẻ Canifa /chủ Tài Khoản từ Canifa.
2.2. KHTV có quyền truy cập, tra cứu thông tin cá nhân, hạng thành viên, giá trị tích lũy trong Tài Khoản thông qua các phương thức khác nhau như liên hệ nhân viên CSKH/ NV Thu ngân hoặc Trang Web hoặc ứng dụng di động Canifa.
2.3. KHTV tự chịu trách nhiệm cho bất kỳ và tất cả các chi phí, thuế, phí, khiếu nại hoặc nợ phải trả (nếu có) phát sinh từ việc được hưởng các lợi ích từ Chương Trình trong chính sách khách hàng.
2.4. Mỗi KH hiểu, cam kết và bảo đảm là chủ sử dụng duy nhất của Thẻ Canifa /Tài Khoản, có trách nhiệm tự bảo quản Thẻ và bảo mật thông tin Tài Khoản của mình. KH không được cung cấp thông tin Thẻ/Tài Khoản của mình cho bất kỳ bên thứ ba nào và tự chịu trách nhiệm nếu thực hiện không đúng quy định này.
2.5. KH đồng ý cho Canifa khởi tạo, lưu trữ, duy trì, cập nhật và xử lý các dữ liệu thông tin cá nhân do KH cung cấp, cập nhật và những thông tin phát sinh từ việc KH tham gia mở và sử dụng tài khoản (“Dữ Liệu”) và đồng ý cho Canifa sử dụng các Dữ Liệu này cho các mục đích, bao gồm nhưng không giới hạn: Phục vụ KH thực hiện các giao dịch theo quy định của tài khoản, giới thiệu các sản phẩm, dịch vụ mới của Canifa. Tất cả các Dữ Liệu sẽ được bảo vệ và được sử dụng theo quy định tại Chính sách bảo mật và chia sẻ thông tin được công bố công khai trên Trang Web và cập nhật tùy từng thời điểm.
2.6. Trường hợp thông tin cá nhân của KH có thay đổi so với thông tin đã đăng ký, KH có nghĩa vụ cập nhật kịp thời thông tin thay đổi qua Trang Web, Mobile App Canifa, Tổng Đài, cửa hàng Canifa để tránh việc sử dụng Thẻ/Tài khoản trái quy định. Canifa không chịu trách nhiệm đối với các sai sót, mất mát và các thiệt hại phát sinh từ hoặc liên quan đến KH do thông tin không được cập nhật kịp thời theo quy định tại ĐKĐK này.
2.7. Mọi thông báo/khiếu nại của KH đến Canifa phải được thực hiện thông qua Tổng Đài, email của Phòng Phát triển khách hàng, hệ thống cửa hàng của Canifa hoặc các hình thức khác theo quy định của Canifa tùy từng thời điểm.
2.8. Canifa có quyền đề nghị KH cung cấp thông tin và/hoặc xuất trình giấy tờ cá nhân hợp lệ ngay khi Canifa phát hiện KH thực hiện các hành vi quy định tại điều II.11 hoặc được nhận các ưu đãi trong một số trường hợp.
2.9. Canifa được miễn trách nhiệm trong trường hợp: (1) Hệ thống xử lý dữ liệu, phần mềm, hệ thống truyền tín hiệu gặp sự cố, bị lỗi, bị tấn công hoặc vì bất kỳ lý do khách quan nào khác nằm ngoài khả năng kiểm soát của Canifa; (2) Khi Thẻ bị lợi dụng trong trường hợp Thẻ bị mất cắp/thất lạc/lộ thông tin Tài Khoản mà chủ thẻ không kịp thời thông báo cho Canifa.
2.10. Canifa không chịu trách nhiệm trong trường hợp Khách hàng làm mất điện thoại, mất sim điện thoại dẫn đến thông tin tài khoản bị lộ mà chủ tài khoản không thông báo mất tài khoản tới Canifa.
2.11. Canifa được quyền từ chối cung cấp, hủy, truy đòi hoặc thu hồi những ưu đãi, điểm trong Tài Khoản đã hoặc sẽ nhận được theo các chương trình ưu đãi, khuyến mại mà không cần thông báo trước với KH trong các trường hợp: (1) Canifa không thể chuyển điểm/ ưu đãi cho khách hàng do các nguyên nhân khách quan nằm ngoài sự kiểm soát của Canifa; (2) Điểm được ghi có không chính xác, không hợp lệ vào Tài Khoản theo quy định; (3) KH có dấu hiệu sử dụng các công cụ hoặc phương thức gian lận nhằm trục lợi; (4) KH vi phạm các quy định của Chương trình/Chính sách ưu đãi được Canifa thông báo tại từng thời điểm; (5) Trong trường hợp bất khả kháng theo quy định pháp luật.
2.12. Canifa không chịu trách nhiệm cho bất kỳ tổn thất hoặc thiệt hại, dù trực tiếp hay gián tiếp của KH liên quan đến các chương trình ưu đãi khác, bao gồm nhưng không giới hạn trường hợp bất khả kháng theo quy định của pháp luật.
3. Chấm dứt quyền KHTT
Quyền KHTV theo Chương Trình có giá trị vô thời hạn trừ khi bị chấm dứt trong những trường hợp sau:
3.1. KHTV gửi yêu cầu chấm dứt cho Canifa qua địa chỉ liên lạc/email chính thức được đăng tải tại Trang Web.
3.2. KHTV cố ý sử dụng Thẻ/Tài Khoản sai quy định của Chương Trình và vi phạm ĐKĐK này.
3.3. KHTV qua đời hoặc các trường hợp chấm dứt khác theo quy định của pháp luật.
3.4. Khi Chương Trình chấm dứt vì bất cứ lý do gì.
3.5. Chấm dứt trong các trường hợp khác theo quy định của Chương Trình và ĐKĐK này.
3.6. Canifa bảo lưu quyền chấm dứt Chương Trình bằng cách thông báo cho tất cả KHTV trước 30 ngày thông qua Trang Web và/hoặc một phương thức phù hợp khác. Phương án giải quyết đối với các quyền lợi của KHTV của Chương Trình sẽ được công bố cùng thông báo chấm dứt Chương Trình.
4. Điều khoản chung
4.1. Tùy thuộc điều kiện thực tế, ĐKĐK của Chương Trình và các chính sách khác được công bố trên Trang Web có thể được sửa đổi/điều chỉnh/chấm dứt theo quyết định riêng của Canifa và sẽ được thông báo cho KHTV trên Trang Web.
4.2. Giải quyết tranh chấp: ĐKĐK này được điều chỉnh bởi pháp luật Việt Nam. Tất cả các tranh chấp phát sinh từ hoặc liên quan đến ĐKĐK này sẽ được các bên cố gắng giải quyết thông qua thương lượng. Trường hợp thương lượng đàm phán không thành công trong vòng 30 (ba mươi) ngày, các Bên sẽ có quyền đưa tranh chấp ra giải quyết tại tòa án có thẩm quyền tại Việt Nam theo quy định của pháp luật.
KHÁM PHÁ TIỆN ÍCH
CHỈ CÓ TRÊN APP
Ưu đãi độc quyền
cho thành viên
Nhận thông báo
sản phẩm mới và
khuyến mãi
Mua sắm tiện lợi
qua video call
với C-live
Quét mã vạch
kiểm tra hàng
tại cửa hàng
QUÉT MÃ
TẢI APP
HỆ THỐNG CỬA HÀNG
Tìm kiếm cửa hàng gần bạn!
Xem danh sách
ĐĂNG KÝ NHẬN BẢN TIN
Cập nhật những thông tin mới nhất về ưu đãi, thời trang và phong cách sống.
Đăng ký ngay
CÔNG TY CỔ PHẦN CANIFA
Số ĐKKD: 0107574310, ngày cấp: 23/09/2016
Nơi cấp: Sở Kế hoạch và đầu tư Hà Nội.
Trụ sở chính: số 688 Đường Quang Trung, P. Hà Đông, TP. Hà Nội.
Địa chỉ: Phòng 301, tầng 3, tòa nhà GP Invest, số 170 La Thành, P. Ô Chợ Dừa, TP. Hà Nội.
Điện thoại: 024 - 7303.0222
Fax: 024 - 6277.6419
Email: hello@canifa.com
THƯƠNG HIỆU
Giới thiệu
Hệ thống cửa hàng
Tin tức
Tuyển dụng
Với cộng đồng
Liên hệ
HỖ TRỢ
Hỏi đáp
Điều kiện - Điều khoản KHTT
Chính sách KHTT
Chính sách vận chuyển
Chính sách bảo mật thông tin KH
Tra cứu đơn hàng
Bảng kích cỡ
TÀI KHOẢN
Đăng nhập/ Đăng ký
Mã ưu đãi
Lịch sử đặt hàng
THEO DÕI CHÚNG TÔI
PHƯƠNG THỨC THANH TOÁN
© 2025 CANIFA
TOP
================================================================================
FILE: data/text/gioi-thieu-html.txt
================================================================================
search
Cửa hàng
Tài khoản
Giỏ hàng
SẢN PHẨM MỚI
NỮ
NAM
BÉ GÁI
BÉ TRAI
CANIFA S
LICENSE
SCHOOL
ĐỒNG PHỤC
Canifa - Khoác lên niềm vui gia đình Việt
Canifa 20 năm - Khoác lên niềm vui gia đình Việt
Năm 1997, Công ty Cổ phần Thương mại và Dịch vụ Hoàng Dương được thành lập với mục đích chính ban đầu là hoạt động trong lĩnh vực sản xuất hàng thời trang xuất khẩu với các sản phẩm chủ yếu làm từ len và sợi.
Năm 2001 thương hiệu thời trang CANIFA ra đời, tự hào trở thành một cột mốc đáng nhớ của doanh nghiệp Việt trong ngành thời trang.
Tầm nhìn và sứ mệnh
Mang đến niềm vui cho hàng triệu gia đình Việt
Canifa hướng đến mục tiêu mang lại niềm vui mặc mới mỗi ngày cho hàng triệu người tiêu dùng Việt. Chúng tôi tin rằng người dân Việt Nam cũng đang hướng đến một cuộc sống năng động, tích cực hơn.
Giá trị cốt lõi của Canifa
20 năm phát triển - Chúng tôi luôn tuân thủ những giá trị cốt lõi của mình.
Kinh doanh dựa trên giá trị thật:
CANIFA thiết lập hệ thống tiêu chuẩn chất lượng quốc tế áp dụng trên tất cả quy trình quản lý và kiểm soát chất lượng từ khâu chọn lọc nguyên phụ liệu cho đến khâu thiết kế và sản xuất (Oeko-tex, Cotton USA, Woolmark,...).
Canifa cam kết phát triển xanh cùng người Việt bằng suy nghĩ và hành động:
Vận hành xanh: Tổ hợp CANIFA Văn Giang tự hào là một đơn vị tiên phong nhận chứng chỉ quốc tế LEED về tiết kiệm năng lượng và ảnh hưởng tích cực đến môi trường sống.
Đối tác xanh: Canifa chọn Cotton USA - đơn vị cung cấp nguyên liệu chính cho sản phẩm tại CANIFA, luôn nghiêm minh tuân thủ các chỉ số bền vững của nông nghiệp Mỹ: tiết kiệm nước, kỹ thuật “không làm đất” để bảo vệ đất trồng.
Sản phẩm xanh: CANIFA đặc biệt chú trọng nghiên cứu, kiểm định chất lượng với nguyên liệu đầu vào và sản phẩm đầu ra, đáp ứng những yêu cầu khắt khe nhất của các chứng chỉ uy tín nhất thế giới (Oeko Tex, Woolmark, WD…)
CANIFA - LỊCH SỬ HÌNH THÀNH
1997
Ngày 23/8/1997 Thành lập công ty TNHH Hoàng Dương
2001
Ra đời thương hiệu thời trang CANIFA.
2002
Xây dựng nhà máy Hoàng Dương Hưng Yên
2004
Chương trình Hơi ấm mùa đông lần đầu tiên được khởi xướng bởi một nhóm các nhân viên, mở đầu cho các chương trình thiện nguyện sau này.
2012
Ra đời cửa hàng bán lẻ “flagship store” đầu tiên của Canifa tại 181 Giảng Võ, Hà Nội. Chính thức chuyển đối từ mô hình kinh doanh đại lý sang chuỗi bán lẻ hiện đại. Thành lập chi nhánh Canifa HCM.
2014
Canifa là thương hiệu thời trang đầu tiên ở Việt Nam nhận được chứng chỉ Woolmark - Tổ chức uy tín nhất thế giới về phát triển và kiểm soát chất lượng len lông cừu
2016
ONOFF sáp nhập vào Canifa sau 10 năm hoạt động.
2019
Tổ hợp xanh Canifa Văn Giang đi vào hoạt động, nhận được chứng chỉ LEED, tiêu chuẩn quốc tế về kiến trúc xanh.
TOP
================================================================================
FILE: data/text/hoi-dap.txt
================================================================================
search
Cửa hàng
Tài khoản
Giỏ hàng
SẢN PHẨM MỚI
NỮ
NAM
BÉ GÁI
BÉ TRAI
CANIFA S
LICENSE
SCHOOL
ĐỒNG PHỤC
Chủ đề được quan tâm
Thanh toán
Vận chuyển
Đổi hàng
Khuyến mại
Kiểm tra đơn hàng
Hướng dẫn chọn size
Hướng dẫn mua hàng
Khách hàng thân thiết
Liên hệ
Các câu hỏi thường gặp
Cước phí vận chuyển
Thanh toán trả trước
Quy định đổi hàng online
Hướng dẫn chọn size
Hướng dẫn mua hàng Online
KHÁM PHÁ TIỆN ÍCH
CHỈ CÓ TRÊN APP
Ưu đãi độc quyền
cho thành viên
Nhận thông báo
sản phẩm mới và
khuyến mãi
Mua sắm tiện lợi
qua video call
với C-live
Quét mã vạch
kiểm tra hàng
tại cửa hàng
QUÉT MÃ
TẢI APP
HỆ THỐNG CỬA HÀNG
Tìm kiếm cửa hàng gần bạn!
Xem danh sách
ĐĂNG KÝ NHẬN BẢN TIN
Cập nhật những thông tin mới nhất về ưu đãi, thời trang và phong cách sống.
Đăng ký ngay
CÔNG TY CỔ PHẦN CANIFA
Số ĐKKD: 0107574310, ngày cấp: 23/09/2016
Nơi cấp: Sở Kế hoạch và đầu tư Hà Nội.
Trụ sở chính: số 688 Đường Quang Trung, P. Hà Đông, TP. Hà Nội.
Địa chỉ: Phòng 301, tầng 3, tòa nhà GP Invest, số 170 La Thành, P. Ô Chợ Dừa, TP. Hà Nội.
Điện thoại: 024 - 7303.0222
Fax: 024 - 6277.6419
Email: hello@canifa.com
THƯƠNG HIỆU
Giới thiệu
Hệ thống cửa hàng
Tin tức
Tuyển dụng
Với cộng đồng
Liên hệ
HỖ TRỢ
Hỏi đáp
Điều kiện - Điều khoản KHTT
Chính sách KHTT
Chính sách vận chuyển
Chính sách bảo mật thông tin KH
Tra cứu đơn hàng
Bảng kích cỡ
TÀI KHOẢN
Đăng nhập/ Đăng ký
Mã ưu đãi
Lịch sử đặt hàng
THEO DÕI CHÚNG TÔI
PHƯƠNG THỨC THANH TOÁN
© 2025 CANIFA
TOP
================================================================================
FILE: data/text/home.txt
================================================================================
THÊM VÀO GIỎ 599.000 ₫ ĐỂ MIỄN PHÍ VẬN CHUYỂN
ĐỔI HÀNG MIỄN PHÍ - TẠI TẤT CẢ CỬA HÀNG TRONG 30 NGÀY
THÊM VÀO GIỎ 599.000 ₫ ĐỂ MIỄN PHÍ VẬN CHUYỂN
ĐỔI HÀNG MIỄN PHÍ - TẠI TẤT CẢ CỬA HÀNG TRONG 30 NGÀY
search
Cửa hàng
Tài khoản
Giỏ hàng
SẢN PHẨM MỚI
NỮ
NAM
BÉ GÁI
BÉ TRAI
CANIFA S
LICENSE
SCHOOL
ĐỒNG PHỤC
Canifa - Khoác lên niềm vui gia đình Việt
ƯU ĐÃI NỔI BẬT
Voucher 50K
Giảm 50k cho đơn từ 999k
HSD: 2026-01-31
Điều kiện
Dùng mã
Voucher 80K
Giảm 80k cho đơn Online đầu tiên từ 399k
HSD: 2026-01-31
Điều kiện
Dùng mã
SẢN PHẨM MỚI
TẤT CẢ
NỮ
NAM
BÉ GÁI
BÉ TRAI
XEM THÊM
Áo khoác lông vũ nam
1.499.000 ₫
Quần dài active nam
799.000 ₫
+1
Áo nỉ bé gái có hình in
349.000 ₫
Bộ pyjama nữ
699.000 ₫
Quần nỉ unisex trẻ em
329.000 ₫
Tất trung cổ unisex Youngster
79.000 ₫
Áo cardigan bé gái cổ ren
499.000 ₫
Áo phông bé gái cotton USA có hình in
269.000 ₫
CANIFALIFE
TOP
================================================================================
FILE: data/text/huong-dan-chon-size-html.txt
================================================================================
HƯỚNG DẪN CHỌN SIZE - CANIFA
* Đơn vị tính: cm, kg
================================================================================
BẢNG SIZE CHUNG CHO NỮ
================================================================================
Size XS - BẢNG SIZE CHUNG CHO NỮ:
- Chiều cao: 147-153 cm
- Cân nặng: 38-43 kg
- Vòng ngực: 74-80 cm
- Vòng mông: 82-88 cm
Size S - BẢNG SIZE CHUNG CHO NỮ:
- Chiều cao: 150-155 cm
- Cân nặng: 41-46 kg
- Vòng ngực: 79-82 cm
- Vòng mông: 88-90 cm
Size M - BẢNG SIZE CHUNG CHO NỮ:
- Chiều cao: 155-163 cm
- Cân nặng: 47-52 kg
- Vòng ngực: 82-87 cm
- Vòng mông: 90-94 cm
Size L - BẢNG SIZE CHUNG CHO NỮ:
- Chiều cao: 160-165 cm
- Cân nặng: 53-58 kg
- Vòng ngực: 88-94 cm
- Vòng mông: 94-98 cm
Size XL - BẢNG SIZE CHUNG CHO NỮ:
- Chiều cao: 162-166 cm
- Cân nặng: 59-64 kg
- Vòng ngực: 94-99 cm
- Vòng mông: 98-102 cm
================================================================================
QUẦN NỮ (Size số)
================================================================================
Size 26 (XS) - QUẦN NỮ (Size số):
- Vòng eo: 65 cm
- Vòng mông (dáng slim): 79 cm
- Vòng mông (dáng regular): 86.92 cm
- Chiều dài quần: 93 cm
- Rộng gấu (dáng slim): 12.5 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 27 (S) - QUẦN NỮ (Size số):
- Vòng eo: 67.5 cm
- Vòng mông (dáng slim): 81.5 cm
- Vòng mông (dáng regular): 89.46 cm
- Chiều dài quần: 94 cm
- Rộng gấu (dáng slim): 13 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 28 (M) - QUẦN NỮ (Size số):
- Vòng eo: 70 cm
- Vòng mông (dáng slim): 84 cm
- Vòng mông (dáng regular): 92 cm
- Chiều dài quần: 95 cm
- Rộng gấu (dáng slim): 13.5 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 29 (L) - QUẦN NỮ (Size số):
- Vòng eo: 72.5 cm
- Vòng mông (dáng slim): 86.5 cm
- Vòng mông (dáng regular): 94.5 cm
- Chiều dài quần: 96 cm
- Rộng gấu (dáng slim): 14 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 30 (XL) - QUẦN NỮ (Size số):
- Vòng eo: 75 cm
- Vòng mông (dáng slim): 89 cm
- Vòng mông (dáng regular): 97.1 cm
- Chiều dài quần: 97 cm
- Rộng gấu (dáng slim): 14.5 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
================================================================================
QUẦN JEANS - KHAKI (NỮ)
================================================================================
Size 26 (XS) - QUẦN JEANS - KHAKI (NỮ):
- Vòng bụng: 65 cm
- Vòng mông: 79 cm
- Chiều dài quần: 93 cm
- Rộng ống (dáng slim): 12.5 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 27 (S) - QUẦN JEANS - KHAKI (NỮ):
- Vòng bụng: 67.5 cm
- Vòng mông: 81.5 cm
- Chiều dài quần: 94 cm
- Rộng ống (dáng slim): 13 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 28 (M) - QUẦN JEANS - KHAKI (NỮ):
- Vòng bụng: 70 cm
- Vòng mông: 84 cm
- Chiều dài quần: 95 cm
- Rộng ống (dáng slim): 13.5 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 29 (L) - QUẦN JEANS - KHAKI (NỮ):
- Vòng bụng: 72.5 cm
- Vòng mông: 86.5 cm
- Chiều dài quần: 96 cm
- Rộng ống (dáng slim): 14 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 30 (XL) - QUẦN JEANS - KHAKI (NỮ):
- Vòng bụng: 75 cm
- Vòng mông: 89 cm
- Chiều dài quần: 97 cm
- Rộng ống (dáng slim): 14.5 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
================================================================================
BẢNG SIZE CHUNG CHO NAM
================================================================================
Size S - BẢNG SIZE CHUNG CHO NAM:
- Chiều cao: 162-168 cm
- Cân nặng: 57-62 kg
- Vòng ngực: 84-88 cm
- Vòng mông: 85-89 cm
Size M - BẢNG SIZE CHUNG CHO NAM:
- Chiều cao: 169-173 cm
- Cân nặng: 63-67 kg
- Vòng ngực: 88-94 cm
- Vòng mông: 90-94 cm
Size L - BẢNG SIZE CHUNG CHO NAM:
- Chiều cao: 171-175 cm
- Cân nặng: 68-72 kg
- Vòng ngực: 94-98 cm
- Vòng mông: 95-99 cm
Size XL - BẢNG SIZE CHUNG CHO NAM:
- Chiều cao: 173-177 cm
- Cân nặng: 73-77 kg
- Vòng ngực: 98-104 cm
- Vòng mông: 100-104 cm
Size XXL - BẢNG SIZE CHUNG CHO NAM:
- Chiều cao: 175-179 cm
- Cân nặng: 78-82 kg
- Vòng ngực: 104-107 cm
- Vòng mông: 104-108 cm
================================================================================
QUẦN JEANS - KHAKI (NAM)
================================================================================
Size 29 (S) - QUẦN JEANS - KHAKI (NAM):
- Vòng eo: 79.5 cm
- Vòng mông: 96.5 cm
- Chiều dài quần: 99.8 cm
- Rộng ống (dáng slim): 15.4 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 30 (M) - QUẦN JEANS - KHAKI (NAM):
- Vòng eo: 82 cm
- Vòng mông: 99 cm
- Chiều dài quần: 100.5 cm
- Rộng ống (dáng slim): 16 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 31 (L) - QUẦN JEANS - KHAKI (NAM):
- Vòng eo: 84.5 cm
- Vòng mông: 101.5 cm
- Chiều dài quần: 101.2 cm
- Rộng ống (dáng slim): 16.6 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 32 (XL) - QUẦN JEANS - KHAKI (NAM):
- Vòng eo: 87 cm
- Vòng mông: 104 cm
- Chiều dài quần: 101.2 cm
- Rộng ống (dáng slim): 17.2 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 33 (XXL) - QUẦN JEANS - KHAKI (NAM):
- Vòng eo: 89 cm
- Vòng mông: 106.5 cm
- Chiều dài quần: 101.2 cm
- Rộng ống (dáng slim): 17.8 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
================================================================================
BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023)
================================================================================
Size 92 (2Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 88-94 cm
- Cân nặng: 10-13 kg
Size 98 (2-3Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 95-101 cm
- Cân nặng: 13-15 kg
Size 104 (3-4Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 101-107 cm
- Cân nặng: 15-18 kg
Size 110 (4-5Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 107-113 cm
- Cân nặng: 18-22 kg
Size 116 (6Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 113-119 cm
- Cân nặng: 22-25 kg
Size 122 (7Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 119-125 cm
- Cân nặng: 25-28 kg
Size 128 (8Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 125-131 cm
- Cân nặng: 28-32 kg
Size 134 (9Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 131-137 cm
- Cân nặng: 32-36 kg
Size 140 (10-11Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 137-145 cm
- Cân nặng: 36-39 kg
Size 152 (11-12Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 145-157 cm
- Cân nặng: 39-46 kg
Size 164 (13-14Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 157-169 cm
- Cân nặng: 46-55 kg
================================================================================
BẢNG SIZE CHUNG CHO BÉ TRAI
================================================================================
Size 90 (2Y) - BẢNG SIZE CHUNG CHO BÉ TRAI:
- Chiều cao: 90 cm
- Cân nặng: 10-13 kg
Size 100 (3-4Y) - BẢNG SIZE CHUNG CHO BÉ TRAI:
- Chiều cao: 100 cm
- Cân nặng: 14-17 kg
Size 110 (4-5Y) - BẢNG SIZE CHUNG CHO BÉ TRAI:
- Chiều cao: 110 cm
- Cân nặng: 18-23 kg
Size 120 (6-7Y) - BẢNG SIZE CHUNG CHO BÉ TRAI:
- Chiều cao: 120 cm
- Cân nặng: 24-29 kg
Size 130 (8Y) - BẢNG SIZE CHUNG CHO BÉ TRAI:
- Chiều cao: 130 cm
- Cân nặng: 29-33 kg
Size 140 (9-11Y) - BẢNG SIZE CHUNG CHO BÉ TRAI:
- Chiều cao: 140 cm
- Cân nặng: 33-39 kg
Size 150 (11-12Y) - BẢNG SIZE CHUNG CHO BÉ TRAI:
- Chiều cao: 150 cm
- Cân nặng: 39-45 kg
Size 160 (13-14Y) - BẢNG SIZE CHUNG CHO BÉ TRAI:
- Chiều cao: 160 cm
- Cân nặng: 45-52 kg
================================================================================
BẢNG SIZE CHUNG CHO BÉ GÁI
================================================================================
Size 90 (2Y) - BẢNG SIZE CHUNG CHO BÉ GÁI:
- Chiều cao: 90 cm
- Cân nặng: 10-13 kg
Size 100 (3-4Y) - BẢNG SIZE CHUNG CHO BÉ GÁI:
- Chiều cao: 100 cm
- Cân nặng: 14-17 kg
Size 110 (4-5Y) - BẢNG SIZE CHUNG CHO BÉ GÁI:
- Chiều cao: 110 cm
- Cân nặng: 18-23 kg
Size 120 (6-7Y) - BẢNG SIZE CHUNG CHO BÉ GÁI:
- Chiều cao: 120 cm
- Cân nặng: 24-29 kg
Size 130 (8Y) - BẢNG SIZE CHUNG CHO BÉ GÁI:
- Chiều cao: 130 cm
- Cân nặng: 29-33 kg
Size 140 (9-11Y) - BẢNG SIZE CHUNG CHO BÉ GÁI:
- Chiều cao: 140 cm
- Cân nặng: 33-39 kg
Size 150 (11-12Y) - BẢNG SIZE CHUNG CHO BÉ GÁI:
- Chiều cao: 150 cm
- Cân nặng: 39-45 kg
Size 160 (13-14Y) - BẢNG SIZE CHUNG CHO BÉ GÁI:
- Chiều cao: 160 cm
- Cân nặng: 45-50 kg
================================================================================
BẢNG SIZE CHUNG CHO UNISEX - NGƯỜI LỚN
================================================================================
Size XXS - BẢNG SIZE CHUNG CHO UNISEX - NGƯỜI LỚN:
- Chiều cao: 155 - 163 cm
- Cân nặng: 47 - 52 kg
Size XS - BẢNG SIZE CHUNG CHO UNISEX - NGƯỜI LỚN:
- Chiều cao: 160 - 165 cm
- Cân nặng: 53 - 58 kg
Size S - BẢNG SIZE CHUNG CHO UNISEX - NGƯỜI LỚN:
- Chiều cao: 162 - 168 cm
- Cân nặng: 57 - 62 kg
Size M - BẢNG SIZE CHUNG CHO UNISEX - NGƯỜI LỚN:
- Chiều cao: 169 - 173 cm
- Cân nặng: 63 - 67 kg
Size L - BẢNG SIZE CHUNG CHO UNISEX - NGƯỜI LỚN:
- Chiều cao: 171 - 175 cm
- Cân nặng: 68 - 72 kg
Size XL - BẢNG SIZE CHUNG CHO UNISEX - NGƯỜI LỚN:
- Chiều cao: 173 - 177 cm
- Cân nặng: 73 - 77 kg
Size XXL - BẢNG SIZE CHUNG CHO UNISEX - NGƯỜI LỚN:
- Chiều cao: 175 - 179 cm
- Cân nặng: 79 - 82 kg
================================================================================
BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM
================================================================================
Dải size lẻ:
Size 92 (2Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size lẻ):
- Chiều cao: 92 cm
- Cân nặng: 10 - 13 kg
Size 98 (2-3Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size lẻ):
- Chiều cao: 98 cm
- Cân nặng: 13 - 15 kg
Size 104 (3-4Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size lẻ):
- Chiều cao: 104 cm
- Cân nặng: 15 - 18 kg
Size 110 (4-5Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size lẻ):
- Chiều cao: 110 cm
- Cân nặng: 18 - 22 kg
Size 116 (6Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size lẻ):
- Chiều cao: 116 cm
- Cân nặng: 22 - 25 kg
Size 122 (7Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size lẻ):
- Chiều cao: 122 cm
- Cân nặng: 25 - 28 kg
Size 128 (8Y) -
- Chiều cao: 128 cm
- Cân nặng: 28 - 32 kg
Size 134 (9Y)
- Chiều cao: 134 cm
- Cân nặng: 32 - 36 kg
Size 140 (9-10Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size lẻ):
- Chiều cao: 140 cm
- Cân nặng: 36 - 39 kg
Size 152 (11-12Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size lẻ):
- Chiều cao: 152 cm
- Cân nặng: 39 - 46 kg
Size 164 (13-14Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size lẻ):
- Chiều cao: 164 cm
- Cân nặng: 46 - 55 kg
Dải size chẵn:
Size 90 (2Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size chẵn):
- Chiều cao: 90 cm
- Cân nặng: 10 - 13 kg
Size 100 (2-3Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size chẵn):
- Chiều cao: 100 cm
- Cân nặng: 14 - 17 kg
Size 110 (4-5Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size chẵn):
- Chiều cao: 110 cm
- Cân nặng: 18 - 23 kg
Size 120 (6-7Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size chẵn):
- Chiều cao: 120 cm
- Cân nặng: 24 - 29 kg
Size 130 (8Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size chẵn):
- Chiều cao: 130 cm
- Cân nặng: 29 - 33 kg
Size 140 (9-10Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size chẵn):
- Chiều cao: 140 cm
- Cân nặng: 33 - 39 kg
Size 150 (11-12Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size chẵn):
- Chiều cao: 150 cm
- Cân nặng: 39 - 45 kg
Size 160 (13-14Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size chẵn):
- Chiều cao: 160 cm
- Cân nặng: 45 - 52 kg
================================================================================
FILE: data/text/lien-he-html.txt
================================================================================
search
Cửa hàng
Tài khoản
Giỏ hàng
SẢN PHẨM MỚI
NỮ
NAM
BÉ GÁI
BÉ TRAI
CANIFA S
LICENSE
SCHOOL
ĐỒNG PHỤC
LIÊN HỆ
Hỗ trợ Khách hàng mua online
Tổng đài: 1800 6061
Từ 9h - 12h, 13h - 21h các ngày từ thứ 2 đến Chủ nhật
Email: saleonline@canifa.com
Địa chỉ: Phòng 301 Tòa nhà GP Invest, 170 La Thành, P. Ô Chợ Dừa, Q. Đống Đa, Hà Nội
Chăm sóc khách hàng:
Điện thoại: 1800.6061
Email: chamsockhachhang@canifa.com
Đặt đồng phục
Ms. Hoa
Điện thoại: 0963.03.03.67
Email: grb2b@canifa.com
Văn phòng miền Bắc
Phòng 301 Tòa nhà GP Invest, 170 La Thành, P. Ô Chợ Dừa, Q. Đống Đa, Hà Nội
Điện thoại: +8424-7303.0222
Fax: +8424 - 6277.6419
Email: hello@canifa.com
Website: www.canifa.com
Văn phòng miền Nam
Địa chỉ: 97 Cao Thắng , Phường 3, Quận 3, TP. HCM
Điện thoại: +8428 3824.7141
Email: infocanifa@canifa.com
Liên hệ làm Nhà phân phối và Đại lý
(KV miền Bắc)
Mr. Nguyễn Đức Bằng
Điện thoại: 0904.530.833
Email: bangnd@canifa.com
Liên hệ làm Nhà phân phối và Đại lý
(KV Miền Nam từ Đà Nẵng đến Cà Mau)
Mr. Nguyễn Công Thành
Điện thoại: 0914.396.239
Email: thanhnc@canifa.com
Nhà máy
Đường Nguyễn Văn Linh, Phường Bần Yên Nhân, T.X Mỹ Hào, Hưng Yên
Điện thoại: +84-221- 394 2234
Fax: +84 - 221-394 2235
 
 
TOP
================================================================================
FILE: data/text/tuyen-dung.txt
================================================================================
GIỚI THIỆU CHUNG
MÔI TRƯỜNG LÀM VIỆC
CHẾ ĐỘ ĐÃI NGỘ
DỰ ÁN HỢP TÁC
TUYỂN DỤNG
Địa điểm làm việc
Tất cả (22)
Hà Nội (18)
Toàn quốc (4)
Ngành/Nghề
Tất cả (22)
Bán hàng (6)
Cơ khí (1)
Công nghệ thông tin (2)
Dịch vụ khách hàng (1)
Điện (1)
IT Phần cứng (1)
IT phần mềm (3)
Kế toán/Tài chính (2)
Kho vận (1)
Khoa học dữ liệu (2)
Kiến trúc (1)
Kinh doanh (4)
Kinh doanh/Bán hàng (6)
Luật/Pháp lý (1)
Marketing (4)
Merchandise (1)
Nghiên cứu - Thiết kế (1)
Nhóm ngành khác (1)
Sản xuất (1)
Thiết kế đồ họa (1)
thời trang (3)
Thương mại Điện tử (2)
Tiếp thị/Marketing (6)
Truyền thông/Media (3)
Tự động hóa (1)
Vận chuyển/Giao nhận/Kho (1)
Vận hành (2)
Xây dựng (2)
PHÓ PHÒNG CƠ SỞ HẠ TẦNG & SETUP
Cạnh tranh
Hà Nội
Hạn nộp hồ sơ: 31/01/2026
Chi tiết
NHÂN VIÊN KHO
7 - 10 triệu/tháng
Toàn quốc
Hạn nộp hồ sơ: 31/03/2026
Chi tiết
NHÂN VIÊN BÁN HÀNG
7 - 10 triệu/tháng
Toàn quốc
Hạn nộp hồ sơ: 31/03/2026
Chi tiết
CHUYÊN VIÊN PCCC & ME
Cạnh tranh
Hà Nội
Hạn nộp hồ sơ: 31/01/2026
Chi tiết
CHUYÊN VIÊN QUẢN TRỊ HỆ THỐNG
Cạnh tranh
Hà Nội
Hạn nộp hồ sơ: 31/01/2026
Chi tiết
TRƯỞNG NHÓM NGHIÊN CỨU VÀ PHÁT TRIỂN THỊ TRƯỜNG
Cạnh tranh
Hà Nội
Hạn nộp hồ sơ: 31/01/2026
Chi tiết
Xem thêm
================================================================================
FILE: data/text/van-chuyen-html.txt
================================================================================
search
Cửa hàng
Tài khoản
Giỏ hàng
SẢN PHẨM MỚI
NỮ
NAM
BÉ GÁI
BÉ TRAI
CANIFA S
LICENSE
SCHOOL
ĐỒNG PHỤC
VẬN CHUYỂN
1. CƯỚC PHÍ VẬN CHUYỂN
Miễn phí giao hàng với tất cả đơn hàng có giá trị từ 599,000 vnđ trở lên tại tất cả tỉnh thành trên toàn quốc.
Đối với những đơn hàng có giá trị dưới 599,000 vnđ, CANIFA áp dụng biểu phí giao hàng theo từng khu vực được quy định dưới đây. Biểu phí này áp dụng từ 14/08/2023 cho đến khi có thay đổi.
HÀ NỘI
Đống Đa, Hoàn Kiếm, Ba Đình, Hai Bà Trưng, Cầu Giấy, Thanh Xuân 20.000đ
Hà Đông, Tây Hồ, Hoàng Mai, Long Biên, Bắc Từ Liêm, Nam Từ Liêm, Ba Vì, Chương Mỹ, Đan Phượng, Đông Anh, Gia Lâm, Hoài Đức, Mê Linh, Mỹ Đức, Phúc Thọ, Phú Xuyên, Quốc Oai, Sóc Sơn, Thạch Thất, Thanh Oai, Thanh Trì, Thường Tín, Ứng Hòa, Thị Xã Sơn Tây. 30.000đ
TP HỒ CHÍ MINH
Tất cả các quận 40.000đ
ĐÀ NẴNG
Tất cả các quận 40.000đ
TẤT CẢ CÁC TỈNH THÀNH KHÁC
Bắc Giang, Bắc Ninh, Hà Nam, Hải Dương, Hải Phòng, Hưng Yên, Hòa Bình, Nam Định, Phú Thọ, Thái Nguyên, Vĩnh Phúc, Hòa Bình,Bắc Kan, Lạng Sơn, Nghệ An, Ninh Bình, Quảng Ninh, Thái Bình, Thanh Hóa, Tuyên Quang, Yên Bái, Nghệ An 30.000đ
Điện Biên, Lào Cai, Hà Giang, Sơn La, Cao Bằng,Huế, Quảng Trị, Gia Lai, Đắc Lắc, Kom Tum, Đắc Nông, Phú Yên, Khánh Hòa, Hà Tình, Tiền Giang, Bến Tre, Tây Ninh, Đồng Tháp, Trà Vinh, Vĩnh Long, Đồng Nai, Bình Dương, Vũng Tàu, Long An, Quảng Bình, Quy Nhơn, Bình Thuận, Ninh Thuận, Bình Phước, Cần Thơ, Hậu Giang, Kiên Giang, An Giang, Long An, Sóc Trăng, Bạc Liêu, Cà Mau, Quảng Ngãi 40.000đ
2. THỜI GIAN VẬN CHUYỂN
Hà Nội : giao hàng từ 1 đến 3 ngày kể từ khi hệ thống xác nhận qua sms/email
Tuyến Đà Nẵng, TP.HCM: giao hàng trong vòng 3 ngày kể từ khi hệ thống xác nhận qua sms/email.
Tất cả thành phố khác: giao hàng trong vòng từ 3- 7 ngày kể từ khi hệ thống xác nhận qua sms/ email.
Thời gian giao hàng không tính thứ bảy, chủ nhật hay các ngày lễ tết.
3. ĐƠN HÀNG ĐƯỢC GIAO TỐI ĐA MẤY LẦN ?
Đơn hàng được giao tối đa 3 lần (Nếu lần 1 đơn hàng giao không thành công, nhân viên vận chuyển sẽ liên hệ lại bạn lần 2 sau 1-2 ngày làm việc kế tiếp . Như vậy sau 3 lần giao dịch không thành công đơn hàng sẽ hủy)
4. KiỂM TRA TÌNH TRẠNG ĐƠN HÀNG
Để kiểm tra thông tin hoặc tình trạng đơn hàng bạn vui lòng sử dụng MÃ ĐƠN HÀNG đã được gửi trong email xác nhận hoặc tin nhắn xác nhận để thông báo tới bộ phận Chăm sóc khách hàng (tổng đài miễn phí cước gọi 1800 6061 nhánh 1)
5. KHI NHẬN ĐƠN HÀNG CÓ ĐƯỢC XEM SẢN PHẨM TRƯỚC KHI THANH TOÁN ?
Bạn hoàn toàn có thể mở gói hàng kiểm tra sản phẩm trước khi thanh toán hoặc trước khi vận chuyển rời đi.
Trong trường hợp bạn gặp vấn đề phát sinh bạn liên hệ ngay đến chúng tôi 1800 6061 nhánh 1 để được hỗ trợ kịp thời.
TOP
================================================================================
FILE: data/text/voi-cong-dong-html.txt
================================================================================
search
Cửa hàng
Tài khoản
Giỏ hàng
SẢN PHẨM MỚI
NỮ
NAM
BÉ GÁI
BÉ TRAI
CANIFA S
LICENSE
SCHOOL
ĐỒNG PHỤC
Phát triển bền vững: 03 xanh
Với mục tiêu phát triển bền vững, CANIFA tập trung nghiên cứu và cải tiến hoạt động sản xuất kinh doanh để đảm bảo nguyên tắc 3 XANH
Bảo vệ môi trường là 01 trong những nguyên tắc hoạt động cốt lõi của Tập đoàn. Tiêu biểu: Tổ hợp Canifa Văn Giang - đơn vị tiên phong trong ngành dệt may tại Việt Nam nhận chứng chỉ quốc tế LEED về công trình xây dựng xanh, tiết kiệm năng lượng và bảo vệ môi trường sống của con người
Hợp tác bền vững là yếu tố quan trọng nhất trong sự đồng hành cùng phát triển
Tiêu biểu: Đối tác Cotton USA - đơn vị cung cấp nguyên liệu chính cho áo phông tại Canifa luôn nghiêm minh tuân thủ các chỉ số bền vững của nông nghiệp Mỹ: tiết kiệm nước, kỹ thuật “không làm đất” để bảo vệ đất trồng.
Thời trang không chỉ đẹp mà còn an toàn với người sử dụng luôn song hành trong mục tiêu nghiên cứu phát triển sản phẩm.
Tiêu biểu: CANIFA luôn chú trọng nghiên cứu, kiểm định chất lượng với nguyên liệu đầu vào và sản phẩm đầu ra, đáp ứng những yêu cầu khắt khe nhất của các chứng chỉ uy tín nhất thế giới để mang đến cho người dùng sự an toàn và thoải mái (Oekotex, Woolmark, AWTA,...)
hoạt động cộng đồng
Với mong muốn mang đến những điều tốt đẹp dù nhỏ bé nhưng ấm áp đến cho cộng đồng Việt, những người sáng lập đã gieo mầm cho các hoạt động hoàn toàn tự nguyện mang tên Hội CANIFA Vì Cộng Đồng.
HƠI ẤM MÙA ĐÔNG
Nếu một lần được thấy hình ảnh những em nhỏ vùng cao vượt qua mùa đông chỉ bằng những tấm áo cộc... chúng tôi tin rằng những trái tim sẽ không ngừng ước mong về một ngày các em đủ ấm.
Được khởi xướng bởi nhân viên Canifa, hành trình Hơi ấm mùa đông là hành trình của hàng ngàn tấm áo ấm đến với các em nhỏ vùng cao cho mùa đông bớt khắc nghiệt.
2019 - năm thứ 15, Canifa sẽ viết tiếp hành trình bằng 15,000 tấm áo, cùng với cộng đồng để trao tận tay từng em nhỏ
GIỌT MÁU HỒNG
Từ 2014, Hoạt động hiến máu nhân đạo được Canifa tổ chức định kỳ hàng năm, thu hút đông đảo CBNV tham gia, đóng góp hàng ngàn đơn vị máu cho hoạt động cứu trợ của Viện huyết học và truyền máu Trung ương.
ÁO MỚI CHO HÀNH TINH XANH
Ở Canifa, chúng tôi tin rằng, mỗi đứa trẻ đều có thể chung tay bảo vệ môi trường. Từ việc bớt sử dụng một chiếc ống hút nhựa cho đến trồng thêm một cây xanh. Mỗi năm, hàng trăm mầm xanh sẽ được chính tay các bạn nhỏ là con em CBNV trong công ty vun trồng. Năm sau đó, các bạn sẽ được quay lại để nhìn những cây xanh đã lớn và tiếp tục gieo thêm những màu xanh.
HOẠT ĐỘNG THIỆN NGUYỆN KHÁC
Chứng kiến sự khắc nghiệt của thiên tai, chúng tôi hiểu mọi sự cứu trợ dù là nhỏ nhất nếu kịp thời đều có ý nghĩa với những người dân vùng thiệt hại. Canifa luôn có những chuyến xe hỏa tốc về vùng bão lũ, chúng tôi gọi đó là những chuyến xe màu đỏ.
CHỨNG NHẬN VÀ CHẤT LƯỢNG
Với triết lý kinh doanh trên giá trị thật, CANIFA thiết lập hệ thống tiêu chuẩn chất lượng quốc tế áp dụng trên tất cả quy trình quản lý và kiểm soát chất lượng từ khâu chọn lọc nguyên phụ liệu cho đến khâu thiết kế và sản xuất.
Luôn cam kết mang đến khách hàng những sản phẩm an toàn với sức khỏe người tiêu dùng, hãng thời trang Canifa chỉ sử dụng những chất liệu tự nhiên an toàn trong mỗi thiết kế.
Sản phẩm Canifa đạt tiêu chuẩn Oeko Tex 100 được kiểm định về độ an toàn cho làn da của người sử dụng.
Và năm 2016, CANIFA tự hào đã đạt được chứng chỉ an toàn cấp độ cao nhất với dòng sản phẩm dành cho trẻ sơ sinh.
Cotton USA - hãng bông được cả thế giới tin dùng với quy trình canh tác bền vững để cho ra đời những sợi bông chất lượng tuyệt vời đưa đến sản phẩm thấm hút tốt, mát mẻ, chịu nhiệt và bền bỉ.
Với mong muốn mang đến sản phẩm chất lượng cho người Việt, CANIFA liên kết cùng tập đoàn Cotton USA mang đến nguyên liệu chất lượng Quốc tế cho người Việt.
Luôn quan tâm tới nhu cầu mặc đẹp, mặc mới và mặc an toàn mỗi ngày của khách hàng, ngoài an toàn về chất lượng sản phẩm.
CANIFA đã vượt qua quy trình nghiêm ngặt khắt khe về kiểm định sản xuất, nguyên vật liệu đầu vào và thành phẩm ra thị trường của tập đoàn quốc tế Disney, từ đó, ký kết chính thức là đối tác chiến lược giữa CANIFA và Disney tại Việt Nam.
Khi cầm trên tay những sản phẩm có biểu tượng Woolmark, bạn có thể yên tâm 100% về chất lượng hảo hạng của món đồ bạn sở hữu đạt chuẩn toàn cầu.
Chứng chỉ Quốc tế này được cấp cho các nhà sản xuất có đủ khả năng đáp ứng các tiêu chuẩn yêu cầu vô cùng nghiêm ngặt.
Từ 2014, CANIFA là nhãn hiệu Việt Nam đầu tiên vượt qua các tiêu chuẩn khắt khe của Woolmark để nhận được 02 chứng chỉ Quốc tế danh giá nhất dành cho sản phẩm len lông cừu là Woolmark và Woolmark Blend.
AWTA Ltd (Australian Wool Testing Authority) - Trung tâm kiểm soát chất lượng len lông cừu lớn nhất thế giới đã chính thức cấp chứng chỉ cho sản phẩm của CANIFA.
Những sản phẩm len lông cừu đạt chuẩn phải được kiểm duyệt từ nguyên liệu đầu vào.
CANIFA đầu tư xây dựng Tổ hợp XANH CANIFA theo tiêu chuẩn LEED.
Đây là tiêu chuẩn tiên phong cho các công trình tiết kiệm năng lượng và bảo vệ môi trường trường sống của con người.
Tuân theo tiêu chuẩn này, việc vận hành sản xuất của nhà máy được vận hành theo quy trình khép kín, xử lý nước thải thông minh để tái sử dụng tưới cây xanh cho Tổ hợp.
Chính việc nhận được Chứng chỉ LEED mang giá trị toàn cầu đã giúp Tổ Hợp XANH CANIFA không chỉ hoàn thành sứ mệnh Phản Ứng Nhanh, để phục vụ khách hàng tốt hơn, mà còn góp phần quan trọng trong việc phát triển xã hội bền vững, văn minh, bảo vệ môi trường sống của cộng đồng.
TOP
================================================================================
FILE: data/text/blog.txt
================================================================================
Skip to content
NỮ
NAM
BÉ GÁI
BÉ TRAI
SẢN PHẨM MỚI
Search for:
Trang chủ | Blog
CANIFA BLOG
Cung cấp những kiến thức, kinh nghiệm hữu ích về thời trang nam, nữ, bé trai và bé gái
Mặc đẹp
CNFLIFE
Kinh nghiệm
Search
BÀI VIẾT NỔI BẬT
Phối đồ
Áo len trễ vai mặc với gì? Bí quyết phối đồ cực hút mắt cho nàng
Áo len trễ vai mặc với gì là câu hỏi khiến nhiều cô nàng phân vân khi muốn thay đổi phong cách mới trong mùa lạnh. Điều tuyệt vời là item này cực kỳ dễ kết hợp với các kiểu trang phục khác nhau. Sau đây, bạn hãy cùng Canifa
03.11.2025
Phối đồ
Cách phối áo hoodie với áo khoác chuẩn phong cách cho nam và nữ
Phối áo hoodie với áo khoác là cách tuyệt vời để tạo nên một outfit vừa thoải mái, thời trang, vừa phù hợp với nhiều hoàn cảnh. Tuy nhiên, để thực sự nổi bật, bạn cần nắm được các nguyên tắc phối đồ cơ bản. Canifa sẽ giúp bạn khám
05.11.2025
Phối đồ
10+ cách phối áo khoác croptop đẹp chuẩn fashionista cho nàng
Cách phối áo khoác croptop đang trở thành xu hướng được yêu thích nhờ khả năng tạo tỷ lệ cơ thể hoàn hảo và phong cách thời trang năng động. Cùng Canifa khám phá những công thức phối đồ đỉnh cao giúp bạn tự tin tỏa sáng trong mọi hoàn
13.11.2025
Phối đồ
Gợi ý cách phối đồ chụp kỷ yếu cho nam đẹp và lịch lãm nhất
Mùa kỷ yếu đã đến rồi, các bạn nam sinh đã biết cách phối đồ chụp kỷ yếu cho nam sao cho đẹp hay chưa? Từ phong cách lịch lãm với vest, năng động với áo polo đến hoài cổ với dây quần tây, mỗi bộ trang phục đều mang
19.11.2025
BÀI VIẾT XEM NHIỀU NHẤT
Phối đồ
Đi Đà Lạt mặc gì? 20 Set đồ đi Đà Lạt cho nữ xinh, sống ảo
Bạn chưa biết đi Đà Lạt mặc gì cho đẹp mà lại có những bức ảnh sống ảo lung linh? Đọc ngay bài viết sau của Canifa sẽ đưa ra 20 gợi ý set đồ đi Đà Lạt cho nữ cực xinh giúp bạn đẹp trong mọi khung hình!
28.02.2025
Phối đồ
Đi đám cưới mặc gì? 15 cách phối đồ cho nữ đơn giản, sang
Bạn đang chưa biết "Đi đám cưới mặc gì"? Trong bài viết này Canifa cung cấp tới bạn 15 cách phối đồ cho nữ đơn giản, sang và cá tính để bạn có trang phục đi đám cưới cho nữ phù hợp nhất với mình nhé!
25.03.2025
Phối đồ
Đi Tà Xùa Mặc Gì? 20 Outfit Đi Tà Xùa Săn Mây Siêu Xinh
Có phải bạn đang thắc mắc đi Tà Xùa mặc gì để vừa có những bức ảnh đẹp mà vẫn giữ ấm, hợp thời trang? Cùng Canifa khám phá 20 outfit giúp bạn săn mây siêu xinh trong bài viết này nhé!
27.02.2025
Tư vấn chọn mua
[Giải đáp] Nên mua áo phao lông vũ hay trần bông?
Áo phao lông vũ và trần bông là hai loại áo khoác được mua nhiều trong mùa đông. Vậy nên mua áo phao lông vũ hay trần bông? Đọc ngay bài viết sau của Canifa để chọn được loại áo phù hợp nhất với bạn nhé!
26.12.2024
Mẹo hay
5 Cách Xử Lý Áo Lông Vũ Bị Vón Cục Hiệu Quả Ngay Tại Nhà
Cách xử lý áo lông vũ bị vón cục không còn là vấn đề khó khăn nếu bạn nắm vững được những mẹo đơn giản sau đây. Hãy cùng CANIFA khám phá những phương pháp hiệu quả giúp bạn khôi phục lại chiếc áo yêu thích nhé!
04.01.2025
Mẹo hay
Cách giặt áo len đúng cách không bị giãn, đẹp như mới
Biết cách giặt áo len đúng cách tại nhà sẽ giúp trang phục của bạn không bị giãn hay xù lông. Điều này cũng đảm bảo áo luôn bền đẹp và mang đến sự tự tin cho bạn khi mặc. Đọc ngay mẹo giặt áo len từ Canifa ngay thôi
25.12.2024
Phối đồ
Cách phối áo khoác ngoài áo dài mùa đông đẹp và tôn dáng nhất
Biết cách phối áo khoác với áo dài truyền thống giúp bạn tỏa sáng tôn lên nét đẹp thanh lịch, duyên dáng mà lại ấm áp trong mùa đông. Trong bài viết này Canifa sẽ bật mí tới bạn những gợi ý mặc áo dài với áo khoác đẹp cùng
15.01.2025
Canifa mách bạn
Phối Đồ Với Khăn Quàng Cổ Nam: Ấm Áp, Lịch Lãm Và Phong Cách
Phối đồ với khăn quàng cổ nam là một cách tuyệt vời để tạo điểm nhấn cho bộ trang phục và làm mới phong cách. Khăn quàng cổ không chỉ giữ ấm mà còn giúp chàng trai thể hiện cá tính mạnh mẽ, lịch lãm. Với các thiết kế đa
21.11.2024
Phối đồ
11 cách phối đồ với áo len cardigan ngắn cho nàng xinh ngoan yêu
Vào những ngày gió lạnh đầu mùa, phối đồ với áo len cardigan ngắn là lựa chọn được nhiều cô gái tin tưởng bởi sự đơn giản và tính ứng dụng cao. Chỉ cần nắm được vài tips cơ bản là bạn đã có thể tự tin xuống phố với
22.10.2025
BÀI VIẾT MỚI NHẤT​
Xem thêm
Tư vấn chọn mua
Top 15+ shop chuyên áo khoác len nữ cardigan đẹp cao cấp nhất
Khi tiết trời chuyển lạnh, cardigan là lựa chọn trang phục giữ ấm đảm bảo đủ tính thời trang và thanh lịch được nhiều cô nàng ưa chuộng. Nếu bạn đang tìm kiếm các shop chuyên áo khoác len nữ cardigan mẫu mã đẹp, chất lượng tốt mà giá phải
05.01.2026
Phối đồ
Học ngay cách mix đồ với áo cardigan dài đơn giản cho ngày lười
Có những ngày bạn chỉ muốn ra khỏi nhà thật nhanh mà vẫn cần một outfit gọn gàng và có gu. Vậy thì đừng bỏ qua hướng dẫn cách mix đồ với áo cardigan dài sau đây. Với khả năng biến hóa linh hoạt phù hợp với nhiều hoàn cảnh,
04.01.2026
Phối đồ, Thuật ngữ - Kiến thức
Áo peplum là gì? Áo peplum phối với gì giúp hack dáng eo thon?
Trong thế giới thời trang hiện đại, áo peplum đã trở thành món đồ không thể thiếu nhờ khả năng tôn eo và tạo dáng đồng hồ cát xuất sắc. Từ môi trường công sở đến dạo phố, thiết kế độc đáo này luôn giúp chị em tự tin và
03.01.2026
Tư vấn chọn mua
Các kiểu đầm hoa nhí đẹp và các cách phối đồ phù hợp nhất
Với những họa tiết nhỏ xinh, các kiểu đầm hoa nhí đẹp luôn khiến chị em trở nên mềm mại và thanh thoát hơn. Và nếu bạn vẫn chưa biết đâu là mẫu váy hoa nhí dành cho mình, thì bài viết sau đây của Canifa sẽ giúp bạn khám
02.01.2026
PHỐI ĐỒ
Xem thêm
Phối đồ
Học ngay cách mix đồ với áo cardigan dài đơn giản cho ngày lười
Có những ngày bạn chỉ muốn ra khỏi nhà thật nhanh mà vẫn cần một outfit gọn gàng và có gu. Vậy thì đừng bỏ qua hướng dẫn cách mix đồ với áo cardigan dài sau đây. Với khả năng biến hóa linh hoạt phù hợp với nhiều hoàn cảnh,
04.01.2026
Phối đồ, Thuật ngữ - Kiến thức
Áo peplum là gì? Áo peplum phối với gì giúp hack dáng eo thon?
Trong thế giới thời trang hiện đại, áo peplum đã trở thành món đồ không thể thiếu nhờ khả năng tôn eo và tạo dáng đồng hồ cát xuất sắc. Từ môi trường công sở đến dạo phố, thiết kế độc đáo này luôn giúp chị em tự tin và
03.01.2026
Phối đồ
Chân váy màu be phối với áo màu gì? Gợi ý outfit thanh lịch nhất
Chân váy màu be phối với áo màu gì đẹp nhất? Đâylà thắc mắc của nhiều chị em khi sở hữu item thanh lịch này. Màu be trung tính, dễ mặc nhưng cần biết cách phối hợp để trang phục thêm nổi bật và phù hợp từng hoàn cảnh. Dưới
25.12.2025
Phối đồ
Chân váy xám phối áo màu gì? 10 cách mix sang chảnh và có gu
Chân váy màu xám là item tương đối quen thuộc của phái đẹp, đặc biệt là những cô nàng công sở theo đuổi phong cách trưởng thành, thanh lịch. Vậy chân váy xám phối áo màu gì để trông thật sang trọng và chuyên nghiệp? Bạn sẽ cần nhiều hơn
24.12.2025
Phối đồ
Chân váy vàng phối áo màu gì? 10 gợi ý phối đồ cực cuốn hút
Chân váy vàng phối áo màu gì là câu hỏi được nhiều chị em quan tâm khi muốn tạo nên những bộ trang phục ấn tượng. Màu vàng tuy rực rỡ nhưng không phải lúc nào cũng dễ dàng trong việc phối đồ. Vì vậy, Canifa Fashion sẽ chia sẻ
23.12.2025
TƯ VẤN CHỌN MUA
Xem thêm
Tư vấn chọn mua
Top 15+ shop chuyên áo khoác len nữ cardigan đẹp cao cấp nhất
Khi tiết trời chuyển lạnh, cardigan là lựa chọn trang phục giữ ấm đảm bảo đủ tính thời trang và thanh lịch được nhiều cô nàng ưa chuộng. Nếu bạn đang tìm kiếm các shop chuyên áo khoác len nữ cardigan mẫu mã đẹp, chất lượng tốt mà giá phải
05.01.2026
Tư vấn chọn mua
Các kiểu đầm hoa nhí đẹp và các cách phối đồ phù hợp nhất
Với những họa tiết nhỏ xinh, các kiểu đầm hoa nhí đẹp luôn khiến chị em trở nên mềm mại và thanh thoát hơn. Và nếu bạn vẫn chưa biết đâu là mẫu váy hoa nhí dành cho mình, thì bài viết sau đây của Canifa sẽ giúp bạn khám
02.01.2026
Tư vấn chọn mua
Top 15 thương hiệu áo len nam nổi tiếng ở Việt Nam và thế giới
Khi tiết trời chuyển thu đông, áo len luôn là món đồ đầu tiên được nam giới nghĩ tới. Giữa vô vàn lựa chọn trên thị trường, các thương hiệu áo len nam nổi tiếng trong nước và quốc tế vẫn luôn nhận được sự tin tưởng của phái mạnh
31.12.2025
Tư vấn chọn mua
Khăn len màu gì dễ phối đồ? Gợi ý màu đẹp, dễ mặc nhất cho bạn
Mỗi độ đông về, khăn len lại trở thành phụ kiện thời trang không thể thiếu mỗi khi ra đường. Nhưng làm sao để chọn được màu sắc khăn len choàng cổ phù hợp để bạn luôn thời trang trong mọi set đồ? Bài viết sau đây của Canifa sẽ
28.12.2025
Kinh nghiệm, Tư vấn chọn mua
Hướng dẫn anh em cách chọn size áo len nam chuẩn và đẹp
Mỗi khi mùa lạnh về, áo len luôn là món đồ được anh em ưu ái hàng đầu bởi sự ấm áp, dễ phối và cực kỳ linh hoạt trong nhiều hoàn cảnh. Thế nhưng, chỉ cần chọn sai size áo len nam, tổng thể trang phục có thể trở
27.12.2025
TIN KHUYẾN MÃI
Xem thêm
Tin Khuyến Mại, Tin tức
Siêu lễ hội mua sắm – CANIFA x Tiktok Super Brand Day
Sự kiện mua sắm siêu hot cuối năm Canifa x TikTok Super Brand Day đã quay trở lại cùng hàng loạt ưu đãi không thể bỏ lỡ! Megalive duy nhất 03 ngày 15, 16, 17/12, BST Vietnam Youngster độc quyền, hàng ngàn sản phẩm giảm tới 70% và vô vàn
12.12.2025
Tin Khuyến Mại
Đại tiệc SALE 5/11 – Siêu ưu đãi thu đông cùng Canifa trên Lazada
Mùa lạnh gõ cửa, tủ đồ của bạn đã sẵn sàng “lột xác” chưa? Đừng bỏ lỡ Đại Tiệc Sale 5.11 trên Lazada – sự kiện ưu đãi khủng nhất mùa thu đông 2025 từ CANIFA! Chỉ duy nhất trong 24h ngày 5/11, hàng ngàn sản phẩm giảm đến 50%,
04.11.2025
Tin Khuyến Mại, Tin tức
Sale Mùa Hè Lớn Nhất Trên Lazada – Giảm Giá Đến 50% Toàn Bộ Sản Phẩm
Chỉ trong 1 ngày duy nhất – 2/6/2025, Canifa mang đến chương trình khuyến mãi khủng nhất năm dành cho cả gia đình. Hè này mặc đẹp không cần nghĩ, săn sale cực đỉnh – giảm giá lên tới 50%, voucher ngập tràn, quà tặng giá trị! SALE CANIFA X
30.05.2025
Tin Khuyến Mại
SIÊU SALE CANIFA TRÊN LAZADA: BÉ MẶC XINH YÊU – ĐÓN HÈ SÀNH ĐIỆU
Tham gia ngay chương trình khuyến mãi tháng 3 lớn nhất dành cho bé yêu "Bé mặc xinh yêu - Đón hè sành điệu" chỉ trong 1 ngày duy nhất - 19/03/2025. Ba mẹ thoải mái sắm đồ cho bé với mức giá tiết kiệm nhất. Xem ngay chương trình
17.03.2025
Tin Khuyến Mại
Rước Lộc Đầu Năm Cùng Canifa – Sở Hữu Ngay Chỉ Vàng 9999
Chào đón năm Ất Tỵ 2025 với thật nhiều tài lộc, Canifa mang đến chương trình khuyến mãi "Rước Lộc Đầu Năm" từ 14/02/2025 - 26/02/2025. Quý khách hàng nhanh tay mua sắm sản phẩm ưng ý và cơ hội trở thành chủ nhân sở hữu 01 CHỈ VÀNG 9999
21.02.2025
Thuật ngữ - Kiến thức, Tin Khuyến Mại
Ngày 11/11 là ngày gì? Bí quyết săn sale ưu đãi khủng ngày 11/11
Ngày 11/11 là ngày gì mà người người nhà nhà đều háo hức săn sale, chờ đón những ưu đãi khủng? Không chỉ là Lễ Độc Thân của giới trẻ, đây còn là một dịp mua sắm bùng nổ nhất trong năm. Hòa cùng không khí sôi động của ngày
11.11.2024
Tin Khuyến Mại
Canifa Chào Đông 2024 – Khoác Ấm Đón Đông, Sale Cực Đậm!
Chương trình khuyến mãi độc quyền lớn nhất mùa đông 2024 của Canifa trên Lazada sắp sửa tung loạt ưu đãi khủng. Đây không chỉ là cơ hội mua sắm thông minh mà còn giúp bạn sẵn sàng chào đón mùa đông với chi phí tiết kiệm tối đa. Hãy
30.10.2024
Tin Khuyến Mại
Chương Trình Khuyến Mãi Độc Quyền Canifa Trên Lazada – Sale Lớn Nhất Mùa Đông 2024
Mùa đông đang đến gần, đã đến lúc bạn cần chuẩn bị những trang phục ấm áp và phong cách cho cả gia đình. Canifa mang đến chương trình khuyến mãi cực khủng trên Lazada, với thông điệp “Khoác ấm đón đông – Canifa sale cực đậm”. Đây là cơ
28.10.2024
CÔNG TY CỔ PHẦN CANIFA
Số ĐKKD: 0107574310, ngày cấp: 23/09/2016, Nơi cấp: Sở Kế hoạch và đầu tư Hà Nội
Địa chỉ trụ sở: tại số 688 Đường Quang Trung, Phường La Khê, Quận Hà Đông, Thành phố Hà Nội.
Địa chỉ liên hệ: P301, tầng 3, tòa nhà GP Invest, số 170 La Thành, Phường Ô Chợ Dừa, Quận Đống Đa, Thành Phố Hà Nội.
Điện thoại: +8424 - 7303.0222
Fax: +8424 - 6277.6419
Email: hello@canifa.com
THƯƠNG HIỆU
Giới thiệu
Hệ thống cửa hàng
Tin tức
Tuyển dụng
Với cộng đồng
Liên hệ
HỖ TRỢ
Hỏi đáp
Điều kiện - Điều khoản KHTT
Chính sách KHTT
Chính sách vận chuyển
Chính sách bảo mật thông tin KH
Bảng kích cỡ
TẢI ỨNG DỤNG
PHƯƠNG THỨC THANH TOÁN
© 2023 CANIFA
================================================================================
FILE: data/text/chinh-sach-bao-mat.txt
================================================================================
search
Cửa hàng
Tài khoản
Giỏ hàng
SẢN PHẨM MỚI
NỮ
NAM
BÉ GÁI
BÉ TRAI
CANIFA S
LICENSE
SCHOOL
ĐỒNG PHỤC
BẢO MẬT THÔNG TIN KHÁCH HÀNG
Canifa cam kết xây dựng và công bố chính sách bảo mật thông tin khi thu thập và sử dụng thông tin cá nhân của người tiêu dùng với đầy đủ các nội dung sau:
A. Nguyên Tắc Chung:
Chính sách bảo mật thông tin này (“Chính Sách Bảo Mật Canifa”) mô tả cách thức Công ty Cổ phần anifa (“Canifa” hoặc “chúng tôi”) thu thập, tiếp nhận, tổng hợp, lưu giữ, sử dụng, xử lý, tiết lộ, chia sẻ và bảo đảm an toàn thông tin của các tổ chức, cá nhân (“Người dùng” hoặc “Quý Khách”), bao gồm khách hàng, đại lý, đối tác: (i) truy cập, sử dụng các kênh tương tác khách hàng thuộc sở hữu của Công Ty, bao gồm nhưng không giới hạn: ứng dụng di động Canifa, website www.canifa.com, và hội nhóm trên các trang mạng xã hội (như facebook, Instagram, Tiktok …) thuộc sở hữu của Công Ty (“Kênh Canifa”); (ii) là khách hàng thân thiết trong Chương trình Chăm Sóc Khách Hàng Thân Thiết của Canifa (“Chương Trình”); và/hoặc (iii) mua bán các loại hàng hóa do Canifa cung cấp hoặc (iv) thông qua các nhân viên dịch vụ khách hàng của chúng tôi, hoặc truy cập vào Nền Tảng của chúng tôi thông qua máy vi tính, thiết bị di động, hoặc bất kỳ thiết bị nào khác có kết nối Internet của Quý khách (mục (i), (ii) và (iii) gọi chung là “Dịch Vụ”). Vui lòng đọc kỹ Chính Sách Bảo Mật này, các điều khoản điều kiện tương ứng và các quy định khác (nếu có).
Chính Sách Bảo Mật Canifa bao gồm các nội dung sau:
Sự chấp thuận
Mục đích thu thập
Phạm vi thu thập
Thời gian lưu trữ
Không chia sẻ thông tin cá nhân khách hàng
An toàn dữ liệu
Quyền của Khách hàng đối với thông tin cá nhân
Trách nhiệm của khách hàng để đảm bảo bảo mật thông tin
Cách thức liên hệ với Canifa
Đơn vị thu thập và quản lý thông tin
Hiệu lực
B. Nội dung chi tiết
Sự Chấp Thuận
Vui lòng đọc kỹ chính sách bảo mật này. Bằng cách nhấp và đánh dấu vào các tuyên bố “Tiếp tục”, “Đồng ý”, “tôi đồng ý với chính sách bảo mật của Canifa” hoặc các tuyên bố tương tự được hiển thị tại trang đăng ký của Canifa hoặc trong quá trình cung cấp các dịch vụ hoặc quyền truy cập vào nền tảng cho Quý khách, Quý khách xác nhận rằng đã đọc và hiểu các điều khoản của chính sách bảo mật này và đã đồng ý và cho phép thực hiện việc thu thập, sử dụng, tiết lộ, lưu trữ, chuyển giao và/hoặc xử lý dữ liệu cá nhân của Quý khách như được mô tả và quy định tại chính sách bảo mật này.
Nếu Quý khách không đồng ý với Chính Sách này, Quý khách có thể dừng cung cấp cho Chúng tôi bất kỳ thông tin cá nhân nào và/hoặc sử dụng các quyền như được nêu tại mục 7 dưới đây.
Canifa bảo lưu quyền sửa đổi, bổ sung nhằm hoàn thiện đối với Chính sách này vào bất kỳ thời điểm nào. Chúng tôi khuyến khích Quý Khách thường xuyên xem lại Chính sách bảo mật thông tin Canifa để được cập nhật mới nhất đảm bảo Quý Khách đã biết và thực hiện quyền quản lý thông tin của mình.
Mục đích thu thập thông tin cá nhân khách hàng
Canifa thu thập thông tin người dùng nhằm phục vụ cho các mục đích:
Đơn hàng: để xử lý các vấn đề liên quan đến đơn đặt hàng của Quý khách;
Duy trì tài khoản: Để tạo và duy trì tài khoản của Qúy khách, bao gồm các chương trình khách hàng thân thiết, các chương trình khuyến mại,… đi kèm với tài khoản của Quý khách;
Cung cấp các dịch vụ/ tiện ích cho KH dựa trên nhu cầu và các thói quen của KH mua sắm tại Canifa;
Gửi thông báo Giới thiệu các sản phẩm, chương trình, dịch vụ mới của Canifa
Dịch vụ Người Dùng, Dịch vụ Chăm sóc khách hàng: bao gồm các phản hồi cho các yêu cầu, khiếu nại và phản hồi của Quý Khách;
An ninh: cho mục đích phát hiện, ngăn chặn các hoạt động giả mạo, chiếm dụng tài khoản của KHTT nhằm mục địch trục lợi, gian lận;
Theo yêu cầu của pháp luật: tùy quy định của pháp luật vào từng thời điểm, chúng tôi có thể thu thập, lưu trữ và cung cấp theo yêu cầu của cơ quan nhà nước có thẩm quyền.
Phạm vi thu thập
Các loại thông tin được chúng tôi thu thập và hình thức thu thập thông tin như sau:
Thông tin Quý khách cung cấp cho chúng tôi:
Đó là các thông tin cá nhân Quý khách cung cấp cho chúng tôi được thực hiện chủ yếu trên các kênh Canifa bao gồm bất kỳ thông tin, dữ liệu nào có thể được sử dụng để nhận dạng Quý Khách hoặc dựa vào đó mà Quý khách được xác định, chẳng hạn như họ tên, giới tính, ngày sinh, thông tin CMND/thẻ căn cước công dân/Hộ chiếu (nếu có), quốc tịch, hình ảnh cá nhân, thông tin mối quan hệ gia đình (cha mẹ, con cái), số điện thoại, chi tiết thẻ thanh toán và ngân hàng, địa chỉ email , thông tin đăng nhập tài khoản như tên đăng nhập, mật khẩu đăng nhập, ID/địa chỉ đăng nhập, câu hỏi/ trả lời bảo mật, các thông tin khác gắn liền với một con người cụ thể hoặc giúp xác định một con người cụ thể.
Thu thập và sử dụng Cookies
Canifa và các bên thứ ba mà Canifa hợp tác (nếu có) có thể sử dụng các phương thức tự động (gọi chung là “Cookies”) có liên quan đến việc sử dụng Kênh Canifa để nhận diện trình duyệt hoặc thiết bị của quý khách, tìm hiểu thêm về sở thích của Quý khách, cung cấp cho quý khách các tính năng và dịch vụ thiết yếu và cho các mục đích bổ sung khác. Cookies có thể chứa đựng các công cụ định danh độc nhất và được lưu trữ tại máy tính hoặc thiết bị di động của Quý khách, trong email mà Canifa gửi, trên các Kênh Canifa, và tại một số địa điểm khác. Cookies có thể truyền tải Thông Tin cá nhân và việc sử dụng Dịch Vụ.
Canifa có thể chia sẻ Thông Tin cá nhân thu thập qua Cookies không mang tính nhận dạng cá nhân với các bên thứ ba, chẳng hạn như dữ liệu vị trí, số nhận dạng quảng cáo hoặc số nhận dạng tài khoản chung (như địa chỉ email), để tạo điều kiện hiển thị quảng cáo.
Quý khách có thể quản lý Cookies trình duyệt bằng việc cài đặt trình duyệt của mình, chặn hoặc ngừng hoạt động Cookies, bằng cách xóa lịch sử trình duyệt và xóa bộ nhớ cache khỏi trình duyệt internet của mình. Quý khách cũng có thể giới hạn việc chia sẻ của chúng tôi về một số Thông Tin cá nhân này thông qua cài đặt thiết bị di động của mình. Nếu Quý khách tắt tất cả Cookies, cả chúng tôi và bên thứ ba sẽ không thể chuyển Cookies sang hoặc từ trình duyệt của quý khách. Tuy nhiên, nếu quý khách làm điều này, Quý khách có thể phải tự tay điều chỉnh một số tùy chọn mỗi khi quý khách truy cập lại vào Dịch Vụ và một số tính năng, kênh và dịch vụ có thể không hoạt động.
Thông tin từ các nguồn khác: Chúng tôi có thể thu thập thông tin cá nhân từ các nguồn hợp pháp khác như chương trình khuyến mại, khảo sát,…
Thời gian lưu trữ
Thông tin cá nhân của khách hàng sẽ được lưu trữ và bảo mật trên hệ thống của Canifa cho đến khi khách hàng tự đăng nhập và thực hiện hủy bỏ hoặc có yêu cầu Canifa hủy bỏ trên hệ thống. Trong mọi trường hợp, thông tin cá nhân của khách hàng sẽ được bảo mật trên máy chủ của canifa.com
Không chia sẻ thông tin cá nhân khách hàng
Chúng tôi sẽ không cung cấp thông tin cá nhân của Quý khách cho bất kỳ bên thứ ba nào, trừ một số hoạt động cần thiết sau:
Các bên cung cấp dịch vụ (ví dụ: đối tác trong các lĩnh vực như dịch vụ thanh toán, dịch vụ vận chuyển và giao nhận , tiếp thị, phân tích dữ liệu hoặc nghiên cứu khảo sát khách hàng, truyền thông xã hội, dịch vụ khách hàng, dịch vụ cài đặt, công nghệ thông tin và, dịch vụ lưu trữ web)
Yêu cầu pháp lý: Canifa có thể tiết lộ các thông tin cá nhân nếu điều đó do luật pháp yêu cầu và việc tiết lộ như vậy là cần thiết để tuân thủ quy trình pháp lý
Chuyển giao kinh doanh (nếu có): trong trường hợp sáp nhập, hợp nhất toàn bộ hoặc một phần với công ty khác.
An toàn dữ liệu
Canifa luôn nỗ lực để giữ an toàn thông tin cá nhân của KH, Chúng tôi đã và đang thực hiện nhiều biện pháp an toàn, bao gồm:
Bảo đảm an toàn trong môi trường vận hành: Canifa lưu trữ thông tin cá nhân khách hàng trong môi trường vận hành an toàn và chỉ có nhân viên, đại diện có thể truy cập trên cơ sở cần phải biết. Canifa tuân theo các tiêu chuẩn ngành, pháp luật trong việc bảo mật thông tin cá nhân KH.
Trong trường hợp máy chủ lưu trữ thông tin bị hacker tấn công dẫn đến mất mát dữ liệu Thông tin KH, Canifa sẽ có trách nhiệm thông báo vụ việc cho cơ quan chức năng điều tra xử lý kịp thời và thông báo cho KH được biết.
Canifa cam kết bảo mật mọi thông tin giao dịch trực tuyến của KH. Mọi Thông Tin KH, cũng như các thông tin trao đổi giữa KH và Canifa đều được lưu giữ và bảo mật bởi hệ thống của Canifa.
Canifa có các biện pháp thích hợp về kỹ thuật và an ninh để ngăn chặn việc truy cập, sử dụng trái phép Thông Tin KH. Tuy nhiên, Quý khách nên hiểu rằng không có phương thức truyền tải nào qua Internet hoặc phương thức lưu trữ điện tử là an toàn tuyệt đối. Mặc dù việc bảo mật không thể đảm bảo tuyệt đối, nhưng chúng tôi nỗ lực để bảo vệ an toàn thông tin của Quý khách và liên tục rà soát và nâng cấp các biện pháp bảo mật thông tin của chúng tôi.
Quyền của Khách hàng đối với thông tin cá nhân
KH có quyền cung cấp thông tin cá nhân cho chúng tôi và có quyền thay đổi quyết định đó bất kỳ lúc nào.
KH có quyền tự truy cập, kiểm tra, cập nhật, điều chỉnh, xóa hoặc hủy bỏ Thông tin cá nhân của mình bằng cách đăng nhập vào tài khoản trên Website/ Ứng dụng Canifa để chỉnh sửa thông tin cá nhân hoặc yêu cầu Canifa thực hiện việc này. Dữ liệu không được xóa được bao gồm: số điện thoại.
Đối với các nội dung khác ngoài những nội dung quy định tại Chính Sách Bảo Mật Canifa liên quan đến thu thập, xử lý và sử dụng thông tin cá nhân của KH sẽ được thực hiện theo quy định của pháp luật có hiệu lực tại thời điểm tương ứng.
KH được quyền rút lại sự đồng ý của mình, trừ trường hợp luật có quy định khác. Cụ thể:
Việc rút lại sự đồng ý không ảnh hưởng đến tính hợp pháp của việc xử lý dữ liệu đã được đồng ý trước khi rút lại sự đồng ý.
Việc rút lại sự đồng ý phải được thể hiện ở một định dạng có thể được in, sao chép bằng văn bản, bao gồm cả dưới dạng điện tử hoặc định dạng kiểm chứng được.
- KH được yêu cầu hạn chế xử lý dữ liệu cá nhân của mình, trừ trường hợp luật có quy định khác; Việc hạn chế xử lý dữ liệu được thực hiện trong 72 giờ sau khi có yêu cầu của KH dữ liệu, với toàn bộ dữ liệu cá nhân mà chủ thể dữ liệu yêu cầu hạn chế, trừ trường hợp luật có quy định khác.
- KH được quyền yêu cầu Canifa cung cấp cho bản thân dữ liệu cá nhân của mình, trừ trường hợp luật có quy định khác.
KH được phản đối Canifa xử lý dữ liệu cá nhân của mình nhằm ngăn chặn hoặc hạn chế tiết lộ dữ liệu cá nhân hoặc sử dụng cho mục đích quảng cáo, tiếp thị, trừ trường hợp luật có quy định khác. Canifa thực hiện yêu cầu của KH trong 72 giờ sau khi nhận được yêu cầu, trừ trường hợp luật có quy định khác.
KH có quyền khiếu nại, tố cáo hoặc khởi kiện theo quy định của pháp luật. KH có quyền yêu cầu bồi thường thiệt hại theo quy định của pháp luật khi xảy ra vi phạm quy định về bảo vệ dữ liệu cá nhân của mình, trừ trường hợp các bên có thỏa thuận khác hoặc luật có quy định khác. KH có quyền tự bảo vệ theo quy định của Bộ luật Dân sự, luật khác có liên quan và Nghị định 13/2023/NĐ-CP, hoặc yêu cầu cơ quan, tổ chức có thẩm quyền thực hiện các phương thức bảo vệ quyền dân sự.
Trách nhiệm của Khách hàng để đảm bảo bảo mật thông tin
KH có trách nhiệm bảo vệ thông tin tài khoản của mình và không cung cấp bất kỳ thông tin nào liên quan đến tài khoản và mật khẩu truy cập tài khoản Canifa cho bên nào khác. Trường hợp KH tiết lộ thông tin dẫn đến thiệt hại, Canifa sẽ không chịu bất kỳ trách nhiệm nào đối với tất cả những vấn đề phát sinh.
Canifa không chịu trách nhiệm về những vấn đề phát sinh khi KH truy cập vào website, ứng dụng di động, các kênh truyền thông khác không phải là website, ứng dụng di động, kênh truyền thông chính thức của Công ty.
KH tuyệt đối không được có bất kỳ hành vi sử dụng công cụ, chương trình để can thiệp trái phép vào hệ thống của Canifa, cũng như bất kỳ hành vi nào khác nhằm phát tán, cổ vũ cho các hoạt động với mục đích can thiệp, phá hoại hay xâm nhập vào dữ liệu của website hoặc ứng dụng Canifa, cũng như các hành vi mà pháp luật Việt Nam nghiêm cấm. Trong trường hợp Canifa phát hiện KH có hành vi cố tình giả mạo, gian lận, phát tán các thông tin trái phép,…Canifa có toàn quyền chuyển thông tin KH cho các cơ quan có thẩm quyền để xử lý theo quy định pháp luật.
Cách thức liên hệ với Canifa
Bất kỳ khi nào KH cần hỗ trợ, hãy liên hệ với của Canifa:
Hỗ trợ mua Online: 1800.6061 / Email: saleonline@canifa.com
Liên hệ Chăm sóc KH: 18006061/ Email: chamsockhachhang@canifa.com
Văn phòng miền Bắc: +8424-7303.0222/ Email: hello@canifa.com
Văn phòng miền Nam: +8428 3824.7141/ Email: infocanifa@canifa.com
KH có quyền gửi khiếu nại về việc bị lộ thông tin cá nhân cho bên thứ ba đến Ban quản trị của Ứng dụng Canifa hoặc đến địa chỉ công ty hoặc phản ánh qua mail: chamsockhachhang@canifa.com. Khi tiếp nhận những phản hồi này, Công ty sẽ xác nhận lại thông tin, có trách nhiệm trả lời lý do và hướng dẫn KH khôi phục và bảo mật lại thông tin.
Canifa có trách nhiệm thực hiện các biện pháp kỹ thuật, nghiệp vụ để xác minh các nội dung được phản ánh trong vòng 15 ngày.
Đơn vị thu thập và quản lý thông tin
Công ty Cổ phần Canifa
Số ĐKKD: 0107574310, ngày cấp: 23/09/2016, nơi cấp: Sở Kế hoạch và đầu tư Hà Nội
Trụ sở chính: Số 688, Đường Quang Trung, Phường La Khê, Quận Hà Đông, Hà Nội, Việt Nam
Địa chỉ liên hệ: Phòng 301 Tòa nhà GP Invest, 170 La Thành, P. Ô Chợ Dừa, Q. Đống Đa, Hà Nội
Hiệu lực
Chính sách bảo mật thông tin này có hiệu lực từ ngày 01/07/2023.
TOP
================================================================================
FILE: data/text/cua-hang-html.txt
================================================================================
search
Cửa hàng
Tài khoản
Giỏ hàng
SẢN PHẨM MỚI
NỮ
NAM
BÉ GÁI
BÉ TRAI
CANIFA S
LICENSE
SCHOOL
ĐỒNG PHỤC
Trang chủ
Hệ thống cửa hàng
110
Hệ thống cửa hàng trên toàn quốc
Canifa hướng đến mục tiêu mang lại niềm vui mặc mới mỗi ngày cho hàng triệu người tiêu dùng Việt. Chúng tôi tin rằng người dân Việt Nam cũng đang hướng đến một cuộc sống năng động, tích cực hơn.
Tìm kiếm cửa hàng
Lựa chọn Tỉnh / Thành Phố
Hà Nội
Bắc Ninh
Hưng Yên
Hồ Chí Minh
Thái Bình
Nghệ An
Hải Phòng
Thanh Hoá
Quảng Ninh
Phú Thọ
Hòa Bình
Sơn La
Quảng Bình
Vĩnh Phúc
Đà Nẵng
Bình Dương
Hải Dương
Bình Phước
Nam Định
Hà Tĩnh
Đồng Nai
Lào Cai
Lâm Đồng
Cao Bằng
Gia Lai
Thái Nguyên
Bà Rịa – Vũng Tàu
Tuyên Quang
Điện Biên
Bắc Giang
Lạng Sơn
Đắk Lắk
Ninh Bình
Hà Nam
Trà Vinh
Lựa chọn Quận / Huyện
Quận Ba Đình
Quận Cầu Giấy
Quận Long Biên
Quận Hai Bà Trưng
Huyện Thanh Trì
Quận Hà Đông
Quận Thanh Xuân
Huyện Thạch Thất
Huyện Đan Phượng
Huyện Thường Tín
Quận Nam Từ Liêm
Huyện Quốc Oai
Thị xã Sơn Tây
Quận Tây Hồ
Quận Hoàng Mai
Huyện Gia Lâm
Huyện Đông Anh
Huyện Hoài Đức
Huyện Chương Mỹ
Huyện Ứng Hòa
Quận Bắc Từ Liêm
Quận Đống Đa
CANIFA Lotte Liễu Giai
F3-A02 & F3-C06 tầng 3, Lotte Center Hanoi, 54 Đường Liễu Giai
09:30 - 22:00
Đang mở
ĐT: (+84) - 024 7300 0166
Chỉ đường
CANIFA - 335 Cầu Giấy
335 Cầu Giấy, P. Quan Hoa
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7301 5866
Chỉ đường
CANIFA Aeon mall Long Biên
T247, tầng 2 TTTM Aeon Mall Long Biên, P. Long Biên
10:00 - 22:00
Đang mở
ĐT: (+84) - 02473 053 866
Chỉ đường
CANIFA Times City
40-42 đường Tương Lai, tầng B1 TTTM Times city, 458 Minh Khai
09:30 - 22:00
Đang mở
ĐT: (+84) - 024 7305 2866
Chỉ đường
CANIFA - Thanh Trì (Đại lý)
Đường mới, xóm chùa, Ngũ Hiệp
09:00 - 22:00
Đang mở
ĐT: (+84) - 0898 543 536
Chỉ đường
CANIFA 171 Trần Phú
171 Đường Trần Phú
09:00 - 22:30
Đang mở
ĐT: (+84) - 0247 302 1866
Chỉ đường
CANIFA - TTTM Royal city
B2-R6-43-44 TTTM Royal city, 72 Nguyễn Trãi
10:00 - 22:00
Đang mở
ĐT: (+84) - 024 7307 4866
Chỉ đường
CANIFA - Bình Phú, Thạch Thất (Đại lý)
48 Thái Hòa - Bình Phú
09:00 - 22:00
Đang mở
ĐT: (+84) - 0989 758 822
Chỉ đường
CANIFA - 133 Tây Sơn, Đan Phượng (Đại lý)
133 Tây Sơn (cạnh Techcombank), Thị Trấn Phùng
09:00 - 22:00
Đang mở
ĐT: (+84) - 0392 661 983
Chỉ đường
CANIFA - 304 Phố Ga, Thường Tín (Đại lý)
304 Phố Ga - TT Thường Tín
09:00 - 22:00
Đang mở
ĐT: (+84) - 0932 378 856
Chỉ đường
CANIFA - 247 Hồ Tùng Mậu
247 Hồ Tùng Mậu, P. Cầu Diễn
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7306 4866
Chỉ đường
CANIFA - Quốc Oai (Đại lý)
56 Phố Đồng Hương - Thị Trấn Quốc Oai
09:00 - 22:00
Đang mở
ĐT: (+84) - 0969 547 895
Chỉ đường
CANIFA - 276 Chùa Thông
276 Chùa Thông
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7304 2688
Chỉ đường
CANIFA - Aeon mall Hà Đông
T211, Tầng 2 TTTM Aeon Mall Hà Đông, P.Dương Nội
10:00 - 22:00
Đang mở
ĐT: (+84) - 024 7303 2688
Chỉ đường
CANIFA - 447 Lạc Long Quân
447 Lạc Long Quân
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7307 1866
Chỉ đường
CANIFA - 24 Nguyễn Hữu Thọ
24 Nguyễn Hữu Thọ, Hoàng Liệt
09:00 - 22:30
Đang mở
ĐT: (+84) - 0247 3002 866
Chỉ đường
CANIFA - 38 Kim Đồng, Hà Nội
38 Kim Đồng
09:00 - 22:30
Đang mở
ĐT: (+84) - 0247 3005 866
Chỉ đường
Canifa 24 Nguyễn Cơ Thạch
24 Nguyễn Cơ Thạch
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7304 7866
Chỉ đường
CANIFA - Center Point – 27 Lê Văn Lương
Center Point – 27 Lê Văn Lương, P. Nhân Chính
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7304 5866
Chỉ đường
CANIFA - Bà Triệu, Hà Nội
69 - 73 Bà Triệu
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7305 1866
Chỉ đường
CANIFA - 164 Ngô Xuân Quảng, Hà Nội (Đại lý)
164 Ngô Xuân Quảng
09:00 - 22:30
Đang mở
ĐT: (+84) -
Chỉ đường
CANIFA - Đông Anh, Hà Nội
59 Cao Lỗ, Uy Nỗ
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7301 4866
Chỉ đường
CANIFA - Liên Quan,Thạch Thất (Đại lý)
Tổ dân phố khu Phố, thị trấn Liên Quan
08:00 - 22:00
Đang mở
ĐT: (+84) - 0979 014 638
Chỉ đường
CANIFA - Geleximco An Khánh
LK 14 - Lô 22, KĐT mới Gleximco A, An Khánh
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 73 060 866
Chỉ đường
CANIFA - Chúc Sơn (Đại lý)
86 Bắc Sơn, TT Chúc Sơn, Chương Mỹ, Hà Nội
09:00 - 22:00
Đang mở
ĐT: (+84) - 0934551005
Chỉ đường
CANIFA - Trạm Trôi, Hoài Đức, Hà Nội (Đại lý)
Khu 7, thị trấn Trạm Trôi
08:00 - 22:00
Đang mở
ĐT: (+84) - 0976 966 884
Chỉ đường
CANIFA - Vân Đình, Ứng Hoà, Hà Nội (Đại lý)
288 Lê Lợi, thị trấn Vân Đình
08:00 - 22:00
Đang mở
ĐT: (+84) - 0375131003
Chỉ đường
CANIFA - Bắc Từ Liêm (Đại lý)
32 phố Nhổn
09:00 - 22:00
Đang mở
ĐT: (+84) - 0962 906 789
Chỉ đường
Canifa - Yên Xá, Thanh Trì
Số 68 đường 70, Tân Triều
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 73 067 866
Chỉ đường
CANIFA - 168 Nguyễn Khánh Toàn
168 Nguyễn Khánh Toàn, p. Quan Hoa
09:00 - 22:00
Đang mở
ĐT: (+84) - 024 7304 0866
Chỉ đường
CANIFA - 139 Bạch Mai
139 Bạch Mai, P. Thanh Nhàn
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7306 1866
Chỉ đường
CANIFA - 152 Cao Lỗ
152 Cao Lỗ, Uy Nỗ
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7307 3866
Chỉ đường
CANIFA - Ba Đình
Số 6 Điện Biên Phủ, Ba Đình
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7303 3866
Chỉ đường
CANIFA - Tasco Mall Long Biên
7-9 Nguyễn Văn Linh, Gia Thụy
09:00 - 22:00
Đang mở
ĐT: (+84) - 024 7305 5688
Chỉ đường
CANIFA Lotte Liễu Giai T05
F5-B16-B17 tầng 05, Lotte Center Hanoi, 54 Đường Liễu Giai
09:30 - 22:00
Đang mở
ĐT: (+84) - 024 7300 0166
Chỉ đường
CANIFA KIDS - LITTLE SAM (Đại lý)
314 tầng 3 TTTM The Loop, 241 Xuân Thuỷ, phường Cầu Giấy
10:00 - 22:00
Đang mở
ĐT: (+84) - 0333 424 955
Chỉ đường
CANIFA - Xã Đàn, Hà Nội
65-67 Xã Đàn, Phường Kim Liên, Quận Đống Đa
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7305 5166
Chỉ đường
CANIFA - 440 Quang Trung Hà Đông
440 Quang Trung
09:00 - 22:30
Đang mở
ĐT: (+84) - 0247 307 5866
Chỉ đường
Canifa - Go! Thăng Long
1S22 TTTM Go! Thăng Long, số 222 đường Trần Duy Hưng, P. Yên Hòa
08:00 - 22:00
Đang mở
ĐT: (+84) - 024 7301 3566
Chỉ đường
CANIFA 181 Giảng Võ
181 Đường Giảng Võ
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7301 2866
Chỉ đường
CANIFA 121 - 123 Chùa Bộc
121 - 123 Đường Chùa Bộc
09:00 - 22:30
Đang mở
ĐT: (+84) - 024 7302 3688
Chỉ đường
CANIFA 554 Nguyễn Văn Cừ
554 Đường Nguyễn Văn Cừ
09:00 - 22:30
Đang mở
ĐT: (+84) - 0247 305 9866
Chỉ đường
Hệ thống cửa hàng
Hà Nội
Bắc Ninh
Hưng Yên
Hồ Chí Minh
Thái Bình
Nghệ An
Hải Phòng
Thanh Hoá
Quảng Ninh
Phú Thọ
Hòa Bình
Sơn La
Quảng Bình
Vĩnh Phúc
Đà Nẵng
Bình Dương
Hải Dương
Bình Phước
Nam Định
Hà Tĩnh
Đồng Nai
Lào Cai
Lâm Đồng
Cao Bằng
Gia Lai
Thái Nguyên
Bà Rịa – Vũng Tàu
Tuyên Quang
Điện Biên
Bắc Giang
Lạng Sơn
Đắk Lắk
Ninh Bình
Hà Nam
Trà Vinh
CỬA HÀNG NỔI BẬT
CANIFA 554 Nguyễn Văn Cừ
554 Đường Nguyễn Văn Cừ
ĐT: 0247 305 9866
Giờ mở cửa: 09:00 - 22:30
CANIFA 121 - 123 Chùa Bộc
121 - 123 Đường Chùa Bộc
ĐT: 024 7302 3688
Giờ mở cửa: 09:00 - 22:30
CANIFA 181 Giảng Võ
181 Đường Giảng Võ
ĐT: 024 7301 2866
Giờ mở cửa: 09:00 - 22:30
TOP
================================================================================
FILE: data/text/dieu-kien-dieu-khoan-khtt-html.txt
================================================================================
search
Cửa hàng
Tài khoản
Giỏ hàng
SẢN PHẨM MỚI
NỮ
NAM
BÉ GÁI
BÉ TRAI
CANIFA S
LICENSE
SCHOOL
ĐỒNG PHỤC
ĐIỀU KIỆN - ĐIỀU KHOẢN CHÍNH SÁCH KHÁCH HÀNG THÂN THIẾT
Áp dụng trên hệ thống cửa hàng Canifa toàn quốc cho đến khi có thông báo mới.
Chữ viết tắt:
Chữ viết tắt Giải nghĩa
CBNV Cán bộ nhân viên
CSKH Chăm sóc Khách hàng
CBLQ Các bên liên quan
TN CSKH Trưởng nhóm Chăm sóc khách hàng
NVCH Nhân viên Cửa hàng
KH Khách hàng
KHTT Khách hàng thân thiết
1. PHẠM VI ÁP DỤNG:
1.1. 1.1. Điều kiện – Điều khoản (“ĐKĐK”) Chính sách Khách hàng của (“Chương trình”) này được áp dụng đối với Khách hàng thành viên (KHTV) và Công ty Cổ phần Canifa
1.2. KHTV là tất cả các cá nhân từ đủ 15 tuổi trở lên đăng ký hợp lệ tham gia Chương Trình, sở hữu tài khoản định danh khách hàng Canifa (“Tài Khoản”) và đã kích hoạt, sở hữu thẻ khách hàng thân thiết (“Thẻ Canifa”), bao gồm thẻ vật lý và/hoặc ứng dụng di động Canifa và/hoặc tài khoản của khách hàng trên website canifa.com (“Trang Web”) do Canifa quản lý vận hành và khai thác hoặc một hình thức khác theo quy định của Chương Trình tùy từng thời điểm.
1.3. Bằng việc tham gia Chương Trình, KHTV thừa nhận đã đọc, hiểu và đồng ý với ĐKĐK này và toàn bộ các chính sách của Chương Trình được công bố công khai trên Trang Web và sẽ được cập nhật tùy từng thời điểm. Nếu KHTV là người chưa đủ 15 tuổi hoặc khó khăn trong nhận thức, làm chủ hành vi hoặc hạn chế năng lực hành vi dân sự theo quy định pháp luật, KHTV cần nhận được sự hỗ trợ hoặc chấp thuận từ cha mẹ, người đại diện theo pháp luật, tùy từng trường hợp áp dụng, để đăng ký tham gia Chương Trình và mở Tài Khoản. Trong trường hợp đó, cha mẹ hoặc người đại diện theo pháp luật khác, tùy từng trường hợp áp dụng, cần hỗ trợ để KHTV hiểu rõ, đồng ý và thay mặt chấp nhận những ĐKĐK của Chương Trình này, chịu trách nhiệm đối với toàn bộ quá trình sử dụng Tài Khoản hoặc các dịch vụ của Canifa.
2. Quyền và trách nhiệm của KHTT, Canifa
2.1. KHTV sẽ được hưởng các quyền lợi cơ bản của chủ Thẻ Canifa /chủ Tài Khoản và các ưu đãi riêng tùy vào phân hạng KHTV theo nội dung Chương Trình được công bố công khai trên Trang Web, bao gồm nhưng không giới hạn các quyền lợi sau: (1) Được thăng hạng và nhận ưu đãi; (2) Tham gia các chương trình khuyến mại/ưu đãi dành riêng cho chủ Thẻ Canifa /chủ Tài Khoản từ Canifa.
2.2. KHTV có quyền truy cập, tra cứu thông tin cá nhân, hạng thành viên, giá trị tích lũy trong Tài Khoản thông qua các phương thức khác nhau như liên hệ nhân viên CSKH/ NV Thu ngân hoặc Trang Web hoặc ứng dụng di động Canifa.
2.3. KHTV tự chịu trách nhiệm cho bất kỳ và tất cả các chi phí, thuế, phí, khiếu nại hoặc nợ phải trả (nếu có) phát sinh từ việc được hưởng các lợi ích từ Chương Trình trong chính sách khách hàng.
2.4. Mỗi KH hiểu, cam kết và bảo đảm là chủ sử dụng duy nhất của Thẻ Canifa /Tài Khoản, có trách nhiệm tự bảo quản Thẻ và bảo mật thông tin Tài Khoản của mình. KH không được cung cấp thông tin Thẻ/Tài Khoản của mình cho bất kỳ bên thứ ba nào và tự chịu trách nhiệm nếu thực hiện không đúng quy định này.
2.5. KH đồng ý cho Canifa khởi tạo, lưu trữ, duy trì, cập nhật và xử lý các dữ liệu thông tin cá nhân do KH cung cấp, cập nhật và những thông tin phát sinh từ việc KH tham gia mở và sử dụng tài khoản (“Dữ Liệu”) và đồng ý cho Canifa sử dụng các Dữ Liệu này cho các mục đích, bao gồm nhưng không giới hạn: Phục vụ KH thực hiện các giao dịch theo quy định của tài khoản, giới thiệu các sản phẩm, dịch vụ mới của Canifa. Tất cả các Dữ Liệu sẽ được bảo vệ và được sử dụng theo quy định tại Chính sách bảo mật và chia sẻ thông tin được công bố công khai trên Trang Web và cập nhật tùy từng thời điểm.
2.6. Trường hợp thông tin cá nhân của KH có thay đổi so với thông tin đã đăng ký, KH có nghĩa vụ cập nhật kịp thời thông tin thay đổi qua Trang Web, Mobile App Canifa, Tổng Đài, cửa hàng Canifa để tránh việc sử dụng Thẻ/Tài khoản trái quy định. Canifa không chịu trách nhiệm đối với các sai sót, mất mát và các thiệt hại phát sinh từ hoặc liên quan đến KH do thông tin không được cập nhật kịp thời theo quy định tại ĐKĐK này.
2.7. Mọi thông báo/khiếu nại của KH đến Canifa phải được thực hiện thông qua Tổng Đài, email của Phòng Phát triển khách hàng, hệ thống cửa hàng của Canifa hoặc các hình thức khác theo quy định của Canifa tùy từng thời điểm.
2.8. Canifa có quyền đề nghị KH cung cấp thông tin và/hoặc xuất trình giấy tờ cá nhân hợp lệ ngay khi Canifa phát hiện KH thực hiện các hành vi quy định tại điều II.11 hoặc được nhận các ưu đãi trong một số trường hợp.
2.9. Canifa được miễn trách nhiệm trong trường hợp: (1) Hệ thống xử lý dữ liệu, phần mềm, hệ thống truyền tín hiệu gặp sự cố, bị lỗi, bị tấn công hoặc vì bất kỳ lý do khách quan nào khác nằm ngoài khả năng kiểm soát của Canifa; (2) Khi Thẻ bị lợi dụng trong trường hợp Thẻ bị mất cắp/thất lạc/lộ thông tin Tài Khoản mà chủ thẻ không kịp thời thông báo cho Canifa.
2.10. Canifa không chịu trách nhiệm trong trường hợp Khách hàng làm mất điện thoại, mất sim điện thoại dẫn đến thông tin tài khoản bị lộ mà chủ tài khoản không thông báo mất tài khoản tới Canifa.
2.11. Canifa được quyền từ chối cung cấp, hủy, truy đòi hoặc thu hồi những ưu đãi, điểm trong Tài Khoản đã hoặc sẽ nhận được theo các chương trình ưu đãi, khuyến mại mà không cần thông báo trước với KH trong các trường hợp: (1) Canifa không thể chuyển điểm/ ưu đãi cho khách hàng do các nguyên nhân khách quan nằm ngoài sự kiểm soát của Canifa; (2) Điểm được ghi có không chính xác, không hợp lệ vào Tài Khoản theo quy định; (3) KH có dấu hiệu sử dụng các công cụ hoặc phương thức gian lận nhằm trục lợi; (4) KH vi phạm các quy định của Chương trình/Chính sách ưu đãi được Canifa thông báo tại từng thời điểm; (5) Trong trường hợp bất khả kháng theo quy định pháp luật.
2.12. Canifa không chịu trách nhiệm cho bất kỳ tổn thất hoặc thiệt hại, dù trực tiếp hay gián tiếp của KH liên quan đến các chương trình ưu đãi khác, bao gồm nhưng không giới hạn trường hợp bất khả kháng theo quy định của pháp luật.
3. Chấm dứt quyền KHTT
Quyền KHTV theo Chương Trình có giá trị vô thời hạn trừ khi bị chấm dứt trong những trường hợp sau:
3.1. KHTV gửi yêu cầu chấm dứt cho Canifa qua địa chỉ liên lạc/email chính thức được đăng tải tại Trang Web.
3.2. KHTV cố ý sử dụng Thẻ/Tài Khoản sai quy định của Chương Trình và vi phạm ĐKĐK này.
3.3. KHTV qua đời hoặc các trường hợp chấm dứt khác theo quy định của pháp luật.
3.4. Khi Chương Trình chấm dứt vì bất cứ lý do gì.
3.5. Chấm dứt trong các trường hợp khác theo quy định của Chương Trình và ĐKĐK này.
3.6. Canifa bảo lưu quyền chấm dứt Chương Trình bằng cách thông báo cho tất cả KHTV trước 30 ngày thông qua Trang Web và/hoặc một phương thức phù hợp khác. Phương án giải quyết đối với các quyền lợi của KHTV của Chương Trình sẽ được công bố cùng thông báo chấm dứt Chương Trình.
4. Điều khoản chung
4.1. Tùy thuộc điều kiện thực tế, ĐKĐK của Chương Trình và các chính sách khác được công bố trên Trang Web có thể được sửa đổi/điều chỉnh/chấm dứt theo quyết định riêng của Canifa và sẽ được thông báo cho KHTV trên Trang Web.
4.2. Giải quyết tranh chấp: ĐKĐK này được điều chỉnh bởi pháp luật Việt Nam. Tất cả các tranh chấp phát sinh từ hoặc liên quan đến ĐKĐK này sẽ được các bên cố gắng giải quyết thông qua thương lượng. Trường hợp thương lượng đàm phán không thành công trong vòng 30 (ba mươi) ngày, các Bên sẽ có quyền đưa tranh chấp ra giải quyết tại tòa án có thẩm quyền tại Việt Nam theo quy định của pháp luật.
KHÁM PHÁ TIỆN ÍCH
CHỈ CÓ TRÊN APP
Ưu đãi độc quyền
cho thành viên
Nhận thông báo
sản phẩm mới và
khuyến mãi
Mua sắm tiện lợi
qua video call
với C-live
Quét mã vạch
kiểm tra hàng
tại cửa hàng
QUÉT MÃ
TẢI APP
HỆ THỐNG CỬA HÀNG
Tìm kiếm cửa hàng gần bạn!
Xem danh sách
ĐĂNG KÝ NHẬN BẢN TIN
Cập nhật những thông tin mới nhất về ưu đãi, thời trang và phong cách sống.
Đăng ký ngay
CÔNG TY CỔ PHẦN CANIFA
Số ĐKKD: 0107574310, ngày cấp: 23/09/2016
Nơi cấp: Sở Kế hoạch và đầu tư Hà Nội.
Trụ sở chính: số 688 Đường Quang Trung, P. Hà Đông, TP. Hà Nội.
Địa chỉ: Phòng 301, tầng 3, tòa nhà GP Invest, số 170 La Thành, P. Ô Chợ Dừa, TP. Hà Nội.
Điện thoại: 024 - 7303.0222
Fax: 024 - 6277.6419
Email: hello@canifa.com
THƯƠNG HIỆU
Giới thiệu
Hệ thống cửa hàng
Tin tức
Tuyển dụng
Với cộng đồng
Liên hệ
HỖ TRỢ
Hỏi đáp
Điều kiện - Điều khoản KHTT
Chính sách KHTT
Chính sách vận chuyển
Chính sách bảo mật thông tin KH
Tra cứu đơn hàng
Bảng kích cỡ
TÀI KHOẢN
Đăng nhập/ Đăng ký
Mã ưu đãi
Lịch sử đặt hàng
THEO DÕI CHÚNG TÔI
PHƯƠNG THỨC THANH TOÁN
© 2025 CANIFA
TOP
================================================================================
FILE: data/text/gioi-thieu-html.txt
================================================================================
search
Cửa hàng
Tài khoản
Giỏ hàng
SẢN PHẨM MỚI
NỮ
NAM
BÉ GÁI
BÉ TRAI
CANIFA S
LICENSE
SCHOOL
ĐỒNG PHỤC
Canifa - Khoác lên niềm vui gia đình Việt
Canifa 20 năm - Khoác lên niềm vui gia đình Việt
Năm 1997, Công ty Cổ phần Thương mại và Dịch vụ Hoàng Dương được thành lập với mục đích chính ban đầu là hoạt động trong lĩnh vực sản xuất hàng thời trang xuất khẩu với các sản phẩm chủ yếu làm từ len và sợi.
Năm 2001 thương hiệu thời trang CANIFA ra đời, tự hào trở thành một cột mốc đáng nhớ của doanh nghiệp Việt trong ngành thời trang.
Tầm nhìn và sứ mệnh
Mang đến niềm vui cho hàng triệu gia đình Việt
Canifa hướng đến mục tiêu mang lại niềm vui mặc mới mỗi ngày cho hàng triệu người tiêu dùng Việt. Chúng tôi tin rằng người dân Việt Nam cũng đang hướng đến một cuộc sống năng động, tích cực hơn.
Giá trị cốt lõi của Canifa
20 năm phát triển - Chúng tôi luôn tuân thủ những giá trị cốt lõi của mình.
Kinh doanh dựa trên giá trị thật:
CANIFA thiết lập hệ thống tiêu chuẩn chất lượng quốc tế áp dụng trên tất cả quy trình quản lý và kiểm soát chất lượng từ khâu chọn lọc nguyên phụ liệu cho đến khâu thiết kế và sản xuất (Oeko-tex, Cotton USA, Woolmark,...).
Canifa cam kết phát triển xanh cùng người Việt bằng suy nghĩ và hành động:
Vận hành xanh: Tổ hợp CANIFA Văn Giang tự hào là một đơn vị tiên phong nhận chứng chỉ quốc tế LEED về tiết kiệm năng lượng và ảnh hưởng tích cực đến môi trường sống.
Đối tác xanh: Canifa chọn Cotton USA - đơn vị cung cấp nguyên liệu chính cho sản phẩm tại CANIFA, luôn nghiêm minh tuân thủ các chỉ số bền vững của nông nghiệp Mỹ: tiết kiệm nước, kỹ thuật “không làm đất” để bảo vệ đất trồng.
Sản phẩm xanh: CANIFA đặc biệt chú trọng nghiên cứu, kiểm định chất lượng với nguyên liệu đầu vào và sản phẩm đầu ra, đáp ứng những yêu cầu khắt khe nhất của các chứng chỉ uy tín nhất thế giới (Oeko Tex, Woolmark, WD…)
CANIFA - LỊCH SỬ HÌNH THÀNH
1997
Ngày 23/8/1997 Thành lập công ty TNHH Hoàng Dương
2001
Ra đời thương hiệu thời trang CANIFA.
2002
Xây dựng nhà máy Hoàng Dương Hưng Yên
2004
Chương trình Hơi ấm mùa đông lần đầu tiên được khởi xướng bởi một nhóm các nhân viên, mở đầu cho các chương trình thiện nguyện sau này.
2012
Ra đời cửa hàng bán lẻ “flagship store” đầu tiên của Canifa tại 181 Giảng Võ, Hà Nội. Chính thức chuyển đối từ mô hình kinh doanh đại lý sang chuỗi bán lẻ hiện đại. Thành lập chi nhánh Canifa HCM.
2014
Canifa là thương hiệu thời trang đầu tiên ở Việt Nam nhận được chứng chỉ Woolmark - Tổ chức uy tín nhất thế giới về phát triển và kiểm soát chất lượng len lông cừu
2016
ONOFF sáp nhập vào Canifa sau 10 năm hoạt động.
2019
Tổ hợp xanh Canifa Văn Giang đi vào hoạt động, nhận được chứng chỉ LEED, tiêu chuẩn quốc tế về kiến trúc xanh.
TOP
================================================================================
FILE: data/text/hoi-dap.txt
================================================================================
search
Cửa hàng
Tài khoản
Giỏ hàng
SẢN PHẨM MỚI
NỮ
NAM
BÉ GÁI
BÉ TRAI
CANIFA S
LICENSE
SCHOOL
ĐỒNG PHỤC
Chủ đề được quan tâm
Thanh toán
Vận chuyển
Đổi hàng
Khuyến mại
Kiểm tra đơn hàng
Hướng dẫn chọn size
Hướng dẫn mua hàng
Khách hàng thân thiết
Liên hệ
Các câu hỏi thường gặp
Cước phí vận chuyển
Thanh toán trả trước
Quy định đổi hàng online
Hướng dẫn chọn size
Hướng dẫn mua hàng Online
KHÁM PHÁ TIỆN ÍCH
CHỈ CÓ TRÊN APP
Ưu đãi độc quyền
cho thành viên
Nhận thông báo
sản phẩm mới và
khuyến mãi
Mua sắm tiện lợi
qua video call
với C-live
Quét mã vạch
kiểm tra hàng
tại cửa hàng
QUÉT MÃ
TẢI APP
HỆ THỐNG CỬA HÀNG
Tìm kiếm cửa hàng gần bạn!
Xem danh sách
ĐĂNG KÝ NHẬN BẢN TIN
Cập nhật những thông tin mới nhất về ưu đãi, thời trang và phong cách sống.
Đăng ký ngay
CÔNG TY CỔ PHẦN CANIFA
Số ĐKKD: 0107574310, ngày cấp: 23/09/2016
Nơi cấp: Sở Kế hoạch và đầu tư Hà Nội.
Trụ sở chính: số 688 Đường Quang Trung, P. Hà Đông, TP. Hà Nội.
Địa chỉ: Phòng 301, tầng 3, tòa nhà GP Invest, số 170 La Thành, P. Ô Chợ Dừa, TP. Hà Nội.
Điện thoại: 024 - 7303.0222
Fax: 024 - 6277.6419
Email: hello@canifa.com
THƯƠNG HIỆU
Giới thiệu
Hệ thống cửa hàng
Tin tức
Tuyển dụng
Với cộng đồng
Liên hệ
HỖ TRỢ
Hỏi đáp
Điều kiện - Điều khoản KHTT
Chính sách KHTT
Chính sách vận chuyển
Chính sách bảo mật thông tin KH
Tra cứu đơn hàng
Bảng kích cỡ
TÀI KHOẢN
Đăng nhập/ Đăng ký
Mã ưu đãi
Lịch sử đặt hàng
THEO DÕI CHÚNG TÔI
PHƯƠNG THỨC THANH TOÁN
© 2025 CANIFA
TOP
================================================================================
FILE: data/text/home.txt
================================================================================
THÊM VÀO GIỎ 599.000 ₫ ĐỂ MIỄN PHÍ VẬN CHUYỂN
ĐỔI HÀNG MIỄN PHÍ - TẠI TẤT CẢ CỬA HÀNG TRONG 30 NGÀY
THÊM VÀO GIỎ 599.000 ₫ ĐỂ MIỄN PHÍ VẬN CHUYỂN
ĐỔI HÀNG MIỄN PHÍ - TẠI TẤT CẢ CỬA HÀNG TRONG 30 NGÀY
search
Cửa hàng
Tài khoản
Giỏ hàng
SẢN PHẨM MỚI
NỮ
NAM
BÉ GÁI
BÉ TRAI
CANIFA S
LICENSE
SCHOOL
ĐỒNG PHỤC
Canifa - Khoác lên niềm vui gia đình Việt
ƯU ĐÃI NỔI BẬT
Voucher 50K
Giảm 50k cho đơn từ 999k
HSD: 2026-01-31
Điều kiện
Dùng mã
Voucher 80K
Giảm 80k cho đơn Online đầu tiên từ 399k
HSD: 2026-01-31
Điều kiện
Dùng mã
SẢN PHẨM MỚI
TẤT CẢ
NỮ
NAM
BÉ GÁI
BÉ TRAI
XEM THÊM
Áo khoác lông vũ nam
1.499.000 ₫
Quần dài active nam
799.000 ₫
+1
Áo nỉ bé gái có hình in
349.000 ₫
Bộ pyjama nữ
699.000 ₫
Quần nỉ unisex trẻ em
329.000 ₫
Tất trung cổ unisex Youngster
79.000 ₫
Áo cardigan bé gái cổ ren
499.000 ₫
Áo phông bé gái cotton USA có hình in
269.000 ₫
CANIFALIFE
TOP
================================================================================
FILE: data/text/huong-dan-chon-size-html.txt
================================================================================
HƯỚNG DẪN CHỌN SIZE - CANIFA
* Đơn vị tính: cm, kg
================================================================================
BẢNG SIZE CHUNG CHO NỮ
================================================================================
Size XS - BẢNG SIZE CHUNG CHO NỮ:
- Chiều cao: 147-153 cm
- Cân nặng: 38-43 kg
- Vòng ngực: 74-80 cm
- Vòng mông: 82-88 cm
Size S - BẢNG SIZE CHUNG CHO NỮ:
- Chiều cao: 150-155 cm
- Cân nặng: 41-46 kg
- Vòng ngực: 79-82 cm
- Vòng mông: 88-90 cm
Size M - BẢNG SIZE CHUNG CHO NỮ:
- Chiều cao: 155-163 cm
- Cân nặng: 47-52 kg
- Vòng ngực: 82-87 cm
- Vòng mông: 90-94 cm
Size L - BẢNG SIZE CHUNG CHO NỮ:
- Chiều cao: 160-165 cm
- Cân nặng: 53-58 kg
- Vòng ngực: 88-94 cm
- Vòng mông: 94-98 cm
Size XL - BẢNG SIZE CHUNG CHO NỮ:
- Chiều cao: 162-166 cm
- Cân nặng: 59-64 kg
- Vòng ngực: 94-99 cm
- Vòng mông: 98-102 cm
================================================================================
QUẦN NỮ (Size số)
================================================================================
Size 26 (XS) - QUẦN NỮ (Size số):
- Vòng eo: 65 cm
- Vòng mông (dáng slim): 79 cm
- Vòng mông (dáng regular): 86.92 cm
- Chiều dài quần: 93 cm
- Rộng gấu (dáng slim): 12.5 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 27 (S) - QUẦN NỮ (Size số):
- Vòng eo: 67.5 cm
- Vòng mông (dáng slim): 81.5 cm
- Vòng mông (dáng regular): 89.46 cm
- Chiều dài quần: 94 cm
- Rộng gấu (dáng slim): 13 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 28 (M) - QUẦN NỮ (Size số):
- Vòng eo: 70 cm
- Vòng mông (dáng slim): 84 cm
- Vòng mông (dáng regular): 92 cm
- Chiều dài quần: 95 cm
- Rộng gấu (dáng slim): 13.5 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 29 (L) - QUẦN NỮ (Size số):
- Vòng eo: 72.5 cm
- Vòng mông (dáng slim): 86.5 cm
- Vòng mông (dáng regular): 94.5 cm
- Chiều dài quần: 96 cm
- Rộng gấu (dáng slim): 14 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 30 (XL) - QUẦN NỮ (Size số):
- Vòng eo: 75 cm
- Vòng mông (dáng slim): 89 cm
- Vòng mông (dáng regular): 97.1 cm
- Chiều dài quần: 97 cm
- Rộng gấu (dáng slim): 14.5 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
================================================================================
QUẦN JEANS - KHAKI (NỮ)
================================================================================
Size 26 (XS) - QUẦN JEANS - KHAKI (NỮ):
- Vòng bụng: 65 cm
- Vòng mông: 79 cm
- Chiều dài quần: 93 cm
- Rộng ống (dáng slim): 12.5 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 27 (S) - QUẦN JEANS - KHAKI (NỮ):
- Vòng bụng: 67.5 cm
- Vòng mông: 81.5 cm
- Chiều dài quần: 94 cm
- Rộng ống (dáng slim): 13 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 28 (M) - QUẦN JEANS - KHAKI (NỮ):
- Vòng bụng: 70 cm
- Vòng mông: 84 cm
- Chiều dài quần: 95 cm
- Rộng ống (dáng slim): 13.5 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 29 (L) - QUẦN JEANS - KHAKI (NỮ):
- Vòng bụng: 72.5 cm
- Vòng mông: 86.5 cm
- Chiều dài quần: 96 cm
- Rộng ống (dáng slim): 14 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 30 (XL) - QUẦN JEANS - KHAKI (NỮ):
- Vòng bụng: 75 cm
- Vòng mông: 89 cm
- Chiều dài quần: 97 cm
- Rộng ống (dáng slim): 14.5 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
================================================================================
BẢNG SIZE CHUNG CHO NAM
================================================================================
Size S - BẢNG SIZE CHUNG CHO NAM:
- Chiều cao: 162-168 cm
- Cân nặng: 57-62 kg
- Vòng ngực: 84-88 cm
- Vòng mông: 85-89 cm
Size M - BẢNG SIZE CHUNG CHO NAM:
- Chiều cao: 169-173 cm
- Cân nặng: 63-67 kg
- Vòng ngực: 88-94 cm
- Vòng mông: 90-94 cm
Size L - BẢNG SIZE CHUNG CHO NAM:
- Chiều cao: 171-175 cm
- Cân nặng: 68-72 kg
- Vòng ngực: 94-98 cm
- Vòng mông: 95-99 cm
Size XL - BẢNG SIZE CHUNG CHO NAM:
- Chiều cao: 173-177 cm
- Cân nặng: 73-77 kg
- Vòng ngực: 98-104 cm
- Vòng mông: 100-104 cm
Size XXL - BẢNG SIZE CHUNG CHO NAM:
- Chiều cao: 175-179 cm
- Cân nặng: 78-82 kg
- Vòng ngực: 104-107 cm
- Vòng mông: 104-108 cm
================================================================================
QUẦN JEANS - KHAKI (NAM)
================================================================================
Size 29 (S) - QUẦN JEANS - KHAKI (NAM):
- Vòng eo: 79.5 cm
- Vòng mông: 96.5 cm
- Chiều dài quần: 99.8 cm
- Rộng ống (dáng slim): 15.4 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 30 (M) - QUẦN JEANS - KHAKI (NAM):
- Vòng eo: 82 cm
- Vòng mông: 99 cm
- Chiều dài quần: 100.5 cm
- Rộng ống (dáng slim): 16 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 31 (L) - QUẦN JEANS - KHAKI (NAM):
- Vòng eo: 84.5 cm
- Vòng mông: 101.5 cm
- Chiều dài quần: 101.2 cm
- Rộng ống (dáng slim): 16.6 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 32 (XL) - QUẦN JEANS - KHAKI (NAM):
- Vòng eo: 87 cm
- Vòng mông: 104 cm
- Chiều dài quần: 101.2 cm
- Rộng ống (dáng slim): 17.2 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
Size 33 (XXL) - QUẦN JEANS - KHAKI (NAM):
- Vòng eo: 89 cm
- Vòng mông: 106.5 cm
- Chiều dài quần: 101.2 cm
- Rộng ống (dáng slim): 17.8 cm
- Rộng gấu (dáng regular): Tùy mẫu kích thước khác nhau
================================================================================
BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023)
================================================================================
Size 92 (2Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 88-94 cm
- Cân nặng: 10-13 kg
Size 98 (2-3Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 95-101 cm
- Cân nặng: 13-15 kg
Size 104 (3-4Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 101-107 cm
- Cân nặng: 15-18 kg
Size 110 (4-5Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 107-113 cm
- Cân nặng: 18-22 kg
Size 116 (6Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 113-119 cm
- Cân nặng: 22-25 kg
Size 122 (7Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 119-125 cm
- Cân nặng: 25-28 kg
Size 128 (8Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 125-131 cm
- Cân nặng: 28-32 kg
Size 134 (9Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 131-137 cm
- Cân nặng: 32-36 kg
Size 140 (10-11Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 137-145 cm
- Cân nặng: 36-39 kg
Size 152 (11-12Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 145-157 cm
- Cân nặng: 39-46 kg
Size 164 (13-14Y) - BẢNG SIZE CHUNG TRẺ EM (sản phẩm từ Thu Đông 2023):
- Chiều cao: 157-169 cm
- Cân nặng: 46-55 kg
================================================================================
BẢNG SIZE CHUNG CHO BÉ TRAI
================================================================================
Size 90 (2Y) - BẢNG SIZE CHUNG CHO BÉ TRAI:
- Chiều cao: 90 cm
- Cân nặng: 10-13 kg
Size 100 (3-4Y) - BẢNG SIZE CHUNG CHO BÉ TRAI:
- Chiều cao: 100 cm
- Cân nặng: 14-17 kg
Size 110 (4-5Y) - BẢNG SIZE CHUNG CHO BÉ TRAI:
- Chiều cao: 110 cm
- Cân nặng: 18-23 kg
Size 120 (6-7Y) - BẢNG SIZE CHUNG CHO BÉ TRAI:
- Chiều cao: 120 cm
- Cân nặng: 24-29 kg
Size 130 (8Y) - BẢNG SIZE CHUNG CHO BÉ TRAI:
- Chiều cao: 130 cm
- Cân nặng: 29-33 kg
Size 140 (9-11Y) - BẢNG SIZE CHUNG CHO BÉ TRAI:
- Chiều cao: 140 cm
- Cân nặng: 33-39 kg
Size 150 (11-12Y) - BẢNG SIZE CHUNG CHO BÉ TRAI:
- Chiều cao: 150 cm
- Cân nặng: 39-45 kg
Size 160 (13-14Y) - BẢNG SIZE CHUNG CHO BÉ TRAI:
- Chiều cao: 160 cm
- Cân nặng: 45-52 kg
================================================================================
BẢNG SIZE CHUNG CHO BÉ GÁI
================================================================================
Size 90 (2Y) - BẢNG SIZE CHUNG CHO BÉ GÁI:
- Chiều cao: 90 cm
- Cân nặng: 10-13 kg
Size 100 (3-4Y) - BẢNG SIZE CHUNG CHO BÉ GÁI:
- Chiều cao: 100 cm
- Cân nặng: 14-17 kg
Size 110 (4-5Y) - BẢNG SIZE CHUNG CHO BÉ GÁI:
- Chiều cao: 110 cm
- Cân nặng: 18-23 kg
Size 120 (6-7Y) - BẢNG SIZE CHUNG CHO BÉ GÁI:
- Chiều cao: 120 cm
- Cân nặng: 24-29 kg
Size 130 (8Y) - BẢNG SIZE CHUNG CHO BÉ GÁI:
- Chiều cao: 130 cm
- Cân nặng: 29-33 kg
Size 140 (9-11Y) - BẢNG SIZE CHUNG CHO BÉ GÁI:
- Chiều cao: 140 cm
- Cân nặng: 33-39 kg
Size 150 (11-12Y) - BẢNG SIZE CHUNG CHO BÉ GÁI:
- Chiều cao: 150 cm
- Cân nặng: 39-45 kg
Size 160 (13-14Y) - BẢNG SIZE CHUNG CHO BÉ GÁI:
- Chiều cao: 160 cm
- Cân nặng: 45-50 kg
================================================================================
BẢNG SIZE CHUNG CHO UNISEX - NGƯỜI LỚN
================================================================================
Size XXS - BẢNG SIZE CHUNG CHO UNISEX - NGƯỜI LỚN:
- Chiều cao: 155 - 163 cm
- Cân nặng: 47 - 52 kg
Size XS - BẢNG SIZE CHUNG CHO UNISEX - NGƯỜI LỚN:
- Chiều cao: 160 - 165 cm
- Cân nặng: 53 - 58 kg
Size S - BẢNG SIZE CHUNG CHO UNISEX - NGƯỜI LỚN:
- Chiều cao: 162 - 168 cm
- Cân nặng: 57 - 62 kg
Size M - BẢNG SIZE CHUNG CHO UNISEX - NGƯỜI LỚN:
- Chiều cao: 169 - 173 cm
- Cân nặng: 63 - 67 kg
Size L - BẢNG SIZE CHUNG CHO UNISEX - NGƯỜI LỚN:
- Chiều cao: 171 - 175 cm
- Cân nặng: 68 - 72 kg
Size XL - BẢNG SIZE CHUNG CHO UNISEX - NGƯỜI LỚN:
- Chiều cao: 173 - 177 cm
- Cân nặng: 73 - 77 kg
Size XXL - BẢNG SIZE CHUNG CHO UNISEX - NGƯỜI LỚN:
- Chiều cao: 175 - 179 cm
- Cân nặng: 79 - 82 kg
================================================================================
BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM
================================================================================
Dải size lẻ:
Size 92 (2Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size lẻ):
- Chiều cao: 92 cm
- Cân nặng: 10 - 13 kg
Size 98 (2-3Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size lẻ):
- Chiều cao: 98 cm
- Cân nặng: 13 - 15 kg
Size 104 (3-4Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size lẻ):
- Chiều cao: 104 cm
- Cân nặng: 15 - 18 kg
Size 110 (4-5Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size lẻ):
- Chiều cao: 110 cm
- Cân nặng: 18 - 22 kg
Size 116 (6Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size lẻ):
- Chiều cao: 116 cm
- Cân nặng: 22 - 25 kg
Size 122 (7Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size lẻ):
- Chiều cao: 122 cm
- Cân nặng: 25 - 28 kg
Size 128 (8Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size lẻ):
- Chiều cao: 128 cm
- Cân nặng: 28 - 32 kg
Size 134 (9Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size lẻ):
- Chiều cao: 134 cm
- Cân nặng: 32 - 36 kg
Size 140 (9-10Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size lẻ):
- Chiều cao: 140 cm
- Cân nặng: 36 - 39 kg
Size 152 (11-12Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size lẻ):
- Chiều cao: 152 cm
- Cân nặng: 39 - 46 kg
Size 164 (13-14Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size lẻ):
- Chiều cao: 164 cm
- Cân nặng: 46 - 55 kg
Dải size chẵn:
Size 90 (2Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size chẵn):
- Chiều cao: 90 cm
- Cân nặng: 10 - 13 kg
Size 100 (2-3Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size chẵn):
- Chiều cao: 100 cm
- Cân nặng: 14 - 17 kg
Size 110 (4-5Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size chẵn):
- Chiều cao: 110 cm
- Cân nặng: 18 - 23 kg
Size 120 (6-7Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size chẵn):
- Chiều cao: 120 cm
- Cân nặng: 24 - 29 kg
Size 130 (8Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size chẵn):
- Chiều cao: 130 cm
- Cân nặng: 29 - 33 kg
Size 140 (9-10Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size chẵn):
- Chiều cao: 140 cm
- Cân nặng: 33 - 39 kg
Size 150 (11-12Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size chẵn):
- Chiều cao: 150 cm
- Cân nặng: 39 - 45 kg
Size 160 (13-14Y) - BẢNG SIZE CHUNG CHO UNISEX - TRẺ EM - (Dải size chẵn):
- Chiều cao: 160 cm
- Cân nặng: 45 - 52 kg
================================================================================
FILE: data/text/lien-he-html.txt
================================================================================
search
Cửa hàng
Tài khoản
Giỏ hàng
SẢN PHẨM MỚI
NỮ
NAM
BÉ GÁI
BÉ TRAI
CANIFA S
LICENSE
SCHOOL
ĐỒNG PHỤC
LIÊN HỆ
Hỗ trợ Khách hàng mua online
Tổng đài: 1800 6061
Từ 9h - 12h, 13h - 21h các ngày từ thứ 2 đến Chủ nhật
Email: saleonline@canifa.com
Địa chỉ: Phòng 301 Tòa nhà GP Invest, 170 La Thành, P. Ô Chợ Dừa, Q. Đống Đa, Hà Nội
Chăm sóc khách hàng:
Điện thoại: 1800.6061
Email: chamsockhachhang@canifa.com
Đặt đồng phục
Ms. Hoa
Điện thoại: 0963.03.03.67
Email: grb2b@canifa.com
Văn phòng miền Bắc
Phòng 301 Tòa nhà GP Invest, 170 La Thành, P. Ô Chợ Dừa, Q. Đống Đa, Hà Nội
Điện thoại: +8424-7303.0222
Fax: +8424 - 6277.6419
Email: hello@canifa.com
Website: www.canifa.com
Văn phòng miền Nam
Địa chỉ: 97 Cao Thắng , Phường 3, Quận 3, TP. HCM
Điện thoại: +8428 3824.7141
Email: infocanifa@canifa.com
Liên hệ làm Nhà phân phối và Đại lý
(KV miền Bắc)
Mr. Nguyễn Đức Bằng
Điện thoại: 0904.530.833
Email: bangnd@canifa.com
Liên hệ làm Nhà phân phối và Đại lý
(KV Miền Nam từ Đà Nẵng đến Cà Mau)
Mr. Nguyễn Công Thành
Điện thoại: 0914.396.239
Email: thanhnc@canifa.com
Nhà máy
Đường Nguyễn Văn Linh, Phường Bần Yên Nhân, T.X Mỹ Hào, Hưng Yên
Điện thoại: +84-221- 394 2234
Fax: +84 - 221-394 2235
 
 
TOP
================================================================================
FILE: data/text/tuyen-dung.txt
================================================================================
GIỚI THIỆU CHUNG
MÔI TRƯỜNG LÀM VIỆC
CHẾ ĐỘ ĐÃI NGỘ
DỰ ÁN HỢP TÁC
TUYỂN DỤNG
Địa điểm làm việc
Tất cả (22)
Hà Nội (18)
Toàn quốc (4)
Ngành/Nghề
Tất cả (22)
Bán hàng (6)
Cơ khí (1)
Công nghệ thông tin (2)
Dịch vụ khách hàng (1)
Điện (1)
IT Phần cứng (1)
IT phần mềm (3)
Kế toán/Tài chính (2)
Kho vận (1)
Khoa học dữ liệu (2)
Kiến trúc (1)
Kinh doanh (4)
Kinh doanh/Bán hàng (6)
Luật/Pháp lý (1)
Marketing (4)
Merchandise (1)
Nghiên cứu - Thiết kế (1)
Nhóm ngành khác (1)
Sản xuất (1)
Thiết kế đồ họa (1)
thời trang (3)
Thương mại Điện tử (2)
Tiếp thị/Marketing (6)
Truyền thông/Media (3)
Tự động hóa (1)
Vận chuyển/Giao nhận/Kho (1)
Vận hành (2)
Xây dựng (2)
PHÓ PHÒNG CƠ SỞ HẠ TẦNG & SETUP
Cạnh tranh
Hà Nội
Hạn nộp hồ sơ: 31/01/2026
Chi tiết
NHÂN VIÊN KHO
7 - 10 triệu/tháng
Toàn quốc
Hạn nộp hồ sơ: 31/03/2026
Chi tiết
NHÂN VIÊN BÁN HÀNG
7 - 10 triệu/tháng
Toàn quốc
Hạn nộp hồ sơ: 31/03/2026
Chi tiết
CHUYÊN VIÊN PCCC & ME
Cạnh tranh
Hà Nội
Hạn nộp hồ sơ: 31/01/2026
Chi tiết
CHUYÊN VIÊN QUẢN TRỊ HỆ THỐNG
Cạnh tranh
Hà Nội
Hạn nộp hồ sơ: 31/01/2026
Chi tiết
TRƯỞNG NHÓM NGHIÊN CỨU VÀ PHÁT TRIỂN THỊ TRƯỜNG
Cạnh tranh
Hà Nội
Hạn nộp hồ sơ: 31/01/2026
Chi tiết
Xem thêm
================================================================================
FILE: data/text/van-chuyen-html.txt
================================================================================
search
Cửa hàng
Tài khoản
Giỏ hàng
SẢN PHẨM MỚI
NỮ
NAM
BÉ GÁI
BÉ TRAI
CANIFA S
LICENSE
SCHOOL
ĐỒNG PHỤC
VẬN CHUYỂN
1. CƯỚC PHÍ VẬN CHUYỂN
Miễn phí giao hàng với tất cả đơn hàng có giá trị từ 599,000 vnđ trở lên tại tất cả tỉnh thành trên toàn quốc.
Đối với những đơn hàng có giá trị dưới 599,000 vnđ, CANIFA áp dụng biểu phí giao hàng theo từng khu vực được quy định dưới đây. Biểu phí này áp dụng từ 14/08/2023 cho đến khi có thay đổi.
HÀ NỘI
Đống Đa, Hoàn Kiếm, Ba Đình, Hai Bà Trưng, Cầu Giấy, Thanh Xuân 20.000đ
Hà Đông, Tây Hồ, Hoàng Mai, Long Biên, Bắc Từ Liêm, Nam Từ Liêm, Ba Vì, Chương Mỹ, Đan Phượng, Đông Anh, Gia Lâm, Hoài Đức, Mê Linh, Mỹ Đức, Phúc Thọ, Phú Xuyên, Quốc Oai, Sóc Sơn, Thạch Thất, Thanh Oai, Thanh Trì, Thường Tín, Ứng Hòa, Thị Xã Sơn Tây. 30.000đ
TP HỒ CHÍ MINH
Tất cả các quận 40.000đ
ĐÀ NẴNG
Tất cả các quận 40.000đ
TẤT CẢ CÁC TỈNH THÀNH KHÁC
Bắc Giang, Bắc Ninh, Hà Nam, Hải Dương, Hải Phòng, Hưng Yên, Hòa Bình, Nam Định, Phú Thọ, Thái Nguyên, Vĩnh Phúc, Hòa Bình,Bắc Kan, Lạng Sơn, Nghệ An, Ninh Bình, Quảng Ninh, Thái Bình, Thanh Hóa, Tuyên Quang, Yên Bái, Nghệ An 30.000đ
Điện Biên, Lào Cai, Hà Giang, Sơn La, Cao Bằng,Huế, Quảng Trị, Gia Lai, Đắc Lắc, Kom Tum, Đắc Nông, Phú Yên, Khánh Hòa, Hà Tình, Tiền Giang, Bến Tre, Tây Ninh, Đồng Tháp, Trà Vinh, Vĩnh Long, Đồng Nai, Bình Dương, Vũng Tàu, Long An, Quảng Bình, Quy Nhơn, Bình Thuận, Ninh Thuận, Bình Phước, Cần Thơ, Hậu Giang, Kiên Giang, An Giang, Long An, Sóc Trăng, Bạc Liêu, Cà Mau, Quảng Ngãi 40.000đ
2. THỜI GIAN VẬN CHUYỂN
Hà Nội : giao hàng từ 1 đến 3 ngày kể từ khi hệ thống xác nhận qua sms/email
Tuyến Đà Nẵng, TP.HCM: giao hàng trong vòng 3 ngày kể từ khi hệ thống xác nhận qua sms/email.
Tất cả thành phố khác: giao hàng trong vòng từ 3- 7 ngày kể từ khi hệ thống xác nhận qua sms/ email.
Thời gian giao hàng không tính thứ bảy, chủ nhật hay các ngày lễ tết.
3. ĐƠN HÀNG ĐƯỢC GIAO TỐI ĐA MẤY LẦN ?
Đơn hàng được giao tối đa 3 lần (Nếu lần 1 đơn hàng giao không thành công, nhân viên vận chuyển sẽ liên hệ lại bạn lần 2 sau 1-2 ngày làm việc kế tiếp . Như vậy sau 3 lần giao dịch không thành công đơn hàng sẽ hủy)
4. KiỂM TRA TÌNH TRẠNG ĐƠN HÀNG
Để kiểm tra thông tin hoặc tình trạng đơn hàng bạn vui lòng sử dụng MÃ ĐƠN HÀNG đã được gửi trong email xác nhận hoặc tin nhắn xác nhận để thông báo tới bộ phận Chăm sóc khách hàng (tổng đài miễn phí cước gọi 1800 6061 nhánh 1)
5. KHI NHẬN ĐƠN HÀNG CÓ ĐƯỢC XEM SẢN PHẨM TRƯỚC KHI THANH TOÁN ?
Bạn hoàn toàn có thể mở gói hàng kiểm tra sản phẩm trước khi thanh toán hoặc trước khi vận chuyển rời đi.
Trong trường hợp bạn gặp vấn đề phát sinh bạn liên hệ ngay đến chúng tôi 1800 6061 nhánh 1 để được hỗ trợ kịp thời.
TOP
================================================================================
FILE: data/text/voi-cong-dong-html.txt
================================================================================
search
Cửa hàng
Tài khoản
Giỏ hàng
SẢN PHẨM MỚI
NỮ
NAM
BÉ GÁI
BÉ TRAI
CANIFA S
LICENSE
SCHOOL
ĐỒNG PHỤC
Phát triển bền vững: 03 xanh
Với mục tiêu phát triển bền vững, CANIFA tập trung nghiên cứu và cải tiến hoạt động sản xuất kinh doanh để đảm bảo nguyên tắc 3 XANH
Bảo vệ môi trường là 01 trong những nguyên tắc hoạt động cốt lõi của Tập đoàn. Tiêu biểu: Tổ hợp Canifa Văn Giang - đơn vị tiên phong trong ngành dệt may tại Việt Nam nhận chứng chỉ quốc tế LEED về công trình xây dựng xanh, tiết kiệm năng lượng và bảo vệ môi trường sống của con người
Hợp tác bền vững là yếu tố quan trọng nhất trong sự đồng hành cùng phát triển
Tiêu biểu: Đối tác Cotton USA - đơn vị cung cấp nguyên liệu chính cho áo phông tại Canifa luôn nghiêm minh tuân thủ các chỉ số bền vững của nông nghiệp Mỹ: tiết kiệm nước, kỹ thuật “không làm đất” để bảo vệ đất trồng.
Thời trang không chỉ đẹp mà còn an toàn với người sử dụng luôn song hành trong mục tiêu nghiên cứu phát triển sản phẩm.
Tiêu biểu: CANIFA luôn chú trọng nghiên cứu, kiểm định chất lượng với nguyên liệu đầu vào và sản phẩm đầu ra, đáp ứng những yêu cầu khắt khe nhất của các chứng chỉ uy tín nhất thế giới để mang đến cho người dùng sự an toàn và thoải mái (Oekotex, Woolmark, AWTA,...)
hoạt động cộng đồng
Với mong muốn mang đến những điều tốt đẹp dù nhỏ bé nhưng ấm áp đến cho cộng đồng Việt, những người sáng lập đã gieo mầm cho các hoạt động hoàn toàn tự nguyện mang tên Hội CANIFA Vì Cộng Đồng.
HƠI ẤM MÙA ĐÔNG
Nếu một lần được thấy hình ảnh những em nhỏ vùng cao vượt qua mùa đông chỉ bằng những tấm áo cộc... chúng tôi tin rằng những trái tim sẽ không ngừng ước mong về một ngày các em đủ ấm.
Được khởi xướng bởi nhân viên Canifa, hành trình Hơi ấm mùa đông là hành trình của hàng ngàn tấm áo ấm đến với các em nhỏ vùng cao cho mùa đông bớt khắc nghiệt.
2019 - năm thứ 15, Canifa sẽ viết tiếp hành trình bằng 15,000 tấm áo, cùng với cộng đồng để trao tận tay từng em nhỏ
GIỌT MÁU HỒNG
Từ 2014, Hoạt động hiến máu nhân đạo được Canifa tổ chức định kỳ hàng năm, thu hút đông đảo CBNV tham gia, đóng góp hàng ngàn đơn vị máu cho hoạt động cứu trợ của Viện huyết học và truyền máu Trung ương.
ÁO MỚI CHO HÀNH TINH XANH
Ở Canifa, chúng tôi tin rằng, mỗi đứa trẻ đều có thể chung tay bảo vệ môi trường. Từ việc bớt sử dụng một chiếc ống hút nhựa cho đến trồng thêm một cây xanh. Mỗi năm, hàng trăm mầm xanh sẽ được chính tay các bạn nhỏ là con em CBNV trong công ty vun trồng. Năm sau đó, các bạn sẽ được quay lại để nhìn những cây xanh đã lớn và tiếp tục gieo thêm những màu xanh.
HOẠT ĐỘNG THIỆN NGUYỆN KHÁC
Chứng kiến sự khắc nghiệt của thiên tai, chúng tôi hiểu mọi sự cứu trợ dù là nhỏ nhất nếu kịp thời đều có ý nghĩa với những người dân vùng thiệt hại. Canifa luôn có những chuyến xe hỏa tốc về vùng bão lũ, chúng tôi gọi đó là những chuyến xe màu đỏ.
CHỨNG NHẬN VÀ CHẤT LƯỢNG
Với triết lý kinh doanh trên giá trị thật, CANIFA thiết lập hệ thống tiêu chuẩn chất lượng quốc tế áp dụng trên tất cả quy trình quản lý và kiểm soát chất lượng từ khâu chọn lọc nguyên phụ liệu cho đến khâu thiết kế và sản xuất.
Luôn cam kết mang đến khách hàng những sản phẩm an toàn với sức khỏe người tiêu dùng, hãng thời trang Canifa chỉ sử dụng những chất liệu tự nhiên an toàn trong mỗi thiết kế.
Sản phẩm Canifa đạt tiêu chuẩn Oeko Tex 100 được kiểm định về độ an toàn cho làn da của người sử dụng.
Và năm 2016, CANIFA tự hào đã đạt được chứng chỉ an toàn cấp độ cao nhất với dòng sản phẩm dành cho trẻ sơ sinh.
Cotton USA - hãng bông được cả thế giới tin dùng với quy trình canh tác bền vững để cho ra đời những sợi bông chất lượng tuyệt vời đưa đến sản phẩm thấm hút tốt, mát mẻ, chịu nhiệt và bền bỉ.
Với mong muốn mang đến sản phẩm chất lượng cho người Việt, CANIFA liên kết cùng tập đoàn Cotton USA mang đến nguyên liệu chất lượng Quốc tế cho người Việt.
Luôn quan tâm tới nhu cầu mặc đẹp, mặc mới và mặc an toàn mỗi ngày của khách hàng, ngoài an toàn về chất lượng sản phẩm.
CANIFA đã vượt qua quy trình nghiêm ngặt khắt khe về kiểm định sản xuất, nguyên vật liệu đầu vào và thành phẩm ra thị trường của tập đoàn quốc tế Disney, từ đó, ký kết chính thức là đối tác chiến lược giữa CANIFA và Disney tại Việt Nam.
Khi cầm trên tay những sản phẩm có biểu tượng Woolmark, bạn có thể yên tâm 100% về chất lượng hảo hạng của món đồ bạn sở hữu đạt chuẩn toàn cầu.
Chứng chỉ Quốc tế này được cấp cho các nhà sản xuất có đủ khả năng đáp ứng các tiêu chuẩn yêu cầu vô cùng nghiêm ngặt.
Từ 2014, CANIFA là nhãn hiệu Việt Nam đầu tiên vượt qua các tiêu chuẩn khắt khe của Woolmark để nhận được 02 chứng chỉ Quốc tế danh giá nhất dành cho sản phẩm len lông cừu là Woolmark và Woolmark Blend.
AWTA Ltd (Australian Wool Testing Authority) - Trung tâm kiểm soát chất lượng len lông cừu lớn nhất thế giới đã chính thức cấp chứng chỉ cho sản phẩm của CANIFA.
Những sản phẩm len lông cừu đạt chuẩn phải được kiểm duyệt từ nguyên liệu đầu vào.
CANIFA đầu tư xây dựng Tổ hợp XANH CANIFA theo tiêu chuẩn LEED.
Đây là tiêu chuẩn tiên phong cho các công trình tiết kiệm năng lượng và bảo vệ môi trường trường sống của con người.
Tuân theo tiêu chuẩn này, việc vận hành sản xuất của nhà máy được vận hành theo quy trình khép kín, xử lý nước thải thông minh để tái sử dụng tưới cây xanh cho Tổ hợp.
Chính việc nhận được Chứng chỉ LEED mang giá trị toàn cầu đã giúp Tổ Hợp XANH CANIFA không chỉ hoàn thành sứ mệnh Phản Ứng Nhanh, để phục vụ khách hàng tốt hơn, mà còn góp phần quan trọng trong việc phát triển xã hội bền vững, văn minh, bảo vệ môi trường sống của cộng đồng.
TOP
import asyncio
import logging
from common.starrocks_connection import StarRocksConnection
# Setup logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
async def main():
try:
db = StarRocksConnection()
print("🔌 Connecting to StarRocks...")
# Get Create Table Statement
table_name = "shared_source.magento_product_dimension_with_text_embedding"
res = await db.execute_query_async(f"SHOW CREATE TABLE {table_name}")
if res:
print("\n=== RAW RESULT KEYS ===")
print(res[0].keys())
print(res[0])
else:
print("❌ Could not get table info.")
except Exception as e:
print(f"❌ Error: {e}")
if __name__ == "__main__":
asyncio.run(main())
import asyncio
import os
import sys
# Ensure backend directory is in python path
current_dir = os.path.dirname(os.path.abspath(__file__))
if current_dir not in sys.path:
sys.path.append(current_dir)
from agent.tools.product_search_helpers import build_starrocks_query
class Params:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
async def main():
# Params for "tìm cho tao áo side m phù hợp để đi chơi"
text = "tìm cho tao áo side m phù hợp để đi chơi"
# Mocking what the extraction layer might produce
params = Params(
query=text,
size_scale="M",
keywords="áo side m đi chơi"
)
print(f"Generating query for: {text}")
try:
sql = await build_starrocks_query(params)
print("Successfully generated query.")
print("Check d:\\cnf\\chatbot_canifa\\backend\\embedding.txt")
except Exception as e:
print(f"Error: {e}")
if __name__ == "__main__":
asyncio.run(main())
......@@ -3,7 +3,9 @@ Performance Test API Server
Server giả lập để test tải với Locust - KHÔNG gọi OpenAI, KHÔNG gọi Postgres.
"""
import asyncio
import logging
import os
import sys
import time
from pathlib import Path
......@@ -16,9 +18,23 @@ from pydantic import BaseModel
sys.path.insert(0, str(Path(__file__).parent.parent))
# Setup Logging
logging.basicConfig(level=logging.INFO)
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
handlers=[logging.FileHandler("perf_error.log", encoding="utf-8"), logging.StreamHandler(sys.stdout)],
)
logger = logging.getLogger(__name__)
# ============================================================
# 0. FORCE PROACTOR EVENT LOOP (CRITICAL FOR WINDOWS HIGH CONCURRENCY)
# ============================================================
if os.name == "nt":
try:
asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
logger.info("⚡ Windows ProactorEventLoopPolicy set (Supports high FD count)")
except Exception as e:
logger.warning(f"Could not set ProactorEventLoopPolicy: {e}")
# ============================================================
# 1. MOCK LLM - Trả lời siêu tốc, không gọi OpenAI
# ============================================================
......@@ -68,32 +84,9 @@ import common.llm_factory
common.llm_factory.create_llm = mock_create_llm
logger.info("🎭 PATCHED common.llm_factory.create_llm")
# ============================================================
# 3. PATCH Checkpointer - Dùng MemorySaver thay Postgres
# ============================================================
from langgraph.checkpoint.memory import MemorySaver
# Tạo 1 instance MemorySaver dùng chung
_shared_memory_saver = MemorySaver()
def mock_get_checkpointer():
"""Trả về MemorySaver thay vì Postgres."""
logger.info("🧠 Using MemorySaver (RAM) instead of Postgres")
return _shared_memory_saver
import agent.checkpointer
# Patch function
agent.checkpointer.get_checkpointer = mock_get_checkpointer
# QUAN TRỌNG: Reset singleton để nó gọi lại mock function
agent.checkpointer._checkpointer_manager._checkpointer = _shared_memory_saver
logger.info("🔧 PATCHED agent.checkpointer (Reset singleton)")
# ============================================================
# 4. PATCH Langfuse - Tắt để tránh Rate Limit
# 3. PATCH Langfuse - Tắt để tránh Rate Limit
# ============================================================
def mock_get_callback_handler():
"""Trả về None - không gửi trace."""
......@@ -105,14 +98,28 @@ import common.langfuse_client
common.langfuse_client.get_callback_handler = mock_get_callback_handler
logger.info("🔇 PATCHED common.langfuse_client.get_callback_handler")
# ============================================================
# 4. MOCK EMBEDDING - Để test DB mà không bị OpenAI Rate Limit
# ============================================================
import common.embedding_service
async def mock_create_embedding_async(text: str) -> list[float]:
"""Trả về vector giả lập (1536 dim) để test StarRocks."""
return [0.01] * 1536
common.embedding_service.create_embedding_async = mock_create_embedding_async
logger.info("🧠 PATCHED common.embedding_service.create_embedding_async (Using Mock Vector)")
# ============================================================
# 5. GIỜ MỚI IMPORT GRAPH (Sau khi patch xong)
# ============================================================
from agent.config import get_config
from langchain_core.messages import HumanMessage
from agent.graph import build_graph
from agent.tools.product_search_helpers import build_starrocks_query
from agent.models import get_config
# ============================================================
# 6. IMPORT CHO DB TEST
......@@ -127,18 +134,26 @@ app = FastAPI(title="Performance Test API")
# Request Models
class SearchRequest(BaseModel):
query: str
# Locust gửi 'message' hoặc 'query'
query: str = ""
message: str = ""
limit: int = 10
user_id: str = "perf_user"
thread_id: str = "perf_thread"
@property
def final_query(self) -> str:
return self.message or self.query
class MockParams(BaseModel):
query_text: str = ""
query: str = "" # Phải là query, không phải query_text để build_starrocks_query nhận diện
limit: int = 10
sku: str = None
gender: str = None
gender_by_product: str = None # Khớp với metadata fields
season: str = None
color: str = None
product_line: str = None
master_color: str = None
product_line_vn: str = None
price_min: float = None
price_max: float = None
......@@ -169,47 +184,93 @@ async def startup_event():
# ============================================================
@app.post("/api/agent/chat")
async def api_agent_chat(request: SearchRequest):
"""
Test toàn bộ Flow Graph với MockLLM.
Dùng chung endpoint với hàng thật để Locust test đúng flow.
"""
if not mock_graph:
raise HTTPException(500, "Mock Graph not initialized")
start_time = time.time()
try:
# Lấy query thực tế (từ message hoặc query)
user_query = request.final_query
if not user_query:
return {"status": "error", "message": "Missing query/message"}
# Tạo thread_id
thread_id = request.thread_id or f"perf_test_{int(time.time() * 1000)}"
input_state = {
"messages": [HumanMessage(content=user_query)],
"user_id": request.user_id,
}
config_runnable = {"configurable": {"thread_id": thread_id}}
# Chạy Graph
async for _event in mock_graph.astream(input_state, config=config_runnable):
pass
process_time = time.time() - start_time
return {
"status": "success",
"process_time_seconds": round(process_time, 4),
"response": "[MOCK RESULT] Đây là câu trả lời giả lập từ Graph Flow.",
}
except Exception as e:
logger.error(f"Graph Error: {e}")
raise HTTPException(status_code=500, detail=str(e))
@app.post("/api/recommend/image")
async def api_recommend_image(body: dict = None):
"""Mock visual search."""
return {"status": "success", "products": []}
@app.post("/test/db-search")
async def test_db_search(request: SearchRequest):
"""
Test StarRocks DB Multi-Search Parallel.
Test StarRocks Vector Search - Query trực tiếp, chỉ lấy internal_ref_code.
"""
import asyncio
start_time = time.time()
try:
# Giả lập Multi-Search với 2 query song song
params1 = MockParams(query_text=request.query)
params2 = MockParams(query_text=request.query + " nam") # Truy vấn phái sinh
# Launch parallel task creation
tasks = [build_starrocks_query(params1), build_starrocks_query(params2)]
sqls = await asyncio.gather(*tasks)
# Tạo embedding vector từ query
embedding = await mock_create_embedding_async(request.final_query)
v_str = str(embedding)
# SQL query trực tiếp
sql = f"""
SELECT /*+ SET_VAR(ann_params='{{"ef_search":64}}') */
internal_ref_code,
approx_cosine_similarity(vector, {v_str}) as score
FROM shared_source.magento_product_dimension_with_text_embedding__tmp
ORDER BY score DESC
LIMIT 50
"""
# Execute query
db = StarRocksConnection()
results = await db.execute_query_async(sql)
# Parallel DB fetching
db_tasks = [db.execute_query_async(sql) for sql in sqls]
results = await asyncio.gather(*db_tasks)
# Trích xuất và làm sạch dữ liệu
ALLOWED_FIELDS = {"product_name", "sale_price", "internal_ref_code", "product_image_url_thumbnail"}
all_products = []
for products in results:
clean = [{k: v for k, v in p.items() if k in ALLOWED_FIELDS} for p in products[:5]]
all_products.extend(clean)
# Trích xuất internal_ref_code
codes = [item.get("internal_ref_code") for item in results if item.get("internal_ref_code")]
process_time = time.time() - start_time
return {
"status": "success",
"count": len(all_products),
"count": len(codes),
"process_time_seconds": round(process_time, 4),
"products": all_products,
"_queries_run": len(sqls)
"codes": codes,
}
except Exception as e:
logger.error(f"DB Multi-Search Error: {e}")
logger.error(f"DB Vector Search Error: {e}")
raise HTTPException(status_code=500, detail=str(e))
......@@ -229,40 +290,10 @@ async def test_db_ping():
raise HTTPException(status_code=500, detail=str(e))
# Endpoint cũ để tương thích (Optional)
@app.post("/test/graph-mock-chat")
async def test_graph_mock_chat(request: SearchRequest):
"""
Test toàn bộ Flow Graph với MockLLM.
KHÔNG GỌI OPENAI - Test logic code Python + LangGraph.
"""
if not mock_graph:
raise HTTPException(500, "Mock Graph not initialized")
start_time = time.time()
try:
# Tạo thread_id unique cho mỗi request
thread_id = f"perf_test_{int(time.time() * 1000)}"
input_state = {
"messages": [HumanMessage(content=request.query)],
"user_id": "perf_user",
}
config_runnable = {"configurable": {"thread_id": thread_id}}
# Chạy Graph
async for _event in mock_graph.astream(input_state, config=config_runnable):
pass # Chỉ cần chạy hết flow
process_time = time.time() - start_time
return {
"status": "success",
"mode": "mock_llm",
"process_time_seconds": round(process_time, 4),
"message": "Graph Flow executed successfully",
}
except Exception as e:
logger.error(f"Graph Error: {e}")
raise HTTPException(status_code=500, detail=str(e))
return await api_agent_chat(request)
@app.get("/")
......@@ -280,6 +311,10 @@ if __name__ == "__main__":
print("🎭 LLM: MockHighSpeedLLM (No OpenAI)")
print("🧠 Checkpointer: MemorySaver (No Postgres)")
print("🔇 Langfuse: Disabled")
print("⚡ Workers: 4")
print("⚙️ Loop: ProactorEventLoop (Windows Optimized)")
print("=" * 60)
uvicorn.run(app, host="0.0.0.0", port=8000)
# Note: On Windows, to use multiple workers, we must pass the app as an import string.
# reload MUST be False when using workers > 1.
uvicorn.run("hehe.api_server_perf:app", host="0.0.0.0", port=8000, workers=4, reload=False)
#!/usr/bin/env python3
"""
🦗 LOCUST MCP SERVER - Custom implementation
============================================================
MCP Server wrapper cho Locust performance testing.
Tích hợp trực tiếp vào project chatbot Canifa.
USAGE:
------
Add vào MCP config (mcp_config.json):
{
"mcpServers": {
"locust-canifa": {
"command": "python",
"args": [
"d:\\cnf\\chatbot_canifa\\backend\\locust\\locust_mcp_server.py"
],
"env": {
"LOCUST_HOST": "http://localhost:8000",
"LOCUST_USERS": "50",
"LOCUST_SPAWN_RATE": "10",
"LOCUST_RUN_TIME": "30s"
}
}
}
}
Sau đó hỏi AI: "Run locust test for locustfile_production.py"
"""
import asyncio
import json
import logging
import os
import subprocess
import sys
from pathlib import Path
from typing import Any, Optional
# MCP SDK imports
try:
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent
except ImportError:
print("ERROR: MCP SDK not installed!", file=sys.stderr)
print("Install with: pip install mcp", file=sys.stderr)
sys.exit(1)
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("locust-mcp")
# ============================================================
# DEFAULT CONFIGS
# ============================================================
DEFAULT_CONFIG = {
"host": os.getenv("LOCUST_HOST", "http://localhost:8000"),
"users": int(os.getenv("LOCUST_USERS", "50")),
"spawn_rate": int(os.getenv("LOCUST_SPAWN_RATE", "10")),
"run_time": os.getenv("LOCUST_RUN_TIME", "30s"),
"locust_dir": str(Path(__file__).parent),
}
# ============================================================
# MCP SERVER IMPLEMENTATION
# ============================================================
app = Server("locust-canifa")
@app.list_tools()
async def list_tools() -> list[Tool]:
"""List available Locust testing tools."""
return [
Tool(
name="run_locust_test",
description="""
Run Locust performance test for Canifa chatbot.
Parameters:
- test_file: Locust test file (e.g., 'locustfile_production.py')
- headless: Run without UI (default: True)
- host: Target server (default: http://localhost:8000)
- users: Number of concurrent users (default: 50)
- spawn_rate: Users spawned per second (default: 10)
- run_time: Test duration (e.g., '30s', '2m', default: 30s)
Returns: Test results including RPS, response times, and failure rate.
""",
inputSchema={
"type": "object",
"properties": {
"test_file": {
"type": "string",
"description": "Locust test file name (e.g., 'locustfile_production.py')",
"default": "locustfile_production.py"
},
"headless": {
"type": "boolean",
"description": "Run in headless mode (no UI)",
"default": True
},
"host": {
"type": "string",
"description": "Target host URL",
"default": DEFAULT_CONFIG["host"]
},
"users": {
"type": "integer",
"description": "Number of concurrent users",
"default": DEFAULT_CONFIG["users"]
},
"spawn_rate": {
"type": "integer",
"description": "User spawn rate (users/second)",
"default": DEFAULT_CONFIG["spawn_rate"]
},
"run_time": {
"type": "string",
"description": "Test duration (e.g., '30s', '2m')",
"default": DEFAULT_CONFIG["run_time"]
}
},
"required": ["test_file"]
}
),
Tool(
name="list_locust_files",
description="List all available Locust test files in the project",
inputSchema={
"type": "object",
"properties": {}
}
),
Tool(
name="quick_performance_check",
description="""
Quick performance check using Python async benchmark (no Locust install needed).
Fast way to check if chatbot is responsive.
Parameters:
- endpoint: API endpoint to test (default: /api/agent/chat)
- requests: Total requests (default: 50)
- concurrency: Concurrent requests (default: 10)
""",
inputSchema={
"type": "object",
"properties": {
"endpoint": {
"type": "string",
"default": "/api/agent/chat"
},
"requests": {
"type": "integer",
"default": 50
},
"concurrency": {
"type": "integer",
"default": 10
}
}
}
)
]
@app.call_tool()
async def call_tool(name: str, arguments: Any) -> list[TextContent]:
"""Execute Locust testing tools."""
if name == "run_locust_test":
return await run_locust_test(arguments)
elif name == "list_locust_files":
return await list_locust_files()
elif name == "quick_performance_check":
return await quick_performance_check(arguments)
else:
raise ValueError(f"Unknown tool: {name}")
# ============================================================
# TOOL IMPLEMENTATIONS
# ============================================================
async def run_locust_test(args: dict) -> list[TextContent]:
"""Run Locust performance test."""
test_file = args.get("test_file", "locustfile_production.py")
headless = args.get("headless", True)
host = args.get("host", DEFAULT_CONFIG["host"])
users = args.get("users", DEFAULT_CONFIG["users"])
spawn_rate = args.get("spawn_rate", DEFAULT_CONFIG["spawn_rate"])
run_time = args.get("run_time", DEFAULT_CONFIG["run_time"])
locust_file_path = Path(DEFAULT_CONFIG["locust_dir"]) / test_file
if not locust_file_path.exists():
return [TextContent(
type="text",
text=f"❌ Error: Locust file not found: {locust_file_path}\n\n"
f"Available files:\n{await _get_locust_files_text()}"
)]
# Build Locust command
cmd = [
"locust",
"-f", str(locust_file_path),
"--host", host,
"-u", str(users),
"-r", str(spawn_rate),
"--run-time", run_time,
]
if headless:
cmd.append("--headless")
# Add stats output
cmd.extend(["--html", "locust_report.html"])
cmd.extend(["--csv", "locust_stats"])
logger.info(f"Running Locust: {' '.join(cmd)}")
try:
# Run Locust
result = subprocess.run(
cmd,
capture_output=True,
text=True,
timeout=300 # 5 minutes max
)
output = result.stdout + result.stderr
# Parse results
summary = _parse_locust_output(output)
response = f"""
🦗 LOCUST PERFORMANCE TEST RESULTS
{'='*60}
📝 Test Configuration:
- File: {test_file}
- Host: {host}
- Users: {users}
- Spawn Rate: {spawn_rate}/s
- Duration: {run_time}
{summary}
📊 Detailed Output:
{output}
💾 Reports Generated:
- HTML Report: locust_report.html
- CSV Stats: locust_stats_*.csv
"""
return [TextContent(type="text", text=response)]
except subprocess.TimeoutExpired:
return [TextContent(
type="text",
text="❌ Test timeout! Locust ran for more than 5 minutes."
)]
except FileNotFoundError:
return [TextContent(
type="text",
text="❌ Locust not installed!\n\n"
"Install with: pip install locust"
)]
except Exception as e:
logger.error(f"Locust error: {e}")
return [TextContent(
type="text",
text=f"❌ Error running Locust: {str(e)}"
)]
async def list_locust_files() -> list[TextContent]:
"""List available Locust test files."""
text = await _get_locust_files_text()
return [TextContent(type="text", text=text)]
async def _get_locust_files_text() -> str:
"""Get formatted list of Locust files."""
locust_dir = Path(DEFAULT_CONFIG["locust_dir"])
locust_files = list(locust_dir.glob("locustfile*.py"))
if not locust_files:
return "❌ No Locust test files found in locust directory!"
output = "📋 Available Locust Test Files:\n" + "="*60 + "\n\n"
for f in locust_files:
output += f" - {f.name}\n"
return output
async def quick_performance_check(args: dict) -> list[TextContent]:
"""Quick performance check without Locust."""
endpoint = args.get("endpoint", "/api/agent/chat")
requests = args.get("requests", 50)
concurrency = args.get("concurrency", 10)
# Run quick benchmark script
benchmark_script = Path(DEFAULT_CONFIG["locust_dir"]) / "quick_benchmark.py"
if not benchmark_script.exists():
return [TextContent(
type="text",
text="❌ Quick benchmark script not found!"
)]
cmd = [
"python",
str(benchmark_script),
"--method", "python",
"--endpoint", endpoint,
"--requests", str(requests),
"--concurrency", str(concurrency)
]
try:
result = subprocess.run(cmd, capture_output=True, text=True, timeout=120)
output = result.stdout + result.stderr
return [TextContent(type="text", text=output)]
except Exception as e:
return [TextContent(
type="text",
text=f"❌ Error running quick benchmark: {str(e)}"
)]
def _parse_locust_output(output: str) -> str:
"""Parse Locust output to extract key metrics."""
lines = output.split('\n')
summary = "📊 Key Metrics:\n"
# Look for key metrics in output
for line in lines:
if "requests/s" in line.lower() or "rps" in line.lower():
summary += f" {line.strip()}\n"
elif "response time" in line.lower():
summary += f" {line.strip()}\n"
elif "failure" in line.lower():
summary += f" {line.strip()}\n"
if summary == "📊 Key Metrics:\n":
summary += " (Check detailed output below)\n"
return summary
# ============================================================
# MAIN - Start MCP Server
# ============================================================
async def main():
"""Start the MCP server."""
logger.info("🦗 Starting Locust MCP Server for Canifa Chatbot...")
logger.info(f"📁 Locust directory: {DEFAULT_CONFIG['locust_dir']}")
logger.info(f"🎯 Default host: {DEFAULT_CONFIG['host']}")
async with stdio_server() as (read_stream, write_stream):
await app.run(
read_stream,
write_stream,
app.create_initialization_options()
)
if __name__ == "__main__":
asyncio.run(main())
This source diff could not be displayed because it is too large. You can view the blob instead.
Count,Message,Traceback,Nodes
Method,Name,Error,Occurrences
POST,/api/agent/chat [MAIN],CatchResponseError('Status: 404'),80
POST,/api/agent/chat [MAIN],CatchResponseError('Status: 0'),7
POST,/test/db-search [DB_ONLY],HTTPError('404 Client Error: Not Found for url: /test/db-search [DB_ONLY]'),231
Type,Name,Request Count,Failure Count,Median Response Time,Average Response Time,Min Response Time,Max Response Time,Average Content Size,Requests/s,Failures/s,50%,66%,75%,80%,90%,95%,98%,99%,99.9%,99.99%,100%
POST,/api/agent/chat [MAIN],87,87,1200.0,1715.7884011494702,1.9360000733286142,6251.831999979913,20.229885057471265,3.7430531309093538,3.7430531309093538,1200,1500,2600,2600,4300,6000,6200,6300,6300,6300,6300
GET,/health,6,0,760.0,1024.0447499866907,86.62169997114688,2807.93920008,17220.0,0.25814159523512786,0.0,770,770,1500,1500,2800,2800,2800,2800,2800,2800,2800
POST,/test/db-search [DB_ONLY],231,231,800.0,1095.216632898276,2.817099913954735,7268.948999932036,22.0,9.938451416552422,9.938451416552422,800,1200,1300,1500,2600,3100,5100,5800,7300,7300,7300
,Aggregated,324,318,890.0,1260.533646911808,1.9360000733286142,7268.948999932036,340.0061728395062,13.939646142696905,13.681504547461776,890,1300,1500,2100,2600,4200,6000,6200,7300,7300,7300
Timestamp,User Count,Type,Name,Requests/s,Failures/s,50%,66%,75%,80%,90%,95%,98%,99%,99.9%,99.99%,100%,Total Request Count,Total Failure Count,Total Median Response Time,Total Average Response Time,Total Min Response Time,Total Max Response Time,Total Average Content Size
1767665177,0,,Aggregated,0.000000,0.000000,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,0,0,0,0.0,0,0,0
1767665178,10,,Aggregated,0.000000,0.000000,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,0,0,0,0.0,0,0,0
1767665179,20,,Aggregated,0.000000,0.000000,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,0,0,0,0.0,0,0,0
1767665180,30,,Aggregated,0.000000,0.000000,2600,2600,2600,2600,2600,2800,2800,2800,2800,2800,2800,12,11,2600.0,2172.7166083583143,13.209500000812113,2807.93920008,1455.1666666666667
1767665181,40,,Aggregated,0.000000,0.000000,2600,2600,2600,2800,3000,3100,3200,3200,3200,3200,3200,23,22,2600.0,2127.1039913256614,13.209500000812113,3222.1904000034556,769.7391304347826
1767665182,50,,Aggregated,3.333333,3.000000,2600,2600,2600,2600,2900,3100,3400,3400,3400,3400,3400,41,40,2600.0,1878.9734097606524,13.209500000812113,3379.774900036864,441.4634146341463
1767665183,50,,Aggregated,4.000000,3.750000,2600,2600,2600,2600,2900,3100,3200,3400,3400,3400,3400,51,50,2600.0,1680.0740803934304,13.209500000812113,3379.774900036864,359.2156862745098
1767665185,50,,Aggregated,6.000000,5.800000,2400,2600,2600,2600,3100,3500,4100,4200,4200,4200,4200,68,67,1100.0,1646.725695587092,13.209500000812113,4216.733000008389,274.9117647058824
1767665186,50,,Aggregated,7.285714,7.142857,1400,2600,2600,2600,3400,4200,5200,5600,5600,5600,5600,80,79,1400.0,1743.8070987467654,13.209500000812113,5642.961099976674,236.975
1767665187,50,,Aggregated,8.500000,8.375000,1200,2600,2600,2600,3500,5000,5200,5600,6100,6100,6100,106,105,1200.0,1724.8162594327334,13.209500000812113,6071.023600059561,184.24528301886792
1767665188,50,,Aggregated,8.777778,8.666667,1100,2400,2600,2600,5000,6000,6300,7200,7300,7300,7300,137,136,1100.0,1771.4287751791046,13.209500000812113,7268.948999932036,147.53284671532847
1767665190,50,,Aggregated,13.000000,12.900000,850,1200,2600,2600,3600,5600,6200,7200,7300,7300,7300,169,166,850.0,1466.0903857917574,2.817099913954735,7268.948999932036,327.2899408284024
1767665191,50,,Aggregated,13.900000,13.800000,830,1200,2400,2600,3200,5200,6200,7200,7300,7300,7300,191,188,830.0,1378.066231930599,2.817099913954735,7268.948999932036,292.1256544502618
1767665192,50,,Aggregated,13.900000,13.800000,870,1200,1500,2600,3100,5200,6100,6300,7300,7300,7300,203,200,870.0,1357.2945172349082,2.817099913954735,7268.948999932036,275.83251231527095
1767665193,50,,Aggregated,16.600000,16.400000,950,1200,1500,2600,3000,5200,6100,6300,7300,7300,7300,217,214,950.0,1361.8354663539308,2.817099913954735,7268.948999932036,259.4562211981567
1767665194,50,,Aggregated,17.300000,17.100000,1100,1400,2100,2500,2900,5000,6100,6300,7300,7300,7300,249,246,1100.0,1419.1991526060308,2.817099913954735,7268.948999932036,228.93975903614458
1767665196,50,,Aggregated,16.600000,16.400000,1100,1400,1900,2500,2900,5000,6100,6300,7300,7300,7300,258,252,1000.0,1382.0461077478446,1.9360000733286142,7268.948999932036,421.69767441860466
1767665197,50,,Aggregated,18.600000,18.100000,950,1300,1600,2400,2600,4200,6100,6300,7300,7300,7300,283,277,950.0,1327.5479494664792,1.9360000733286142,7268.948999932036,386.3886925795053
1767665199,50,,Aggregated,17.600000,17.100000,840,1200,1500,2300,2600,4100,6000,6200,7300,7300,7300,308,302,830.0,1242.4250762961055,1.9360000733286142,7268.948999932036,356.7402597402597
1767665200,50,,Aggregated,16.000000,15.500000,890,1300,1500,2100,2600,4200,6000,6200,7300,7300,7300,324,318,890.0,1260.533646911808,1.9360000733286142,7268.948999932036,340.0061728395062
"""
🎯 Production-like Performance Testing with Locust
Test thực tế các endpoint QUAN TRỌNG của chatbot để tìm bottleneck.
CÁCH CHẠY:
1. Start API server:
cd backend
python run.py
2. Run Locust với file này:
locust -f locust/locustfile_production.py --host=http://localhost:8000
3. Mở browser: http://localhost:8089
- Number of users: 50 (tăng dần để test scalability)
- Spawn rate: 10 users/second
- Host: http://localhost:8000
📊 METRICS CẦN QUAN TÂM:
- Response Time (P50, P95, P99): Thời gian phản hồi
- RPS (Requests per second): Throughput
- Failure Rate: Tỷ lệ lỗi
"""
import random
import time
from locust import HttpUser, between, events, task
# ============================================================
# TEST DATA - Mô phỏng real user queries
# ============================================================
CHAT_QUERIES = [
# Simple product search (nhanh)
"tìm áo phông nam",
"quần jean nữ",
"váy liền",
# Complex search với filters (chậm hơn)
"áo khoác nam màu đen giá dưới 500k",
"quần short nữ mùa hè",
# Knowledge queries (test RAG knowledge base)
"Canifa có cửa hàng ở Hà Nội không?",
"chính sách đổi trả",
"bảng size áo nam",
# Conversational (test LLM reasoning)
"xin chào",
"cảm ơn bạn",
]
VISUAL_SEARCH_IMAGES = [
"https://canifa.com/img/500/750/resize/6/t/6ts24w007-sk010-m-1-u.webp",
"https://canifa.com/img/500/750/resize/6/a/6aw24w006-sb492-thumb-2.webp",
]
# ============================================================
# CUSTOM METRICS - Track specific bottlenecks
# ============================================================
chat_response_times = []
db_query_times = []
llm_call_times = []
@events.test_stop.add_listener
def on_test_stop(environment, **kwargs):
"""Print summary khi test xong."""
print("\n" + "=" * 60)
print("📊 PERFORMANCE TEST SUMMARY")
print("=" * 60)
if chat_response_times:
avg_chat = sum(chat_response_times) / len(chat_response_times)
print(f"💬 Chat Response Time (avg): {avg_chat:.2f}ms")
print(f" P50: {sorted(chat_response_times)[len(chat_response_times) // 2]:.2f}ms")
print(f" P95: {sorted(chat_response_times)[int(len(chat_response_times) * 0.95)]:.2f}ms")
print("\n🎯 RECOMMENDED ACTIONS:")
print("1. Check response times > 2000ms")
print("2. Identify which endpoint has highest latency")
print("3. Use profiling tools (below) for deep dive")
print("=" * 60 + "\n")
# ============================================================
# USER BEHAVIORS
# ============================================================
class ChatbotUser(HttpUser):
"""Mô phỏng user sử dụng chatbot."""
wait_time = between(2, 5) # User thường đợi 2-5s giữa các câu hỏi
def on_start(self):
"""Initialize user - giống như user mở chat lần đầu."""
self.user_id = f"user_{random.randint(1000, 9999)}"
self.thread_id = f"thread_{int(time.time() * 1000)}_{random.randint(0, 999)}"
@task(10)
def chat_message(self):
"""
Task quan trọng nhất - test FULL chatbot flow.
Weight: 10 (chiếm 10/12 = 83% traffic)
"""
query = random.choice(CHAT_QUERIES)
start_time = time.time()
with self.client.post(
"/api/agent/chat",
json={"message": query, "user_id": self.user_id, "thread_id": self.thread_id},
catch_response=True,
name="/api/agent/chat [MAIN]",
) as response:
duration = (time.time() - start_time) * 1000 # ms
chat_response_times.append(duration)
if response.status_code == 200:
response.success()
else:
response.failure(f"Status: {response.status_code}")
@task(1)
def health_check(self):
"""
Health check endpoint.
Weight: 1 (8% traffic)
"""
self.client.get("/", name="/health")
@task(1)
def visual_search(self):
"""
Test visual search nếu có.
Weight: 1 (8% traffic)
"""
img_url = random.choice(VISUAL_SEARCH_IMAGES)
self.client.post(
"/api/recommend/image",
json={"image_url": img_url},
name="/api/recommend/image [VISUAL]",
catch_response=True,
)
class DatabaseStressUser(HttpUser):
"""
Riêng để test ONLY database bottleneck.
Chạy riêng test này để isolate DB performance.
"""
wait_time = between(8, 20) # Mô phỏng người dùng thật: đợi 8-20s giữa các lần search
@task
def db_direct_query(self):
"""Test trực tiếp StarRocks query speed."""
self.client.post(
"/test/db-search",
json={"query": random.choice(["áo phông", "quần jean", "váy"]), "limit": 10},
name="/test/db-search [DB_ONLY]",
)
# ============================================================
# SHAPE CONFIGURATION - Simulate real traffic pattern
# ============================================================
class WebsiteUserShape:
"""
Mô phỏng traffic pattern thực tế:
- Sáng sớm: ít user
- Trưa + tối: peak hours
- Đêm khuya: vắng
CHỈ DÙNG KHI MUỐN TEST THEO PATTERN, KHÔNG DÙNG CHO TEST NHANH.
"""
pass # Implement nếu cần
if __name__ == "__main__":
print("🚀 Starting Locust Performance Test...")
print("📖 Read the docstring for instructions!")
{
"mcpServers": {
"dbeaver": {
"command": "dbeaver-mcp-server",
"env": {
"DBEAVER_DEBUG": "false",
"DBEAVER_TIMEOUT": "30000"
}
},
"sequential-thinking": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-sequential-thinking"
],
"env": {}
},
"docs-langchain": {
"serverUrl": "https://docs.langchain.com/mcp"
},
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
},
"locust-canifa": {
"command": "python",
"args": [
"d:\\cnf\\chatbot_canifa\\backend\\locust\\locust_mcp_server.py"
],
"env": {
"LOCUST_HOST": "http://localhost:8000",
"LOCUST_USERS": "50",
"LOCUST_SPAWN_RATE": "10",
"LOCUST_RUN_TIME": "30s"
}
}
}
}
\ No newline at end of file
"""
🔍 BOTTLENECK PROFILER - Tìm chỗ code chậm nhất
============================================================
Tool này sẽ:
1. Profile TOÀN BỘ API call (từ request → response)
2. Breakdown time cho từng bước: LLM, DB, Tool calls, etc.
3. Export chi tiết ra file để phân tích
CÁCH DÙNG:
----------
1. Chạy script này:
python locust/profiler_bottleneck.py
2. Xem kết quả trong:
- Terminal: Summary report
- File: profiler_results.json (chi tiết)
3. Phân tích bottleneck:
- LLM calls > 1000ms? → Cân nhắc streaming hoặc cache
- DB queries > 500ms? → Optimize index hoặc query
- Tool execution > 2000ms? → Check logic tool
============================================================
"""
import asyncio
import json
import logging
import sys
import time
from pathlib import Path
# Setup path
sys.path.insert(0, str(Path(__file__).parent.parent))
from agent.graph import build_graph
from agent.config import get_config
from langchain_core.messages import HumanMessage
from common.starrocks_connection import StarRocksConnection
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# ============================================================
# PROFILING DECORATORS
# ============================================================
class PerformanceProfiler:
"""Track và log performance của mỗi step."""
def __init__(self):
self.metrics = {
"total_time": 0,
"llm_calls": [],
"db_queries": [],
"tool_executions": [],
"graph_steps": []
}
self.current_step_start = None
def start_timer(self):
"""Bắt đầu đếm thời gian."""
self.current_step_start = time.time()
def record_llm_call(self, duration_ms: float, tokens: int = 0):
"""Record LLM call time."""
self.metrics["llm_calls"].append({
"duration_ms": duration_ms,
"tokens": tokens
})
def record_db_query(self, duration_ms: float, query_type: str):
"""Record DB query time."""
self.metrics["db_queries"].append({
"duration_ms": duration_ms,
"type": query_type
})
def record_tool_execution(self, tool_name: str, duration_ms: float):
"""Record tool execution time."""
self.metrics["tool_executions"].append({
"tool": tool_name,
"duration_ms": duration_ms
})
def record_graph_step(self, step_name: str, duration_ms: float):
"""Record graph node execution time."""
self.metrics["graph_steps"].append({
"step": step_name,
"duration_ms": duration_ms
})
def get_summary(self):
"""Tính toán summary statistics."""
llm_total = sum(c["duration_ms"] for c in self.metrics["llm_calls"])
llm_avg = llm_total / len(self.metrics["llm_calls"]) if self.metrics["llm_calls"] else 0
db_total = sum(q["duration_ms"] for q in self.metrics["db_queries"])
db_avg = db_total / len(self.metrics["db_queries"]) if self.metrics["db_queries"] else 0
tool_total = sum(t["duration_ms"] for t in self.metrics["tool_executions"])
return {
"total_time_ms": self.metrics["total_time"],
"llm": {
"total_ms": llm_total,
"avg_ms": llm_avg,
"count": len(self.metrics["llm_calls"]),
"percentage": (llm_total / self.metrics["total_time"] * 100) if self.metrics["total_time"] > 0 else 0
},
"db": {
"total_ms": db_total,
"avg_ms": db_avg,
"count": len(self.metrics["db_queries"]),
"percentage": (db_total / self.metrics["total_time"] * 100) if self.metrics["total_time"] > 0 else 0
},
"tools": {
"total_ms": tool_total,
"count": len(self.metrics["tool_executions"]),
"percentage": (tool_total / self.metrics["total_time"] * 100) if self.metrics["total_time"] > 0 else 0
},
"graph_steps": self.metrics["graph_steps"]
}
def print_report(self):
"""In báo cáo đẹp mắt ra terminal."""
summary = self.get_summary()
print("\n" + "="*60)
print("🔍 BOTTLENECK PROFILING REPORT")
print("="*60)
print(f"⏱️ TOTAL TIME: {summary['total_time_ms']:.2f}ms\n")
print("📊 BREAKDOWN BY COMPONENT:")
print(f" 🤖 LLM Calls:")
print(f" - Time: {summary['llm']['total_ms']:.2f}ms ({summary['llm']['percentage']:.1f}%)")
print(f" - Count: {summary['llm']['count']}")
print(f" - Avg: {summary['llm']['avg_ms']:.2f}ms/call\n")
print(f" 🗄️ Database Queries:")
print(f" - Time: {summary['db']['total_ms']:.2f}ms ({summary['db']['percentage']:.1f}%)")
print(f" - Count: {summary['db']['count']}")
print(f" - Avg: {summary['db']['avg_ms']:.2f}ms/query\n")
print(f" 🔧 Tool Executions:")
print(f" - Time: {summary['tools']['total_ms']:.2f}ms ({summary['tools']['percentage']:.1f}%)")
print(f" - Count: {summary['tools']['count']}\n")
print("📈 GRAPH EXECUTION STEPS:")
for step in summary['graph_steps']:
print(f" ├─ {step['step']}: {step['duration_ms']:.2f}ms")
print("\n" + "="*60)
print("🎯 BOTTLENECK ANALYSIS:")
# Identify bottleneck
components = [
("LLM", summary['llm']['percentage']),
("Database", summary['db']['percentage']),
("Tools", summary['tools']['percentage'])
]
bottleneck = max(components, key=lambda x: x[1])
if bottleneck[1] > 40:
print(f"⚠️ PRIMARY BOTTLENECK: {bottleneck[0]} ({bottleneck[1]:.1f}%)")
if bottleneck[0] == "LLM":
print("💡 RECOMMENDATIONS:")
print(" - Consider streaming response instead of waiting full completion")
print(" - Cache common queries/responses")
print(" - Use lighter model for simple tasks")
elif bottleneck[0] == "Database":
print("💡 RECOMMENDATIONS:")
print(" - Check if vector index is being used (EXPLAIN query)")
print(" - Optimize WHERE clauses and add proper indexes")
print(" - Consider connection pooling")
print(" - Cache frequent queries")
elif bottleneck[0] == "Tools":
print("💡 RECOMMENDATIONS:")
print(" - Profile individual tool execution")
print(" - Add caching for deterministic tools")
print(" - Parallelize independent tool calls")
else:
print("✅ No single dominant bottleneck - well balanced!")
print("="*60 + "\n")
# ============================================================
# TEST QUERIES
# ============================================================
TEST_QUERIES = [
"tìm áo phông nam màu đen",
"Canifa có cửa hàng ở Hà Nội không?",
"quần jean nữ giá dưới 500k",
"chính sách đổi trả như thế nào?",
"áo khoác mùa đông",
]
# ============================================================
# MAIN PROFILING FUNCTION
# ============================================================
async def profile_chatbot_performance():
"""Chạy test và profile performance."""
print("🚀 Starting Performance Profiling...")
print("="*60)
# Build graph
config = get_config()
graph = build_graph(config)
# Test với mỗi query
all_profiles = []
for i, query in enumerate(TEST_QUERIES, 1):
print(f"\n[{i}/{len(TEST_QUERIES)}] Testing: '{query}'")
profiler = PerformanceProfiler()
# Tạo unique thread
thread_id = f"profile_test_{int(time.time() * 1000)}"
# Run graph với profiling
start_time = time.time()
try:
input_state = {
"messages": [HumanMessage(content=query)],
"user_id": "profiler_user"
}
config_runnable = {"configurable": {"thread_id": thread_id}}
step_count = 0
async for event in graph.astream(input_state, config=config_runnable):
step_count += 1
step_name = list(event.keys())[0] if event else f"step_{step_count}"
step_time = time.time()
# Record step (simplified - trong production cần hook vào LangGraph callbacks)
profiler.record_graph_step(step_name, 0) # TODO: measure actual step time
total_time = (time.time() - start_time) * 1000
profiler.metrics["total_time"] = total_time
# Mock some metrics (in production, hook into actual LLM/DB calls)
# Đây chỉ là example - cần integrate với actual callbacks
profiler.record_llm_call(800, 150) # Example
profiler.record_db_query(300, "vector_search") # Example
all_profiles.append({
"query": query,
"profiler": profiler,
"summary": profiler.get_summary()
})
print(f" ✅ Completed in {total_time:.2f}ms")
except Exception as e:
print(f" ❌ Error: {e}")
# Print aggregate report
print("\n" + "="*60)
print("📊 AGGREGATE REPORT")
print("="*60)
for profile in all_profiles:
print(f"\nQuery: '{profile['query']}'")
profile['profiler'].print_report()
# Save detailed results
results_file = Path(__file__).parent / "profiler_results.json"
with open(results_file, "w", encoding="utf-8") as f:
json.dump(
{
"timestamp": time.time(),
"results": [
{
"query": p["query"],
"summary": p["summary"]
}
for p in all_profiles
]
},
f,
indent=2,
ensure_ascii=False
)
print(f"\n💾 Detailed results saved to: {results_file}")
print("\n✅ Profiling complete!")
# ============================================================
# BONUS: Quick DB Query Profiler
# ============================================================
async def profile_db_queries():
"""Profile ONLY database queries để tìm slow queries."""
print("\n🗄️ DATABASE QUERY PROFILER")
print("="*60)
test_queries = [
("Simple text search", """
SELECT * FROM shared_source.canifa_products_by_sku
WHERE LOWER(product_name) LIKE '%áo phông%'
LIMIT 10
"""),
("Vector search (no filters)", """
WITH top_candidates AS (
SELECT internal_ref_code,
approx_cosine_similarity(embedding, [0.1, 0.2, /* ... 766 more ... */]) as score
FROM shared_source.canifa_products_by_sku
ORDER BY score DESC
LIMIT 100
)
SELECT * FROM top_candidates WHERE score > 0.7
"""),
]
db = StarRocksConnection()
for name, sql in test_queries:
print(f"\nTesting: {name}")
start = time.time()
try:
# Execute query
await db.execute_query_async(sql)
duration = (time.time() - start) * 1000
print(f" ⏱️ Duration: {duration:.2f}ms")
if duration > 500:
print(f" ⚠️ SLOW QUERY DETECTED!")
print(f" 💡 Recommendation: Run EXPLAIN to check index usage")
except Exception as e:
print(f" ❌ Error: {e}")
print("\n" + "="*60)
# ============================================================
# ENTRY POINT
# ============================================================
if __name__ == "__main__":
print(__doc__)
# Chạy main profiler
asyncio.run(profile_chatbot_performance())
# Bonus: DB profiler
# asyncio.run(profile_db_queries())
"""
🚀 QUICK BENCHMARK TOOL - Test nhanh performance
============================================================
Multiple testing methods trong 1 file:
1. Pure Python asyncio benchmark
2. Apache Bench wrapper
3. wrk wrapper (if installed)
4. Quick Locust headless test
USAGE:
------
python locust/quick_benchmark.py --method all
python locust/quick_benchmark.py --method ab
python locust/quick_benchmark.py --method locust
python locust/quick_benchmark.py --endpoint /api/agent/chat
"""
import argparse
import asyncio
import json
import subprocess
import sys
import time
from pathlib import Path
from typing import List, Dict
import aiohttp
# ============================================================
# 1. PURE PYTHON ASYNC BENCHMARK
# ============================================================
async def async_benchmark(
url: str,
total_requests: int = 100,
concurrent: int = 10,
payload: Dict = None
):
"""
Pure Python async benchmark - không cần tool ngoài.
Giống ab nhưng flexible hơn.
"""
print(f"\n🐍 PYTHON ASYNC BENCHMARK")
print("="*60)
print(f"URL: {url}")
print(f"Total Requests: {total_requests}")
print(f"Concurrency: {concurrent}")
print("="*60)
results = {
"success": 0,
"failed": 0,
"response_times": []
}
async def single_request(session, sem):
async with sem:
start = time.time()
try:
if payload:
async with session.post(url, json=payload) as resp:
await resp.text()
duration = (time.time() - start) * 1000
results["response_times"].append(duration)
if resp.status == 200:
results["success"] += 1
else:
results["failed"] += 1
else:
async with session.get(url) as resp:
await resp.text()
duration = (time.time() - start) * 1000
results["response_times"].append(duration)
if resp.status == 200:
results["success"] += 1
else:
results["failed"] += 1
except Exception as e:
results["failed"] += 1
print(f"❌ Error: {e}")
# Run benchmark
sem = asyncio.Semaphore(concurrent)
start_time = time.time()
async with aiohttp.ClientSession() as session:
tasks = [single_request(session, sem) for _ in range(total_requests)]
await asyncio.gather(*tasks)
total_time = time.time() - start_time
# Calculate stats
if results["response_times"]:
sorted_times = sorted(results["response_times"])
p50 = sorted_times[len(sorted_times) // 2]
p95 = sorted_times[int(len(sorted_times) * 0.95)]
p99 = sorted_times[int(len(sorted_times) * 0.99)]
avg = sum(sorted_times) / len(sorted_times)
print(f"\n📊 RESULTS:")
print(f"Total Time: {total_time:.2f}s")
print(f"Requests/sec: {total_requests / total_time:.2f}")
print(f"Success: {results['success']}")
print(f"Failed: {results['failed']}")
print(f"\nResponse Times:")
print(f" Avg: {avg:.2f}ms")
print(f" P50: {p50:.2f}ms")
print(f" P95: {p95:.2f}ms")
print(f" P99: {p99:.2f}ms")
print(f" Min: {min(sorted_times):.2f}ms")
print(f" Max: {max(sorted_times):.2f}ms")
return results
# ============================================================
# 2. APACHE BENCH WRAPPER
# ============================================================
def run_apache_bench(url: str, requests: int = 1000, concurrency: int = 10):
"""
Sử dụng Apache Bench (ab) nếu có cài.
"""
print(f"\n🔨 APACHE BENCH TEST")
print("="*60)
try:
cmd = [
"ab",
"-n", str(requests),
"-c", str(concurrency),
"-T", "application/json",
url
]
result = subprocess.run(cmd, capture_output=True, text=True)
print(result.stdout)
if result.returncode != 0:
print(f"❌ Error: {result.stderr}")
except FileNotFoundError:
print("❌ Apache Bench (ab) not found!")
print("💡 Install: apt-get install apache2-utils (Linux)")
print(" or brew install ab (Mac)")
return None
# ============================================================
# 3. WRK WRAPPER
# ============================================================
def run_wrk(url: str, duration: str = "10s", threads: int = 4, connections: int = 10):
"""
Sử dụng wrk nếu có cài - tool siêu nhanh viết bằng C.
"""
print(f"\n⚡ WRK BENCHMARK")
print("="*60)
try:
cmd = [
"wrk",
"-t", str(threads),
"-c", str(connections),
"-d", duration,
url
]
result = subprocess.run(cmd, capture_output=True, text=True)
print(result.stdout)
if result.returncode != 0:
print(f"❌ Error: {result.stderr}")
except FileNotFoundError:
print("❌ wrk not found!")
print("💡 Install: https://github.com/wg/wrk")
print(" Mac: brew install wrk")
print(" Linux: build from source")
return None
# ============================================================
# 4. LOCUST HEADLESS
# ============================================================
def run_locust_headless(
locustfile: str,
host: str,
users: int = 50,
spawn_rate: int = 10,
run_time: str = "30s"
):
"""
Chạy Locust ở chế độ headless (không UI).
"""
print(f"\n🦗 LOCUST HEADLESS TEST")
print("="*60)
try:
cmd = [
"locust",
"-f", locustfile,
"--headless",
"--host", host,
"-u", str(users),
"-r", str(spawn_rate),
"--run-time", run_time,
"--html", "locust_report.html"
]
print(f"Running: {' '.join(cmd)}")
result = subprocess.run(cmd, text=True)
if result.returncode == 0:
print("\n✅ Test completed!")
print(f"📊 Report saved to: locust_report.html")
except FileNotFoundError:
print("❌ Locust not found!")
print("💡 Install: pip install locust")
return None
# ============================================================
# 5. K6 WRAPPER (Bonus)
# ============================================================
def generate_k6_script(url: str, output_file: str = "test.js"):
"""
Generate k6 test script.
"""
script = f"""
import http from 'k6/http';
import {{ check, sleep }} from 'k6';
export let options = {{
stages: [
{{ duration: '30s', target: 20 }},
{{ duration: '1m', target: 50 }},
{{ duration: '30s', target: 0 }},
],
thresholds: {{
http_req_duration: ['p(95)<500'], // 95% requests < 500ms
}},
}};
export default function () {{
let res = http.post('{url}', JSON.stringify({{
message: 'test',
user_id: 'test_user',
thread_id: 'test_thread'
}}), {{
headers: {{ 'Content-Type': 'application/json' }},
}});
check(res, {{
'status is 200': (r) => r.status === 200,
'response time < 2000ms': (r) => r.timings.duration < 2000,
}});
sleep(1);
}}
"""
with open(output_file, "w") as f:
f.write(script)
print(f"✅ k6 script generated: {output_file}")
print(f"💡 Run with: k6 run {output_file}")
# ============================================================
# MAIN CLI
# ============================================================
def main():
parser = argparse.ArgumentParser(description="Quick Performance Benchmark Tool")
parser.add_argument("--method", default="python",
choices=["python", "ab", "wrk", "locust", "k6-gen", "all"],
help="Benchmark method to use")
parser.add_argument("--endpoint", default="/api/agent/chat",
help="API endpoint to test")
parser.add_argument("--host", default="http://localhost:8000",
help="Server host")
parser.add_argument("--requests", type=int, default=100,
help="Total requests (for python/ab)")
parser.add_argument("--concurrency", type=int, default=10,
help="Concurrent requests")
args = parser.parse_args()
url = args.host + args.endpoint
print("\n" + "="*60)
print("🔥 QUICK BENCHMARK TOOL")
print("="*60)
print(f"Target: {url}")
print("="*60)
# Prepare payload for chat endpoint
payload = None
if "/chat" in args.endpoint:
payload = {
"message": "test performance",
"user_id": "benchmark_user",
"thread_id": "benchmark_thread"
}
if args.method == "python" or args.method == "all":
asyncio.run(async_benchmark(url, args.requests, args.concurrency, payload))
if args.method == "ab" or args.method == "all":
# ab không support POST JSON dễ, skip hoặc dùng cho GET
if not payload:
run_apache_bench(url, args.requests, args.concurrency)
else:
print("\n⚠️ Apache Bench: Skipped (POST JSON not supported easily)")
if args.method == "wrk" or args.method == "all":
run_wrk(url, "30s", 4, args.concurrency)
if args.method == "locust":
locustfile = str(Path(__file__).parent / "locustfile_production.py")
run_locust_headless(locustfile, args.host, 50, 10, "30s")
if args.method == "k6-gen":
generate_k6_script(url)
print("\n" + "="*60)
print("✅ Benchmark Complete!")
print("="*60 + "\n")
if __name__ == "__main__":
main()
This source diff could not be displayed because it is too large. You can view the blob instead.
# Chạy từ thư mục d:\cnf\chatbot_canifa\backend\hehe
# 1. Khởi động Server (4 Workers)
python api_server_perf.py
# 2. Chạy Locust Test (500 Users)
locust -f locustfile_production.py --host=http://localhost:8000 --headless -u 500 -r 20 --run-time 1m --html report.html
# 3. Lệnh "trảm" process nếu bị treo
Stop-Process -Name python -Force
\ No newline at end of file
# ============================================================
# 🚀 AUTO PERFORMANCE TEST RUNNER
# ============================================================
# Script tự động:
# 1. Start Mock Server (port 8000)
# 2. Đợi server ready
# 3. Run Locust performance test
# 4. Cleanup
# ============================================================
Write-Host "=" -NoNewline -ForegroundColor Cyan
Write-Host "=" * 59 -ForegroundColor Cyan
Write-Host "🚀 CANIFA CHATBOT - PERFORMANCE TEST AUTOMATION" -ForegroundColor Green
Write-Host "=" -NoNewline -ForegroundColor Cyan
Write-Host "=" * 59 -ForegroundColor Cyan
# Activate venv
Write-Host "`n📦 Activating virtual environment..." -ForegroundColor Yellow
& ..\..\.venv\Scripts\Activate.ps1
# Start Mock Server in background
Write-Host "🎭 Starting Mock Server (Port 8000)..." -ForegroundColor Yellow
$serverJob = Start-Job -ScriptBlock {
Set-Location "D:\cnf\chatbot_canifa\backend"
& .venv\Scripts\Activate.ps1
python locust/api_server_perf.py
}
Write-Host "⏳ Waiting for server to be ready..." -ForegroundColor Yellow
Start-Sleep -Seconds 5
# Check if server is running
try {
$response = Invoke-WebRequest -Uri "http://localhost:8000/" -UseBasicParsing -TimeoutSec 3
Write-Host "✅ Mock Server is ready!" -ForegroundColor Green
} catch {
Write-Host "❌ Mock Server failed to start!" -ForegroundColor Red
Stop-Job $serverJob
Remove-Job $serverJob
exit 1
}
# Run Locust Test
Write-Host "`n🦗 Running Locust Performance Test..." -ForegroundColor Yellow
Write-Host " - Users: 50" -ForegroundColor Cyan
Write-Host " - Spawn Rate: 10/s" -ForegroundColor Cyan
Write-Host " - Duration: 30s" -ForegroundColor Cyan
Write-Host ""
locust -f locust/locustfile_production.py `
--headless `
--host http://localhost:8000 `
-u 50 `
-r 10 `
--run-time 30s `
--html locust/locust_report.html `
--csv locust/locust_stats
# Cleanup
Write-Host "`n🧹 Stopping Mock Server..." -ForegroundColor Yellow
Stop-Job $serverJob
Remove-Job $serverJob
Write-Host "`n" -NoNewline
Write-Host "=" -NoNewline -ForegroundColor Cyan
Write-Host "=" * 59 -ForegroundColor Cyan
Write-Host "✅ PERFORMANCE TEST COMPLETE!" -ForegroundColor Green
Write-Host "=" -NoNewline -ForegroundColor Cyan
Write-Host "=" * 59 -ForegroundColor Cyan
Write-Host "`n📊 View Results:" -ForegroundColor Yellow
Write-Host " - HTML Report: locust/locust_report.html" -ForegroundColor Cyan
Write-Host " - CSV Stats: locust/locust_stats_*.csv" -ForegroundColor Cyan
Write-Host ""
locust -f locustfile.py --host=http://localhost:8000
\ No newline at end of file
WITH top_candidates AS (
SELECT /*+ SET_VAR(ann_params='{"ef_search":64}') */
internal_ref_code,
product_color_code,
approx_cosine_similarity(vector, [0.004157349932938814,-0.047062162309885025,-0.05855855718255043,-0.043294113129377365,0.010717792436480522,-0.027683624997735023,0.039526063948869705,0.07082394510507584,0.02479991503059864,-0.06582550704479218,0.04844634607434273,0.006002924870699644,-0.0234349574893713,-0.005123393144458532,0.01686970889568329,0.013582278974354267,-0.029298502951860428,-0.03275895491242409,-0.04710061103105545,0.002352627459913492,-0.0003343302523717284,0.023761779069900513,-0.0006458311108872294,-0.01809048093855381,0.06486427038908005,0.016533276066184044,-0.016254518181085587,-0.056866779923439026,0.008314699865877628,-0.014082121662795544,0.004832618869841099,-0.03135555237531662,0.05602089315652847,-0.067555733025074,0.04348636046051979,0.03546964377164841,0.027779748663306236,-0.00037608397542499006,0.0038858004845678806,-0.007766794878989458,-0.03360484540462494,0.009203843772411346,-0.010141050443053246,0.04394775629043579,0.03496980294585228,0.053906168788671494,-0.009881515987217426,0.0070506734773516655,-0.015937309712171555,-0.005767421796917915,0.04952292889356613,-0.013937936164438725,-0.032893531024456024,0.029509976506233215,0.022704416885972023,0.02193542756140232,0.005801065359264612,0.002467975951731205,0.039910558611154556,0.02916393056511879,0.011996237561106682,-0.026164870709180832,0.012265384197235107,0.03850715234875679,-0.03187461942434311,0.009689268656075,-0.036430880427360535,-0.010785078629851341,-0.0236656554043293,0.045716430991888046,-0.015475915744900703,-0.027318354696035385,-0.020532021299004555,-0.0001552998583065346,0.004457736387848854,0.0066133104264736176,0.01867683418095112,-0.02501138672232628,0.026472466066479683,-0.017004283145070076,-0.004657193087041378,-0.014139796607196331,0.010237174108624458,0.00025262509007006884,-0.04956137761473656,-0.05321408063173294,-0.015283668413758278,0.04379395768046379,-0.023492632433772087,-0.02449231781065464,-0.03006749227643013,-0.021839303895831108,0.025530453771352768,-0.02887555956840515,0.012303833849728107,0.011256084777414799,-0.014610801823437214,-0.001953714294359088,-0.028125794604420662,0.00937686674296856,-0.025722701102495193,-0.028606412932276726,0.019474660977721214,0.012755614705383778,0.020897291600704193,0.005536725278943777,-0.015350954607129097,0.0023322012275457382,-0.05982739105820656,0.030105942860245705,0.029932919889688492,0.038930099457502365,-0.028683312237262726,0.031105628237128258,0.0024103017058223486,0.007382300216704607,0.018705671653151512,-0.022127674892544746,-0.013985997997224331,-0.0021267367992550135,-0.0016989863943308592,0.013236233033239841,-0.021224113181233406,-0.04567798227071762,-0.040064357221126556,0.05329097807407379,-0.01801358163356781,0.02681851200759411,0.008290668949484825,-0.04271737113595009,0.021916203200817108,0.004784557037055492,-0.004825409501791,0.013140109367668629,-0.009679656475782394,0.023627204820513725,-0.03445073217153549,0.033720195293426514,-0.04214062914252281,-0.034393060952425,0.041333191096782684,-0.0006560442270711064,0.024992162361741066,-0.010823528282344341,0.014745375141501427,-0.022569844499230385,0.01966690830886364,-0.013236233033239841,0.01036213431507349,0.04740820825099945,-0.011198410764336586,-0.021608607843518257,0.018052030354738235,-0.02870253659784794,0.002428324893116951,-0.0014514678623527288,0.0005866549327038229,0.06436442583799362,-0.0036166540812700987,0.014437779784202576,0.01672552339732647,-0.02879866026341915,-0.0030423151329159737,-0.06397993117570877,-0.07555323094129562,-0.007209277246147394,-0.019407374784350395,0.016244905069470406,-0.037430569529533386,0.030490437522530556,0.02629944495856762,0.05963514372706413,0.022819766774773598,0.01058321911841631,0.03744979202747345,-0.06167296692728996,0.01438971795141697,0.025741927325725555,-0.01575467362999916,0.016860097646713257,0.02103186585009098,0.01338041853159666,0.0014430570881813765,-0.032662831246852875,-0.026568589732050896,-0.03546964377164841,-0.041256289929151535,-0.014937622472643852,0.011477169580757618,0.016994670033454895,-0.020532021299004555,-0.01672552339732647,-0.03881474956870079,-0.031778495758771896,0.042102180421352386,-0.0020438302308321,-0.022819766774773598,-0.0034868870861828327,0.047215960919857025,-0.004474558401852846,0.03510437533259392,-0.006632535252720118,-0.001092205522581935,-0.007685089949518442,-0.021358685567975044,-0.003354717046022415,-0.04456294700503349,0.01157329324632883,0.031163303181529045,-0.00438804691657424,0.041563887149095535,0.03506592661142349,-0.03287430480122566,0.06036568433046341,0.0006974975694902241,-0.009900741279125214,0.08551163971424103,-0.012688328512012959,0.04848479479551315,0.054675161838531494,-0.021877754479646683,-0.012880575843155384,0.043524809181690216,0.032374460250139236,-0.011304146610200405,0.03248981013894081,0.03225911408662796,-0.029856020584702492,-0.014216694980859756,-0.013918711803853512,-0.024011699482798576,0.011208022944629192,-0.028587188571691513,0.01664862409234047,-0.0065940856002271175,0.009088495746254921,-8.027831063373014e-05,0.015052971430122852,-0.02185853011906147,-0.0664791539311409,-0.05282958596944809,-0.055444151163101196,0.025145959109067917,0.018196215853095055,0.021531708538532257,-0.021435584872961044,0.01694660820066929,-0.02028210088610649,-0.036200184375047684,0.02064737118780613,0.03181694447994232,0.023454181849956512,0.03435460850596428,0.0060702115297317505,0.03731521964073181,0.009069271385669708,-0.015120257623493671,0.021685507148504257,0.00908368919044733,0.003823320148512721,-0.020301325246691704,0.001674955477938056,0.027606725692749023,-0.05163764953613281,0.0467161163687706,-0.007608190644532442,0.011544456705451012,0.04302496835589409,-0.037411343306303024,-0.00037157817860133946,0.013313132338225842,-0.04279427230358124,0.03716142103075981,0.01582196168601513,-0.012476855888962746,-0.039314594119787216,0.0017374358139932156,0.03235523775219917,0.02110876515507698,0.04975362494587898,-0.050907112658023834,-0.02026287652552128,-0.01686970889568329,-0.03662312775850296,0.03083648346364498,-0.03641165792942047,0.06313404440879822,-0.009751749224960804,-0.017004283145070076,-0.015274056233465672,0.0373728945851326,0.027395254001021385,-0.040218155831098557,-0.002105108927935362,0.01914784125983715,0.018715284764766693,-0.02562657743692398,-0.06428752839565277,-0.011073450557887554,0.009660432115197182,0.015052971430122852,0.07824469357728958,-0.036353982985019684,0.0007449586410075426,-0.030721133574843407,0.023165810853242874,0.029356177896261215,-0.015129869803786278,0.010217948816716671,0.013688014820218086,0.03685382753610611,-0.007242920808494091,0.01717730425298214,0.0009858687408268452,0.04252512380480766,-0.006012537516653538,-0.011102287098765373,-0.04544728621840477,0.022050777450203896,-0.02743370458483696,0.06532566249370575,-0.06501807272434235,0.018551873043179512,0.0027299129869788885,0.020301325246691704,-0.030490437522530556,-0.03729599714279175,0.005978893954306841,0.02110876515507698,-0.027452928945422173,-0.04875393956899643,0.01289018802344799,-0.019647683948278427,-0.053906168788671494,-0.05179144814610481,-0.024453869089484215,0.041025593876838684,-0.01785978302359581,-0.04248667508363724,-0.02479991503059864,-0.012476855888962746,0.002099101198837161,-0.03739212080836296,-0.0069737741723656654,0.04952292889356613,-0.03037508949637413,-0.002418712479993701,-0.03216299042105675,0.007997491396963596,0.012063524685800076,0.06544101238250732,0.008348342962563038,0.011525231413543224,-0.024742240086197853,0.031182527542114258,-0.02283899113535881,0.002343015279620886,-0.009102914482355118,-0.0470237135887146,0.021647056564688683,-0.03216299042105675,-0.023108137771487236,0.04817719757556915,-0.029183154925704002,-6.717394717270508e-05,0.0035854140296578407,0.010573606938123703,0.030990280210971832,0.012265384197235107,-0.004890293348580599,0.02629944495856762,0.04836944490671158,-0.01232305821031332,-0.053560126572847366,-0.028048895299434662,0.022396821528673172,-0.02020520158112049,0.02103186585009098,0.01062166877090931,-0.03612328693270683,0.006627729162573814,-0.024203946813941002,0.009295161813497543,0.028990907594561577,0.030932607129216194,-0.020839618518948555,-0.016908159479498863,0.015764286741614342,-0.02049357257783413,0.0012520111631602049,0.03618096187710762,-0.0186864472925663,0.05094556137919426,-0.01165019255131483,-0.01530289277434349,0.03956451639533043,0.048407893627882004,0.0006932921824045479,-0.033566396683454514,0.05486740916967392,-0.017523350194096565,0.004102078732103109,-0.00828586332499981,0.0027130914386361837,0.02147403359413147,0.041486989706754684,-0.010996551252901554,0.013688014820218086,0.03200919181108475,-0.003929056227207184,-0.0014178245328366756,-0.04567798227071762,0.016091106459498405,0.01341886818408966,-0.004765332210808992,0.007262145634740591,-0.0661715567111969,0.015658549964427948,-0.017965519800782204,-0.00550308171659708,0.03596948832273483,-0.028740985319018364,-0.045255038887262344,0.048561692237854004,-0.026933860033750534,0.03479677811264992,0.018705671653151512,-0.006113467272371054,0.035238947719335556,-0.018551873043179512,-0.03610406070947647,0.0007852104608900845,-0.009054852649569511,0.017830945551395416,0.041486989706754684,-0.025684252381324768,-0.041563887149095535,-0.0059308321215212345,0.011852052062749863,0.008478110656142235,0.041717685759067535,-0.010073763318359852,-0.06778643280267715,-0.03602716326713562,0.007627415470778942,-0.043678607791662216,0.020974190905690193,0.0021423569414764643,-0.04298651963472366,-0.011621355079114437,-0.014745375141501427,-0.030105942860245705,-0.03719986975193024,-0.01303437352180481,-0.06867077201604843,-0.0027491378132253885,0.029971368610858917,-0.01740800216794014,-0.02872176095843315,-0.016850484535098076,0.04821564629673958,0.03896854817867279,0.020012954249978065,0.008862605318427086,0.0018660012865439057,-0.01606227084994316,0.01779249683022499,0.014139796607196331,0.001519956043921411,-0.038853198289871216,0.011179186403751373,-0.03868017718195915,-0.021723955869674683,-0.02954842522740364,-0.014793436974287033,-0.00021492657833732665,0.009770973585546017,-0.04041040316224098,-0.010121825151145458,-0.024088598787784576,-0.04371706023812294,-0.025838050991296768,-0.03646933287382126,-0.037949636578559875,-0.04836944490671158,0.09996864944696426,0.031778495758771896,0.03295120224356651,-0.05955824255943298,-0.007747570052742958,-0.006940131075680256,0.002294953214004636,-0.011131124570965767,-0.004078047815710306,0.0034268097952008247,0.029183154925704002,0.01914784125983715,0.037276770919561386,-0.02126256190240383,-0.047446656972169876,-0.0024091002997010946,-0.0680171325802803,-0.01794629544019699,-0.04863859340548515,0.0014274369459599257,0.0053252531215548515,0.002777974819764495,0.01183282770216465,0.011852052062749863,-0.006805557757616043,-0.008766481652855873,0.03777661547064781,-0.0235118567943573,0.011371433734893799,-0.04356326162815094,-0.001790303853340447,0.014466616325080395,0.019561173394322395,-0.03460453078150749,0.05190679803490639,0.009646013379096985,0.00747842388227582,0.016168005764484406,-0.008872217498719692,0.007218889892101288,-0.05586709454655647,0.0029053387697786093,-0.049407582730054855,-0.015966147184371948,-0.013582278974354267,-0.00026869578869082034,0.014322430826723576,-0.03329724818468094,0.05040726810693741,-0.0004541844828054309,-0.029971368610858917,0.03718064725399017,0.010304460301995277,0.018878694623708725,0.02510751038789749,0.00616152910515666,0.022954339161515236,-0.003251384012401104,-0.023723328486084938,-0.011342596262693405,-0.06251885741949081,0.004750913940370083,-0.05267578735947609,-0.03373941779136658,0.0014911189209669828,0.0283372662961483,-0.019128616899251938,0.03172082081437111,-0.012861350551247597,0.01051593292504549,-0.015725838020443916,0.0005190679803490639,0.020781943574547768,0.010448645800352097,-0.01839807629585266,0.041333191096782684,0.011746316216886044,0.022819766774773598,0.020032178610563278,-0.0184557493776083,-0.01877295784652233,-0.0076754773035645485,-0.0065267994068562984,-0.050599515438079834,-0.025799600407481194,-0.014716538600623608,0.0579049177467823,-0.02681851200759411,-0.026645489037036896,-0.01043903362005949,-0.009362448006868362,0.028298817574977875,0.027395254001021385,-0.012236546725034714,-0.031989965587854385,-0.015697000548243523,0.005411764141172171,-0.0160430446267128,0.0030278966296464205,0.034085463732481,-0.022127674892544746,-0.01537979207932949,0.019243964925408363,0.025568904355168343,-0.011236860416829586,0.0051666488870978355,-0.03514282405376434,0.019532335922122,-0.033643294125795364,-0.01664862409234047,-0.016696685925126076,-0.047908052802085876,-0.0003418399137444794,0.0016629400197416544,-0.05598244071006775,0.032662831246852875,0.02531898207962513,-0.04959983006119728,-0.010246786288917065,-0.008463691920042038,0.027452928945422173,-0.023242710158228874,0.028914008289575577,-0.009843066334724426,-0.02554967999458313,0.01831156387925148,0.0027130914386361837,-0.005618430208414793,-0.010227561928331852,-0.031317099928855896,-0.014235920272767544,-0.006887263152748346,0.017061956226825714,0.0053252531215548515,-0.006377807352691889,-0.011496394872665405,0.029529200866818428,0.0171965304762125,-0.014678088948130608,-0.014043672010302544,-0.0010982132516801357,-0.013774526305496693,-0.0470237135887146,0.01815776713192463,-0.03883397579193115,0.020897291600704193,-0.04836944490671158,0.02162783220410347,0.018128929659724236,-0.01815776713192463,0.020397448912262917,-0.0016473198775202036,-0.035392746329307556,0.004231845960021019,0.027452928945422173,-0.0003253186587244272,0.011736704036593437,0.009756555780768394,-0.07090084254741669,0.04583178088068962,0.0061086611822247505,-0.0020258070435374975,-0.034854453057050705,-0.01951311156153679,0.025588128715753555,0.09366293251514435,0.004123706836253405,0.010871590115129948,-0.01756179891526699,0.02524208277463913,0.043063417077064514,0.005777034442871809,-0.03218221291899681,-0.018744122236967087,-0.01499529741704464,-0.0028500675689429045,0.021762404590845108,0.016158394515514374,-0.007334238383919001,0.006473931018263102,0.03149012476205826,-0.007017029915004969,0.049253784120082855,-0.02735680527985096,0.015312504954636097,0.027856647968292236,-0.005978893954306841,0.0002952799841295928,-0.008886636234819889,0.02681851200759411,-0.041025593876838684,-0.020301325246691704,0.02033977396786213,0.013822588138282299,0.04098714515566826,0.01634102873504162,-0.0040299859829247,-0.027914322912693024,-0.0163506418466568,0.003145648166537285,-0.0027251068968325853,-0.012313446030020714,0.027760524302721024,0.009011596441268921,-0.03445073217153549,-0.01875373348593712,-0.01785978302359581,0.009328804910182953,-0.012899800203740597,0.0012520111631602049,0.015293280594050884,0.05017657205462456,0.0013625534484162927,-0.0023706506472080946,-0.01839807629585266,-0.019878381863236427,0.01126569788902998,0.012380732223391533,-0.0007647841703146696,-0.02028210088610649,-0.00885299313813448,-0.018426913768053055,-0.01548552792519331,-0.008569427765905857,0.004308744799345732,0.02968299761414528,0.001320499344728887,-0.006925712339580059,0.009400897659361362,-0.004025179892778397,0.03068268485367298,-0.024280846118927002,-0.01900365576148033,0.0022300698328763247,0.029644548892974854,0.01636025309562683,0.04606247693300247,-0.001519956043921411,0.025203634053468704,-0.04233287647366524,0.01974380761384964,0.027087658643722534,0.01424553245306015,-0.01794629544019699,-0.02449231781065464,0.002218054374679923,-0.02230069786310196,-0.03971831128001213,0.014726150780916214,-0.020397448912262917,0.011496394872665405,0.009021209552884102,-0.0017025910783559084,0.008828962221741676,-0.02253139577805996,-0.00550308171659708,0.003948281053453684,-0.012198097072541714,0.018897918984293938,-0.008189738728106022,0.0011354611488059163,-0.02291589044034481,-0.015187544748187065,0.0009257913916371763,-0.027491377666592598,-0.015495140105485916,0.000702904537320137,-0.0016377075808122754,0.021896978840231895,0.026164870709180832,-0.05213749408721924,0.01749451272189617,-0.02501138672232628,0.01808086782693863,-0.03052888624370098,0.019580397754907608,0.020589696243405342,0.02893323265016079,-0.005488663446158171,-0.0008669156231917441,0.003943474963307381,-0.014793436974287033,-0.02531898207962513,0.0035373521968722343,-0.0044048684649169445,-0.005815483629703522,-0.00994880311191082,-0.002358635189011693,0.02478068880736828,-0.023261934518814087,-0.05552104860544205,-0.012774839997291565,0.018061643466353416,0.001261623576283455,0.0008849388104863465,-0.0013517395127564669,0.0015379792312160134,0.021743180230259895,0.02268519252538681,-0.027779748663306236,-0.026203321292996407,-0.01908055506646633,-0.0017362342914566398,-0.028452614322304726,-0.0045851003378629684,-0.005344477482140064,-0.021993102505803108,-0.017283041030168533,0.01552397757768631,0.004025179892778397,-0.03308577835559845,-0.013370806351304054,0.026337893679738045,0.06028878316283226,-0.014870336279273033,0.004169365391135216,0.0331626757979393,-0.025126734748482704,-0.043217215687036514,0.03868017718195915,-0.00461634062230587,0.020435897633433342,0.012553755193948746,-0.021993102505803108,0.0020618534181267023,-0.0040876604616642,0.0016821647295728326,0.012303833849728107,0.019657297059893608,0.026395568624138832,-3.5727225622395054e-05,0.0033715388271957636,0.03204764053225517,-0.006536411587148905,0.01816737838089466,0.021743180230259895,0.02397325076162815,-0.016927383840084076,0.013861037790775299,-0.009650819003582,-0.008074390701949596,0.0038449480198323727,0.0008494931971654296,-0.012649878859519958,-0.013438093475997448,0.013976385816931725,0.005411764141172171,0.012457631528377533,-0.003037508809939027,0.010141050443053246,-0.001062166877090931,0.01232305821031332,0.013832200318574905,-0.02653014101088047,0.019580397754907608,0.03502747416496277,-0.014803050085902214,0.002127938438206911,-0.004121303558349609,0.011813602410256863,0.009059658274054527,0.003325880039483309,0.012640266679227352,-0.01495684776455164,0.021512484177947044,0.00559439929202199,-0.01179437804967165,0.002946191467344761,0.00307115213945508,-0.043678607791662216,-0.013909099623560905,-0.0008398808422498405,-0.011871276423335075,0.057328175753355026,-0.001635304419323802,-0.02526130899786949,-0.018186604604125023,-0.0474851056933403,-0.00994880311191082,-0.0002997857809532434,0.004964788910001516,-0.02479991503059864,0.013063210994005203,0.027260681614279747,-0.014178245328366756,-0.004979207646101713,-0.02591494843363762,-0.01352460402995348,-0.023338833823800087,0.006315327249467373,0.025511229410767555,0.03120175190269947,0.05832786113023758,0.012351895682513714,0.014668476767838001,0.039679862558841705,-0.01040058396756649,0.010198724456131458,-0.013861037790775299,0.0333164744079113,0.040871795266866684,-0.029356177896261215,-0.0019513111328706145,-0.03202841803431511,-0.023319609463214874,0.017734821885824203,-0.03252825886011124,0.04075644910335541,-0.02133946120738983,0.005815483629703522,-0.017138855531811714,-0.005728972610086203,0.004940757993608713,0.0163506418466568,0.003893009852617979,0.01673513650894165,-0.0037824674509465694,0.0020810780115425587,0.03585413843393326,-0.007295788731426001,0.03045198880136013,0.0323936864733696,-0.0028332460206001997,-0.027106883004307747,0.0379880852997303,-0.029183154925704002,-0.04217907786369324,0.00676230201497674,-0.025492005050182343,0.026030298322439194,-0.02478068880736828,0.007339044474065304,-0.008458885364234447,-0.01883063279092312,-0.05840475857257843,-0.0052483538165688515,-0.003246577922254801,-0.03358561918139458,-0.02456921711564064,0.021916203200817108,0.014899173751473427,-0.0282603669911623,-0.010890815407037735,0.013409256003797054,0.02322348579764366,-0.025069061666727066,0.03902622312307358,-0.04017970710992813,0.014408942312002182,0.010794691741466522,-0.03664235398173332,0.035315848886966705,0.009641206823289394,-0.022646743804216385,-0.008362761698663235,0.006036568433046341,0.002967819105833769,0.0030038657132536173,-0.019388150423765182,0.030105942860245705,-0.01548552792519331,0.008271444588899612,-0.004267892334610224,0.007612997200340033,0.011438719928264618,0.014495453797280788,-2.1665380700142123e-05,0.003330686129629612,-0.020378224551677704,-0.008728032000362873,0.026280218735337257,0.03006749227643013,0.005430988967418671,0.0018527843058109283,0.0013445302611216903,0.02554967999458313,-0.023800227791070938,-0.03037508949637413,-0.01686970889568329,0.0057914527133107185,0.008473304100334644,0.018657609820365906,-0.006949743255972862,0.07478424161672592,0.03174004703760147,-0.03994901105761528,0.01982070691883564,0.022358372807502747,0.0006650558207184076,0.04225597903132439,0.01755218766629696,0.00010100498184328899,0.014110959134995937,0.015101033262908459,-0.01908055506646633,-0.018580710515379906,-0.00035806078813038766,0.02405015006661415,0.0070698983035981655,-0.04529348760843277,0.03541197255253792,-0.014572353102266788,-0.0002515737432986498,-0.009569114074110985,0.0033066552132368088,-0.006555636413395405,0.013476542197167873,0.012198097072541714,0.003770451992750168,-0.011217636056244373,0.02374255284667015,-0.00186479976400733,-0.030913380905985832,0.024549992755055428,0.030778808519244194,-0.025492005050182343,-0.028279593214392662,-0.006695015821605921,0.011054225265979767,-0.009535470977425575,0.006392226088792086,0.007324625737965107,0.024088598787784576,0.011217636056244373,0.01892675645649433,-0.01832117699086666,-0.001236391137354076,-0.01250569336116314,0.049253784120082855,0.05332942679524422,-0.008199351839721203,-0.011996237561106682,-0.014495453797280788,0.007512066978961229,0.028971683233976364,-0.00784369371831417,0.002114721341058612,0.03504670038819313,0.008877024054527283,0.027472153306007385,0.0002176300622522831,0.03164392337203026,-0.005940444767475128,0.049023088067770004,-0.013370806351304054,0.0033955697435885668,0.02237759716808796,0.020378224551677704,-0.018869081512093544,0.06578706204891205,-0.003965102601796389,-0.0036118479911237955,0.003126423340290785,-0.0018888306804001331,-0.020320549607276917,0.008569427765905857,-0.012947862036526203,0.024203946813941002,0.003335492452606559,0.0007749973447062075,-0.03029819019138813,-0.01900365576148033,0.04906153678894043,-0.008122452534735203,-0.0009942795149981976,0.0035325458738952875,-0.041486989706754684,0.02268519252538681,-0.012842126190662384,-0.05306028202176094,0.039910558611154556,0.001769877620972693,-0.016177618876099586,-0.01567777618765831,-0.014976072125136852,-0.0375266931951046,-0.010150662623345852,0.005214710719883442,0.009823841974139214,0.06936286389827728,-0.010794691741466522,0.033816318958997726,0.03848792985081673,0.010727404616773129,0.009545083157718182,0.006358582526445389,0.010977326892316341,0.031528573483228683,0.025568904355168343,-0.0002832645259331912,-0.020512796938419342,-0.0234349574893713,-0.020608920603990555,0.01726381666958332,0.0026049523148685694,-0.021723955869674683,0.007166021969169378,0.016187230125069618,0.01890753209590912,-0.005253160372376442,0.024665340781211853,0.054982755333185196,0.003275415161624551,-0.01115034893155098,0.008886636234819889,0.027106883004307747,-0.01626412943005562,0.027683624997735023,0.02578037604689598,0.025953399017453194,-0.03902622312307358,0.017994357272982597,-0.0069929989986121655,0.018484586849808693,0.005041688214987516,0.0003733804915100336,-0.005397345870733261,-0.02020520158112049,-0.006959355901926756,-0.02193542756140232,-0.03662312775850296,0.011400270275771618,0.006699821911752224,-0.0031840975861996412,-0.020532021299004555,-0.0012832513311877847,-0.015187544748187065,0.027683624997735023,-0.015725838020443916,-0.006324939429759979,0.0006956952856853604,-0.022858215495944023,-0.0007287377957254648,-0.006334551610052586,0.028914008289575577,-0.03216299042105675,-0.010794691741466522,0.02005140297114849,-0.02170473150908947,-0.017619473859667778,-0.0030423151329159737,-0.013572665862739086,0.001445460133254528,-0.0010381359606981277,-0.023627204820513725,0.00621439702808857,-0.019561173394322395,-0.011659804731607437,-0.025049835443496704,-0.0062672654166817665,-0.013957161456346512,0.004765332210808992,-0.006224009674042463,-0.04606247693300247,0.013130497187376022,0.020455123856663704,-0.001465886365622282,-0.006344164256006479,-0.011179186403751373,0.020974190905690193,-0.010813916102051735,0.008396404795348644,0.05975048989057541,-0.03971831128001213,-0.03308577835559845,-0.009549889713525772,0.008824155665934086,0.03277818113565445,-0.019167065620422363,0.013543829321861267,0.017244592308998108,0.009670044295489788,0.018503811210393906,-0.030932607129216194,0.021204888820648193,0.027991220355033875,0.0236656554043293,-0.003280221251770854,-0.02493448741734028,-0.0462547242641449,-0.021012641489505768,-0.024357745423913002,-0.008958728983998299,-0.005435795057564974,0.021589383482933044,-0.015350954607129097,0.006012537516653538,-0.025818824768066406,-0.03633475676178932,0.006022149696946144,0.015225994400680065,-0.013284294866025448,0.07005494832992554,0.0032129345927387476,-0.01898443140089512,2.7898402549908496e-05,0.033873990178108215,-0.047600455582141876,0.003955490421503782,-0.03927614167332649,0.04637007415294647,-0.04629317298531532,0.002238480607047677,0.00859826523810625,-0.004698046017438173,-0.05006122216582298,0.03781506419181824,0.015793124213814735,0.020628144964575768,-0.004921533167362213,-0.01179437804967165,-0.04271737113595009,-0.010813916102051735,-3.659083813545294e-05,-0.03543119505047798,-0.0009834655793383718,0.012313446030020714,-0.016485214233398438,0.003878591349348426,0.0005986703909002244,-0.010112212970852852,0.0014730957336723804,-0.008713613264262676,-0.056328486651182175,0.04025660455226898,0.007925398647785187,-0.012111586518585682,0.03473910316824913,-0.0030495242681354284,0.007608190644532442,0.01112151239067316,-0.004871068522334099,0.05721282586455345,0.009021209552884102,-0.012198097072541714,0.016975445672869682,-0.023338833823800087,-0.005469438619911671,0.006512380670756102,-0.018513424322009087,-0.014447391964495182,0.03602716326713562,0.01989760622382164,0.037122972309589386,0.022185349836945534,-0.009554695338010788,-0.019455436617136,-0.023012014105916023,0.0028452614787966013,0.026395568624138832,-0.004373628180474043,-0.03927614167332649,-0.01047748327255249,-0.01495684776455164,-0.0005845522391609848,-0.0006602496723644435,0.01808086782693863,-0.020147526636719704,0.009612370282411575,0.062441956251859665,0.011506007052958012,-0.00012818996037822217,-0.007098735310137272,-0.0023009609431028366,0.012130810879170895,-0.017379164695739746,-0.01473576296120882,-0.01487994845956564,0.010688954964280128,0.012717165052890778,0.0170427318662405,-0.019936054944992065,0.018647998571395874,0.02426162175834179,0.00021672890579793602,0.011900113895535469,-0.039295367896556854,0.01009298861026764,-0.012457631528377533,-0.0007335440022870898,0.02178163081407547,0.028375716879963875,0.03812265768647194,0.02268519252538681,0.0055655622854828835,0.04044885188341141,-0.02207000181078911,0.0040468075312674046,0.011131124570965767,0.014418554492294788,0.011871276423335075,-0.008386792615056038,-0.0234349574893713,0.008747256360948086,0.027549052610993385,-0.01785978302359581,0.02487681247293949,0.02508828602731228,-0.030182842165231705,-0.03535429760813713,0.058135613799095154,0.016994670033454895,-0.006916100159287453,0.007117960136383772,0.03089415654540062,0.0161968432366848,0.016898546367883682,0.008218576200306416,0.0014827080303803086,0.05371392145752907,-0.0036815376952290535,-0.0171965304762125,0.03979521244764328,0.013303520157933235,0.01349576748907566,-0.04956137761473656,0.010371747426688671,0.029740672558546066,-0.015581651590764523,-0.01108306273818016,0.0028981296345591545,0.03218221291899681,-0.030778808519244194,-0.0017158080590888858,-0.01047748327255249,-0.005772228352725506,0.025838050991296768,-0.014447391964495182,-0.009626788087189198,0.0009894733084365726,0.013188171200454235,-0.0162737425416708,-0.00552230654284358,0.022492945194244385,0.020935742184519768,0.014408942312002182,0.022704416885972023,0.0077764070592820644,0.01695622131228447,0.049638278782367706,0.005834708455950022,-0.013120885007083416,-0.0005133606027811766,0.000560821732506156,-0.001600459567271173,0.0006956952856853604,-0.019503498449921608,0.004830216057598591,0.005296415649354458,-0.005671298131346703,0.039295367896556854,0.01352460402995348,0.018744122236967087,0.0037247934378683567,-0.008011910133063793,0.03181694447994232,0.008920279331505299,0.008338730782270432,0.00563284894451499,0.02033977396786213,-0.009400897659361362,-0.014360880479216576,0.0015319715021178126,0.008896248415112495,0.05079176276922226,0.007247726898640394,0.02916393056511879,0.008252219296991825,-0.030202066525816917,7.787521462887526e-05,0.014533903449773788,0.01013143826276064,0.017532963305711746,-0.007502454798668623,-0.026260994374752045,-0.017763659358024597,0.006166335195302963,0.003703165566548705,0.03618096187710762,0.0372190959751606,0.009497021324932575,-0.021358685567975044,-0.01620645634829998,0.016552500426769257,-0.0170427318662405,-0.004491379950195551,-0.041563887149095535,-0.01687932200729847,0.014803050085902214,-0.0004746107733808458,0.04294806718826294,-0.00791578646749258,0.014793436974287033,0.031105628237128258,0.014947235584259033,-0.01898443140089512,0.0334702730178833,0.0061711412854492664,-0.03518127277493477,0.003097586100921035,0.041794583201408386,-0.009655625559389591,-0.01171747874468565,-0.03648855537176132,-0.02637634240090847,-0.03329724818468094,-0.021589383482933044,-0.035392746329307556,0.0021567754447460175,0.004803781863301992,-0.04575487971305847,0.023992475122213364,-0.00556075619533658,-0.013774526305496693,0.03022129088640213,-0.005224322900176048,-0.05259888991713524,-0.017456064000725746,-0.044947441667318344,-0.010737016797065735,-0.015206769108772278,-0.033797092735767365,-0.002677045064046979,-0.014754988253116608,-0.027606725692749023,0.008011910133063793,-0.016225680708885193,0.0044433181174099445,0.007247726898640394,0.05194524675607681,0.045485734939575195,-0.025434330105781555,0.006776720751076937,0.011592518538236618,-0.013889874331653118,0.01590847223997116,-0.016465989872813225,-0.011640580371022224,-0.004318356979638338,-0.002323790453374386,-0.022742867469787598,0.015918085351586342,-0.02216612547636032,0.034258484840393066,-0.0016016610898077488,-0.016071882098913193,-0.014620414935052395,-0.002838052110746503,0.003580607706680894,0.013889874331653118,0.003789676818996668,-0.012572979554533958,0.012025075033307076,0.026549365371465683,-0.030855707824230194,-0.010256398469209671,0.03164392337203026,-0.020224425941705704,-0.0322398878633976,0.006286489777266979,-0.03556576743721962,-0.03708452358841896,0.02606874704360962,0.019263189285993576,0.021204888820648193,0.05752042308449745,0.006882457062602043,0.05409841611981392,-0.0066133104264736176,0.025357432663440704,0.0652487650513649,0.020397448912262917,0.00743997422978282,-0.0043664188124239445,-0.003479677950963378,0.008622296154499054,-0.012880575843155384,0.004337581805884838,-0.0014286384684965014,0.008963534608483315,-0.015610489062964916,-0.0025256501976400614,0.0234349574893713,0.009814229793846607,0.013351581990718842,0.01036213431507349,-0.005767421796917915,0.013236233033239841,-0.025972623378038406,0.028452614322304726,0.03489290177822113,0.017917457967996597,0.007752376142889261,-0.017013894394040108,7.637328235432506e-05,-0.00011347102554282174,-0.012524917721748352,-0.03502747416496277,-0.009030821733176708,-0.024011699482798576,0.00085249706171453,-0.009213456884026527,-0.0019861559849232435,0.030567336827516556,0.015620101243257523,-0.02478068880736828,0.000952225411310792,0.029971368610858917,-0.0073294322937726974,-0.014178245328366756,0.012457631528377533,0.03610406070947647,0.01254414301365614,0.0009984849020838737,-0.034162361174821854,-0.0020258070435374975,0.03314345329999924,0.03800731152296066,0.008439661003649235,-0.05282958596944809,0.011217636056244373,-0.02087806724011898,0.016004595905542374,0.012092361226677895,0.03429693728685379,-0.0036671191919595003,0.017773272469639778,0.019541947171092033,-0.032605160027742386,0.0025064253713935614,-0.01906132884323597,-0.017542574554681778,0.02214690111577511,-0.019955279305577278,-0.0026193708181381226,0.013178559020161629,-0.00867035798728466,0.02924082987010479,-0.0011360619682818651,-0.0022108450066298246,-0.003609444946050644,-0.0043856436386704445,-0.04310186579823494,-0.029125479981303215,0.01574506238102913,-0.007685089949518442,0.024761464446783066,0.026645489037036896,0.05398306995630264,0.02005140297114849,0.012169260531663895]) as similarity_score
FROM shared_source.magento_product_dimension_with_text_embedding__tmp
ORDER BY similarity_score DESC
LIMIT 100
)
SELECT
t1.internal_ref_code,
ANY_VALUE(t2.product_name) as product_name,
ANY_VALUE(t2.sale_price) as sale_price,
ANY_VALUE(t2.original_price) as original_price,
GROUP_CONCAT(DISTINCT t2.master_color ORDER BY t2.master_color SEPARATOR ', ') as available_colors,
ANY_VALUE(t2.product_image_url) as product_image_url,
ANY_VALUE(t2.product_image_url_thumbnail) as product_image_url_thumbnail,
ANY_VALUE(t2.product_web_url) as product_web_url,
ANY_VALUE(t2.description_text) as description_text,
ANY_VALUE(t2.material) as material,
ANY_VALUE(t2.material_group) as material_group,
ANY_VALUE(t2.gender_by_product) as gender_by_product,
ANY_VALUE(t2.age_by_product) as age_by_product,
ANY_VALUE(t2.season) as season,
ANY_VALUE(t2.style) as style,
ANY_VALUE(t2.fitting) as fitting,
ANY_VALUE(t2.form_neckline) as form_neckline,
ANY_VALUE(t2.form_sleeve) as form_sleeve,
ANY_VALUE(t2.product_line_vn) as product_line_vn,
MAX(t1.similarity_score) as max_score
FROM top_candidates t1
JOIN shared_source.magento_product_dimension_with_text_embedding__tmp t2
ON t1.internal_ref_code = t2.internal_ref_code
AND t1.product_color_code = t2.product_color_code
WHERE t2.sale_price <= 400000.0
GROUP BY t1.internal_ref_code
ORDER BY max_score DESC
LIMIT 10
\ No newline at end of file
......@@ -56,8 +56,6 @@ langgraph-checkpoint-postgres==3.0.2
langgraph-prebuilt==1.0.5
langgraph-sdk==0.3.0
langsmith==0.5.0
locust==2.42.6
locust-cloud==1.30.0
loguru==0.7.3
MarkupSafe==3.0.3
msgpack==1.1.2
......
......@@ -12,11 +12,10 @@ from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent))
from langchain_core.messages import AIMessage, HumanMessage
from langfuse import get_client, observe, propagate_attributes
from langfuse.langchain import CallbackHandler
# from langfuse import get_client, observe, propagate_attributes # TẮT TẠM
# from langfuse.langchain import CallbackHandler # TẮT TẠM
from agent.graph import build_graph
from agent.memory import get_memory_manager
from agent.models import get_config
......@@ -26,21 +25,25 @@ async def main():
# Tắt log rác của LangChain để terminal sạch sẽ
logging.getLogger("langchain").setLevel(logging.ERROR)
logging.getLogger("langgraph").setLevel(logging.ERROR)
logging.getLogger("langfuse").setLevel(logging.ERROR) # TẮT Langfuse logs
# 📝 Enable INFO logs for Data Retrieval & Embedding tools (Timing & Debug)
logging.basicConfig(level=logging.INFO, format="%(message)s") # Bật INFO để thấy tool calls
logging.getLogger("agent.tools.data_retrieval_tool").setLevel(logging.INFO)
logging.getLogger("agent.tools.product_search_helpers").setLevel(logging.INFO)
print("\n" + "=" * 50)
print("🚀 CANIFA FASHION AGENT - TERMINAL TESTER (MEM V2)")
print("=" * 50)
try:
# 1. Init Langfuse (Monitor tool)
from langfuse import Langfuse
Langfuse() # Initialize singleton
# 1. Init Langfuse (Monitor tool) - TẮT TẠM ĐỂ TRÁNH RATE LIMIT
# from langfuse import Langfuse
# Langfuse() # Initialize singleton
# 2. Build Graph
config = get_config()
graph = build_graph(config)
memory = get_memory_manager()
print("✅ System: Graph & MongoDB Memory Ready!")
except Exception as e:
......@@ -79,7 +82,6 @@ async def main():
# 🎯 Call wrapped function - each call = 1 trace
await run_single_query(
graph=graph,
memory=memory,
query=query,
conversation_id=conversation_id,
user_id=user_id,
......@@ -89,16 +91,15 @@ async def main():
print("\n👋 CiCi: 'Cảm ơn anh/chị đã ghé thăm CANIFA. Hẹn gặp lại nhé!'")
@observe() # 🎯 Each call = 1 trace in Langfuse
async def run_single_query(
graph, memory, query: str, conversation_id: str, user_id: str, enable_streaming: bool = True
):
"""Run single query with Langfuse tracing"""
# @observe() # TẮT TẠM - Tránh Langfuse rate limit
async def run_single_query(graph, query: str, conversation_id: str, user_id: str, enable_streaming: bool = True):
"""Run single query - Langfuse DISABLED"""
import logging
logger = logging.getLogger(__name__)
# Propagate trace attributes
with propagate_attributes(session_id=conversation_id, user_id=user_id, tags=["terminal-test", "canifa"]):
# Load History từ MongoDB
history = await memory.load_messages(conversation_id, limit=10)
history = []
current_human_msg = HumanMessage(content=query)
input_state = {
......@@ -107,12 +108,12 @@ async def run_single_query(
"user_id": user_id,
}
# CallbackHandler inherits current trace context
langfuse_handler = CallbackHandler()
# TẮT Langfuse callback
# langfuse_handler = CallbackHandler()
config_runnable = {
"configurable": {"conversation_id": conversation_id, "user_id": user_id, "transient_images": []},
"callbacks": [langfuse_handler], # ✨ Nested under @observe trace
# "callbacks": [langfuse_handler], # TẮT
}
final_ai_message = None
......@@ -126,6 +127,11 @@ async def run_single_query(
async for event in graph.astream(input_state, config=config_runnable, stream_mode="values"):
if "messages" in event:
msg = event["messages"][-1]
# 🔍 LOG TOOL CALLS
if hasattr(msg, "tool_calls") and msg.tool_calls:
logger.info(f"\n🛠️ TOOL CALLED: {[tc['name'] for tc in msg.tool_calls]}")
if isinstance(msg, AIMessage) and msg.content:
final_ai_message = msg
......@@ -144,17 +150,12 @@ async def run_single_query(
if final_ai_message:
# Lưu History mới
new_history = [*history, current_human_msg, final_ai_message]
await memory.save_messages(conversation_id, new_history, user_id=user_id)
# Update trace with input/output
langfuse = get_client()
langfuse.update_current_trace(
name="terminal-test-query",
input={"query": query},
output={"response": final_ai_message.content if final_ai_message else None},
)
print("[System]: ✅ Trace saved separately")
# TẮT Langfuse update
# langfuse = get_client()
# langfuse.update_current_trace(...)
print("[System]: ✅ Response complete")
except Exception as e:
print(f"\n❌ Error during execution: {e}")
......
......@@ -5,3 +5,6 @@ uvicorn server:app --host 0.0.0.0 --port 5000 --reload
uvicorn server:app --host 0.0.0.0 --port 5000
......@@ -10,9 +10,6 @@ if platform.system() == "Windows":
print("🔧 Windows detected: Applying SelectorEventLoopPolicy globally...")
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
# Tạm thời tắt LangChain Tracing để tránh lỗi recursion (Đúng ý bro)
os.environ["LANGCHAIN_TRACING_V2"] = "false"
os.environ["LANGCHAIN_API_KEY"] = ""
# Sau khi fix xong mới import tiếp
import logging
......@@ -25,7 +22,6 @@ from fastapi.staticfiles import StaticFiles # Import cái này để mount HTML
# Updated APIs (Import sau cùng để DB nhận cấu hình fix ở trên)
from api.chatbot_route import router as chatbot_router
from api.conservation_route import router as conservation_router
from api.test_route import router as test_router # ← Test API (isolated)
from config import PORT
# Configure Logging
......@@ -50,8 +46,8 @@ app.add_middleware(
)
app.include_router(conservation_router)
app.include_router(chatbot_router, prefix="/api/agent")
app.include_router(test_router, prefix="/api") # ← Test routes
app.include_router(chatbot_router)
#
# ==========================================
# 🟢 ĐOẠN MOUNT STATIC HTML CỦA BRO ĐÂY 🟢
......@@ -67,9 +63,12 @@ except Exception as e:
print(f"⚠️ Failed to mount static files: {e}")
from fastapi.responses import RedirectResponse
@app.get("/")
async def root():
return {"message": "Contract AI Service is running!", "status": "healthy"}
# Tự động nhảy sang trang Chatbot luôn
return RedirectResponse(url="/static/index.html")
if __name__ == "__main__":
......
......@@ -258,6 +258,172 @@
::-webkit-scrollbar-thumb:hover {
background: #666;
}
/* Product Cards Styling */
.product-cards-container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 15px;
margin-top: 15px;
padding-top: 15px;
border-top: 1px solid #555;
}
.product-card {
background: #3d3d3d;
border-radius: 8px;
overflow: hidden;
transition: all 0.3s;
border: 1px solid #555;
display: flex;
flex-direction: column;
}
.product-card:hover {
transform: translateY(-5px);
box-shadow: 0 5px 15px rgba(102, 126, 234, 0.3);
border-color: #667eea;
}
.product-card img {
width: 100%;
height: 200px;
object-fit: cover;
background: #2d2d2d;
}
.product-card-body {
padding: 12px;
flex-grow: 1;
display: flex;
flex-direction: column;
}
.product-sku {
font-size: 0.75em;
color: #667eea;
font-weight: bold;
margin-bottom: 5px;
}
.product-name {
font-size: 0.9em;
color: #fff;
margin-bottom: 10px;
line-height: 1.3;
flex-grow: 1;
}
.product-price {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 10px;
}
.price-original {
font-size: 0.85em;
color: #888;
text-decoration: line-through;
}
.price-sale {
font-size: 1.1em;
color: #ff6b6b;
font-weight: bold;
}
.price-regular {
font-size: 1.1em;
color: #4caf50;
font-weight: bold;
}
.product-link {
display: block;
text-align: center;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
text-decoration: none;
padding: 8px 12px;
border-radius: 6px;
font-size: 0.85em;
transition: all 0.3s;
}
.product-link:hover {
opacity: 0.9;
transform: scale(1.02);
}
/* Response Time */
.response-time {
font-size: 0.75em;
color: #888;
margin-top: 8px;
font-style: italic;
}
/* Per-Message Toggle Button */
.message-view-toggle {
display: flex;
gap: 5px;
background: #3d3d3d;
border-radius: 6px;
padding: 4px;
border: 1px solid #555;
margin-top: 10px;
width: fit-content;
}
.message-view-toggle button {
padding: 6px 12px;
font-size: 0.8em;
background: transparent;
color: #aaa;
border: none;
border-radius: 4px;
cursor: pointer;
transition: all 0.3s;
}
.message-view-toggle button.active {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
}
.message-view-toggle button:hover:not(.active) {
background: #4d4d4d;
color: #fff;
}
/* Raw JSON View */
.raw-json-view {
background: #1e1e1e;
border: 1px solid #555;
border-radius: 8px;
padding: 12px;
margin-top: 10px;
overflow-x: auto;
}
.raw-json-view pre {
margin: 0;
font-family: 'Courier New', monospace;
font-size: 0.85em;
color: #d4d4d4;
white-space: pre-wrap;
word-wrap: break-word;
}
/* Filtered content view */
.filtered-content {
display: block;
}
.raw-content {
display: none;
}
</style>
</head>
......@@ -267,7 +433,6 @@
<h1>🤖 Canifa AI System</h1>
<div class="nav-links">
<a href="/static/index.html" class="active">💬 Chatbot</a>
<a href="/static/loadtest.html">🔬 Load Test</a>
</div>
</div>
......@@ -299,6 +464,28 @@
</div>
<script>
let messageHistory = []; // Store messages for reference
function toggleMessageView(messageId) {
const filteredContent = document.getElementById('filtered-' + messageId);
const rawContent = document.getElementById('raw-' + messageId);
const filteredBtn = document.getElementById('filtered-btn-' + messageId);
const rawBtn = document.getElementById('raw-btn-' + messageId);
if (filteredContent.style.display === 'none') {
// Switch to filtered
filteredContent.style.display = 'block';
rawContent.style.display = 'none';
filteredBtn.classList.add('active');
rawBtn.classList.remove('active');
} else {
// Switch to raw
filteredContent.style.display = 'none';
rawContent.style.display = 'block';
rawBtn.classList.add('active');
filteredBtn.classList.remove('active');
}
}
let currentCursor = null;
let isTyping = false;
......@@ -317,7 +504,7 @@
currentCursor = null;
}
const url = `/history/${userId}?limit=20${currentCursor ? `&before_id=${currentCursor}` : ''}`;
const url = `/api/history/${userId}?limit=20${currentCursor ? `&before_id=${currentCursor}` : ''}`;
try {
const response = await fetch(url);
......@@ -426,6 +613,9 @@
input.value = '';
chatBox.scrollTop = chatBox.scrollHeight;
// Track response time
const startTime = Date.now();
try {
// SWITCH TO NON-STREAMING ENDPOINT
const response = await fetch('/api/agent/chat', {
......@@ -440,6 +630,19 @@
if (!response.ok) throw new Error('Network response was not ok');
const data = await response.json();
const responseTime = ((Date.now() - startTime) / 1000).toFixed(2);
// Generate unique message ID
const messageId = 'msg-' + Date.now();
// Store message data
messageHistory.push({
type: 'bot',
data: data,
responseTime: responseTime,
timestamp: new Date().toISOString(),
id: messageId
});
// Create bot message placeholder
const messagesArea = document.getElementById('messagesArea');
......@@ -456,20 +659,131 @@
botMsgDiv.className = 'message bot';
if (data.status === 'success') {
// Display AI response
botMsgDiv.innerText = data.ai_response || data.response || 'No response';
// FILTERED CONTENT (default visible)
const filteredDiv = document.createElement('div');
filteredDiv.id = 'filtered-' + messageId;
filteredDiv.className = 'filtered-content';
// Display AI text response
const textDiv = document.createElement('div');
textDiv.innerText = data.ai_response || 'No response';
filteredDiv.appendChild(textDiv);
// Add product IDs if available
// Render product cards if available
if (data.product_ids && data.product_ids.length > 0) {
const productInfo = document.createElement('div');
productInfo.style.marginTop = '8px';
productInfo.style.fontSize = '0.85em';
productInfo.style.color = '#aaa';
productInfo.style.borderTop = '1px solid #555';
productInfo.style.paddingTop = '8px';
productInfo.innerText = `📦 Products: ${data.product_ids.join(', ')}`;
botMsgDiv.appendChild(productInfo);
}
const productsContainer = document.createElement('div');
productsContainer.className = 'product-cards-container';
data.product_ids.forEach(product => {
const card = document.createElement('div');
card.className = 'product-card';
// Product image
const img = document.createElement('img');
img.src = product.thumbnail_image_url || 'https://via.placeholder.com/200';
img.alt = product.name;
img.onerror = function() { this.src = 'https://via.placeholder.com/200?text=No+Image'; };
card.appendChild(img);
// Product body
const body = document.createElement('div');
body.className = 'product-card-body';
// SKU
const sku = document.createElement('div');
sku.className = 'product-sku';
sku.innerText = product.sku;
body.appendChild(sku);
// Name
const name = document.createElement('div');
name.className = 'product-name';
name.innerText = product.name;
body.appendChild(name);
// Price
const priceDiv = document.createElement('div');
priceDiv.className = 'product-price';
if (product.sale_price && product.sale_price < product.price) {
// Show original price with strikethrough
const originalPrice = document.createElement('span');
originalPrice.className = 'price-original';
originalPrice.innerText = product.price.toLocaleString('vi-VN') + 'đ';
priceDiv.appendChild(originalPrice);
// Show sale price
const salePrice = document.createElement('span');
salePrice.className = 'price-sale';
salePrice.innerText = product.sale_price.toLocaleString('vi-VN') + 'đ';
priceDiv.appendChild(salePrice);
} else {
// Show regular price
const regularPrice = document.createElement('span');
regularPrice.className = 'price-regular';
regularPrice.innerText = product.price.toLocaleString('vi-VN') + 'đ';
priceDiv.appendChild(regularPrice);
}
body.appendChild(priceDiv);
// Link button
const link = document.createElement('a');
link.className = 'product-link';
link.href = product.url;
link.target = '_blank';
link.innerText = '🛍️ Xem chi tiết';
body.appendChild(link);
card.appendChild(body);
productsContainer.appendChild(card);
});
filteredDiv.appendChild(productsContainer);
}
botMsgDiv.appendChild(filteredDiv);
// RAW CONTENT (hidden by default)
const rawDiv = document.createElement('div');
rawDiv.id = 'raw-' + messageId;
rawDiv.className = 'raw-content';
rawDiv.style.display = 'none';
const rawJsonDiv = document.createElement('div');
rawJsonDiv.className = 'raw-json-view';
const pre = document.createElement('pre');
pre.textContent = JSON.stringify({
ai_response: data.ai_response,
product_ids: data.product_ids
}, null, 2);
rawJsonDiv.appendChild(pre);
rawDiv.appendChild(rawJsonDiv);
botMsgDiv.appendChild(rawDiv);
// Add toggle button
const toggleDiv = document.createElement('div');
toggleDiv.className = 'message-view-toggle';
const filteredBtn = document.createElement('button');
filteredBtn.id = 'filtered-btn-' + messageId;
filteredBtn.className = 'active';
filteredBtn.innerText = '🎨 Widget';
filteredBtn.onclick = () => toggleMessageView(messageId);
const rawBtn = document.createElement('button');
rawBtn.id = 'raw-btn-' + messageId;
rawBtn.innerText = '👁️ Raw JSON';
rawBtn.onclick = () => toggleMessageView(messageId);
toggleDiv.appendChild(filteredBtn);
toggleDiv.appendChild(rawBtn);
botMsgDiv.appendChild(toggleDiv);
// Add response time
const timeDiv = document.createElement('div');
timeDiv.className = 'response-time';
timeDiv.innerText = `⏱️ ${responseTime}s`;
botMsgDiv.appendChild(timeDiv);
} else {
botMsgDiv.innerText = "Error: " + (data.message || "Unknown error");
botMsgDiv.style.color = 'red';
......
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>🔬 Load Testing Dashboard</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
}
/* Navigation Header */
.nav-header {
background: rgba(0, 0, 0, 0.2);
padding: 15px 30px;
display: flex;
justify-content: space-between;
align-items: center;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
}
.nav-header h1 {
margin: 0;
color: white;
font-size: 1.5em;
}
.nav-links {
display: flex;
gap: 15px;
}
.nav-links a {
color: white;
text-decoration: none;
padding: 8px 16px;
border-radius: 6px;
background: rgba(255, 255, 255, 0.2);
transition: all 0.3s;
font-weight: 500;
}
.nav-links a:hover {
background: rgba(255, 255, 255, 0.3);
transform: translateY(-2px);
}
.nav-links a.active {
background: rgba(255, 255, 255, 0.4);
}
.main-wrapper {
padding: 20px;
}
.container {
max-width: 1200px;
margin: 0 auto;
background: white;
border-radius: 16px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
overflow: hidden;
}
.header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 30px;
text-align: center;
}
.header h1 {
font-size: 2em;
margin-bottom: 10px;
}
.header p {
opacity: 0.9;
font-size: 1.1em;
}
.content {
padding: 30px;
}
.section {
margin-bottom: 30px;
padding: 20px;
border: 2px solid #f0f0f0;
border-radius: 12px;
}
.section h2 {
color: #667eea;
margin-bottom: 20px;
font-size: 1.5em;
display: flex;
align-items: center;
gap: 10px;
}
.form-group {
margin-bottom: 15px;
}
label {
display: block;
margin-bottom: 5px;
font-weight: 600;
color: #333;
}
input,
select {
width: 100%;
padding: 12px;
border: 2px solid #e0e0e0;
border-radius: 8px;
font-size: 14px;
transition: border-color 0.3s;
}
input:focus,
select:focus {
outline: none;
border-color: #667eea;
}
.button-group {
display: flex;
gap: 15px;
margin-top: 20px;
}
button {
flex: 1;
padding: 15px 30px;
border: none;
border-radius: 8px;
font-size: 16px;
font-weight: 600;
cursor: pointer;
transition: all 0.3s;
}
.btn-start {
background: linear-gradient(135deg, #11998e 0%, #38ef7d 100%);
color: white;
}
.btn-start:hover:not(:disabled) {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(17, 153, 142, 0.4);
}
.btn-stop {
background: linear-gradient(135deg, #ee0979 0%, #ff6a00 100%);
color: white;
}
.btn-stop:hover:not(:disabled) {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(238, 9, 121, 0.4);
}
button:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.metrics-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
margin-top: 20px;
}
.metric-card {
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
padding: 20px;
border-radius: 12px;
text-align: center;
}
.metric-label {
font-size: 14px;
color: #666;
margin-bottom: 10px;
}
.metric-value {
font-size: 32px;
font-weight: bold;
color: #333;
}
.metric-unit {
font-size: 16px;
color: #999;
margin-left: 5px;
}
.status {
display: inline-block;
padding: 8px 16px;
border-radius: 20px;
font-weight: 600;
font-size: 14px;
margin: 10px 0;
}
.status.idle {
background: #e0e0e0;
color: #666;
}
.status.running {
background: #4caf50;
color: white;
animation: pulse 2s infinite;
}
.status.stopped {
background: #f44336;
color: white;
}
@keyframes pulse {
0%,
100% {
opacity: 1;
}
50% {
opacity: 0.7;
}
}
.log-container {
background: #1e1e1e;
color: #00ff00;
padding: 20px;
border-radius: 8px;
font-family: 'Courier New', monospace;
font-size: 14px;
max-height: 300px;
overflow-y: auto;
}
.log-entry {
margin-bottom: 5px;
}
.alert {
padding: 15px;
border-radius: 8px;
margin-bottom: 20px;
}
.alert-warning {
background: #fff3cd;
border-left: 4px solid #ffc107;
color: #856404;
}
.alert-info {
background: #d1ecf1;
border-left: 4px solid #17a2b8;
color: #0c5460;
}
/* Chart container */
.chart-container {
position: relative;
height: 300px;
margin-top: 20px;
}
</style>
<!-- Chart.js -->
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
</head>
<body>
<!-- Navigation Header -->
<div class="nav-header">
<h1>🤖 Canifa AI System</h1>
<div class="nav-links">
<a href="/static/index.html">💬 Chatbot</a>
<a href="/static/loadtest.html" class="active">🔬 Load Test</a>
</div>
</div>
<div class="main-wrapper">
<div class="container">
<div class="header">
<h1>🔬 Load Testing Dashboard</h1>
<p>Performance testing tool for Canifa Chat API</p>
</div>
<div class="content">
<!-- Alert -->
<div class="alert alert-warning">
⚠️ <strong>Lưu ý:</strong> Sử dụng <code>chat_mock</code> để test mà không tốn tiền OpenAI!
</div>
<!-- Config Section -->
<div class="section">
<h2>⚙️ Test Configuration</h2>
<div class="form-group">
<label for="targetUrl">Target URL</label>
<input type="text" id="targetUrl" value="http://localhost:5000"
placeholder="http://localhost:5000">
</div>
<div class="form-group">
<label for="numUsers">Number of Users (1-1000)</label>
<input type="number" id="numUsers" value="10" min="1" max="1000">
</div>
<div class="form-group">
<label for="spawnRate">Spawn Rate (users/second)</label>
<input type="number" id="spawnRate" value="2" min="1" max="100">
</div>
<div class="form-group">
<label for="duration">Duration (seconds)</label>
<input type="number" id="duration" value="60" min="10" max="600">
</div>
<div class="form-group">
<label for="testType">Test Type</label>
<select id="testType">
<option value="chat_mock">💚 Mock Chat (No cost - Recommended)</option>
<option value="db_search">🔥 DB Search (Test StarRocks - No LLM cost)</option>
<option value="chat_real">💸 Real Chat (Costs money!)</option>
<option value="history">📜 History API (Postgres)</option>
</select>
</div>
<div class="button-group">
<button class="btn-start" id="startBtn" onclick="startTest()">▶ Start Test</button>
<button class="btn-stop" id="stopBtn" onclick="stopTest()" disabled>⏹ Stop Test</button>
</div>
</div>
<!-- Status Section -->
<div class="section">
<h2>📊 Live Metrics</h2>
<div>
Current Status: <span class="status idle" id="statusBadge">IDLE</span>
</div>
<div class="metrics-grid">
<div class="metric-card">
<div class="metric-label">Total Requests</div>
<div class="metric-value" id="totalReq">0</div>
</div>
<div class="metric-card">
<div class="metric-label">Requests/Second</div>
<div class="metric-value" id="rps">0<span class="metric-unit">req/s</span></div>
</div>
<div class="metric-card">
<div class="metric-label">Avg Response Time</div>
<div class="metric-value" id="avgLatency">0<span class="metric-unit">ms</span></div>
</div>
<div class="metric-card">
<div class="metric-label">P50 (Median)</div>
<div class="metric-value" id="p50">0<span class="metric-unit">ms</span></div>
</div>
<div class="metric-card">
<div class="metric-label">P90</div>
<div class="metric-value" id="p90">0<span class="metric-unit">ms</span></div>
</div>
<div class="metric-card">
<div class="metric-label">P95</div>
<div class="metric-value" id="p95">0<span class="metric-unit">ms</span></div>
</div>
<div class="metric-card">
<div class="metric-label">P99 (Worst)</div>
<div class="metric-value" id="p99">0<span class="metric-unit">ms</span></div>
</div>
<div class="metric-card">
<div class="metric-label">Success Rate</div>
<div class="metric-value" id="successRate">100<span class="metric-unit">%</span></div>
</div>
<div class="metric-card">
<div class="metric-label">Active Users</div>
<div class="metric-value" id="activeUsers">0</div>
</div>
<div class="metric-card">
<div class="metric-label">Elapsed Time</div>
<div class="metric-value" id="elapsed">0<span class="metric-unit">s</span></div>
</div>
</div>
</div>
<!-- Chart Section -->
<div class="section">
<h2>📈 Response Time Chart (Real-time)</h2>
<div class="chart-container">
<canvas id="responseTimeChart"></canvas>
</div>
</div>
<!-- Logs Section -->
<div class="section">
<h2>📝 Logs</h2>
<div class="log-container" id="logContainer">
<div class="log-entry">[INFO] Waiting for test to start...</div>
</div>
</div>
</div>
</div>
<script>
let pollingInterval = null;
let responseTimeChart = null;
const maxDataPoints = 30; // Giữ 30 data points (60 giây với poll 2s)
// Initialize Chart
function initChart() {
const ctx = document.getElementById('responseTimeChart').getContext('2d');
responseTimeChart = new Chart(ctx, {
type: 'line',
data: {
labels: [],
datasets: [
{
label: 'P99 (Worst)',
data: [],
borderColor: 'rgb(255, 99, 132)',
backgroundColor: 'rgba(255, 99, 132, 0.1)',
tension: 0.4,
fill: true
},
{
label: 'P95',
data: [],
borderColor: 'rgb(255, 159, 64)',
backgroundColor: 'rgba(255, 159, 64, 0.1)',
tension: 0.4,
fill: true
},
{
label: 'P50 (Median)',
data: [],
borderColor: 'rgb(75, 192, 192)',
backgroundColor: 'rgba(75, 192, 192, 0.1)',
tension: 0.4,
fill: true
},
{
label: 'Avg',
data: [],
borderColor: 'rgb(54, 162, 235)',
backgroundColor: 'rgba(54, 162, 235, 0.1)',
tension: 0.4,
fill: true
}
]
},
options: {
responsive: true,
maintainAspectRatio: false,
scales: {
y: {
beginAtZero: true,
title: {
display: true,
text: 'Response Time (ms)'
}
},
x: {
title: {
display: true,
text: 'Time (seconds)'
}
}
},
plugins: {
legend: {
display: true,
position: 'top'
}
}
}
});
}
function updateChart(metrics) {
if (!responseTimeChart) return;
const elapsed = metrics.elapsed_seconds || 0;
// Add new data point
responseTimeChart.data.labels.push(elapsed + 's');
responseTimeChart.data.datasets[0].data.push(metrics.p99_response_time_ms || 0);
responseTimeChart.data.datasets[1].data.push(metrics.p95_response_time_ms || 0);
responseTimeChart.data.datasets[2].data.push(metrics.p50_response_time_ms || 0);
responseTimeChart.data.datasets[3].data.push(metrics.avg_response_time_ms || 0);
// Giữ tối đa maxDataPoints
if (responseTimeChart.data.labels.length > maxDataPoints) {
responseTimeChart.data.labels.shift();
responseTimeChart.data.datasets.forEach(dataset => dataset.data.shift());
}
responseTimeChart.update('none'); // Update without animation for smoother realtime
}
function addLog(message, type = 'INFO') {
const logContainer = document.getElementById('logContainer');
const timestamp = new Date().toLocaleTimeString();
const logEntry = document.createElement('div');
logEntry.className = 'log-entry';
logEntry.textContent = `[${timestamp}] [${type}] ${message}`;
logContainer.appendChild(logEntry);
logContainer.scrollTop = logContainer.scrollHeight;
}
async function startTest() {
const config = {
target_url: document.getElementById('targetUrl').value,
num_users: parseInt(document.getElementById('numUsers').value),
spawn_rate: parseInt(document.getElementById('spawnRate').value),
duration_seconds: parseInt(document.getElementById('duration').value),
test_type: document.getElementById('testType').value
};
try {
document.getElementById('startBtn').disabled = true;
addLog('Starting load test...', 'INFO');
const response = await fetch('/api/test/loadtest/start', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(config)
});
const data = await response.json();
if (data.status === 'success') {
addLog(`Test started successfully! Type: ${config.test_type}`, 'SUCCESS');
document.getElementById('stopBtn').disabled = false;
startPolling();
} else {
addLog(`Failed to start: ${data.detail || 'Unknown error'}`, 'ERROR');
document.getElementById('startBtn').disabled = false;
}
} catch (error) {
addLog(`Error: ${error.message}`, 'ERROR');
document.getElementById('startBtn').disabled = false;
}
}
async function stopTest() {
try {
addLog('Stopping test...', 'INFO');
const response = await fetch('/api/test/loadtest/stop', {
method: 'POST'
});
const data = await response.json();
addLog('Test stopped by user', 'INFO');
stopPolling();
} catch (error) {
addLog(`Error stopping test: ${error.message}`, 'ERROR');
}
}
async function fetchMetrics() {
try {
const response = await fetch('/api/test/loadtest/metrics');
const data = await response.json();
if (data.status === 'success') {
const metrics = data.data;
// Update status badge
const statusBadge = document.getElementById('statusBadge');
statusBadge.textContent = metrics.status.toUpperCase();
statusBadge.className = `status ${metrics.status}`;
// Update metrics
document.getElementById('totalReq').textContent = metrics.total_requests || 0;
document.getElementById('rps').innerHTML = `${metrics.current_rps || 0}<span class="metric-unit">req/s</span>`;
document.getElementById('avgLatency').innerHTML = `${metrics.avg_response_time_ms || 0}<span class="metric-unit">ms</span>`;
// Percentiles
document.getElementById('p50').innerHTML = `${metrics.p50_response_time_ms || 0}<span class="metric-unit">ms</span>`;
document.getElementById('p90').innerHTML = `${metrics.p90_response_time_ms || 0}<span class="metric-unit">ms</span>`;
document.getElementById('p95').innerHTML = `${metrics.p95_response_time_ms || 0}<span class="metric-unit">ms</span>`;
document.getElementById('p99').innerHTML = `${metrics.p99_response_time_ms || 0}<span class="metric-unit">ms</span>`;
const successRate = Math.round((1 - metrics.failure_rate) * 100);
document.getElementById('successRate').innerHTML = `${successRate}<span class="metric-unit">%</span>`;
document.getElementById('activeUsers').textContent = metrics.active_users || 0;
document.getElementById('elapsed').innerHTML = `${metrics.elapsed_seconds || 0}<span class="metric-unit">s</span>`;
// Update chart
updateChart(metrics);
// Stop polling if test is stopped
if (metrics.status === 'stopped' || metrics.status === 'idle') {
stopPolling();
addLog('Test completed!', 'INFO');
}
}
} catch (error) {
console.error('Error fetching metrics:', error);
}
}
function startPolling() {
if (pollingInterval) clearInterval(pollingInterval);
pollingInterval = setInterval(fetchMetrics, 2000); // Poll every 2 seconds
}
function stopPolling() {
if (pollingInterval) {
clearInterval(pollingInterval);
pollingInterval = null;
}
document.getElementById('startBtn').disabled = false;
document.getElementById('stopBtn').disabled = true;
}
// Initialize
window.addEventListener('load', () => {
initChart();
addLog('Dashboard ready', 'INFO');
});
</script>
</div> <!-- Close main-wrapper -->
</body>
</html>
\ No newline at end of file
import requests
"""
Test Script: Kiểm tra Vector Index - SIÊU GỌN
Chỉ đo thời gian từ lúc có full query đến khi nhận kết quả
"""
import sys
import os
import asyncio
import time
response = requests.post(
"http://172.16.2.210:8008/text_search/search", data={"query": "áo polo nam"}, headers={"accept": "application/json"}
)
# Add parent dir to path
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
print(response.json())
from common.embedding_service import create_embedding_async
from common.starrocks_connection import StarRocksConnection
async def main():
print("="*60)
print("🔍 TEST VECTOR INDEX - PERFORMANCE CHECK")
print("="*60)
# 1. Chuẩn bị dữ liệu (Embedding)
test_query = "áo sơ mi"
print(f" Creating embedding for: '{test_query}'...")
query_vector = await create_embedding_async(test_query)
# 2. Tạo full query string (COPY Y HỆT câu bro bảo "ngon" nhưng thêm Hint chuẩn)
v_str = "[" + ",".join(str(v) for v in query_vector) + "]"
sql = f"""
SELECT /*+ SET_VAR(ann_params='{{"ef_search":64}}') */
internal_ref_code,
approx_cosine_similarity(vector, {v_str}) as score
FROM shared_source.magento_product_dimension_with_text_embedding__tmp
ORDER BY score DESC
LIMIT 50
"""
# 3. Kết nối DB
db = StarRocksConnection()
conn = db.connect()
conn.ping(reconnect=True)
try:
with conn.cursor() as cursor:
# --- KIỂM TRA PLAN ---
print("🔬 Đang kiểm tra Query Plan (XEM FULL)...")
cursor.execute(f"EXPLAIN {sql}")
plan = cursor.fetchall()
is_vector_on = False
for row in plan:
line = str(row)
print(f" > {line}") # In full để mình soi
if "VECTORINDEX: ON" in line:
is_vector_on = True
print(f"\n📊 Vector Index Status: {'ON ✅' if is_vector_on else 'OFF ❌'}")
# Baseline: Độ trễ mạng
t_base_0 = time.perf_counter()
cursor.execute("SELECT 1")
cursor.fetchone()
baseline_ms = (time.perf_counter() - t_base_0) * 1000
print(f"📡 Network Baseline: {baseline_ms:.2f} ms")
print(f"\n🚀 ĐANG GỬI TRUY VẤN (10 vòng lặp)...")
durations = []
for i in range(1, 11):
start_time = time.perf_counter()
cursor.execute(sql)
rows = cursor.fetchall()
duration_ms = (time.perf_counter() - start_time) * 1000
durations.append(duration_ms)
status_icon = "⚡" if duration_ms < 80 else "🐢"
print(f"🔄 Lần {i:02d}: {duration_ms:7.2f} ms {status_icon}")
print("-" * 30)
print(f"📈 AVG: {sum(durations)/10:.2f}ms | MIN: {min(durations):.2f}ms | MAX: {max(durations):.2f}ms")
print("-" * 30 + "\n")
except Exception as e:
print(f"\n❌ Lỗi: {e}\n")
finally:
pass
print("="*60 + "\n")
if __name__ == "__main__":
asyncio.run(main())
"""
Test Script: Kiểm tra Vector Index - SIÊU GỌN
Chỉ đo thời gian từ lúc có full query đến khi nhận kết quả
"""
import sys
import os
import asyncio
import time
# Add parent dir to path
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from common.embedding_service import create_embedding_async
from common.starrocks_connection import StarRocksConnection
async def main():
print("="*60)
print("🔍 TEST VECTOR INDEX - PERFORMANCE CHECK")
print("="*60)
# 1. Chuẩn bị dữ liệu (Embedding)
test_query = "áo sơ mi"
print(f" Creating embedding for: '{test_query}'...")
query_vector = await create_embedding_async(test_query)
# 2. Tạo full query string (COPY Y HỆT câu bro bảo "ngon" nhưng thêm Hint chuẩn)
v_str = "[" + ",".join(str(v) for v in query_vector) + "]"
sql = f"""
SELECT /*+ SET_VAR(ann_params='{{"ef_search":64}}') */
internal_ref_code,
approx_cosine_similarity(vector, {v_str}) as score
FROM shared_source.magento_product_dimension_with_text_embedding__tmp
ORDER BY score DESC
LIMIT 50
"""
# 3. Kết nối DB
db = StarRocksConnection()
conn = db.connect()
conn.ping(reconnect=True)
try:
with conn.cursor() as cursor:
# --- KIỂM TRA PLAN ---
print("🔬 Đang kiểm tra Query Plan (XEM FULL)...")
cursor.execute(f"EXPLAIN {sql}")
plan = cursor.fetchall()
is_vector_on = False
for row in plan:
line = str(row)
print(f" > {line}") # In full để mình soi
if "VECTORINDEX: ON" in line:
is_vector_on = True
print(f"\n📊 Vector Index Status: {'ON ✅' if is_vector_on else 'OFF ❌'}")
# Baseline: Độ trễ mạng
t_base_0 = time.perf_counter()
cursor.execute("SELECT 1")
cursor.fetchone()
baseline_ms = (time.perf_counter() - t_base_0) * 1000
print(f"📡 Network Baseline: {baseline_ms:.2f} ms")
print(f"\n🚀 ĐANG GỬI TRUY VẤN (10 vòng lặp)...")
durations = []
for i in range(1, 11):
start_time = time.perf_counter()
cursor.execute(sql)
rows = cursor.fetchall()
duration_ms = (time.perf_counter() - start_time) * 1000
durations.append(duration_ms)
status_icon = "⚡" if duration_ms < 80 else "🐢"
print(f"🔄 Lần {i:02d}: {duration_ms:7.2f} ms {status_icon}")
print("-" * 30)
print(f"📈 AVG: {sum(durations)/10:.2f}ms | MIN: {min(durations):.2f}ms | MAX: {max(durations):.2f}ms")
print("-" * 30 + "\n")
except Exception as e:
print(f"\n❌ Lỗi: {e}\n")
finally:
pass
print("="*60 + "\n")
if __name__ == "__main__":
asyncio.run(main())
SELECT
internal_ref_code,
approx_cosine_similarity(vector, [0.020767446607351303,-0.01121582742780447,-0.08832024037837982,-0.028268102556467056,0.003533512819558382,-0.024752169847488403,-0.020591648295521736,-0.0001370664540445432,0.03169027715921402,-0.02442401647567749,0.00906524807214737,-0.028127465397119522,-0.02951039932668209,0.06305240094661713,-0.0031262505799531937,-0.016677243635058403,-0.029158806428313255,-0.00627594068646431,0.01993534155189991,0.0018736994825303555,0.02501000463962555,0.035534366965293884,0.0066275340504944324,0.014262969605624676,0.04636343941092491,-0.010026269592344761,-0.002494847634807229,0.0042366995476186275,0.020474450662732124,-0.03675322234630585,-0.008643335662782192,-0.040128517895936966,0.043996043503284454,0.0010437926976010203,-0.027635235339403152,0.04992625117301941,0.018353171646595,-0.03260442242026329,-0.019114958122372627,0.0019908971153199673,0.014368447475135326,0.013372265733778477,0.03975348547101021,-0.0017740813782438636,0.04842612147331238,0.01095799170434475,-0.04455859586596489,0.019185276702046394,0.029885433614253998,0.03419831022620201,0.013231628574430943,0.0009485695045441389,0.02981511317193508,0.11541637033224106,0.0526452399790287,0.0007090465514920652,-0.01271595899015665,0.04903554916381836,0.052176449447870255,0.028150904923677444,-0.024377137422561646,-0.05241084471344948,0.01077047549188137,0.04875427484512329,-0.006352119613438845,-0.03342480584979057,0.0025182871613651514,0.005206511355936527,-0.04176928848028183,0.007260402198880911,-0.03417487069964409,0.012669079937040806,0.0004127559077460319,-0.011790095828473568,-0.028057146817445755,0.0025505165103822947,0.0011690477840602398,-0.030237026512622833,0.021083880215883255,-0.010975571349263191,-0.029651036486029625,0.03419831022620201,-0.003173129865899682,-0.01626705192029476,-0.018318012356758118,-0.035534366965293884,-0.051988933235406876,0.06319303810596466,0.004098992329090834,0.020462730899453163,-0.04474611207842827,0.010137607343494892,-0.027096126228570938,-0.03192467242479324,0.05981774628162384,0.0067037129774689674,-0.04115985706448555,-0.0386987067759037,-0.013501184061169624,0.017720304429531097,0.014122331514954567,-0.022548852488398552,0.04805108904838562,0.015188831835985184,0.02013457752764225,-0.00887187197804451,0.03126836568117142,-0.03330760821700096,-0.004008163698017597,0.015903737396001816,0.08049143105745316,-0.03759704530239105,0.009123846888542175,0.005540524609386921,0.012282326817512512,0.07224071025848389,0.030940212309360504,-0.07050618529319763,0.044417958706617355,-0.04657439514994621,0.01675928197801113,0.01855240762233734,0.005487785674631596,-0.03581564128398895,-0.007647154852747917,0.02272464893758297,-0.012926914729177952,-0.021880824118852615,0.014989595860242844,-0.00406383303925395,-0.014825518243014812,-0.03061205893754959,0.04165209084749222,-0.03546404838562012,-0.008280023001134396,0.002231152728199959,-0.010916972532868385,0.016888199374079704,-0.044300757348537445,0.007717473432421684,0.058458250015974045,0.006768171675503254,-0.03358888253569603,0.021083880215883255,0.007260402198880911,-0.046902548521757126,0.01002040971070528,-0.01723979227244854,0.007488938048481941,0.031549639999866486,0.06478693336248398,1.101590441976441e-05,-0.008848432451486588,0.02929944358766079,-0.022091779857873917,-0.05822385475039482,-0.015130233019590378,0.01122168730944395,0.004963325802236795,0.0424724742770195,0.020896364003419876,-0.012305766344070435,-0.019079796969890594,-0.025689752772450447,-0.05184829607605934,0.031174607574939728,-0.03101053088903427,-0.007553396746516228,-0.019103236496448517,-0.0032200089190155268,-0.006820910610258579,-0.02512720227241516,-0.026135103777050972,0.02053304947912693,-0.028783774003386497,-0.05067631974816322,0.04596496745944023,-0.012422963976860046,-0.04476955160498619,0.052973393350839615,0.033846717327833176,0.02770555391907692,0.04333973675966263,-0.025244401767849922,-0.04263655096292496,0.0014063733397051692,-0.012212008237838745,-0.015692781656980515,0.01824769377708435,0.01965406723320484,-0.025947587564587593,0.017685145139694214,-0.011286146007478237,-0.05873952433466911,0.0016803231555968523,-0.015212271362543106,-0.024564653635025024,-0.006533775944262743,0.009903212077915668,0.013442585244774818,0.009522318840026855,-0.031432442367076874,-0.05212957039475441,-0.02442401647567749,-0.026439817622303963,0.004424216225743294,-0.039636287838220596,-0.024189621210098267,0.03837055340409279,-0.03368264064192772,0.06586515158414841,0.0071373446844518185,0.0436210110783577,0.03541716933250427,-0.025549115613102913,0.02951039932668209,0.022783247753977776,0.01573966071009636,0.028877532109618187,0.008256583474576473,-0.05672372505068779,0.033752959221601486,0.06703712791204453,0.024845927953720093,-0.056348688900470734,0.0008826457196846604,-0.01585685834288597,-0.08719514310359955,-0.04462891444563866,-0.030776135623455048,0.022279297932982445,0.026346059516072273,0.005566894542425871,-0.02482248842716217,-0.013407425954937935,0.05245772376656532,-0.02252541296184063,-0.0018502598395571113,-0.029838554561138153,-0.06403686106204987,-0.05034816265106201,0.0232285987585783,0.0562080517411232,0.02382630854845047,0.010330984368920326,0.02510376274585724,-0.00832690205425024,-0.0020436362829059362,-0.005016064736992121,0.024588093161582947,0.032463785260915756,0.027939949184656143,0.006715432740747929,-0.023861467838287354,-0.0031526200473308563,0.03079957515001297,0.0144973648712039,-0.000141369819175452,0.002907969756051898,-0.004535553976893425,-0.053676582872867584,-0.00682677049189806,0.009510599076747894,-0.04312878102064133,0.00436268700286746,0.015892017632722855,-0.034245189279317856,0.021294835954904556,0.05175453796982765,0.012762838043272495,-0.04903554916381836,-0.01855240762233734,0.005520015023648739,0.04176928848028183,-0.00852613802999258,0.01754450611770153,-0.03490149602293968,0.05344218388199806,0.0022604521363973618,0.03119804710149765,-0.020954962819814682,-0.047605738043785095,0.05095759406685829,-0.0013177425134927034,0.00020509610476437956,-0.0064986166544258595,0.033143531531095505,-0.01795469969511032,0.030658937990665436,-0.020075978711247444,-0.03440926596522331,0.0420505627989769,0.011356464587152004,-0.01290347520262003,0.029533838853240013,0.01236436516046524,-0.0019908971153199673,-0.039120618253946304,-0.046996306627988815,-0.0076998937875032425,0.050582561641931534,0.06530260294675827,-0.01160843949764967,0.03900342062115669,-0.005522944964468479,-0.029651036486029625,0.0110634695738554,0.01606781594455242,0.03218251094222069,-0.0010350028751417994,-0.02013457752764225,0.022044900804758072,-0.0021139548625797033,-0.018868841230869293,0.03237002715468407,-0.06675585359334946,-0.0005453358753584325,-0.021400313824415207,0.06999050825834274,-0.01245812326669693,0.06328679621219635,-0.015927176922559738,0.021095599979162216,-0.021072160452604294,-0.008953910320997238,0.0055170850828289986,0.003990584053099155,-0.006258361041545868,0.0294166412204504,0.010682577267289162,-0.04038635268807411,0.026557015255093575,0.042824067175388336,-0.010600538924336433,0.007524097338318825,-0.02831498347222805,0.01573966071009636,0.03689385950565338,0.022947324439883232,0.06947483867406845,-0.040902022272348404,-0.01884540170431137,-0.0566299669444561,0.028760334476828575,0.003140900284051895,-0.09713351726531982,0.007758492603898048,-0.0322997085750103,0.013231628574430943,0.020158017054200172,0.024939686059951782,0.021294835954904556,-0.004377336706966162,-0.056067414581775665,0.039730045944452286,-0.032932575792074203,-0.01794297993183136,0.03269818052649498,-0.02333407662808895,0.048238605260849,-0.020790886133909225,-2.1058975107735023e-05,0.004090202506631613,-0.027752432972192764,0.01743902824819088,-0.001031340449117124,-0.01331366691738367,-0.0049838353879749775,0.048894912004470825,-0.00448574498295784,-0.017181193456053734,0.037925198674201965,-0.03640162944793701,-0.028057146817445755,-0.033448245376348495,0.07303765416145325,-0.009633657522499561,0.02533815987408161,-0.014977876096963882,-0.03290913626551628,-0.037339210510253906,0.02533815987408161,-0.009592638351023197,-0.0029343392234295607,0.019196996465325356,-0.011198247782886028,0.04439451918005943,-0.0221269391477108,0.012692519463598728,0.016981957480311394,-0.0018517248099669814,-0.04258967190980911,0.0540047362446785,0.015786539763212204,0.006170462816953659,0.024353697896003723,0.017790623009204865,0.020990122109651566,-0.0601927787065506,0.013641821220517159,0.008139385841786861,-0.01675928197801113,-0.03956596925854683,-0.014790358953177929,-0.016395969316363335,0.05475480109453201,-0.01616157405078411,0.0002561870205681771,0.04776981472969055,0.010231365449726582,0.029768234118819237,-0.045003946870565414,0.029065048322081566,0.03176059573888779,0.01742730848491192,-0.033448245376348495,-0.02312312088906765,0.028080586344003677,-0.0031584801618009806,-0.008778112940490246,-0.01160843949764967,-0.012001052498817444,-0.037620484828948975,0.03558124601840973,0.014122331514954567,0.010389583185315132,0.010541940107941628,-0.006533775944262743,0.036518827080726624,-0.06230233609676361,-0.044605474919080734,0.003395805601030588,-0.02981511317193508,0.027728993445634842,-0.030260466039180756,-0.0440429225564003,-0.04019883647561073,0.0041663809679448605,-0.017462467774748802,-0.05025440454483032,-0.015411507338285446,-0.006053265184164047,0.005895047914236784,-0.015974055975675583,-0.01555214449763298,-0.028361862525343895,0.02552567608654499,-0.021083880215883255,-0.003111600875854492,-0.04235527664422989,0.020368972793221474,-0.048004209995269775,-0.016970237717032433,-0.0034807738848030567,0.018318012356758118,0.0144973648712039,0.04884803295135498,0.01806017756462097,0.009457860141992569,-0.033448245376348495,0.05231708660721779,0.0010635697981342673,-0.004840268287807703,0.029088487848639488,0.02859625779092312,-0.0384877510368824,0.06830286234617233,-0.02651013620197773,-0.0021930632647126913,0.036729782819747925,-0.003272747853770852,-0.036940738558769226,0.00897734984755516,-0.012129969894886017,-0.021365154534578323,-0.05850512906908989,0.061739787459373474,0.021669868379831314,0.04066762700676918,0.018400050699710846,-0.0015294309705495834,-0.03668290376663208,-0.05386409908533096,-0.009153146296739578,-0.012645640410482883,0.056676845997571945,-0.0008797157788649201,0.0034016654826700687,-0.027564916759729385,0.017978139221668243,-0.023884907364845276,-0.006686132866889238,0.029065048322081566,-0.009692256338894367,0.04556649550795555,0.01693507842719555,-0.008912891149520874,-0.021505791693925858,-0.010395443066954613,-0.053582824766635895,0.013196469284594059,-0.010629838332533836,-0.04814484715461731,0.03750328719615936,0.013419145718216896,0.0222324188798666,0.01974782533943653,0.02211521938443184,0.01420437078922987,0.02421306073665619,-0.03487805649638176,0.019759545102715492,-0.02053304947912693,-0.025549115613102913,-0.046011846512556076,-0.027682114392518997,-0.017720304429531097,-0.01056537963449955,-0.00822728406637907,-0.03965972736477852,-0.021494071930646896,0.005836449097841978,-0.010811494663357735,-0.03609691560268402,-0.015892017632722855,-0.022865286096930504,0.05311403051018715,-0.027096126228570938,-0.02252541296184063,-0.020204896107316017,-0.022947324439883232,-0.012505002319812775,-0.014286409132182598,0.02442401647567749,0.01021964568644762,-0.01420437078922987,0.01225888729095459,-0.002012871904298663,0.012739398516714573,0.030940212309360504,0.03511245176196098,0.006639253813773394,-0.019372792914509773,-0.05105135217308998,-0.019595468416810036,0.007067025639116764,-0.029674476012587547,-0.017204632982611656,-0.005171352066099644,0.019900182262063026,-0.05569238215684891,-0.015434946864843369,-0.007277981843799353,0.01504819467663765,-0.023662229999899864,-0.0162553321570158,-0.000909015245269984,-0.01355978287756443,0.013337106443941593,0.008250723592936993,0.028455620631575584,0.025853829458355904,0.015399787575006485,0.015013035386800766,-0.02383802831172943,0.004336317535489798,0.011438502930104733,0.014591122977435589,0.019068077206611633,-0.03110428899526596,0.006475177127867937,0.025877268984913826,-0.002191598294302821,-0.04329285770654678,-0.011749076656997204,0.011643598787486553,-0.015505265444517136,0.01011416781693697,-0.05236396566033363,-0.005355938337743282,-0.003120390698313713,0.03949565067887306,-0.026767972856760025,0.016102975234389305,-0.011913154274225235,0.0172515120357275,0.036448508501052856,-0.019806424155831337,-0.024353697896003723,0.008092506788671017,-0.03935501351952553,-0.012411244213581085,-0.002704338636249304,-0.012540161609649658,0.02580695040524006,-0.06113035976886749,-0.011297865770757198,-0.025197520852088928,-0.05461416393518448,-0.032862257212400436,0.000848951400257647,0.006305240094661713,0.027869630604982376,-0.020286934450268745,0.03262786194682121,0.0011836974881589413,-0.04329285770654678,0.009903212077915668,-0.031057409942150116,-0.005707531701773405,0.0318777933716774,0.037315770983695984,0.014157491736114025,-0.03267474099993706,0.02629918046295643,-0.016864759847521782,-0.027541477233171463,-0.013184749521315098,0.019900182262063026,0.016372529789805412,-0.016524886712431908,0.011426783166825771,0.034503024071455,-0.01095799170434475,0.0069322483614087105,-0.032838817685842514,-0.034221749752759933,0.015141952782869339,-0.0029519188683480024,-0.008180405013263226,0.033940475434064865,0.0023263758048415184,0.014673161320388317,0.00011628216452663764,-0.0019322982989251614,0.027869630604982376,-0.026346059516072273,-0.009035948663949966,0.0036389909218996763,-0.00044388658716343343,-0.009188305586576462,0.009909071959555149,0.02981511317193508,-0.03140900284051895,0.05194205418229103,0.018693044781684875,0.013512903824448586,0.007389319594949484,0.008397220633924007,0.006809190846979618,0.0486605167388916,0.010834934189915657,-0.014473925344645977,-0.005520015023648739,-0.016009215265512466,-0.0067740315571427345,0.0030149128288030624,-0.049785614013671875,-0.001363156596198678,-0.007910849526524544,0.005086383316665888,0.03108084946870804,0.01953686960041523,-0.04805108904838562,-0.0005713391583412886,0.02043929137289524,-4.8481422709301114e-05,0.04746510088443756,-0.007242822553962469,0.0047494396567344666,-0.010137607343494892,0.014778639189898968,0.001453252392821014,-0.02761179581284523,0.06000526249408722,0.010793915018439293,-0.004960395861417055,0.016419408842921257,-0.008655055426061153,0.0037532588467001915,0.030166707932949066,-0.021845664829015732,-0.010729456320405006,-0.02861969731748104,0.04125361517071724,-0.011256846599280834,0.018224254250526428,0.0015470106154680252,-0.022255858406424522,-0.012188568711280823,-0.01544666662812233,0.02103700116276741,0.012985513545572758,-0.008397220633924007,9.375822264701128e-05,0.007623715326189995,0.016102975234389305,0.018505528569221497,0.013137870468199253,-0.015376348048448563,0.013149590231478214,-0.01685304008424282,0.029158806428313255,-0.009246904402971268,-0.022865286096930504,-0.020990122109651566,-0.01663036458194256,0.02033381350338459,-0.011104489676654339,-0.007494797930121422,-0.003058861941099167,0.007225242909044027,0.002918224548920989,0.03070581704378128,-0.00796944834291935,-0.043714769184589386,0.008250723592936993,-0.01684132032096386,-0.00803390797227621,-0.01311443094164133,-0.008567157201468945,0.03340136632323265,-0.05062944069504738,0.011344744823873043,-0.048097968101501465,-0.02601790614426136,0.02014629729092121,-0.010395443066954613,-0.008350341580808163,-0.014848957769572735,0.027143005281686783,0.00972155574709177,-0.0054672760888934135,0.01290347520262003,-0.007705753669142723,0.024048984050750732,-0.023439554497599602,0.025595994666218758,-0.035253092646598816,-0.032440345734357834,-0.010588819161057472,-0.0002464815624989569,-0.0012913730461150408,0.01633737049996853,-0.037222012877464294,-0.0004354629782028496,-0.008561297319829464,0.004611732438206673,-0.03297945484519005,0.023298917338252068,0.0050336443819105625,0.007260402198880911,0.017989858984947205,0.02969791553914547,-0.02381458878517151,-0.029440080747008324,0.00021223785006441176,-0.027260202914476395,0.022865286096930504,0.011491241864860058,0.013969974592328072,0.038347113877534866,-0.0034514744766056538,0.034127991646528244,0.005241670645773411,-0.021283116191625595,0.02852593921124935,-0.026767972856760025,0.023252038285136223,0.01106932945549488,0.013395706191658974,-0.042214639484882355,0.019888462498784065,-0.018095336854457855,-0.03776112198829651,-0.02451777458190918,-0.014884117059409618,-0.01813049614429474,0.0010181557154282928,0.01862272620201111,-0.013782458379864693,-0.021798785775899887,-0.02093152329325676,0.0004057972982991487,-0.016583485528826714,0.010336844250559807,-0.025056883692741394,0.004101922269910574,0.02711956575512886,-0.018165655434131622,0.02901816926896572,-0.03101053088903427,-0.015927176922559738,-0.003970074467360973,0.00542918685823679,-0.04249591380357742,0.039730045944452286,0.04448827728629112,0.03745640814304352,-0.012891755439341068,-0.023861467838287354,0.02711956575512886,0.0034280349500477314,0.003917335532605648,0.01715775392949581,-0.010829074308276176,-0.017298391088843346,-0.009211745113134384,0.028174344450235367,-0.026838291436433792,-0.005889188032597303,0.014016853645443916,-0.015013035386800766,-0.012762838043272495,0.019689226523041725,-0.002225292846560478,0.0072076632641255856,0.029861994087696075,0.0436210110783577,0.001957202795892954,0.036518827080726624,-0.006229061633348465,0.027049247175455093,-0.003908545710146427,0.009340662509202957,-0.003958354704082012,-0.0077291931957006454,0.016677243635058403,0.021599549800157547,0.009211745113134384,0.013149590231478214,0.005405747331678867,0.004702560603618622,-0.012411244213581085,0.010172766633331776,0.012622200883924961,0.013442585244774818,0.023369235917925835,-0.04556649550795555,0.007272121962159872,0.0316668376326561,0.027541477233171463,-0.052785877138376236,0.014098891988396645,-0.011485381983220577,0.014720040373504162,-0.01933763362467289,-0.006551355589181185,-0.006574795115739107,0.02233789674937725,0.01912667788565159,-0.013477744534611702,-0.015716221183538437,0.001050385064445436,-0.0292056854814291,0.0085202781483531,0.01832973212003708,0.00448574498295784,0.030377663671970367,-0.011825255118310452,0.0030823014676570892,0.048285484313964844,-0.039612848311662674,0.0028537658508867025,0.0243302583694458,0.005625493358820677,-0.03656570613384247,0.009217604994773865,-0.005821799393743277,-0.016478007659316063,-2.760556890279986e-05,0.020486170426011086,-0.039214376360177994,-0.05583301931619644,0.025478797033429146,-0.002304401248693466,-0.002839116146788001,0.0031555502209812403,-0.05873952433466911,-0.02702580764889717,0.02311140112578869,-0.0464571975171566,-0.005678232293576002,0.020193176344037056,0.03958940878510475,0.002820071531459689,0.00897734984755516,0.003032492473721504,-0.014579403214156628,0.00672715250402689,-0.007125624921172857,0.00034042290644720197,0.006305240094661713,-0.03916749730706215,-0.002223827876150608,0.012797997333109379,0.009317222982645035,0.003445614594966173,0.006516196299344301,0.010131747461855412,-0.010190346278250217,-0.005813009571284056,0.021365154534578323,0.015399787575006485,0.0017008327413350344,0.022900445386767387,0.02263089083135128,0.006422438193112612,-0.03049486130475998,0.002168158767744899,-0.006609954405575991,-0.008074927143752575,0.027752432972192764,0.025080323219299316,0.0376439243555069,-0.022091779857873917,-0.015036474913358688,-0.022888725623488426,0.006117723882198334,-0.009440280497074127,-0.010125887580215931,-0.038933102041482925,-0.004626382142305374,-0.014884117059409618,-0.015798259526491165,-0.0031467601656913757,-0.03532341122627258,0.01196003332734108,0.03419831022620201,-0.0091765858232975,-0.04134737700223923,-0.023486433550715446,-0.022162098437547684,-0.009791874326765537,0.04258967190980911,-0.010541940107941628,0.042824067175388336,-0.005868678446859121,-0.007565116509795189,-0.010354423895478249,0.012622200883924961,-0.0100145498290658,-0.01852896809577942,0.04115985706448555,-0.011004870757460594,-0.020017379894852638,-0.012141689658164978,0.0013272648211568594,0.015528704971075058,-0.010811494663357735,-0.014016853645443916,0.016325650736689568,-0.0006350654293783009,-0.01722807250916958,-0.01786094158887863,-0.0031057409942150116,0.005077593494206667,-0.0209198035299778,0.013899656012654305,-0.02890097163617611,-0.0008855757187120616,-0.042120881378650665,-0.01656004600226879,-0.015505265444517136,-0.002755612600594759,-0.005405747331678867,0.014063732698559761,-0.020568208768963814,0.02761179581284523,0.04273030906915665,-0.03447958454489708,-0.008192124776542187,0.006322820205241442,0.02283012680709362,0.004558993503451347,-0.023298917338252068,-0.026486696675419807,0.03201843053102493,-0.030283905565738678,-0.029838554561138153,-0.008930470794439316,0.04851987957954407,-0.01804845780134201,-0.02491624653339386,0.015516985207796097,-0.011086910031735897,0.053770340979099274,0.0006892693927511573,-0.0029211544897407293,-0.001788731082342565,0.043011583387851715,0.03190123289823532,0.0027966320049017668,-0.026088224723935127,0.017919540405273438,-0.0019029988907277584,-0.012727678753435612,-0.016431128606200218,0.011936593800783157,0.008578876964747906,-0.01925559528172016,-0.007371739950031042,-0.013020672835409641,-0.009580918587744236,-0.019489990547299385,0.009434420615434647,-0.013583222404122353,-0.004843198228627443,0.017802342772483826,0.012047931551933289,0.0028024918865412474,-0.006012246012687683,-0.024588093161582947,0.005681162234395742,0.03417487069964409,-0.014098891988396645,-0.004078482743352652,0.022900445386767387,-0.04387884587049484,0.027541477233171463,0.036940738558769226,-0.004301158245652914,0.022501973435282707,-0.01011416781693697,0.03696417808532715,-0.008455819450318813,0.02700236812233925,0.028268102556467056,0.042214639484882355,-0.009657097049057484,-0.04348037391901016,0.008801553398370743,0.019279034808278084,0.029768234118819237,-0.007459638640284538,0.03588595986366272,-0.030283905565738678,-0.005769060458987951,0.0015294309705495834,-0.03897998109459877,0.006445877719670534,0.023978665471076965,-0.0028816002886742353,0.031737156212329865,0.007459638640284538,-0.01803673803806305,-0.03506557270884514,0.009955951012670994,-0.03778456151485443,0.011034170165657997,0.0014012459432706237,-0.004790459293872118,0.004890077281743288,-0.016220172867178917,-0.004075552802532911,-0.0016129344003275037,0.03267474099993706,-0.007295561488717794,-0.0046996306627988815,-0.0081276660785079,-0.03021358698606491,0.01693507842719555,-0.022044900804758072,-0.00149573665112257,0.0325106643140316,-0.03841743245720863,0.028854092583060265,0.05325466766953468,0.0028215365018695593,0.01963062770664692,0.009282063692808151,0.023896627128124237,0.030049510300159454,0.03377639874815941,-0.00357453222386539,0.00842066016048193,-0.03326072916388512,-0.02062680758535862,0.011854555457830429,-0.007817091420292854,-0.005054153967648745,-0.011731497012078762,0.011567420326173306,-0.009768434800207615,0.0018839542753994465,-0.0030031930655241013,0.054661042988300323,0.008022187277674675,-0.011831114999949932,-0.01112206932157278,-0.01813049614429474,0.014673161320388317,0.0076998937875032425,0.02123623713850975,-0.009545758366584778,-0.026885170489549637,0.004444725811481476,0.004851988051086664,0.00906524807214737,0.022560572251677513,0.012973793782293797,0.005892117973417044,0.045214902609586716,-0.03958940878510475,-0.02622886188328266,-0.019419671967625618,-0.028783774003386497,0.00822728406637907,0.014016853645443916,-0.009381681680679321,0.020908083766698837,0.01095799170434475,-0.015458386391401291,-0.006328680086880922,0.015411507338285446,0.013255068100988865,0.00013624240818899125,-0.012821436859667301,-0.0044212862849235535,0.020872924476861954,-0.018470369279384613,-0.02421306073665619,-0.010049709118902683,0.017497627064585686,-0.018071897327899933,-0.019712666049599648,0.04662127420306206,0.01057123951613903,0.002532936865463853,-0.037432968616485596,0.005912627559155226,0.014989595860242844,0.02700236812233925,-0.016583485528826714,0.017392149195075035,0.0025109623093158007,0.011930733919143677,-0.03851119056344032,0.008180405013263226,0.018904000520706177,0.049598097801208496,0.013594942167401314,-0.008156965486705303,0.026346059516072273,-0.005326638929545879,0.020193176344037056,0.004140011500567198,0.09408637136220932,-0.027682114392518997,-0.000858473707921803,-0.025267841294407845,-0.009686396457254887,-0.013911375775933266,-0.025549115613102913,-0.00010117464262293652,-0.019267315044999123,0.030283905565738678,0.01375901885330677,-0.018107056617736816,-0.0221269391477108,0.0008716584416106343,-0.028244663029909134,-0.012926914729177952,-0.010582959279417992,-0.03140900284051895,0.006715432740747929,-0.009510599076747894,-0.02241993509232998,-0.038839343935251236,-0.0069029489532113075,-0.012118250131607056,0.030541740357875824,-0.03595627844333649,-0.02451777458190918,0.039026860147714615,-0.009487159550189972,0.0036887999158352613,0.04992625117301941,0.010541940107941628,0.0009273273753933609,0.0006574062863364816,-0.021576110273599625,-0.03696417808532715,-0.01875164359807968,-0.03445614501833916,0.0035921118687838316,-0.033049773424863815,0.008895311504602432,0.033448245376348495,-0.02374427020549774,-0.003211219096556306,0.008444099687039852,0.015997495502233505,0.04533210024237633,-0.02470529079437256,-0.004717210307717323,0.005382307805120945,-0.03684698045253754,0.018997758626937866,-0.026369499042630196,0.00715492432937026,0.022947324439883232,-0.011678758077323437,-0.02700236812233925,0.014520804397761822,0.02281840704381466,0.007389319594949484,0.02360363118350506,-0.06624018400907516,0.024752169847488403,-0.021904263645410538,0.029088487848639488,0.017989858984947205,0.004435935989022255,-0.011737356893718243,0.012575320899486542,-0.016489727422595024,-0.005253390409052372,0.0007808301597833633,0.0005336161120794713,0.011168948374688625,0.016899919137358665,-0.004931096453219652,-0.01614985428750515,-0.07275637984275818,-0.03119804710149765,-0.018915720283985138,-0.0025944658555090427,0.016372529789805412,0.0037649786099791527,0.039026860147714615,0.035042133182287216,-0.0017579665873199701,-0.014286409132182598,0.020697128027677536,0.03855806961655617,-0.04104265943169594,0.007178363855928183,-0.013430865481495857,0.006574795115739107,-0.015329468995332718,0.013688700273633003,-0.015306029468774796,-0.025572555139660835,0.010776335373520851,-0.00501020485535264,-0.016923358663916588,0.030846454203128815,-0.020462730899453163,0.024681851267814636,-0.0013704814482480288,-0.007225242909044027,-0.030963651835918427,-0.01225888729095459,-0.02969791553914547,-0.0003125884395558387,-0.01535290852189064,0.007430338766425848,-0.009457860141992569,0.019689226523041725,0.009504739195108414,-0.004192750435322523,-0.03640162944793701,0.005587404128164053,0.009522318840026855,-0.043996043503284454,0.006316960323601961,0.019173556938767433,0.01012002769857645,0.0044212862849235535,-0.024400576949119568,-0.027963388711214066,0.010723596438765526,-0.003029562532901764,0.05592677742242813,-0.009381681680679321,-0.008918751031160355,-0.010301684029400349,0.008531997911632061,0.032346587628126144,-0.03546404838562012,0.00046915735583752394,0.024799048900604248,0.016888199374079704,-0.016876479610800743,0.02503344416618347,0.00416052108630538,0.006797471083700657,0.005361798219382763,0.023673949763178825,-9.2796835815534e-05,-0.00240401946939528,-0.007899129763245583,0.00627594068646431,0.03658914566040039,-0.02104872092604637,-0.012434683740139008,0.030166707932949066,0.00734830042347312,-0.02103700116276741,-0.016700683161616325,-0.02482248842716217,0.013829337432980537,-0.0023380955681204796,-0.0022296877577900887,-0.004453515633940697,0.008467539213597775,0.02660389430820942,-0.01722807250916958,0.01489583682268858,-0.023884907364845276,-0.004980905447155237,0.005637213122099638,-0.018318012356758118,0.002049496164545417,-0.019396232441067696,-0.018575847148895264,-0.02892441116273403,0.00777021236717701,-0.008203844539821148,-0.019572028890252113,-0.004714280366897583,-0.0015294309705495834,-0.0005881863180547953,0.015997495502233505,-0.013899656012654305,0.014848957769572735,0.02583038993179798,0.022490253672003746,0.004822688642889261,0.024986565113067627,-0.026650773361325264,-0.027846191078424454,0.00523581076413393,-0.011491241864860058,0.03855806961655617,-0.02503344416618347,-0.0062642209231853485,-0.01663036458194256,-0.018704764544963837,-7.599543096148409e-06,0.009938371367752552,0.018282853066921234,0.01245812326669693,-0.024588093161582947,-0.010483341291546822,0.029885433614253998,-0.030260466039180756,0.014731760136783123,0.04219119995832443,0.009979390539228916,0.01564590260386467,-0.006510336417704821,0.025150641798973083,0.03965972736477852,0.024072423577308655,0.009698116220533848,0.052176449447870255,0.005736831109970808,-0.008678494952619076,-0.021974582225084305,-0.018259413540363312,0.027236763387918472,-0.023275477811694145,-0.01665380410850048,-0.008895311504602432,0.024002104997634888,0.019771264865994453,-0.0036038316320627928,0.010143467225134373,-0.02302936278283596,-0.05259836092591286,-0.017474187538027763,-0.025853829458355904,-0.0318777933716774,0.01563418284058571,-0.015575584024190903,0.02253713272511959,0.0027746574487537146,-0.008989069610834122,-0.023591911420226097,0.0027028736658394337,-0.002585676033049822,0.002090515336021781,0.004723070189356804,0.022044900804758072,0.029322883114218712,0.014087172225117683,-0.01170805748552084,0.007360020186752081,0.0007160051609389484,-0.005420397035777569,-0.011280286125838757,-0.01862272620201111,-0.0042659989558160305,-0.024095863103866577,0.018189094960689545,0.030447982251644135,-0.030049510300159454,-0.008092506788671017,-0.05325466766953468,-0.0376439243555069,-0.058645766228437424,-0.0019352282397449017,-0.05423913151025772,0.0014180931029841304,-0.0043451073579490185,0.04847300052642822,0.007301421370357275,0.012294046580791473,-0.01685304008424282,-0.017802342772483826,-0.022455094382166862,0.004670331254601479,0.009844613261520863,0.010653277859091759,-0.00026973799685947597,-0.01815393567085266,0.004084342624992132,-0.021693307906389236,0.010442322120070457,-0.005177211947739124,-0.01256360113620758,0.023193439468741417,-0.011836974881589413,0.020486170426011086,0.019056357443332672,-0.004084342624992132,-0.02082604542374611,-0.003788418136537075,-0.011344744823873043,-0.024541214108467102,-0.01933763362467289,0.011626019142568111,0.019372792914509773,-0.02042757160961628,0.0042659989558160305,0.021165918558835983,-0.01994706131517887,-0.023861467838287354,-0.01912667788565159,0.001190289855003357,0.029627596959471703,0.004342177417129278,-0.042120881378650665,-0.03907373920083046,-0.011180668137967587,0.028455620631575584,0.004764089360833168,-0.010817354544997215,0.028877532109618187,0.0024611533153802156,0.04148801416158676,-0.025783510878682137,0.017966419458389282,0.036448508501052856,0.02352159284055233,0.014544243924319744,0.0027951670344918966,-0.02222069911658764,0.001996756996959448,-0.0046498216688632965,0.02324031852185726,0.01656004600226879,0.018118776381015778,0.033331047743558884,0.008250723592936993,0.02402554452419281,0.007653014734387398,0.0038440870121121407,0.011778376065194607,-0.0019938270561397076,0.037737682461738586,-0.01944311149418354,-0.013266787864267826,0.030658937990665436,-0.005912627559155226,0.0008863082039169967,0.00052043137839064,0.015868578106164932,0.022970763966441154,-0.011274426244199276,0.007342440541833639,-0.04045667126774788,-0.004690840840339661,-0.04029259458184242,-0.008883591741323471,-0.010161046870052814,0.01270423922687769,0.019583748653531075,-0.017966419458389282,0.004151731263846159,0.009229324758052826,0.01596233621239662,-0.009967670775949955,-0.01504819467663765,-0.013618381693959236,-0.028877532109618187,-0.010184486396610737,0.008678494952619076,-0.024072423577308655,0.03454990312457085,0.005420397035777569,0.01912667788565159,-0.05531734973192215,-0.005938997492194176,0.012868315912783146,-0.015376348048448563,-0.002534401835873723,0.008080787025392056,0.03701105713844299,0.023908346891403198,0.006662693340331316,0.029838554561138153,0.013805897906422615,0.016407689079642296,-0.025478797033429146,-0.020872924476861954,-0.004277718719094992,-0.009481299668550491,-0.05405161529779434,0.025549115613102913,0.00532956887036562,0.022888725623488426,-0.012223728001117706,-0.008338621817529202,-0.0426834300160408,0.02442401647567749,0.030330784618854523,0.019466551020741463,0.022584011778235435,0.048191726207733154,-0.04146457463502884,0.003926125355064869,-0.005900907795876265,0.010084868408739567]) as score
FROM shared_source.magento_product_dimension_with_text_embedding__tmp
/*+ SET_VAR(ann_params='{"ef_search":64}') */
ORDER BY score DESC
LIMIT 10
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment