Manik Sheokand commited on
Commit
3e46c4a
·
1 Parent(s): 794d924

aded recommendor

Browse files
=0.0.8 ADDED
@@ -0,0 +1,187 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Collecting safetensors
2
+ Downloading safetensors-0.6.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.1 kB)
3
+ Collecting transformers==4.51.3
4
+ Downloading transformers-4.51.3-py3-none-any.whl.metadata (38 kB)
5
+ Collecting accelerate==0.32.1
6
+ Downloading accelerate-0.32.1-py3-none-any.whl.metadata (18 kB)
7
+ Collecting peft==0.17.0
8
+ Downloading peft-0.17.0-py3-none-any.whl.metadata (14 kB)
9
+ Requirement already satisfied: huggingface_hub<1.0,>=0.23 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (0.36.0)
10
+ Collecting qwen-vl-utils
11
+ Downloading qwen_vl_utils-0.0.14-py3-none-any.whl.metadata (9.0 kB)
12
+ Collecting gradio==4.44.1
13
+ Downloading gradio-4.44.1-py3-none-any.whl.metadata (15 kB)
14
+ Collecting gradio_client==1.3.0
15
+ Downloading gradio_client-1.3.0-py3-none-any.whl.metadata (7.1 kB)
16
+ Collecting pydantic==2.10.6
17
+ Downloading pydantic-2.10.6-py3-none-any.whl.metadata (30 kB)
18
+ Requirement already satisfied: pillow in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (11.3.0)
19
+ Collecting faiss-cpu
20
+ Downloading faiss_cpu-1.12.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (5.1 kB)
21
+ Collecting sentence-transformers
22
+ Downloading sentence_transformers-5.1.2-py3-none-any.whl.metadata (16 kB)
23
+ Requirement already satisfied: filelock in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from transformers==4.51.3) (3.19.1)
24
+ Requirement already satisfied: numpy>=1.17 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from transformers==4.51.3) (1.26.4)
25
+ Requirement already satisfied: packaging>=20.0 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from transformers==4.51.3) (25.0)
26
+ Requirement already satisfied: pyyaml>=5.1 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from transformers==4.51.3) (6.0.3)
27
+ Collecting regex!=2019.12.17 (from transformers==4.51.3)
28
+ Downloading regex-2025.10.23-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (40 kB)
29
+ Requirement already satisfied: requests in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from transformers==4.51.3) (2.32.5)
30
+ Collecting tokenizers<0.22,>=0.21 (from transformers==4.51.3)
31
+ Downloading tokenizers-0.21.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.7 kB)
32
+ Requirement already satisfied: tqdm>=4.27 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from transformers==4.51.3) (4.67.1)
33
+ Requirement already satisfied: psutil in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from accelerate==0.32.1) (7.1.0)
34
+ Requirement already satisfied: torch>=1.10.0 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from accelerate==0.32.1) (2.2.0)
35
+ Collecting aiofiles<24.0,>=22.0 (from gradio==4.44.1)
36
+ Downloading aiofiles-23.2.1-py3-none-any.whl.metadata (9.7 kB)
37
+ Requirement already satisfied: anyio<5.0,>=3.0 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from gradio==4.44.1) (4.11.0)
38
+ Requirement already satisfied: fastapi<1.0 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from gradio==4.44.1) (0.118.1)
39
+ Collecting ffmpy (from gradio==4.44.1)
40
+ Downloading ffmpy-0.6.4-py3-none-any.whl.metadata (2.9 kB)
41
+ Requirement already satisfied: httpx>=0.24.1 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from gradio==4.44.1) (0.28.1)
42
+ Collecting importlib-resources<7.0,>=1.3 (from gradio==4.44.1)
43
+ Downloading importlib_resources-6.5.2-py3-none-any.whl.metadata (3.9 kB)
44
+ Requirement already satisfied: jinja2<4.0 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from gradio==4.44.1) (3.1.6)
45
+ Collecting markupsafe~=2.0 (from gradio==4.44.1)
46
+ Downloading MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.0 kB)
47
+ Requirement already satisfied: matplotlib~=3.0 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from gradio==4.44.1) (3.8.2)
48
+ Collecting orjson~=3.0 (from gradio==4.44.1)
49
+ Downloading orjson-3.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (41 kB)
50
+ Requirement already satisfied: pandas<3.0,>=1.0 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from gradio==4.44.1) (2.1.4)
51
+ Collecting pillow
52
+ Downloading pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl.metadata (9.2 kB)
53
+ Collecting pydub (from gradio==4.44.1)
54
+ Downloading pydub-0.25.1-py2.py3-none-any.whl.metadata (1.4 kB)
55
+ Requirement already satisfied: python-multipart>=0.0.9 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from gradio==4.44.1) (0.0.20)
56
+ Collecting ruff>=0.2.2 (from gradio==4.44.1)
57
+ Downloading ruff-0.14.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (25 kB)
58
+ Collecting semantic-version~=2.0 (from gradio==4.44.1)
59
+ Downloading semantic_version-2.10.0-py2.py3-none-any.whl.metadata (9.7 kB)
60
+ Collecting tomlkit==0.12.0 (from gradio==4.44.1)
61
+ Downloading tomlkit-0.12.0-py3-none-any.whl.metadata (2.7 kB)
62
+ Collecting typer<1.0,>=0.12 (from gradio==4.44.1)
63
+ Downloading typer-0.20.0-py3-none-any.whl.metadata (16 kB)
64
+ Requirement already satisfied: typing-extensions~=4.0 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from gradio==4.44.1) (4.15.0)
65
+ Requirement already satisfied: urllib3~=2.0 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from gradio==4.44.1) (2.5.0)
66
+ Requirement already satisfied: uvicorn>=0.14.0 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from gradio==4.44.1) (0.37.0)
67
+ Requirement already satisfied: fsspec in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from gradio_client==1.3.0) (2025.9.0)
68
+ Collecting websockets<13.0,>=10.0 (from gradio_client==1.3.0)
69
+ Downloading websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.6 kB)
70
+ Requirement already satisfied: annotated-types>=0.6.0 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from pydantic==2.10.6) (0.7.0)
71
+ Collecting pydantic-core==2.27.2 (from pydantic==2.10.6)
72
+ Downloading pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.6 kB)
73
+ Requirement already satisfied: hf-xet<2.0.0,>=1.1.3 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from huggingface_hub<1.0,>=0.23) (1.1.10)
74
+ Requirement already satisfied: idna>=2.8 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from anyio<5.0,>=3.0->gradio==4.44.1) (3.10)
75
+ Requirement already satisfied: sniffio>=1.1 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from anyio<5.0,>=3.0->gradio==4.44.1) (1.3.1)
76
+ Requirement already satisfied: starlette<0.49.0,>=0.40.0 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from fastapi<1.0->gradio==4.44.1) (0.48.0)
77
+ Requirement already satisfied: contourpy>=1.0.1 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from matplotlib~=3.0->gradio==4.44.1) (1.3.3)
78
+ Requirement already satisfied: cycler>=0.10 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from matplotlib~=3.0->gradio==4.44.1) (0.12.1)
79
+ Requirement already satisfied: fonttools>=4.22.0 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from matplotlib~=3.0->gradio==4.44.1) (4.60.1)
80
+ Requirement already satisfied: kiwisolver>=1.3.1 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from matplotlib~=3.0->gradio==4.44.1) (1.4.9)
81
+ Requirement already satisfied: pyparsing>=2.3.1 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from matplotlib~=3.0->gradio==4.44.1) (3.2.5)
82
+ Requirement already satisfied: python-dateutil>=2.7 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from matplotlib~=3.0->gradio==4.44.1) (2.9.0.post0)
83
+ Requirement already satisfied: pytz>=2020.1 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from pandas<3.0,>=1.0->gradio==4.44.1) (2025.2)
84
+ Requirement already satisfied: tzdata>=2022.1 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from pandas<3.0,>=1.0->gradio==4.44.1) (2025.2)
85
+ Requirement already satisfied: click>=8.0.0 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from typer<1.0,>=0.12->gradio==4.44.1) (8.3.0)
86
+ Collecting shellingham>=1.3.0 (from typer<1.0,>=0.12->gradio==4.44.1)
87
+ Downloading shellingham-1.5.4-py2.py3-none-any.whl.metadata (3.5 kB)
88
+ Requirement already satisfied: rich>=10.11.0 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from typer<1.0,>=0.12->gradio==4.44.1) (14.1.0)
89
+ Collecting av (from qwen-vl-utils)
90
+ Downloading av-16.0.1-cp312-cp312-manylinux_2_28_x86_64.whl.metadata (4.6 kB)
91
+ Requirement already satisfied: scikit-learn in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from sentence-transformers) (1.3.2)
92
+ Requirement already satisfied: scipy in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from sentence-transformers) (1.11.4)
93
+ Requirement already satisfied: certifi in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from httpx>=0.24.1->gradio==4.44.1) (2025.10.5)
94
+ Requirement already satisfied: httpcore==1.* in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from httpx>=0.24.1->gradio==4.44.1) (1.0.9)
95
+ Requirement already satisfied: h11>=0.16 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from httpcore==1.*->httpx>=0.24.1->gradio==4.44.1) (0.16.0)
96
+ Requirement already satisfied: six>=1.5 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from python-dateutil>=2.7->matplotlib~=3.0->gradio==4.44.1) (1.17.0)
97
+ Requirement already satisfied: markdown-it-py>=2.2.0 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from rich>=10.11.0->typer<1.0,>=0.12->gradio==4.44.1) (4.0.0)
98
+ Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from rich>=10.11.0->typer<1.0,>=0.12->gradio==4.44.1) (2.19.2)
99
+ Requirement already satisfied: mdurl~=0.1 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from markdown-it-py>=2.2.0->rich>=10.11.0->typer<1.0,>=0.12->gradio==4.44.1) (0.1.2)
100
+ Requirement already satisfied: sympy in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from torch>=1.10.0->accelerate==0.32.1) (1.14.0)
101
+ Requirement already satisfied: networkx in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from torch>=1.10.0->accelerate==0.32.1) (3.5)
102
+ Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from torch>=1.10.0->accelerate==0.32.1) (12.1.105)
103
+ Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from torch>=1.10.0->accelerate==0.32.1) (12.1.105)
104
+ Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from torch>=1.10.0->accelerate==0.32.1) (12.1.105)
105
+ Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from torch>=1.10.0->accelerate==0.32.1) (8.9.2.26)
106
+ Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from torch>=1.10.0->accelerate==0.32.1) (12.1.3.1)
107
+ Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from torch>=1.10.0->accelerate==0.32.1) (11.0.2.54)
108
+ Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from torch>=1.10.0->accelerate==0.32.1) (10.3.2.106)
109
+ Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from torch>=1.10.0->accelerate==0.32.1) (11.4.5.107)
110
+ Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from torch>=1.10.0->accelerate==0.32.1) (12.1.0.106)
111
+ Requirement already satisfied: nvidia-nccl-cu12==2.19.3 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from torch>=1.10.0->accelerate==0.32.1) (2.19.3)
112
+ Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from torch>=1.10.0->accelerate==0.32.1) (12.1.105)
113
+ Requirement already satisfied: triton==2.2.0 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from torch>=1.10.0->accelerate==0.32.1) (2.2.0)
114
+ Requirement already satisfied: nvidia-nvjitlink-cu12 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.10.0->accelerate==0.32.1) (12.8.93)
115
+ Requirement already satisfied: charset_normalizer<4,>=2 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from requests->transformers==4.51.3) (3.4.3)
116
+ Requirement already satisfied: joblib>=1.1.1 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from scikit-learn->sentence-transformers) (1.5.2)
117
+ Requirement already satisfied: threadpoolctl>=2.0.0 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from scikit-learn->sentence-transformers) (3.6.0)
118
+ Requirement already satisfied: mpmath<1.4,>=1.1.0 in /home/zeus/miniconda3/envs/cloudspace/lib/python3.12/site-packages (from sympy->torch>=1.10.0->accelerate==0.32.1) (1.3.0)
119
+ Downloading transformers-4.51.3-py3-none-any.whl (10.4 MB)
120
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.4/10.4 MB 114.3 MB/s 0:00:00
121
+
122
+ Downloading accelerate-0.32.1-py3-none-any.whl (314 kB)
123
+ Downloading peft-0.17.0-py3-none-any.whl (503 kB)
124
+ Downloading gradio-4.44.1-py3-none-any.whl (18.1 MB)
125
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 18.1/18.1 MB 113.9 MB/s 0:00:00
126
+
127
+ Downloading gradio_client-1.3.0-py3-none-any.whl (318 kB)
128
+ Downloading pydantic-2.10.6-py3-none-any.whl (431 kB)
129
+ Downloading pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB)
130
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.0/2.0 MB 93.3 MB/s 0:00:00
131
+
132
+ Downloading tomlkit-0.12.0-py3-none-any.whl (37 kB)
133
+ Downloading pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl (4.5 MB)
134
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.5/4.5 MB 100.8 MB/s 0:00:00
135
+
136
+ Downloading aiofiles-23.2.1-py3-none-any.whl (15 kB)
137
+ Downloading importlib_resources-6.5.2-py3-none-any.whl (37 kB)
138
+ Downloading MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (28 kB)
139
+ Downloading orjson-3.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (136 kB)
140
+ Downloading semantic_version-2.10.0-py2.py3-none-any.whl (15 kB)
141
+ Downloading tokenizers-0.21.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.1 MB)
142
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.1/3.1 MB 116.9 MB/s 0:00:00
143
+
144
+ Downloading typer-0.20.0-py3-none-any.whl (47 kB)
145
+ Downloading websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (131 kB)
146
+ Downloading safetensors-0.6.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (485 kB)
147
+ Downloading qwen_vl_utils-0.0.14-py3-none-any.whl (8.1 kB)
148
+ Downloading faiss_cpu-1.12.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (31.4 MB)
149
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 31.4/31.4 MB 155.9 MB/s 0:00:00
150
+
151
+ Downloading sentence_transformers-5.1.2-py3-none-any.whl (488 kB)
152
+ Downloading regex-2025.10.23-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (803 kB)
153
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 803.4/803.4 kB 85.9 MB/s 0:00:00
154
+
155
+ Downloading ruff-0.14.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.3 MB)
156
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 13.3/13.3 MB 158.7 MB/s 0:00:00
157
+
158
+ Downloading shellingham-1.5.4-py2.py3-none-any.whl (9.8 kB)
159
+ Downloading av-16.0.1-cp312-cp312-manylinux_2_28_x86_64.whl (40.5 MB)
160
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 40.5/40.5 MB 190.9 MB/s 0:00:00
161
+
162
+ Downloading ffmpy-0.6.4-py3-none-any.whl (5.6 kB)
163
+ Downloading pydub-0.25.1-py2.py3-none-any.whl (32 kB)
164
+ Installing collected packages: pydub, websockets, tomlkit, shellingham, semantic-version, safetensors, ruff, regex, pydantic-core, pillow, orjson, markupsafe, importlib-resources, ffmpy, faiss-cpu, av, aiofiles, qwen-vl-utils, pydantic, typer, tokenizers, gradio_client, transformers, gradio, accelerate, sentence-transformers, peft
165
+ Attempting uninstall: websockets
166
+ Found existing installation: websockets 15.0.1
167
+ Uninstalling websockets-15.0.1:
168
+ Successfully uninstalled websockets-15.0.1
169
+ Attempting uninstall: pydantic-core
170
+ Found existing installation: pydantic_core 2.41.1
171
+ Uninstalling pydantic_core-2.41.1:
172
+ Successfully uninstalled pydantic_core-2.41.1
173
+ Attempting uninstall: pillow
174
+ Found existing installation: pillow 11.3.0
175
+ Uninstalling pillow-11.3.0:
176
+ Successfully uninstalled pillow-11.3.0
177
+ Attempting uninstall: markupsafe
178
+ Found existing installation: MarkupSafe 3.0.3
179
+ Uninstalling MarkupSafe-3.0.3:
180
+ Successfully uninstalled MarkupSafe-3.0.3
181
+ Attempting uninstall: pydantic
182
+ Found existing installation: pydantic 2.12.0
183
+ Uninstalling pydantic-2.12.0:
184
+ Successfully uninstalled pydantic-2.12.0
185
+
186
+
187
+ Successfully installed accelerate-0.32.1 aiofiles-23.2.1 av-16.0.1 faiss-cpu-1.12.0 ffmpy-0.6.4 gradio-4.44.1 gradio_client-1.3.0 importlib-resources-6.5.2 markupsafe-2.1.5 orjson-3.11.4 peft-0.17.0 pillow-10.4.0 pydantic-2.10.6 pydantic-core-2.27.2 pydub-0.25.1 qwen-vl-utils-0.0.14 regex-2025.10.23 ruff-0.14.2 safetensors-0.6.2 semantic-version-2.10.0 sentence-transformers-5.1.2 shellingham-1.5.4 tokenizers-0.21.4 tomlkit-0.12.0 transformers-4.51.3 typer-0.20.0 websockets-12.0
=0.4.3 ADDED
File without changes
app.py CHANGED
@@ -5,11 +5,12 @@ import os
5
  import spaces
6
  import torch
7
  import gradio as gr
 
8
  from PIL import Image
9
  from transformers import AutoProcessor, Qwen2_5_VLForConditionalGeneration
10
  from peft import PeftModel
11
  from qwen_vl_utils import process_vision_info # pip install qwen-vl-utils
12
- import transformers, accelerate, numpy as np
13
 
14
  print("VERSIONS:", transformers.__version__, accelerate.__version__, torch.__version__, np.__version__)
15
  os.environ["ACCELERATE_USE_SLOW_RETRIEVAL"] = "true"
@@ -44,6 +45,52 @@ model = PeftModel.from_pretrained(
44
 
45
  _model_on_gpu = False # once-per-session move
46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  # ---- Inference on GPU (ZeroGPU pattern) ----
48
  @spaces.GPU(duration=120)
49
  def generate_answer(image, question, temperature=0.7, top_p=0.95, max_tokens=256):
@@ -94,19 +141,31 @@ def generate_answer(image, question, temperature=0.7, top_p=0.95, max_tokens=256
94
  return processor.batch_decode(trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
95
 
96
  # ---- UI ----
97
- with gr.Blocks(title="PetBull‑7B‑VL (ZeroGPU, Qwen2.5‑VL)") as demo:
98
- gr.Markdown("## PetBull‑7B‑VL Ask a Vet\nUpload a photo and/or type a question.")
99
- with gr.Row():
100
- with gr.Column():
101
- img_in = gr.Image(type="pil", label="Pet photo (optional)")
102
- txt_in = gr.Textbox(lines=3, placeholder="Describe the issue…")
103
- ask = gr.Button("Ask PetBull")
104
- temp = gr.Slider(0.1, 1.5, 0.7, label="Temperature")
105
- topp = gr.Slider(0.1, 1.0, 0.95, label="Top‑p")
106
- max_tok = gr.Slider(32, 512, 256, step=8, label="Max tokens")
107
- with gr.Column():
108
- answer = gr.Textbox(lines=12, label="Assistant", interactive=False)
109
-
110
- ask.click(generate_answer, inputs=[img_in, txt_in, temp, topp, max_tok], outputs=answer)
 
 
 
 
 
 
 
 
 
 
 
 
111
 
112
  demo.queue().launch(show_api=False, share=True)
 
5
  import spaces
6
  import torch
7
  import gradio as gr
8
+ import transformers, accelerate, numpy as np
9
  from PIL import Image
10
  from transformers import AutoProcessor, Qwen2_5_VLForConditionalGeneration
11
  from peft import PeftModel
12
  from qwen_vl_utils import process_vision_info # pip install qwen-vl-utils
13
+ from tools.retriever import search as product_search
14
 
15
  print("VERSIONS:", transformers.__version__, accelerate.__version__, torch.__version__, np.__version__)
16
  os.environ["ACCELERATE_USE_SLOW_RETRIEVAL"] = "true"
 
45
 
46
  _model_on_gpu = False # once-per-session move
47
 
48
+ def format_candidates_for_llm(cands, budget_twd=None):
49
+ lines = []
50
+ rank = 1
51
+ for c in cands:
52
+ price = f"{c.get('price_value')} {c.get('price_currency')}" if c.get("price_value") else "N/A"
53
+ if budget_twd and c.get("price_currency") == "TWD" and c.get("price_value") and c["price_value"] > budget_twd:
54
+ continue
55
+ lines.append(
56
+ f"{rank}. {c.get('brand_en','')}/{c.get('brand_zh','')} — {c.get('product_name_en') or c.get('product_name_zh')}\n"
57
+ f" • Category: {c.get('category_en') or c.get('category_zh')}\n"
58
+ f" • Price: {price}\n"
59
+ f" • Link: {c.get('source_url')}\n"
60
+ )
61
+ rank += 1
62
+ return "\n".join(lines) if lines else "No products matched."
63
+
64
+ DERMA_SAFETY = (
65
+ "Safety notes: For broken/infected skin, pregnancy/lactation, infants, "
66
+ "or if symptoms worsen—seek a qualified dermatologist. Patch-test first."
67
+ )
68
+
69
+ def recommend_products(query_text: str, budget_twd: int | None = None, k: int = 8):
70
+ # 1) Retrieve candidates
71
+ cands = product_search(query_text, k=k)
72
+
73
+ # 2) Build short grounded context
74
+ context = format_candidates_for_llm(cands, budget_twd=budget_twd)
75
+
76
+ # 3) Ask your LLM to pick & explain (plug into your existing generation path)
77
+ system = (
78
+ "You are DermalCare’s assistant. Recommend up to 3 products strictly "
79
+ "from the provided list. Include a one-line why-it-helps and a brief how-to-use. "
80
+ "Respect budget and do not invent products."
81
+ )
82
+ user = f"User need: {query_text}\nCandidate products:\n{context}\n{DERMA_SAFETY}"
83
+
84
+ # --- if you already have Qwen2-VL loaded as text generator, reuse it.
85
+ # Example skeleton (pseudo—replace with your app’s generate() function):
86
+ try:
87
+ # Replace this with your actual text-generation helper:
88
+ answer = f"(LLM picks here)\n\nContext:\n{context}"
89
+ except Exception as e:
90
+ answer = f"❌ Generation error: {e}\n\nHere are candidates:\n{context}"
91
+
92
+ return answer
93
+
94
  # ---- Inference on GPU (ZeroGPU pattern) ----
95
  @spaces.GPU(duration=120)
96
  def generate_answer(image, question, temperature=0.7, top_p=0.95, max_tokens=256):
 
141
  return processor.batch_decode(trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
142
 
143
  # ---- UI ----
144
+ with gr.Blocks(title="DermalCare - Pet & Skincare Assistant") as demo:
145
+ gr.Markdown("# DermalCare - Your AI Assistant for Pet Care and Skincare")
146
+
147
+ with gr.Tabs():
148
+ with gr.Tab("Pet Care"):
149
+ gr.Markdown("## PetBull‑7B‑VL – Ask a Vet\nUpload a photo and/or type a question.")
150
+ with gr.Row():
151
+ with gr.Column():
152
+ img_in = gr.Image(type="pil", label="Pet photo (optional)")
153
+ txt_in = gr.Textbox(lines=3, placeholder="Describe the issue…")
154
+ ask = gr.Button("Ask PetBull")
155
+ temp = gr.Slider(0.1, 1.5, 0.7, label="Temperature")
156
+ topp = gr.Slider(0.1, 1.0, 0.95, label="Top‑p")
157
+ max_tok = gr.Slider(32, 512, 256, step=8, label="Max tokens")
158
+ with gr.Column():
159
+ answer = gr.Textbox(lines=12, label="Assistant", interactive=False)
160
+
161
+ ask.click(generate_answer, inputs=[img_in, txt_in, temp, topp, max_tok], outputs=answer)
162
+
163
+ with gr.Tab("Product Recommender"):
164
+ need = gr.Textbox(label="Describe your need (中文或English)", lines=3,
165
+ value="敏感肌 想找溫和溫和拔乾的保濕潔面,預算 < TWD 400")
166
+ budget = gr.Number(label="Budget (TWD, optional)", value=400, precision=0)
167
+ btn = gr.Button("Recommend", variant="primary")
168
+ out = gr.Textbox(label="Recommendations", lines=14)
169
+ btn.click(fn=recommend_products, inputs=[need, budget], outputs=out, queue=True)
170
 
171
  demo.queue().launch(show_api=False, share=True)
data/cosmetics_full_en_zh.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
indexes/cosmetics_meta.json ADDED
@@ -0,0 +1,2426 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "id": "a_derma_ad001_200ml",
4
+ "brand_en": "A-Derma",
5
+ "brand_zh": "艾芙美",
6
+ "product_name_en": "A‑Derma Biology Micellar Cleansing Milk",
7
+ "product_name_zh": "艾芙美新葉三效卸妝乳200ml",
8
+ "category_en": "Cleansing Milk",
9
+ "category_zh": "卸妝乳",
10
+ "price_value": null,
11
+ "price_currency": null,
12
+ "source_url": "https://www.s3.com.tw/TC/PDContent.aspx?yano=S00014931"
13
+ },
14
+ {
15
+ "id": "a_derma_ad022_400ml",
16
+ "brand_en": "A-Derma",
17
+ "brand_zh": "艾芙美",
18
+ "product_name_en": "A‑Derma Biology Micellar Cleansing Milk",
19
+ "product_name_zh": "艾芙美新葉三效卸妝乳400ml",
20
+ "category_en": "Cleansing Milk",
21
+ "category_zh": "卸妝乳",
22
+ "price_value": 589,
23
+ "price_currency": "TWD",
24
+ "source_url": "https://www.s3.com.tw/TC/PDContent.aspx?yano=S00014931"
25
+ },
26
+ {
27
+ "id": "a_derma_ad012_400ml",
28
+ "brand_en": "A-Derma",
29
+ "brand_zh": "艾芙美",
30
+ "product_name_en": null,
31
+ "product_name_zh": "艾芙美燕麥新葉益護佳乳液400ml",
32
+ "category_en": null,
33
+ "category_zh": null,
34
+ "price_value": null,
35
+ "price_currency": null,
36
+ "source_url": null
37
+ },
38
+ {
39
+ "id": "a_derma_ad026_400ml",
40
+ "brand_en": "A-Derma",
41
+ "brand_zh": "艾芙美",
42
+ "product_name_en": null,
43
+ "product_name_zh": "艾芙美燕麥新葉益護佳營養霜400ml",
44
+ "category_en": null,
45
+ "category_zh": null,
46
+ "price_value": null,
47
+ "price_currency": null,
48
+ "source_url": null
49
+ },
50
+ {
51
+ "id": "a_derma_ad031_400ml",
52
+ "brand_en": "A-Derma",
53
+ "brand_zh": "艾芙美",
54
+ "product_name_en": null,
55
+ "product_name_zh": "艾芙美燕麥新葉益護佳強護霜400ml",
56
+ "category_en": null,
57
+ "category_zh": null,
58
+ "price_value": null,
59
+ "price_currency": null,
60
+ "source_url": null
61
+ },
62
+ {
63
+ "id": "av_ne_av005_300ml",
64
+ "brand_en": "Avène",
65
+ "brand_zh": "雅漾",
66
+ "product_name_en": null,
67
+ "product_name_zh": "雅漾舒護活泉水300ml(雅漾噴霧)",
68
+ "category_en": null,
69
+ "category_zh": null,
70
+ "price_value": null,
71
+ "price_currency": null,
72
+ "source_url": null
73
+ },
74
+ {
75
+ "id": "av_ne_av068_40ml",
76
+ "brand_en": "Avène",
77
+ "brand_zh": "雅漾",
78
+ "product_name_en": null,
79
+ "product_name_zh": "雅漾修護保濕精華乳+-清爽40ml",
80
+ "category_en": null,
81
+ "category_zh": null,
82
+ "price_value": null,
83
+ "price_currency": null,
84
+ "source_url": null
85
+ },
86
+ {
87
+ "id": "av_ne_av069_40ml",
88
+ "brand_en": "Avène",
89
+ "brand_zh": "雅漾",
90
+ "product_name_en": null,
91
+ "product_name_zh": "雅漾修護保濕精華乳+-滋潤40ml",
92
+ "category_en": null,
93
+ "category_zh": null,
94
+ "price_value": null,
95
+ "price_currency": null,
96
+ "source_url": null
97
+ },
98
+ {
99
+ "id": "av_ne_av071_hydra10_40ml",
100
+ "brand_en": "Avène",
101
+ "brand_zh": "雅漾",
102
+ "product_name_en": "Avène Tolerance Hydra‑10 Hydrating Cream (40ml)",
103
+ "product_name_zh": "雅漾Hydra10極簡保濕霜40ml",
104
+ "category_en": "Moisturizer",
105
+ "category_zh": "保濕霜",
106
+ "price_value": null,
107
+ "price_currency": null,
108
+ "source_url": "https://www.eau-thermale-avene.ca/en_ca/p/tolerance-hydra-10-moisturising-cream-3282770388336-69716462"
109
+ },
110
+ {
111
+ "id": "av_ne_av072_hydra10_40ml",
112
+ "brand_en": "Avène",
113
+ "brand_zh": "雅漾",
114
+ "product_name_en": "Avène Tolerance Hydra‑10 Hydrating Fluid (40ml)",
115
+ "product_name_zh": "雅漾Hydra10極簡保濕乳40ml",
116
+ "category_en": "Moisturizer",
117
+ "category_zh": "保濕乳",
118
+ "price_value": null,
119
+ "price_currency": null,
120
+ "source_url": "https://www.avene.com.au/p/tolerance-hydra-10-moisturising-cream-3282770388336-b1d9f42b"
121
+ },
122
+ {
123
+ "id": "av_ne_av084_400ml",
124
+ "brand_en": "Avène",
125
+ "brand_zh": "雅漾",
126
+ "product_name_en": null,
127
+ "product_name_zh": "雅漾控油舒緩潔膚凝膠400ml",
128
+ "category_en": null,
129
+ "category_zh": null,
130
+ "price_value": null,
131
+ "price_currency": null,
132
+ "source_url": null
133
+ },
134
+ {
135
+ "id": "av_ne_av088_400ml",
136
+ "brand_en": "Avène",
137
+ "brand_zh": "雅漾",
138
+ "product_name_en": null,
139
+ "product_name_zh": "雅漾舒敏卸妝潔顏凝露400ml",
140
+ "category_en": null,
141
+ "category_zh": null,
142
+ "price_value": null,
143
+ "price_currency": null,
144
+ "source_url": null
145
+ },
146
+ {
147
+ "id": "bioderma_bd001_500ml",
148
+ "brand_en": "Bioderma",
149
+ "brand_zh": "貝膚黛瑪",
150
+ "product_name_en": "Bioderma Sensibio H2O Micellar Water (500ml)",
151
+ "product_name_zh": "貝膚黛瑪舒敏高效潔膚液500ml",
152
+ "category_en": "Micellar Water",
153
+ "category_zh": "卸妝潔膚水",
154
+ "price_value": 19.99,
155
+ "price_currency": "USD",
156
+ "source_url": "https://www.bioderma.us/en/p/sensibio-h2o-micellar-water.html"
157
+ },
158
+ {
159
+ "id": "bioderma_bd002_500ml",
160
+ "brand_en": "Bioderma",
161
+ "brand_zh": "貝膚黛瑪",
162
+ "product_name_en": "Bioderma Sébium H2O Micellar Water (500ml)",
163
+ "product_name_zh": "貝膚黛瑪平衡控油潔膚液500ml",
164
+ "category_en": "Micellar Water",
165
+ "category_zh": "卸妝潔膚水",
166
+ "price_value": 20.99,
167
+ "price_currency": "USD",
168
+ "source_url": "https://www.bioderma.us/en/p/sebium-h2o-micellar-water.html"
169
+ },
170
+ {
171
+ "id": "bioderma_bd026_ts_500ml",
172
+ "brand_en": "Bioderma",
173
+ "brand_zh": "貝膚黛瑪",
174
+ "product_name_en": null,
175
+ "product_name_zh": "貝膚黛瑪舒敏TS高效潔膚液500ml",
176
+ "category_en": null,
177
+ "category_zh": null,
178
+ "price_value": null,
179
+ "price_currency": null,
180
+ "source_url": null
181
+ },
182
+ {
183
+ "id": "bioderma_bd007_ds_40ml",
184
+ "brand_en": "Bioderma",
185
+ "brand_zh": "貝膚黛瑪",
186
+ "product_name_en": null,
187
+ "product_name_zh": "貝膚黛瑪舒敏DS特效修護乳40ml",
188
+ "category_en": null,
189
+ "category_zh": null,
190
+ "price_value": null,
191
+ "price_currency": null,
192
+ "source_url": null
193
+ },
194
+ {
195
+ "id": "bioderma_bd019_1000ml",
196
+ "brand_en": "Bioderma",
197
+ "brand_zh": "貝膚黛瑪",
198
+ "product_name_en": null,
199
+ "product_name_zh": "貝膚黛瑪舒益淨沐浴露1000ml",
200
+ "category_en": null,
201
+ "category_zh": null,
202
+ "price_value": null,
203
+ "price_currency": null,
204
+ "source_url": null
205
+ },
206
+ {
207
+ "id": "bioderma_bd022_1000ml",
208
+ "brand_en": "Bioderma",
209
+ "brand_zh": "貝膚黛瑪",
210
+ "product_name_en": null,
211
+ "product_name_zh": "貝膚黛瑪舒益輕沐浴油1000ml",
212
+ "category_en": null,
213
+ "category_zh": null,
214
+ "price_value": null,
215
+ "price_currency": null,
216
+ "source_url": null
217
+ },
218
+ {
219
+ "id": "bioderma_bd039_500ml",
220
+ "brand_en": "Bioderma",
221
+ "brand_zh": "貝膚黛瑪",
222
+ "product_name_en": null,
223
+ "product_name_zh": "貝膚黛瑪舒益潔膚凝露500ml",
224
+ "category_en": null,
225
+ "category_zh": null,
226
+ "price_value": null,
227
+ "price_currency": null,
228
+ "source_url": null
229
+ },
230
+ {
231
+ "id": "bioderma_bd035_b3_500ml",
232
+ "brand_en": "Bioderma",
233
+ "brand_zh": "貝膚黛瑪",
234
+ "product_name_en": null,
235
+ "product_name_zh": "貝膚黛瑪舒益B3彈潤修護輕乳霜500ml",
236
+ "category_en": null,
237
+ "category_zh": null,
238
+ "price_value": null,
239
+ "price_currency": null,
240
+ "source_url": null
241
+ },
242
+ {
243
+ "id": "bioderma_bd036_500ml",
244
+ "brand_en": "Bioderma",
245
+ "brand_zh": "貝膚黛瑪",
246
+ "product_name_en": null,
247
+ "product_name_zh": "貝膚黛瑪舒益修護精華乳500ml-強效滋潤",
248
+ "category_en": null,
249
+ "category_zh": null,
250
+ "price_value": null,
251
+ "price_currency": null,
252
+ "source_url": null
253
+ },
254
+ {
255
+ "id": "bioderma_bd038_pp_500ml",
256
+ "brand_en": "Bioderma",
257
+ "brand_zh": "貝膚黛瑪",
258
+ "product_name_en": null,
259
+ "product_name_zh": "貝膚黛瑪舒益PP修護滋養乳500ml",
260
+ "category_en": null,
261
+ "category_zh": null,
262
+ "price_value": null,
263
+ "price_currency": null,
264
+ "source_url": null
265
+ },
266
+ {
267
+ "id": "cerave_cr012_cerave_sa_88ml",
268
+ "brand_en": "CeraVe",
269
+ "brand_zh": "適樂膚",
270
+ "product_name_en": null,
271
+ "product_name_zh": "Cerave SA抗燥柔嫩潤膚護足霜88ml",
272
+ "category_en": null,
273
+ "category_zh": null,
274
+ "price_value": null,
275
+ "price_currency": null,
276
+ "source_url": null
277
+ },
278
+ {
279
+ "id": "cerave_cr021_cerave_473ml",
280
+ "brand_en": "CeraVe",
281
+ "brand_zh": "適樂膚",
282
+ "product_name_en": "CeraVe Hydrating Facial Cleanser (473ml)",
283
+ "product_name_zh": "Cerave輕柔保濕潔膚露473ml",
284
+ "category_en": "Cleanser",
285
+ "category_zh": "潔面",
286
+ "price_value": null,
287
+ "price_currency": null,
288
+ "source_url": "https://www.cerave.com/skincare/cleansers/hydrating-facial-cleanser"
289
+ },
290
+ {
291
+ "id": "cerave_cr022_cerave_236ml",
292
+ "brand_en": "CeraVe",
293
+ "brand_zh": "適樂膚",
294
+ "product_name_en": null,
295
+ "product_name_zh": "Cerave輕柔保濕潔膚露236ml",
296
+ "category_en": null,
297
+ "category_zh": null,
298
+ "price_value": null,
299
+ "price_currency": null,
300
+ "source_url": null
301
+ },
302
+ {
303
+ "id": "cerave_cr031_cerave_473ml",
304
+ "brand_en": "CeraVe",
305
+ "brand_zh": "適樂膚",
306
+ "product_name_en": null,
307
+ "product_name_zh": "Cerave溫和泡沫潔膚露473ml",
308
+ "category_en": null,
309
+ "category_zh": null,
310
+ "price_value": null,
311
+ "price_currency": null,
312
+ "source_url": null
313
+ },
314
+ {
315
+ "id": "cerave_cr032_cerave_236ml",
316
+ "brand_en": "CeraVe",
317
+ "brand_zh": "適樂膚",
318
+ "product_name_en": null,
319
+ "product_name_zh": "Cerave溫和泡沫潔膚露236ml",
320
+ "category_en": null,
321
+ "category_zh": null,
322
+ "price_value": null,
323
+ "price_currency": null,
324
+ "source_url": null
325
+ },
326
+ {
327
+ "id": "cerave_cr041_cerave_473ml",
328
+ "brand_en": "CeraVe",
329
+ "brand_zh": "適樂膚",
330
+ "product_name_en": null,
331
+ "product_name_zh": "Cerave長效清爽保濕乳473ml",
332
+ "category_en": null,
333
+ "category_zh": null,
334
+ "price_value": null,
335
+ "price_currency": null,
336
+ "source_url": null
337
+ },
338
+ {
339
+ "id": "cerave_cr042_cerave_236ml",
340
+ "brand_en": "CeraVe",
341
+ "brand_zh": "適樂膚",
342
+ "product_name_en": null,
343
+ "product_name_zh": "Cerave長效清爽保濕乳236ml",
344
+ "category_en": null,
345
+ "category_zh": null,
346
+ "price_value": null,
347
+ "price_currency": null,
348
+ "source_url": null
349
+ },
350
+ {
351
+ "id": "cerave_cr043_cerave_1000ml",
352
+ "brand_en": "CeraVe",
353
+ "brand_zh": "適樂膚",
354
+ "product_name_en": null,
355
+ "product_name_zh": "Cerave長效清爽保濕乳1000ml",
356
+ "category_en": null,
357
+ "category_zh": null,
358
+ "price_value": null,
359
+ "price_currency": null,
360
+ "source_url": null
361
+ },
362
+ {
363
+ "id": "cerave_cr051_cerave_454g",
364
+ "brand_en": "CeraVe",
365
+ "brand_zh": "適樂膚",
366
+ "product_name_en": null,
367
+ "product_name_zh": "Cerave長效潤澤修護霜454g-壓頭",
368
+ "category_en": null,
369
+ "category_zh": null,
370
+ "price_value": null,
371
+ "price_currency": null,
372
+ "source_url": null
373
+ },
374
+ {
375
+ "id": "cerave_cr052_cerave_454g",
376
+ "brand_en": "CeraVe",
377
+ "brand_zh": "適樂膚",
378
+ "product_name_en": null,
379
+ "product_name_zh": "Cerave長效潤澤修護霜454g-瓶蓋",
380
+ "category_en": null,
381
+ "category_zh": null,
382
+ "price_value": null,
383
+ "price_currency": null,
384
+ "source_url": null
385
+ },
386
+ {
387
+ "id": "cerave_cr053_cerave_177ml",
388
+ "brand_en": "CeraVe",
389
+ "brand_zh": "適樂膚",
390
+ "product_name_en": null,
391
+ "product_name_zh": "Cerave長效潤澤修護霜177ml",
392
+ "category_en": null,
393
+ "category_zh": null,
394
+ "price_value": null,
395
+ "price_currency": null,
396
+ "source_url": null
397
+ },
398
+ {
399
+ "id": "cerave_cr061_cerave_52ml",
400
+ "brand_en": "CeraVe",
401
+ "brand_zh": "適樂膚",
402
+ "product_name_en": null,
403
+ "product_name_zh": "Cerave全效超級修護乳52ml",
404
+ "category_en": null,
405
+ "category_zh": null,
406
+ "price_value": null,
407
+ "price_currency": null,
408
+ "source_url": null
409
+ },
410
+ {
411
+ "id": "cerave_cr062_cerave_14ml",
412
+ "brand_en": "CeraVe",
413
+ "brand_zh": "適樂膚",
414
+ "product_name_en": null,
415
+ "product_name_zh": "Cerave全效亮眼修護精萃14ml",
416
+ "category_en": null,
417
+ "category_zh": null,
418
+ "price_value": null,
419
+ "price_currency": null,
420
+ "source_url": null
421
+ },
422
+ {
423
+ "id": "green_pharmacy_gp001_green_pharmacy_300ml",
424
+ "brand_en": "Green Pharmacy",
425
+ "brand_zh": "Green Pharmacy",
426
+ "product_name_en": null,
427
+ "product_name_zh": "Green Pharmacy蔓越莓私密潔膚露300ml",
428
+ "category_en": null,
429
+ "category_zh": null,
430
+ "price_value": null,
431
+ "price_currency": null,
432
+ "source_url": null
433
+ },
434
+ {
435
+ "id": "green_pharmacy_gp002_green_pharmacy_300ml",
436
+ "brand_en": "Green Pharmacy",
437
+ "brand_zh": "Green Pharmacy",
438
+ "product_name_en": null,
439
+ "product_name_zh": "Green Pharmacy茶樹私密潔膚露300ml",
440
+ "category_en": null,
441
+ "category_zh": null,
442
+ "price_value": null,
443
+ "price_currency": null,
444
+ "source_url": null
445
+ },
446
+ {
447
+ "id": "green_pharmacy_gp003_green_pharmacy_300ml",
448
+ "brand_en": "Green Pharmacy",
449
+ "brand_zh": "Green Pharmacy",
450
+ "product_name_en": null,
451
+ "product_name_zh": "Green Pharmacy鼠尾草私密潔膚露300ml",
452
+ "category_en": null,
453
+ "category_zh": null,
454
+ "price_value": null,
455
+ "price_currency": null,
456
+ "source_url": null
457
+ },
458
+ {
459
+ "id": "green_pharmacy_gp004_green_pharmacy_300ml",
460
+ "brand_en": "Green Pharmacy",
461
+ "brand_zh": "Green Pharmacy",
462
+ "product_name_en": null,
463
+ "product_name_zh": "Green Pharmacy洋甘菊私密潔膚露300ml",
464
+ "category_en": null,
465
+ "category_zh": null,
466
+ "price_value": null,
467
+ "price_currency": null,
468
+ "source_url": null
469
+ },
470
+ {
471
+ "id": "green_pharmacy_gp011_green_pharmacy_370ml",
472
+ "brand_en": "Green Pharmacy",
473
+ "brand_zh": "Green Pharmacy",
474
+ "product_name_en": null,
475
+ "product_name_zh": "Green Pharmacy鼠尾草私密水嫩潔膚露-加強型370ml",
476
+ "category_en": null,
477
+ "category_zh": null,
478
+ "price_value": null,
479
+ "price_currency": null,
480
+ "source_url": null
481
+ },
482
+ {
483
+ "id": "green_pharmacy_gp012_green_pharmacy_370ml",
484
+ "brand_en": "Green Pharmacy",
485
+ "brand_zh": "Green Pharmacy",
486
+ "product_name_en": null,
487
+ "product_name_zh": "Green Pharmacy洋甘菊私密水嫩潔膚露-加強型370ml",
488
+ "category_en": null,
489
+ "category_zh": null,
490
+ "price_value": null,
491
+ "price_currency": null,
492
+ "source_url": null
493
+ },
494
+ {
495
+ "id": "green_pharmacy_gp013_green_pharmacy_370ml",
496
+ "brand_en": "Green Pharmacy",
497
+ "brand_zh": "Green Pharmacy",
498
+ "product_name_en": null,
499
+ "product_name_zh": "Green Pharmacy金盞花&茶樹潔膚露-加強型370ml",
500
+ "category_en": null,
501
+ "category_zh": null,
502
+ "price_value": null,
503
+ "price_currency": null,
504
+ "source_url": null
505
+ },
506
+ {
507
+ "id": "klorane_kl001_400ml",
508
+ "brand_en": "Klorane",
509
+ "brand_zh": "蔻蘿蘭",
510
+ "product_name_en": "Klorane Strengthening Shampoo with Quinine & Organic Edelweiss (400ml)",
511
+ "product_name_zh": "蔻蘿蘭奎寧養髮洗髮精400ml",
512
+ "category_en": "Shampoo",
513
+ "category_zh": "洗髮精",
514
+ "price_value": null,
515
+ "price_currency": null,
516
+ "source_url": "https://www.klorane.com/uk-en/p/shampoo-with-quinine-and-organic-edelweiss-3282770141283-b5405ca4"
517
+ },
518
+ {
519
+ "id": "klorane_kl002_400ml",
520
+ "brand_en": "Klorane",
521
+ "brand_zh": "蔻蘿蘭",
522
+ "product_name_en": null,
523
+ "product_name_zh": "蔻蘿蘭蕁麻控油洗髮精400ml",
524
+ "category_en": null,
525
+ "category_zh": null,
526
+ "price_value": null,
527
+ "price_currency": null,
528
+ "source_url": null
529
+ },
530
+ {
531
+ "id": "klorane_kl003_400ml",
532
+ "brand_en": "Klorane",
533
+ "brand_zh": "蔻蘿蘭",
534
+ "product_name_en": null,
535
+ "product_name_zh": "蔻蘿蘭芍藥舒敏洗髮精400ml",
536
+ "category_en": null,
537
+ "category_zh": null,
538
+ "price_value": null,
539
+ "price_currency": null,
540
+ "source_url": null
541
+ },
542
+ {
543
+ "id": "klorane_kl005_400ml",
544
+ "brand_en": "Klorane",
545
+ "brand_zh": "蔻蘿蘭",
546
+ "product_name_en": null,
547
+ "product_name_zh": "蔻蘿蘭紅石榴護色洗髮精400ml",
548
+ "category_en": null,
549
+ "category_zh": null,
550
+ "price_value": null,
551
+ "price_currency": null,
552
+ "source_url": null
553
+ },
554
+ {
555
+ "id": "klorane_kl009_400ml",
556
+ "brand_en": "Klorane",
557
+ "brand_zh": "蔻蘿蘭",
558
+ "product_name_en": null,
559
+ "product_name_zh": "蔻蘿蘭洋甘菊亮澤洗髮精400ml",
560
+ "category_en": null,
561
+ "category_zh": null,
562
+ "price_value": null,
563
+ "price_currency": null,
564
+ "source_url": null
565
+ },
566
+ {
567
+ "id": "klorane_kl013_400ml",
568
+ "brand_en": "Klorane",
569
+ "brand_zh": "蔻蘿蘭",
570
+ "product_name_en": null,
571
+ "product_name_zh": "蔻蘿蘭燕麥溫和洗髮精400ml",
572
+ "category_en": null,
573
+ "category_zh": null,
574
+ "price_value": null,
575
+ "price_currency": null,
576
+ "source_url": null
577
+ },
578
+ {
579
+ "id": "klorane_kl032_400ml",
580
+ "brand_en": "Klorane",
581
+ "brand_zh": "蔻蘿蘭",
582
+ "product_name_en": null,
583
+ "product_name_zh": "蔻蘿蘭澎鬆洗髮精400ml",
584
+ "category_en": null,
585
+ "category_zh": null,
586
+ "price_value": null,
587
+ "price_currency": null,
588
+ "source_url": null
589
+ },
590
+ {
591
+ "id": "klorane_kl012_500ml",
592
+ "brand_en": "Klorane",
593
+ "brand_zh": "蔻蘿蘭",
594
+ "product_name_en": null,
595
+ "product_name_zh": "蔻蘿蘭寶寶洗髮沐浴精500ml二入組",
596
+ "category_en": null,
597
+ "category_zh": null,
598
+ "price_value": null,
599
+ "price_currency": null,
600
+ "source_url": null
601
+ },
602
+ {
603
+ "id": "l_occitane_lo017_30ml",
604
+ "brand_en": "L'Occitane",
605
+ "brand_zh": "歐舒丹",
606
+ "product_name_en": null,
607
+ "product_name_zh": "歐舒丹乳油木護手霜30ml",
608
+ "category_en": null,
609
+ "category_zh": null,
610
+ "price_value": null,
611
+ "price_currency": null,
612
+ "source_url": null
613
+ },
614
+ {
615
+ "id": "l_occitane_lo095_30ml",
616
+ "brand_en": "L'Occitane",
617
+ "brand_zh": "歐舒丹",
618
+ "product_name_en": null,
619
+ "product_name_zh": "歐舒丹櫻花護手霜30ml",
620
+ "category_en": null,
621
+ "category_zh": null,
622
+ "price_value": null,
623
+ "price_currency": null,
624
+ "source_url": null
625
+ },
626
+ {
627
+ "id": "l_occitane_lo097_30ml",
628
+ "brand_en": "L'Occitane",
629
+ "brand_zh": "歐舒丹",
630
+ "product_name_en": null,
631
+ "product_name_zh": "歐舒丹玫瑰護手霜30ml",
632
+ "category_en": null,
633
+ "category_zh": null,
634
+ "price_value": null,
635
+ "price_currency": null,
636
+ "source_url": null
637
+ },
638
+ {
639
+ "id": "l_occitane_lo116_30ml",
640
+ "brand_en": "L'Occitane",
641
+ "brand_zh": "歐舒丹",
642
+ "product_name_en": null,
643
+ "product_name_zh": "歐舒丹橙花&蘭花護手霜30ml",
644
+ "category_en": null,
645
+ "category_zh": null,
646
+ "price_value": null,
647
+ "price_currency": null,
648
+ "source_url": null
649
+ },
650
+ {
651
+ "id": "l_occitane_lo105_30ml",
652
+ "brand_en": "L'Occitane",
653
+ "brand_zh": "歐舒丹",
654
+ "product_name_en": null,
655
+ "product_name_zh": "歐舒丹馬鞭草護手乳30ml",
656
+ "category_en": null,
657
+ "category_zh": null,
658
+ "price_value": null,
659
+ "price_currency": null,
660
+ "source_url": null
661
+ },
662
+ {
663
+ "id": "l_occitane_lo094_30ml",
664
+ "brand_en": "L'Occitane",
665
+ "brand_zh": "歐舒丹",
666
+ "product_name_en": null,
667
+ "product_name_zh": "歐舒丹牡丹護手霜30ml",
668
+ "category_en": null,
669
+ "category_zh": null,
670
+ "price_value": null,
671
+ "price_currency": null,
672
+ "source_url": null
673
+ },
674
+ {
675
+ "id": "l_occitane_lo101_30ml",
676
+ "brand_en": "L'Occitane",
677
+ "brand_zh": "歐舒丹",
678
+ "product_name_en": null,
679
+ "product_name_zh": "歐舒丹乳油木玫瑰護手霜30ml",
680
+ "category_en": null,
681
+ "category_zh": null,
682
+ "price_value": null,
683
+ "price_currency": null,
684
+ "source_url": null
685
+ },
686
+ {
687
+ "id": "l_occitane_lo117_30ml",
688
+ "brand_en": "L'Occitane",
689
+ "brand_zh": "歐舒丹",
690
+ "product_name_en": null,
691
+ "product_name_zh": "歐舒丹桂花護手霜30ml",
692
+ "category_en": null,
693
+ "category_zh": null,
694
+ "price_value": null,
695
+ "price_currency": null,
696
+ "source_url": null
697
+ },
698
+ {
699
+ "id": "l_occitane_lo011_75ml",
700
+ "brand_en": "L'Occitane",
701
+ "brand_zh": "歐舒丹",
702
+ "product_name_en": null,
703
+ "product_name_zh": "歐舒丹乳油木護手霜75ml",
704
+ "category_en": null,
705
+ "category_zh": null,
706
+ "price_value": null,
707
+ "price_currency": null,
708
+ "source_url": null
709
+ },
710
+ {
711
+ "id": "l_occitane_lo012_75ml",
712
+ "brand_en": "L'Occitane",
713
+ "brand_zh": "歐舒丹",
714
+ "product_name_en": null,
715
+ "product_name_zh": "歐舒丹薰衣草護手霜75ml",
716
+ "category_en": null,
717
+ "category_zh": null,
718
+ "price_value": null,
719
+ "price_currency": null,
720
+ "source_url": null
721
+ },
722
+ {
723
+ "id": "l_occitane_lo015_75ml",
724
+ "brand_en": "L'Occitane",
725
+ "brand_zh": "歐舒丹",
726
+ "product_name_en": null,
727
+ "product_name_zh": "歐舒丹櫻花護手霜75ml",
728
+ "category_en": null,
729
+ "category_zh": null,
730
+ "price_value": null,
731
+ "price_currency": null,
732
+ "source_url": null
733
+ },
734
+ {
735
+ "id": "l_occitane_lo127_75ml",
736
+ "brand_en": "L'Occitane",
737
+ "brand_zh": "歐舒丹",
738
+ "product_name_en": null,
739
+ "product_name_zh": "歐舒丹乳油木玫瑰護手霜75ml",
740
+ "category_en": null,
741
+ "category_zh": null,
742
+ "price_value": null,
743
+ "price_currency": null,
744
+ "source_url": null
745
+ },
746
+ {
747
+ "id": "l_occitane_lo130_75ml",
748
+ "brand_en": "L'Occitane",
749
+ "brand_zh": "歐舒丹",
750
+ "product_name_en": null,
751
+ "product_name_zh": "歐舒丹杏仁護手霜75ml",
752
+ "category_en": null,
753
+ "category_zh": null,
754
+ "price_value": null,
755
+ "price_currency": null,
756
+ "source_url": null
757
+ },
758
+ {
759
+ "id": "l_occitane_lo137_75ml",
760
+ "brand_en": "L'Occitane",
761
+ "brand_zh": "歐舒丹",
762
+ "product_name_en": null,
763
+ "product_name_zh": "歐舒丹馬鞭草護手霜75ml",
764
+ "category_en": null,
765
+ "category_zh": null,
766
+ "price_value": null,
767
+ "price_currency": null,
768
+ "source_url": null
769
+ },
770
+ {
771
+ "id": "l_occitane_lo177_75ml",
772
+ "brand_en": "L'Occitane",
773
+ "brand_zh": "歐舒丹",
774
+ "product_name_en": null,
775
+ "product_name_zh": "歐舒丹玫瑰護手霜75ml",
776
+ "category_en": null,
777
+ "category_zh": null,
778
+ "price_value": null,
779
+ "price_currency": null,
780
+ "source_url": null
781
+ },
782
+ {
783
+ "id": "l_occitane_lo181_75ml",
784
+ "brand_en": "L'Occitane",
785
+ "brand_zh": "歐舒丹",
786
+ "product_name_en": null,
787
+ "product_name_zh": "歐舒丹牡丹護手霜75ml",
788
+ "category_en": null,
789
+ "category_zh": null,
790
+ "price_value": null,
791
+ "price_currency": null,
792
+ "source_url": null
793
+ },
794
+ {
795
+ "id": "l_occitane_lo201_75ml",
796
+ "brand_en": "L'Occitane",
797
+ "brand_zh": "歐舒丹",
798
+ "product_name_en": null,
799
+ "product_name_zh": "歐舒丹乳油木蠟菊賦活護手霜75ml",
800
+ "category_en": null,
801
+ "category_zh": null,
802
+ "price_value": null,
803
+ "price_currency": null,
804
+ "source_url": null
805
+ },
806
+ {
807
+ "id": "l_occitane_lo018_150ml",
808
+ "brand_en": "L'Occitane",
809
+ "brand_zh": "歐舒丹",
810
+ "product_name_en": null,
811
+ "product_name_zh": "歐舒丹乳油木護手霜150ml",
812
+ "category_en": null,
813
+ "category_zh": null,
814
+ "price_value": null,
815
+ "price_currency": null,
816
+ "source_url": null
817
+ },
818
+ {
819
+ "id": "l_occitane_lo118_150ml",
820
+ "brand_en": "L'Occitane",
821
+ "brand_zh": "歐舒丹",
822
+ "product_name_en": null,
823
+ "product_name_zh": "歐舒丹杏仁護手霜150ml",
824
+ "category_en": null,
825
+ "category_zh": null,
826
+ "price_value": null,
827
+ "price_currency": null,
828
+ "source_url": null
829
+ },
830
+ {
831
+ "id": "l_occitane_lo119_150ml",
832
+ "brand_en": "L'Occitane",
833
+ "brand_zh": "歐舒丹",
834
+ "product_name_en": null,
835
+ "product_name_zh": "歐舒丹櫻花護手霜150ml",
836
+ "category_en": null,
837
+ "category_zh": null,
838
+ "price_value": null,
839
+ "price_currency": null,
840
+ "source_url": null
841
+ },
842
+ {
843
+ "id": "l_occitane_lo126_150ml",
844
+ "brand_en": "L'Occitane",
845
+ "brand_zh": "歐舒丹",
846
+ "product_name_en": null,
847
+ "product_name_zh": "歐舒丹玫瑰護手霜150ml",
848
+ "category_en": null,
849
+ "category_zh": null,
850
+ "price_value": null,
851
+ "price_currency": null,
852
+ "source_url": null
853
+ },
854
+ {
855
+ "id": "l_occitane_lo176_150ml",
856
+ "brand_en": "L'Occitane",
857
+ "brand_zh": "歐舒丹",
858
+ "product_name_en": null,
859
+ "product_name_zh": "歐舒丹乳油木玫瑰護手霜150ml",
860
+ "category_en": null,
861
+ "category_zh": null,
862
+ "price_value": null,
863
+ "price_currency": null,
864
+ "source_url": null
865
+ },
866
+ {
867
+ "id": "l_occitane_lo016_150ml",
868
+ "brand_en": "L'Occitane",
869
+ "brand_zh": "歐舒丹",
870
+ "product_name_en": null,
871
+ "product_name_zh": "歐舒丹乳油木密集修護手膜霜150ml",
872
+ "category_en": null,
873
+ "category_zh": null,
874
+ "price_value": null,
875
+ "price_currency": null,
876
+ "source_url": null
877
+ },
878
+ {
879
+ "id": "l_occitane_lo019_150ml",
880
+ "brand_en": "L'Occitane",
881
+ "brand_zh": "歐舒丹",
882
+ "product_name_en": null,
883
+ "product_name_zh": "歐舒丹乳油木護足霜150ml",
884
+ "category_en": null,
885
+ "category_zh": null,
886
+ "price_value": null,
887
+ "price_currency": null,
888
+ "source_url": null
889
+ },
890
+ {
891
+ "id": "l_occitane_lo021_250ml",
892
+ "brand_en": "L'Occitane",
893
+ "brand_zh": "歐舒丹",
894
+ "product_name_en": null,
895
+ "product_name_zh": "歐舒丹乳油木身體乳250ml",
896
+ "category_en": null,
897
+ "category_zh": null,
898
+ "price_value": null,
899
+ "price_currency": null,
900
+ "source_url": null
901
+ },
902
+ {
903
+ "id": "l_occitane_lo073_250ml",
904
+ "brand_en": "L'Occitane",
905
+ "brand_zh": "歐舒丹",
906
+ "product_name_en": null,
907
+ "product_name_zh": "歐舒丹馬鞭草身體乳250ml",
908
+ "category_en": null,
909
+ "category_zh": null,
910
+ "price_value": null,
911
+ "price_currency": null,
912
+ "source_url": null
913
+ },
914
+ {
915
+ "id": "l_occitane_lo083_250ml",
916
+ "brand_en": "L'Occitane",
917
+ "brand_zh": "歐舒丹",
918
+ "product_name_en": null,
919
+ "product_name_zh": "歐舒丹櫻花美體乳250ml",
920
+ "category_en": null,
921
+ "category_zh": null,
922
+ "price_value": null,
923
+ "price_currency": null,
924
+ "source_url": null
925
+ },
926
+ {
927
+ "id": "l_occitane_lo084_250ml",
928
+ "brand_en": "L'Occitane",
929
+ "brand_zh": "歐舒丹",
930
+ "product_name_en": null,
931
+ "product_name_zh": "歐舒丹玫瑰美體乳250ml",
932
+ "category_en": null,
933
+ "category_zh": null,
934
+ "price_value": null,
935
+ "price_currency": null,
936
+ "source_url": null
937
+ },
938
+ {
939
+ "id": "l_occitane_lo090_250ml",
940
+ "brand_en": "L'Occitane",
941
+ "brand_zh": "歐舒丹",
942
+ "product_name_en": null,
943
+ "product_name_zh": "歐舒丹薰衣草身體乳250ml",
944
+ "category_en": null,
945
+ "category_zh": null,
946
+ "price_value": null,
947
+ "price_currency": null,
948
+ "source_url": null
949
+ },
950
+ {
951
+ "id": "l_occitane_lo166_240ml",
952
+ "brand_en": "L'Occitane",
953
+ "brand_zh": "歐舒丹",
954
+ "product_name_en": null,
955
+ "product_name_zh": "歐舒丹杏仁身體乳240ml",
956
+ "category_en": null,
957
+ "category_zh": null,
958
+ "price_value": null,
959
+ "price_currency": null,
960
+ "source_url": null
961
+ },
962
+ {
963
+ "id": "l_occitane_lo028_250ml",
964
+ "brand_en": "L'Occitane",
965
+ "brand_zh": "歐舒丹",
966
+ "product_name_en": null,
967
+ "product_name_zh": "歐舒丹玫瑰沐浴膠250ml",
968
+ "category_en": null,
969
+ "category_zh": null,
970
+ "price_value": null,
971
+ "price_currency": null,
972
+ "source_url": null
973
+ },
974
+ {
975
+ "id": "l_occitane_lo292_500ml",
976
+ "brand_en": "L'Occitane",
977
+ "brand_zh": "歐舒丹",
978
+ "product_name_en": null,
979
+ "product_name_zh": "歐舒丹玫瑰沐浴膠500ml",
980
+ "category_en": null,
981
+ "category_zh": null,
982
+ "price_value": null,
983
+ "price_currency": null,
984
+ "source_url": null
985
+ },
986
+ {
987
+ "id": "l_occitane_lo074_250ml",
988
+ "brand_en": "L'Occitane",
989
+ "brand_zh": "歐舒丹",
990
+ "product_name_en": null,
991
+ "product_name_zh": "歐舒丹馬鞭草沐浴膠250ml",
992
+ "category_en": null,
993
+ "category_zh": null,
994
+ "price_value": null,
995
+ "price_currency": null,
996
+ "source_url": null
997
+ },
998
+ {
999
+ "id": "l_occitane_lo185_500ml",
1000
+ "brand_en": "L'Occitane",
1001
+ "brand_zh": "歐舒丹",
1002
+ "product_name_en": null,
1003
+ "product_name_zh": "歐舒丹馬鞭草沐浴膠500ml",
1004
+ "category_en": null,
1005
+ "category_zh": null,
1006
+ "price_value": null,
1007
+ "price_currency": null,
1008
+ "source_url": null
1009
+ },
1010
+ {
1011
+ "id": "l_occitane_lo075_250ml",
1012
+ "brand_en": "L'Occitane",
1013
+ "brand_zh": "歐舒丹",
1014
+ "product_name_en": null,
1015
+ "product_name_zh": "歐舒丹薰衣草沐浴膠250ml",
1016
+ "category_en": null,
1017
+ "category_zh": null,
1018
+ "price_value": null,
1019
+ "price_currency": null,
1020
+ "source_url": null
1021
+ },
1022
+ {
1023
+ "id": "l_occitane_lo082_250ml",
1024
+ "brand_en": "L'Occitane",
1025
+ "brand_zh": "歐舒丹",
1026
+ "product_name_en": null,
1027
+ "product_name_zh": "歐舒丹櫻花沐浴膠250ml",
1028
+ "category_en": null,
1029
+ "category_zh": null,
1030
+ "price_value": null,
1031
+ "price_currency": null,
1032
+ "source_url": null
1033
+ },
1034
+ {
1035
+ "id": "l_occitane_lo189_500ml",
1036
+ "brand_en": "L'Occitane",
1037
+ "brand_zh": "歐舒丹",
1038
+ "product_name_en": null,
1039
+ "product_name_zh": "歐舒丹櫻花沐浴膠500ml",
1040
+ "category_en": null,
1041
+ "category_zh": null,
1042
+ "price_value": null,
1043
+ "price_currency": null,
1044
+ "source_url": null
1045
+ },
1046
+ {
1047
+ "id": "l_occitane_lo089_200ml",
1048
+ "brand_en": "L'Occitane",
1049
+ "brand_zh": "歐舒丹",
1050
+ "product_name_en": null,
1051
+ "product_name_zh": "歐舒丹杏仁去角質沐浴膠200ml",
1052
+ "category_en": null,
1053
+ "category_zh": null,
1054
+ "price_value": null,
1055
+ "price_currency": null,
1056
+ "source_url": null
1057
+ },
1058
+ {
1059
+ "id": "l_occitane_lo242_250ml",
1060
+ "brand_en": "L'Occitane",
1061
+ "brand_zh": "歐舒丹",
1062
+ "product_name_en": null,
1063
+ "product_name_zh": "歐舒丹杏仁沐浴油250ml",
1064
+ "category_en": null,
1065
+ "category_zh": null,
1066
+ "price_value": null,
1067
+ "price_currency": null,
1068
+ "source_url": null
1069
+ },
1070
+ {
1071
+ "id": "l_occitane_lo243_500ml",
1072
+ "brand_en": "L'Occitane",
1073
+ "brand_zh": "歐舒丹",
1074
+ "product_name_en": null,
1075
+ "product_name_zh": "歐舒丹杏仁沐浴油500ml",
1076
+ "category_en": null,
1077
+ "category_zh": null,
1078
+ "price_value": null,
1079
+ "price_currency": null,
1080
+ "source_url": null
1081
+ },
1082
+ {
1083
+ "id": "l_occitane_lo186_500ml",
1084
+ "brand_en": "L'Occitane",
1085
+ "brand_zh": "歐舒丹",
1086
+ "product_name_en": null,
1087
+ "product_name_zh": "歐舒丹馬鞭草泡泡浴500ml",
1088
+ "category_en": null,
1089
+ "category_zh": null,
1090
+ "price_value": null,
1091
+ "price_currency": null,
1092
+ "source_url": null
1093
+ },
1094
+ {
1095
+ "id": "l_occitane_lo187_500ml",
1096
+ "brand_en": "L'Occitane",
1097
+ "brand_zh": "歐舒丹",
1098
+ "product_name_en": null,
1099
+ "product_name_zh": "歐舒丹杏仁牛奶泡泡浴500ml",
1100
+ "category_en": null,
1101
+ "category_zh": null,
1102
+ "price_value": null,
1103
+ "price_currency": null,
1104
+ "source_url": null
1105
+ },
1106
+ {
1107
+ "id": "l_occitane_lo153_500ml",
1108
+ "brand_en": "L'Occitane",
1109
+ "brand_zh": "歐舒丹",
1110
+ "product_name_en": null,
1111
+ "product_name_zh": "歐舒丹草本修護洗髮乳500ml",
1112
+ "category_en": null,
1113
+ "category_zh": null,
1114
+ "price_value": null,
1115
+ "price_currency": null,
1116
+ "source_url": null
1117
+ },
1118
+ {
1119
+ "id": "l_occitane_lo160_500ml",
1120
+ "brand_en": "L'Occitane",
1121
+ "brand_zh": "歐舒丹",
1122
+ "product_name_en": null,
1123
+ "product_name_zh": "歐舒丹草本修護潤髮乳500ml",
1124
+ "category_en": null,
1125
+ "category_zh": null,
1126
+ "price_value": null,
1127
+ "price_currency": null,
1128
+ "source_url": null
1129
+ },
1130
+ {
1131
+ "id": "l_occitane_lo154_500ml",
1132
+ "brand_en": "L'Occitane",
1133
+ "brand_zh": "歐舒丹",
1134
+ "product_name_en": null,
1135
+ "product_name_zh": "歐舒丹草本淨涼洗髮乳500ml",
1136
+ "category_en": null,
1137
+ "category_zh": null,
1138
+ "price_value": null,
1139
+ "price_currency": null,
1140
+ "source_url": null
1141
+ },
1142
+ {
1143
+ "id": "l_occitane_lo155_500ml",
1144
+ "brand_en": "L'Occitane",
1145
+ "brand_zh": "歐舒丹",
1146
+ "product_name_en": null,
1147
+ "product_name_zh": "歐舒丹草本平衡洗髮乳500ml",
1148
+ "category_en": null,
1149
+ "category_zh": null,
1150
+ "price_value": null,
1151
+ "price_currency": null,
1152
+ "source_url": null
1153
+ },
1154
+ {
1155
+ "id": "l_occitane_lo330_500ml",
1156
+ "brand_en": "L'Occitane",
1157
+ "brand_zh": "歐舒丹",
1158
+ "product_name_en": null,
1159
+ "product_name_zh": "歐舒丹草本強韌洗髮乳500ml",
1160
+ "category_en": null,
1161
+ "category_zh": null,
1162
+ "price_value": null,
1163
+ "price_currency": null,
1164
+ "source_url": null
1165
+ },
1166
+ {
1167
+ "id": "l_occitane_lo020_50ml",
1168
+ "brand_en": "L'Occitane",
1169
+ "brand_zh": "歐舒丹",
1170
+ "product_name_en": null,
1171
+ "product_name_zh": "歐舒丹乳油木保濕霜50ml",
1172
+ "category_en": null,
1173
+ "category_zh": null,
1174
+ "price_value": null,
1175
+ "price_currency": null,
1176
+ "source_url": null
1177
+ },
1178
+ {
1179
+ "id": "l_occitane_lo093_200ml",
1180
+ "brand_en": "L'Occitane",
1181
+ "brand_zh": "歐舒丹",
1182
+ "product_name_en": null,
1183
+ "product_name_zh": "歐舒丹杏仁緊膚凝霜200ml",
1184
+ "category_en": null,
1185
+ "category_zh": null,
1186
+ "price_value": null,
1187
+ "price_currency": null,
1188
+ "source_url": null
1189
+ },
1190
+ {
1191
+ "id": "l_occitane_lo200_200ml",
1192
+ "brand_en": "L'Occitane",
1193
+ "brand_zh": "歐舒丹",
1194
+ "product_name_en": null,
1195
+ "product_name_zh": "歐舒丹乳油木舒芙身體霜200ml(清爽)",
1196
+ "category_en": null,
1197
+ "category_zh": null,
1198
+ "price_value": null,
1199
+ "price_currency": null,
1200
+ "source_url": null
1201
+ },
1202
+ {
1203
+ "id": "l_occitane_lo241_100ml",
1204
+ "brand_en": "L'Occitane",
1205
+ "brand_zh": "歐舒丹",
1206
+ "product_name_en": null,
1207
+ "product_name_zh": "歐舒丹杏仁美膚油100ml",
1208
+ "category_en": null,
1209
+ "category_zh": null,
1210
+ "price_value": null,
1211
+ "price_currency": null,
1212
+ "source_url": null
1213
+ },
1214
+ {
1215
+ "id": "la_roche_posay_lr005_15ml",
1216
+ "brand_en": "La Roche-Posay",
1217
+ "brand_zh": "理膚寶水",
1218
+ "product_name_en": null,
1219
+ "product_name_zh": "理膚寶水全日長效玻尿酸保濕修護眼霜15ml",
1220
+ "category_en": null,
1221
+ "category_zh": null,
1222
+ "price_value": null,
1223
+ "price_currency": null,
1224
+ "source_url": null
1225
+ },
1226
+ {
1227
+ "id": "la_roche_posay_lr009_200ml",
1228
+ "brand_en": "La Roche-Posay",
1229
+ "brand_zh": "理膚寶水",
1230
+ "product_name_en": null,
1231
+ "product_name_zh": "理膚寶水水感保濕清新化妝水200ml",
1232
+ "category_en": null,
1233
+ "category_zh": null,
1234
+ "price_value": null,
1235
+ "price_currency": null,
1236
+ "source_url": null
1237
+ },
1238
+ {
1239
+ "id": "la_roche_posay_lr010_300ml",
1240
+ "brand_en": "La Roche-Posay",
1241
+ "brand_zh": "理膚寶水",
1242
+ "product_name_en": null,
1243
+ "product_name_zh": "理膚寶水溫泉舒緩噴液300ml(理膚噴霧)",
1244
+ "category_en": null,
1245
+ "category_zh": null,
1246
+ "price_value": null,
1247
+ "price_currency": null,
1248
+ "source_url": null
1249
+ },
1250
+ {
1251
+ "id": "la_roche_posay_lr019_50ml",
1252
+ "brand_en": "La Roche-Posay",
1253
+ "brand_zh": "理膚寶水",
1254
+ "product_name_en": null,
1255
+ "product_name_zh": "理膚寶水全日長效玻尿酸修護保濕乳-清爽50ml",
1256
+ "category_en": null,
1257
+ "category_zh": null,
1258
+ "price_value": null,
1259
+ "price_currency": null,
1260
+ "source_url": null
1261
+ },
1262
+ {
1263
+ "id": "la_roche_posay_lr020_50ml",
1264
+ "brand_en": "La Roche-Posay",
1265
+ "brand_zh": "理膚寶水",
1266
+ "product_name_en": null,
1267
+ "product_name_zh": "理膚寶水全日長效玻尿酸修護保濕乳-潤澤50ml",
1268
+ "category_en": null,
1269
+ "category_zh": null,
1270
+ "price_value": null,
1271
+ "price_currency": null,
1272
+ "source_url": null
1273
+ },
1274
+ {
1275
+ "id": "la_roche_posay_lr021_400ml",
1276
+ "brand_en": "La Roche-Posay",
1277
+ "brand_zh": "理膚寶水",
1278
+ "product_name_en": null,
1279
+ "product_name_zh": "理膚寶水身體濕潤霜400ml",
1280
+ "category_en": null,
1281
+ "category_zh": null,
1282
+ "price_value": null,
1283
+ "price_currency": null,
1284
+ "source_url": null
1285
+ },
1286
+ {
1287
+ "id": "la_roche_posay_lr024_40ml",
1288
+ "brand_en": "La Roche-Posay",
1289
+ "brand_zh": "理膚寶水",
1290
+ "product_name_en": null,
1291
+ "product_name_zh": "理膚寶水全面舒痕修復凝膠40ml",
1292
+ "category_en": null,
1293
+ "category_zh": null,
1294
+ "price_value": null,
1295
+ "price_currency": null,
1296
+ "source_url": null
1297
+ },
1298
+ {
1299
+ "id": "la_roche_posay_lr028_400ml",
1300
+ "brand_en": "La Roche-Posay",
1301
+ "brand_zh": "理膚寶水",
1302
+ "product_name_en": null,
1303
+ "product_name_zh": "理膚寶水多容安清潔卸妝乳400ml",
1304
+ "category_en": null,
1305
+ "category_zh": null,
1306
+ "price_value": null,
1307
+ "price_currency": null,
1308
+ "source_url": null
1309
+ },
1310
+ {
1311
+ "id": "la_roche_posay_lr030_40ml",
1312
+ "brand_en": "La Roche-Posay",
1313
+ "brand_zh": "理膚寶水",
1314
+ "product_name_en": null,
1315
+ "product_name_zh": "理膚寶水毛孔緊緻控油保濕乳40ml",
1316
+ "category_en": null,
1317
+ "category_zh": null,
1318
+ "price_value": null,
1319
+ "price_currency": null,
1320
+ "source_url": null
1321
+ },
1322
+ {
1323
+ "id": "la_roche_posay_lr038_m_400ml",
1324
+ "brand_en": "La Roche-Posay",
1325
+ "brand_zh": "理膚寶水",
1326
+ "product_name_en": null,
1327
+ "product_name_zh": "理膚寶水青春潔膚凝膠+M 400ml",
1328
+ "category_en": null,
1329
+ "category_zh": null,
1330
+ "price_value": null,
1331
+ "price_currency": null,
1332
+ "source_url": null
1333
+ },
1334
+ {
1335
+ "id": "la_roche_posay_lr046_ap_400ml",
1336
+ "brand_en": "La Roche-Posay",
1337
+ "brand_zh": "理膚寶水",
1338
+ "product_name_en": null,
1339
+ "product_name_zh": "理膚寶水理必佳極效滋潤霜(異位AP+)400ml",
1340
+ "category_en": null,
1341
+ "category_zh": null,
1342
+ "price_value": null,
1343
+ "price_currency": null,
1344
+ "source_url": null
1345
+ },
1346
+ {
1347
+ "id": "la_roche_posay_lr047_b5_40ml",
1348
+ "brand_en": "La Roche-Posay",
1349
+ "brand_zh": "理膚寶水",
1350
+ "product_name_en": null,
1351
+ "product_name_zh": "理膚寶水B5+全面修復霜40ml",
1352
+ "category_en": null,
1353
+ "category_zh": null,
1354
+ "price_value": null,
1355
+ "price_currency": null,
1356
+ "source_url": null
1357
+ },
1358
+ {
1359
+ "id": "la_roche_posay_lr048_b5_100ml",
1360
+ "brand_en": "La Roche-Posay",
1361
+ "brand_zh": "理膚寶水",
1362
+ "product_name_en": null,
1363
+ "product_name_zh": "理膚寶水B5+全面修復霜100ml",
1364
+ "category_en": null,
1365
+ "category_zh": null,
1366
+ "price_value": null,
1367
+ "price_currency": null,
1368
+ "source_url": null
1369
+ },
1370
+ {
1371
+ "id": "la_roche_posay_lr087_200ml",
1372
+ "brand_en": "La Roche-Posay",
1373
+ "brand_zh": "理膚寶水",
1374
+ "product_name_en": null,
1375
+ "product_name_zh": "理膚寶水全面修復潔膚凝膠200ml",
1376
+ "category_en": null,
1377
+ "category_zh": null,
1378
+ "price_value": null,
1379
+ "price_currency": null,
1380
+ "source_url": null
1381
+ },
1382
+ {
1383
+ "id": "la_roche_posay_lr059_40ml",
1384
+ "brand_en": "La Roche-Posay",
1385
+ "brand_zh": "理膚寶水",
1386
+ "product_name_en": null,
1387
+ "product_name_zh": "理膚寶水多容安超極效舒緩修護精華乳40ml(安心霜)-輕潤型",
1388
+ "category_en": null,
1389
+ "category_zh": null,
1390
+ "price_value": null,
1391
+ "price_currency": null,
1392
+ "source_url": null
1393
+ },
1394
+ {
1395
+ "id": "la_roche_posay_lr062_40ml",
1396
+ "brand_en": "La Roche-Posay",
1397
+ "brand_zh": "理膚寶水",
1398
+ "product_name_en": null,
1399
+ "product_name_zh": "理膚寶水多容安超極效舒緩修護精華乳40ml(安心霜)-清爽型",
1400
+ "category_en": null,
1401
+ "category_zh": null,
1402
+ "price_value": null,
1403
+ "price_currency": null,
1404
+ "source_url": null
1405
+ },
1406
+ {
1407
+ "id": "la_roche_posay_lr074_40ml",
1408
+ "brand_en": "La Roche-Posay",
1409
+ "brand_zh": "理膚寶水",
1410
+ "product_name_en": null,
1411
+ "product_name_zh": "理膚寶水多容安舒緩保濕面霜-清爽型40ml",
1412
+ "category_en": null,
1413
+ "category_zh": null,
1414
+ "price_value": null,
1415
+ "price_currency": null,
1416
+ "source_url": null
1417
+ },
1418
+ {
1419
+ "id": "la_roche_posay_lr075_40ml",
1420
+ "brand_en": "La Roche-Posay",
1421
+ "brand_zh": "理膚寶水",
1422
+ "product_name_en": null,
1423
+ "product_name_zh": "理膚寶水多容安舒緩保濕面霜-滋潤型40ml",
1424
+ "category_en": null,
1425
+ "category_zh": null,
1426
+ "price_value": null,
1427
+ "price_currency": null,
1428
+ "source_url": null
1429
+ },
1430
+ {
1431
+ "id": "la_roche_posay_lr109_400ml",
1432
+ "brand_en": "La Roche-Posay",
1433
+ "brand_zh": "理膚寶水",
1434
+ "product_name_en": null,
1435
+ "product_name_zh": "理膚寶水敏感性頭皮溫和洗髮露400ml",
1436
+ "category_en": null,
1437
+ "category_zh": null,
1438
+ "price_value": null,
1439
+ "price_currency": null,
1440
+ "source_url": null
1441
+ },
1442
+ {
1443
+ "id": "la_roche_posay_lr116_b5_30ml",
1444
+ "brand_en": "La Roche-Posay",
1445
+ "brand_zh": "理膚寶水",
1446
+ "product_name_en": null,
1447
+ "product_name_zh": "理膚寶水B5彈潤修復精華30ml",
1448
+ "category_en": null,
1449
+ "category_zh": null,
1450
+ "price_value": null,
1451
+ "price_currency": null,
1452
+ "source_url": null
1453
+ },
1454
+ {
1455
+ "id": "la_roche_posay_lr117_20ml",
1456
+ "brand_en": "La Roche-Posay",
1457
+ "brand_zh": "理膚寶水",
1458
+ "product_name_en": null,
1459
+ "product_name_zh": "理膚寶水容安舒緩保濕修護精華20ml(安心小藍瓶)",
1460
+ "category_en": null,
1461
+ "category_zh": null,
1462
+ "price_value": null,
1463
+ "price_currency": null,
1464
+ "source_url": null
1465
+ },
1466
+ {
1467
+ "id": "mustela_mu001_500ml",
1468
+ "brand_en": "Mustela",
1469
+ "brand_zh": "慕之恬廊",
1470
+ "product_name_en": "Mustela Gentle Cleansing Gel (500ml)",
1471
+ "product_name_zh": "慕之恬廊慕之幼多慕雙潔乳500ml",
1472
+ "category_en": "Baby Cleanser",
1473
+ "category_zh": "嬰幼兒潔膚",
1474
+ "price_value": null,
1475
+ "price_currency": null,
1476
+ "source_url": "https://www.mustelausa.com/products/gentle-cleansing-gel"
1477
+ },
1478
+ {
1479
+ "id": "mustela_mu021_300ml",
1480
+ "brand_en": "Mustela",
1481
+ "brand_zh": "慕之恬廊",
1482
+ "product_name_en": null,
1483
+ "product_name_zh": "慕之恬廊慕之幼爽身潤膚乳300ml",
1484
+ "category_en": null,
1485
+ "category_zh": null,
1486
+ "price_value": null,
1487
+ "price_currency": null,
1488
+ "source_url": null
1489
+ },
1490
+ {
1491
+ "id": "mustela_mu027_500ml",
1492
+ "brand_en": "Mustela",
1493
+ "brand_zh": "慕之恬廊",
1494
+ "product_name_en": null,
1495
+ "product_name_zh": "慕之恬廊慕之幼爽身潤膚乳500ml",
1496
+ "category_en": null,
1497
+ "category_zh": null,
1498
+ "price_value": null,
1499
+ "price_currency": null,
1500
+ "source_url": null
1501
+ },
1502
+ {
1503
+ "id": "mustela_mu003_500ml",
1504
+ "brand_en": "Mustela",
1505
+ "brand_zh": "慕之恬廊",
1506
+ "product_name_en": "Mustela Gentle Cleansing Gel (500ml)",
1507
+ "product_name_zh": "慕之恬廊舒恬良雙潔乳500ml",
1508
+ "category_en": "Baby Cleanser",
1509
+ "category_zh": "嬰幼兒潔膚",
1510
+ "price_value": null,
1511
+ "price_currency": null,
1512
+ "source_url": "https://www.mustelausa.com/products/gentle-cleansing-gel"
1513
+ },
1514
+ {
1515
+ "id": "mustela_mu007_400ml",
1516
+ "brand_en": "Mustela",
1517
+ "brand_zh": "慕之恬廊",
1518
+ "product_name_en": null,
1519
+ "product_name_zh": "慕之恬廊舒恬良柔舒霜400ml-清爽型",
1520
+ "category_en": null,
1521
+ "category_zh": null,
1522
+ "price_value": null,
1523
+ "price_currency": null,
1524
+ "source_url": null
1525
+ },
1526
+ {
1527
+ "id": "mustela_mu008_400ml",
1528
+ "brand_en": "Mustela",
1529
+ "brand_zh": "慕之恬廊",
1530
+ "product_name_en": null,
1531
+ "product_name_zh": "慕之恬廊舒恬良柔舒霜400ml-滋養型",
1532
+ "category_en": null,
1533
+ "category_zh": null,
1534
+ "price_value": null,
1535
+ "price_currency": null,
1536
+ "source_url": null
1537
+ },
1538
+ {
1539
+ "id": "mustela_mu009_vbc_100ml",
1540
+ "brand_en": "Mustela",
1541
+ "brand_zh": "慕之恬廊",
1542
+ "product_name_en": null,
1543
+ "product_name_zh": "慕之恬廊衛蓓欣VBC全效護膚膏100ml",
1544
+ "category_en": null,
1545
+ "category_zh": null,
1546
+ "price_value": null,
1547
+ "price_currency": null,
1548
+ "source_url": null
1549
+ },
1550
+ {
1551
+ "id": "the_ordinary_od005_the_ordinary_30ml",
1552
+ "brand_en": "The Ordinary",
1553
+ "brand_zh": "The Ordinary",
1554
+ "product_name_en": "The Ordinary Niacinamide 10% + Zinc 1% (30ml)",
1555
+ "product_name_zh": "The Ordinary菸鹼胺精華液30ml",
1556
+ "category_en": "Serum",
1557
+ "category_zh": "精華",
1558
+ "price_value": null,
1559
+ "price_currency": null,
1560
+ "source_url": "https://theordinary.com/en-us/niacinamide-10-zinc-1-serum-100436.html"
1561
+ },
1562
+ {
1563
+ "id": "the_ordinary_od045_the_ordinary_60ml",
1564
+ "brand_en": "The Ordinary",
1565
+ "brand_zh": "The Ordinary",
1566
+ "product_name_en": "The Ordinary Niacinamide 10% + Zinc 1% (60ml)",
1567
+ "product_name_zh": "The Ordinary菸鹼胺精華液60ml",
1568
+ "category_en": "Serum",
1569
+ "category_zh": "精華",
1570
+ "price_value": null,
1571
+ "price_currency": null,
1572
+ "source_url": "https://theordinary.com/en-us/niacinamide-10-zinc-1-serum-100436.html"
1573
+ },
1574
+ {
1575
+ "id": "the_ordinary_od006_the_ordinary_30ml",
1576
+ "brand_en": "The Ordinary",
1577
+ "brand_zh": "The Ordinary",
1578
+ "product_name_en": null,
1579
+ "product_name_zh": "The Ordinary植物角鯊烯精華液30ml",
1580
+ "category_en": null,
1581
+ "category_zh": null,
1582
+ "price_value": null,
1583
+ "price_currency": null,
1584
+ "source_url": null
1585
+ },
1586
+ {
1587
+ "id": "the_ordinary_od007_the_ordinary_buffet_30ml",
1588
+ "brand_en": "The Ordinary",
1589
+ "brand_zh": "The Ordinary",
1590
+ "product_name_en": null,
1591
+ "product_name_zh": "The Ordinary Buffet+藍銅胜肽精華30ml",
1592
+ "category_en": null,
1593
+ "category_zh": null,
1594
+ "price_value": null,
1595
+ "price_currency": null,
1596
+ "source_url": null
1597
+ },
1598
+ {
1599
+ "id": "the_ordinary_od008_the_ordinary_b5_30ml",
1600
+ "brand_en": "The Ordinary",
1601
+ "brand_zh": "The Ordinary",
1602
+ "product_name_en": null,
1603
+ "product_name_zh": "The Ordinary超純補水玻尿酸+B5精華液30ml",
1604
+ "category_en": null,
1605
+ "category_zh": null,
1606
+ "price_value": null,
1607
+ "price_currency": null,
1608
+ "source_url": null
1609
+ },
1610
+ {
1611
+ "id": "the_ordinary_od018_the_ordinary_b5_60ml",
1612
+ "brand_en": "The Ordinary",
1613
+ "brand_zh": "The Ordinary",
1614
+ "product_name_en": null,
1615
+ "product_name_zh": "The Ordinary超純補水玻尿酸+B5精華液60ml",
1616
+ "category_en": null,
1617
+ "category_zh": null,
1618
+ "price_value": null,
1619
+ "price_currency": null,
1620
+ "source_url": null
1621
+ },
1622
+ {
1623
+ "id": "the_ordinary_od009_the_ordinary_30ml",
1624
+ "brand_en": "The Ordinary",
1625
+ "brand_zh": "The Ordinary",
1626
+ "product_name_en": null,
1627
+ "product_name_zh": "The Ordinary高濃縮熊果素淨白精華液30ml",
1628
+ "category_en": null,
1629
+ "category_zh": null,
1630
+ "price_value": null,
1631
+ "price_currency": null,
1632
+ "source_url": null
1633
+ },
1634
+ {
1635
+ "id": "the_ordinary_od010_the_ordinary_30ml",
1636
+ "brand_en": "The Ordinary",
1637
+ "brand_zh": "The Ordinary",
1638
+ "product_name_en": null,
1639
+ "product_name_zh": "The Ordinary咖啡因眼部精華30ml",
1640
+ "category_en": null,
1641
+ "category_zh": null,
1642
+ "price_value": null,
1643
+ "price_currency": null,
1644
+ "source_url": null
1645
+ },
1646
+ {
1647
+ "id": "the_ordinary_od013_the_ordinary_30ml",
1648
+ "brand_en": "The Ordinary",
1649
+ "brand_zh": "The Ordinary",
1650
+ "product_name_en": null,
1651
+ "product_name_zh": "The Ordinary海洋玻尿酸精華30ml",
1652
+ "category_en": null,
1653
+ "category_zh": null,
1654
+ "price_value": null,
1655
+ "price_currency": null,
1656
+ "source_url": null
1657
+ },
1658
+ {
1659
+ "id": "the_ordinary_od043_the_ordinary_30ml",
1660
+ "brand_en": "The Ordinary",
1661
+ "brand_zh": "The Ordinary",
1662
+ "product_name_en": null,
1663
+ "product_name_zh": "The Ordinary杜鵑花酸乳霜30ml",
1664
+ "category_en": null,
1665
+ "category_zh": null,
1666
+ "price_value": null,
1667
+ "price_currency": null,
1668
+ "source_url": null
1669
+ },
1670
+ {
1671
+ "id": "the_ordinary_od046_the_ordinary_c_20g",
1672
+ "brand_en": "The Ordinary",
1673
+ "brand_zh": "The Ordinary",
1674
+ "product_name_en": null,
1675
+ "product_name_zh": "The Ordinary左旋精純維他命C粉20g",
1676
+ "category_en": null,
1677
+ "category_zh": null,
1678
+ "price_value": null,
1679
+ "price_currency": null,
1680
+ "source_url": null
1681
+ },
1682
+ {
1683
+ "id": "the_ordinary_od047_the_ordinary_euk134_0_1_30ml",
1684
+ "brand_en": "The Ordinary",
1685
+ "brand_zh": "The Ordinary",
1686
+ "product_name_en": null,
1687
+ "product_name_zh": "The Ordinary EUK134 0.1%抗氧化精華液30ml",
1688
+ "category_en": null,
1689
+ "category_zh": null,
1690
+ "price_value": null,
1691
+ "price_currency": null,
1692
+ "source_url": null
1693
+ },
1694
+ {
1695
+ "id": "the_ordinary_od048_the_ordinary_10_30ml",
1696
+ "brand_en": "The Ordinary",
1697
+ "brand_zh": "The Ordinary",
1698
+ "product_name_en": null,
1699
+ "product_name_zh": "The Ordinary 杏仁酸10%+玻尿酸精華液30ml",
1700
+ "category_en": null,
1701
+ "category_zh": null,
1702
+ "price_value": null,
1703
+ "price_currency": null,
1704
+ "source_url": null
1705
+ },
1706
+ {
1707
+ "id": "the_ordinary_od049_the_ordinary_30ml",
1708
+ "brand_en": "The Ordinary",
1709
+ "brand_zh": "The Ordinary",
1710
+ "product_name_en": null,
1711
+ "product_name_zh": "The Ordinary 果酸去角質面膜精華液30ml",
1712
+ "category_en": null,
1713
+ "category_zh": null,
1714
+ "price_value": null,
1715
+ "price_currency": null,
1716
+ "source_url": null
1717
+ },
1718
+ {
1719
+ "id": "the_ordinary_od050_the_ordinary_1_30ml",
1720
+ "brand_en": "The Ordinary",
1721
+ "brand_zh": "The Ordinary",
1722
+ "product_name_en": null,
1723
+ "product_name_zh": "The Ordinary 視黃醇1%角鯊烷精華液30ml",
1724
+ "category_en": null,
1725
+ "category_zh": null,
1726
+ "price_value": null,
1727
+ "price_currency": null,
1728
+ "source_url": null
1729
+ },
1730
+ {
1731
+ "id": "sebamed_sb002_1000ml",
1732
+ "brand_en": "Sebamed",
1733
+ "brand_zh": "施巴",
1734
+ "product_name_en": "Sebamed Olive Face & Body Wash (1000ml)",
1735
+ "product_name_zh": "施巴橄欖潔膚露1000ml",
1736
+ "category_en": "Cleanser",
1737
+ "category_zh": "潔膚露",
1738
+ "price_value": null,
1739
+ "price_currency": null,
1740
+ "source_url": "https://www.sebamedusa.com/paraben-free-olive-face-and-body-wash"
1741
+ },
1742
+ {
1743
+ "id": "sebamed_sb004_1000ml",
1744
+ "brand_en": "Sebamed",
1745
+ "brand_zh": "施巴",
1746
+ "product_name_en": "Sebamed Liquid Face & Body Wash (1000ml)",
1747
+ "product_name_zh": "施巴潔膚露1000ml",
1748
+ "category_en": "Cleanser",
1749
+ "category_zh": "潔膚露",
1750
+ "price_value": null,
1751
+ "price_currency": null,
1752
+ "source_url": "https://www.sebamedusa.com/400ml-paraben-free-liquid-face-and-body-wash-with-pump"
1753
+ },
1754
+ {
1755
+ "id": "sebamed_sb072_1000ml",
1756
+ "brand_en": "Sebamed",
1757
+ "brand_zh": "施巴",
1758
+ "product_name_en": null,
1759
+ "product_name_zh": "施巴潔膚露環保補充包1000ml",
1760
+ "category_en": null,
1761
+ "category_zh": null,
1762
+ "price_value": null,
1763
+ "price_currency": null,
1764
+ "source_url": null
1765
+ },
1766
+ {
1767
+ "id": "sebamed_sb005_1000ml",
1768
+ "brand_en": "Sebamed",
1769
+ "brand_zh": "施巴",
1770
+ "product_name_en": null,
1771
+ "product_name_zh": "施巴溫和洗髮乳1000ml",
1772
+ "category_en": null,
1773
+ "category_zh": null,
1774
+ "price_value": null,
1775
+ "price_currency": null,
1776
+ "source_url": null
1777
+ },
1778
+ {
1779
+ "id": "sebamed_sb011_1000ml",
1780
+ "brand_en": "Sebamed",
1781
+ "brand_zh": "施巴",
1782
+ "product_name_en": null,
1783
+ "product_name_zh": "施巴抗乾敏保濕乳液1000ml",
1784
+ "category_en": null,
1785
+ "category_zh": null,
1786
+ "price_value": null,
1787
+ "price_currency": null,
1788
+ "source_url": null
1789
+ },
1790
+ {
1791
+ "id": "sebamed_sb016_1000ml",
1792
+ "brand_en": "Sebamed",
1793
+ "brand_zh": "施巴",
1794
+ "product_name_en": null,
1795
+ "product_name_zh": "施巴嬰兒泡泡浴露1000ml",
1796
+ "category_en": null,
1797
+ "category_zh": null,
1798
+ "price_value": null,
1799
+ "price_currency": null,
1800
+ "source_url": null
1801
+ },
1802
+ {
1803
+ "id": "sebamed_sb070_200ml",
1804
+ "brand_en": "Sebamed",
1805
+ "brand_zh": "施巴",
1806
+ "product_name_en": null,
1807
+ "product_name_zh": "施巴運動沐浴乳(活力麝香)200ml",
1808
+ "category_en": null,
1809
+ "category_zh": null,
1810
+ "price_value": null,
1811
+ "price_currency": null,
1812
+ "source_url": null
1813
+ },
1814
+ {
1815
+ "id": "sebamed_sb071_200ml",
1816
+ "brand_en": "Sebamed",
1817
+ "brand_zh": "施巴",
1818
+ "product_name_en": null,
1819
+ "product_name_zh": "施巴運動沐浴乳(清新花香)200ml",
1820
+ "category_en": null,
1821
+ "category_zh": null,
1822
+ "price_value": null,
1823
+ "price_currency": null,
1824
+ "source_url": null
1825
+ },
1826
+ {
1827
+ "id": "the_body_shop_tbs008_250ml",
1828
+ "brand_en": "The Body Shop",
1829
+ "brand_zh": "美體小舖",
1830
+ "product_name_en": "The Body Shop Tea Tree Skin Clearing Facial Cleanser",
1831
+ "product_name_zh": "美體小舖茶樹淨膚深層潔面膠250ml",
1832
+ "category_en": "Cleanser",
1833
+ "category_zh": "潔面",
1834
+ "price_value": null,
1835
+ "price_currency": null,
1836
+ "source_url": "https://www.thebodyshop.com/products/tea-tree-skin-clearing-facial-wash"
1837
+ },
1838
+ {
1839
+ "id": "the_body_shop_tbs010_150ml",
1840
+ "brand_en": "The Body Shop",
1841
+ "brand_zh": "美體小舖",
1842
+ "product_name_en": "The Body Shop Tea Tree Skin Clearing Facial Cleanser",
1843
+ "product_name_zh": "美體小舖茶樹淨膚潔面慕絲150ml",
1844
+ "category_en": "Cleanser",
1845
+ "category_zh": "潔面",
1846
+ "price_value": null,
1847
+ "price_currency": null,
1848
+ "source_url": "https://www.thebodyshop.com/products/tea-tree-skin-clearing-facial-wash"
1849
+ },
1850
+ {
1851
+ "id": "the_body_shop_tbs011_250ml",
1852
+ "brand_en": "The Body Shop",
1853
+ "brand_zh": "美體小舖",
1854
+ "product_name_en": "The Body Shop Tea Tree Skin Clearing Facial Cleanser",
1855
+ "product_name_zh": "美體小舖茶樹淨膚調理水250ml",
1856
+ "category_en": "Cleanser",
1857
+ "category_zh": "潔面",
1858
+ "price_value": null,
1859
+ "price_currency": null,
1860
+ "source_url": "https://www.thebodyshop.com/products/tea-tree-skin-clearing-facial-wash"
1861
+ },
1862
+ {
1863
+ "id": "the_body_shop_tbs012_100ml",
1864
+ "brand_en": "The Body Shop",
1865
+ "brand_zh": "美體小舖",
1866
+ "product_name_en": "The Body Shop Tea Tree Skin Clearing Facial Cleanser",
1867
+ "product_name_zh": "美體小舖茶樹淨膚調理面膜100ml",
1868
+ "category_en": "Cleanser",
1869
+ "category_zh": "潔面",
1870
+ "price_value": null,
1871
+ "price_currency": null,
1872
+ "source_url": "https://www.thebodyshop.com/products/tea-tree-skin-clearing-facial-wash"
1873
+ },
1874
+ {
1875
+ "id": "the_body_shop_tbs013_250ml",
1876
+ "brand_en": "The Body Shop",
1877
+ "brand_zh": "美體小舖",
1878
+ "product_name_en": "The Body Shop Tea Tree Skin Clearing Facial Cleanser",
1879
+ "product_name_zh": "美體小舖茶樹淨膚沐浴膠250ml",
1880
+ "category_en": "Cleanser",
1881
+ "category_zh": "潔面",
1882
+ "price_value": null,
1883
+ "price_currency": null,
1884
+ "source_url": "https://www.thebodyshop.com/products/tea-tree-skin-clearing-facial-wash"
1885
+ },
1886
+ {
1887
+ "id": "the_body_shop_tbs014_3_125ml",
1888
+ "brand_en": "The Body Shop",
1889
+ "brand_zh": "美體小舖",
1890
+ "product_name_en": null,
1891
+ "product_name_zh": "美體小舖茶樹3效淨膚磨砂面膜125ml",
1892
+ "category_en": null,
1893
+ "category_zh": null,
1894
+ "price_value": null,
1895
+ "price_currency": null,
1896
+ "source_url": null
1897
+ },
1898
+ {
1899
+ "id": "the_body_shop_tbs025_250ml",
1900
+ "brand_en": "The Body Shop",
1901
+ "brand_zh": "美體小舖",
1902
+ "product_name_en": null,
1903
+ "product_name_zh": "美體小舖白麝香絲柔身體潤膚乳250ml",
1904
+ "category_en": null,
1905
+ "category_zh": null,
1906
+ "price_value": null,
1907
+ "price_currency": null,
1908
+ "source_url": null
1909
+ },
1910
+ {
1911
+ "id": "the_body_shop_tbs026_400ml",
1912
+ "brand_en": "The Body Shop",
1913
+ "brand_zh": "美體小舖",
1914
+ "product_name_en": null,
1915
+ "product_name_zh": "美體小舖白麝香絲柔身體潤膚乳400ml",
1916
+ "category_en": null,
1917
+ "category_zh": null,
1918
+ "price_value": null,
1919
+ "price_currency": null,
1920
+ "source_url": null
1921
+ },
1922
+ {
1923
+ "id": "the_body_shop_tbs028_250ml",
1924
+ "brand_en": "The Body Shop",
1925
+ "brand_zh": "美體小舖",
1926
+ "product_name_en": null,
1927
+ "product_name_zh": "美體小舖白麝香絲柔沐浴膠250ml",
1928
+ "category_en": null,
1929
+ "category_zh": null,
1930
+ "price_value": null,
1931
+ "price_currency": null,
1932
+ "source_url": null
1933
+ },
1934
+ {
1935
+ "id": "the_body_shop_tbs027_400ml",
1936
+ "brand_en": "The Body Shop",
1937
+ "brand_zh": "美體小舖",
1938
+ "product_name_en": null,
1939
+ "product_name_zh": "美體小舖白麝香絲柔沐浴膠400ml",
1940
+ "category_en": null,
1941
+ "category_zh": null,
1942
+ "price_value": null,
1943
+ "price_currency": null,
1944
+ "source_url": null
1945
+ },
1946
+ {
1947
+ "id": "the_body_shop_tbs046_100ml",
1948
+ "brand_en": "The Body Shop",
1949
+ "brand_zh": "美體小舖",
1950
+ "product_name_en": null,
1951
+ "product_name_zh": "美體小舖大麻籽密集修護護手霜100ml",
1952
+ "category_en": null,
1953
+ "category_zh": null,
1954
+ "price_value": null,
1955
+ "price_currency": null,
1956
+ "source_url": null
1957
+ },
1958
+ {
1959
+ "id": "the_body_shop_tbs047_30ml",
1960
+ "brand_en": "The Body Shop",
1961
+ "brand_zh": "美體小舖",
1962
+ "product_name_en": null,
1963
+ "product_name_zh": "美體小舖大麻籽密集修護護手霜30ml",
1964
+ "category_en": null,
1965
+ "category_zh": null,
1966
+ "price_value": null,
1967
+ "price_currency": null,
1968
+ "source_url": null
1969
+ },
1970
+ {
1971
+ "id": "the_body_shop_tbs048_100ml",
1972
+ "brand_en": "The Body Shop",
1973
+ "brand_zh": "美體小舖",
1974
+ "product_name_en": null,
1975
+ "product_name_zh": "美體小舖乳油木果修護護手霜100ml",
1976
+ "category_en": null,
1977
+ "category_zh": null,
1978
+ "price_value": null,
1979
+ "price_currency": null,
1980
+ "source_url": null
1981
+ },
1982
+ {
1983
+ "id": "the_body_shop_tbs100_100ml",
1984
+ "brand_en": "The Body Shop",
1985
+ "brand_zh": "美體小舖",
1986
+ "product_name_en": null,
1987
+ "product_name_zh": "美體小舖英皇玫瑰嫩膚護手霜100ml",
1988
+ "category_en": null,
1989
+ "category_zh": null,
1990
+ "price_value": null,
1991
+ "price_currency": null,
1992
+ "source_url": null
1993
+ },
1994
+ {
1995
+ "id": "the_body_shop_tbs101_30ml",
1996
+ "brand_en": "The Body Shop",
1997
+ "brand_zh": "美體小舖",
1998
+ "product_name_en": null,
1999
+ "product_name_zh": "美體小舖英皇玫瑰嫩膚護手霜30ml",
2000
+ "category_en": null,
2001
+ "category_zh": null,
2002
+ "price_value": null,
2003
+ "price_currency": null,
2004
+ "source_url": null
2005
+ },
2006
+ {
2007
+ "id": "the_body_shop_tbs105_30ml",
2008
+ "brand_en": "The Body Shop",
2009
+ "brand_zh": "美體小舖",
2010
+ "product_name_en": null,
2011
+ "product_name_zh": "美體小舖粉紅葡萄柚活力護手霜30ml",
2012
+ "category_en": null,
2013
+ "category_zh": null,
2014
+ "price_value": null,
2015
+ "price_currency": null,
2016
+ "source_url": null
2017
+ },
2018
+ {
2019
+ "id": "the_body_shop_tbs107_30ml",
2020
+ "brand_en": "The Body Shop",
2021
+ "brand_zh": "美體小舖",
2022
+ "product_name_en": null,
2023
+ "product_name_zh": "美體小舖辣木籽更新護手霜30ml",
2024
+ "category_en": null,
2025
+ "category_zh": null,
2026
+ "price_value": null,
2027
+ "price_currency": null,
2028
+ "source_url": null
2029
+ },
2030
+ {
2031
+ "id": "the_body_shop_tbs071_200ml",
2032
+ "brand_en": "The Body Shop",
2033
+ "brand_zh": "美體小舖",
2034
+ "product_name_en": null,
2035
+ "product_name_zh": "美體小舖乳油木果修護身體滋養霜200ml",
2036
+ "category_en": null,
2037
+ "category_zh": null,
2038
+ "price_value": null,
2039
+ "price_currency": null,
2040
+ "source_url": null
2041
+ },
2042
+ {
2043
+ "id": "the_body_shop_tbs072_200ml",
2044
+ "brand_en": "The Body Shop",
2045
+ "brand_zh": "美體小舖",
2046
+ "product_name_en": null,
2047
+ "product_name_zh": "美體小舖辣木籽更新身體滋養霜200ml",
2048
+ "category_en": null,
2049
+ "category_zh": null,
2050
+ "price_value": null,
2051
+ "price_currency": null,
2052
+ "source_url": null
2053
+ },
2054
+ {
2055
+ "id": "the_body_shop_tbs074_200ml",
2056
+ "brand_en": "The Body Shop",
2057
+ "brand_zh": "美體小舖",
2058
+ "product_name_en": null,
2059
+ "product_name_zh": "美體小舖摩洛哥堅果油身體滋養霜200ml",
2060
+ "category_en": null,
2061
+ "category_zh": null,
2062
+ "price_value": null,
2063
+ "price_currency": null,
2064
+ "source_url": null
2065
+ },
2066
+ {
2067
+ "id": "the_body_shop_tbs081_200ml",
2068
+ "brand_en": "The Body Shop",
2069
+ "brand_zh": "美體小舖",
2070
+ "product_name_en": null,
2071
+ "product_name_zh": "美體小舖杏奶舒敏身體滋養霜200ml",
2072
+ "category_en": null,
2073
+ "category_zh": null,
2074
+ "price_value": null,
2075
+ "price_currency": null,
2076
+ "source_url": null
2077
+ },
2078
+ {
2079
+ "id": "the_body_shop_tbs082_200ml",
2080
+ "brand_en": "The Body Shop",
2081
+ "brand_zh": "美體小舖",
2082
+ "product_name_en": null,
2083
+ "product_name_zh": "美體小舖英皇玫瑰嫩膚身體滋養霜200ml",
2084
+ "category_en": null,
2085
+ "category_zh": null,
2086
+ "price_value": null,
2087
+ "price_currency": null,
2088
+ "source_url": null
2089
+ },
2090
+ {
2091
+ "id": "the_body_shop_tbs133_250ml",
2092
+ "brand_en": "The Body Shop",
2093
+ "brand_zh": "美體小舖",
2094
+ "product_name_en": null,
2095
+ "product_name_zh": "美體小舖英皇玫瑰嫩膚沐浴膠250ml",
2096
+ "category_en": null,
2097
+ "category_zh": null,
2098
+ "price_value": null,
2099
+ "price_currency": null,
2100
+ "source_url": null
2101
+ },
2102
+ {
2103
+ "id": "the_body_shop_tbs135_250ml",
2104
+ "brand_en": "The Body Shop",
2105
+ "brand_zh": "美體小舖",
2106
+ "product_name_en": null,
2107
+ "product_name_zh": "美體小舖草莓嫩白沐浴膠250ml",
2108
+ "category_en": null,
2109
+ "category_zh": null,
2110
+ "price_value": null,
2111
+ "price_currency": null,
2112
+ "source_url": null
2113
+ },
2114
+ {
2115
+ "id": "the_body_shop_tbs137_250ml",
2116
+ "brand_en": "The Body Shop",
2117
+ "brand_zh": "美體小舖",
2118
+ "product_name_en": null,
2119
+ "product_name_zh": "美體小舖杏奶舒敏滋養沐浴乳250ml",
2120
+ "category_en": null,
2121
+ "category_zh": null,
2122
+ "price_value": null,
2123
+ "price_currency": null,
2124
+ "source_url": null
2125
+ },
2126
+ {
2127
+ "id": "the_body_shop_tbs160_75ml",
2128
+ "brand_en": "The Body Shop",
2129
+ "brand_zh": "美體小舖",
2130
+ "product_name_en": null,
2131
+ "product_name_zh": "美體小舖漢蔘米糠元氣煥白面膜75ml",
2132
+ "category_en": null,
2133
+ "category_zh": null,
2134
+ "price_value": null,
2135
+ "price_currency": null,
2136
+ "source_url": null
2137
+ },
2138
+ {
2139
+ "id": "the_body_shop_tbs161_75ml",
2140
+ "brand_en": "The Body Shop",
2141
+ "brand_zh": "美體小舖",
2142
+ "product_name_en": null,
2143
+ "product_name_zh": "美體小舖日本抹茶防護抗老面膜75ml",
2144
+ "category_en": null,
2145
+ "category_zh": null,
2146
+ "price_value": null,
2147
+ "price_currency": null,
2148
+ "source_url": null
2149
+ },
2150
+ {
2151
+ "id": "the_body_shop_tbs162_75ml",
2152
+ "brand_en": "The Body Shop",
2153
+ "brand_zh": "美體小舖",
2154
+ "product_name_en": null,
2155
+ "product_name_zh": "美體小舖英皇玫瑰澎潤補水面膜75ml",
2156
+ "category_en": null,
2157
+ "category_zh": null,
2158
+ "price_value": null,
2159
+ "price_currency": null,
2160
+ "source_url": null
2161
+ },
2162
+ {
2163
+ "id": "the_body_shop_tbs054_400ml",
2164
+ "brand_en": "The Body Shop",
2165
+ "brand_zh": "美體小舖",
2166
+ "product_name_en": null,
2167
+ "product_name_zh": "美體小舖薑根鏗活調理洗髮精400ml",
2168
+ "category_en": null,
2169
+ "category_zh": null,
2170
+ "price_value": null,
2171
+ "price_currency": null,
2172
+ "source_url": null
2173
+ },
2174
+ {
2175
+ "id": "other_bi001_biorepair_75ml",
2176
+ "brand_en": "Other",
2177
+ "brand_zh": "其他品牌",
2178
+ "product_name_en": null,
2179
+ "product_name_zh": "Biorepair貝利達全效防護牙膏75ml(綠)",
2180
+ "category_en": null,
2181
+ "category_zh": null,
2182
+ "price_value": null,
2183
+ "price_currency": null,
2184
+ "source_url": null
2185
+ },
2186
+ {
2187
+ "id": "other_bi002_biorepair_75ml",
2188
+ "brand_en": "Other",
2189
+ "brand_zh": "其他品牌",
2190
+ "product_name_en": null,
2191
+ "product_name_zh": "Biorepair貝利達抗敏感牙膏75ml(紅)",
2192
+ "category_en": null,
2193
+ "category_zh": null,
2194
+ "price_value": null,
2195
+ "price_currency": null,
2196
+ "source_url": null
2197
+ },
2198
+ {
2199
+ "id": "other_bi003_biorepair_75ml",
2200
+ "brand_en": "Other",
2201
+ "brand_zh": "其他品牌",
2202
+ "product_name_en": null,
2203
+ "product_name_zh": "Biorepair貝利達護齦牙膏75ml(粉)",
2204
+ "category_en": null,
2205
+ "category_zh": null,
2206
+ "price_value": null,
2207
+ "price_currency": null,
2208
+ "source_url": null
2209
+ },
2210
+ {
2211
+ "id": "other_bi004_biorepair_75ml",
2212
+ "brand_en": "Other",
2213
+ "brand_zh": "其他品牌",
2214
+ "product_name_en": null,
2215
+ "product_name_zh": "Biorepair貝利達亮白修護牙膏75ml(白)",
2216
+ "category_en": null,
2217
+ "category_zh": null,
2218
+ "price_value": null,
2219
+ "price_currency": null,
2220
+ "source_url": null
2221
+ },
2222
+ {
2223
+ "id": "other_cd005_200ml",
2224
+ "brand_en": "Other",
2225
+ "brand_zh": "其他品牌",
2226
+ "product_name_en": null,
2227
+ "product_name_zh": "歐緹麗葡萄水噴霧200ml",
2228
+ "category_en": null,
2229
+ "category_zh": null,
2230
+ "price_value": null,
2231
+ "price_currency": null,
2232
+ "source_url": null
2233
+ },
2234
+ {
2235
+ "id": "other_cd008_100ml",
2236
+ "brand_en": "Other",
2237
+ "brand_zh": "其他品牌",
2238
+ "product_name_en": null,
2239
+ "product_name_zh": "歐緹麗葡萄籽活性化妝水100ml",
2240
+ "category_en": null,
2241
+ "category_zh": null,
2242
+ "price_value": null,
2243
+ "price_currency": null,
2244
+ "source_url": null
2245
+ },
2246
+ {
2247
+ "id": "other_dm001_40ml",
2248
+ "brand_en": "Other",
2249
+ "brand_zh": "其他品牌",
2250
+ "product_name_en": null,
2251
+ "product_name_zh": "朵瑪敏弱舒緩修復乳40ml",
2252
+ "category_en": null,
2253
+ "category_zh": null,
2254
+ "price_value": null,
2255
+ "price_currency": null,
2256
+ "source_url": null
2257
+ },
2258
+ {
2259
+ "id": "other_el001_embryolisse24_75ml",
2260
+ "brand_en": "Other",
2261
+ "brand_zh": "其他品牌",
2262
+ "product_name_en": null,
2263
+ "product_name_zh": "Embryolisse24小時神奇保濕乳75ml",
2264
+ "category_en": null,
2265
+ "category_zh": null,
2266
+ "price_value": null,
2267
+ "price_currency": null,
2268
+ "source_url": null
2269
+ },
2270
+ {
2271
+ "id": "other_el003_embryolisse24_75ml",
2272
+ "brand_en": "Other",
2273
+ "brand_zh": "其他品牌",
2274
+ "product_name_en": null,
2275
+ "product_name_zh": "Embryolisse24小時神奇保濕乳75ml-乾性肌",
2276
+ "category_en": null,
2277
+ "category_zh": null,
2278
+ "price_value": null,
2279
+ "price_currency": null,
2280
+ "source_url": null
2281
+ },
2282
+ {
2283
+ "id": "other_la002_75ml",
2284
+ "brand_en": "Other",
2285
+ "brand_zh": "其他品牌",
2286
+ "product_name_en": null,
2287
+ "product_name_zh": "黎瑞孕膚精華液75ml-兩入組",
2288
+ "category_en": null,
2289
+ "category_zh": null,
2290
+ "price_value": null,
2291
+ "price_currency": null,
2292
+ "source_url": null
2293
+ },
2294
+ {
2295
+ "id": "other_pg001_75ml",
2296
+ "brand_en": "Other",
2297
+ "brand_zh": "其他品牌",
2298
+ "product_name_en": null,
2299
+ "product_name_zh": "倍樂喜牙周保健牙膏75ml-粉",
2300
+ "category_en": null,
2301
+ "category_zh": null,
2302
+ "price_value": null,
2303
+ "price_currency": null,
2304
+ "source_url": null
2305
+ },
2306
+ {
2307
+ "id": "other_sg003_30ml",
2308
+ "brand_en": "Other",
2309
+ "brand_zh": "其他品牌",
2310
+ "product_name_en": null,
2311
+ "product_name_zh": "賽吉兒菁萃柔嫩乳霜30ml",
2312
+ "category_en": null,
2313
+ "category_zh": null,
2314
+ "price_value": null,
2315
+ "price_currency": null,
2316
+ "source_url": null
2317
+ },
2318
+ {
2319
+ "id": "other_sg005_500ml",
2320
+ "brand_en": "Other",
2321
+ "brand_zh": "其他品牌",
2322
+ "product_name_en": null,
2323
+ "product_name_zh": "賽吉兒菁萃潔浴凝露日用型500ml",
2324
+ "category_en": null,
2325
+ "category_zh": null,
2326
+ "price_value": null,
2327
+ "price_currency": null,
2328
+ "source_url": null
2329
+ },
2330
+ {
2331
+ "id": "other_sg009_250ml",
2332
+ "brand_en": "Other",
2333
+ "brand_zh": "其他品牌",
2334
+ "product_name_en": null,
2335
+ "product_name_zh": "賽吉兒菁萃婦潔凝露黃金女郎250ml",
2336
+ "category_en": null,
2337
+ "category_zh": null,
2338
+ "price_value": null,
2339
+ "price_currency": null,
2340
+ "source_url": null
2341
+ },
2342
+ {
2343
+ "id": "other_sg010_500ml",
2344
+ "brand_en": "Other",
2345
+ "brand_zh": "其他品牌",
2346
+ "product_name_en": null,
2347
+ "product_name_zh": "賽吉兒菁萃婦潔凝露500ml",
2348
+ "category_en": null,
2349
+ "category_zh": null,
2350
+ "price_value": null,
2351
+ "price_currency": null,
2352
+ "source_url": null
2353
+ },
2354
+ {
2355
+ "id": "other_ur012_300ml",
2356
+ "brand_en": "Other",
2357
+ "brand_zh": "其他品牌",
2358
+ "product_name_en": null,
2359
+ "product_name_zh": "優麗雅含氧等滲透壓活泉噴霧300ml",
2360
+ "category_en": null,
2361
+ "category_zh": null,
2362
+ "price_value": null,
2363
+ "price_currency": null,
2364
+ "source_url": null
2365
+ },
2366
+ {
2367
+ "id": "other_ur025_4g",
2368
+ "brand_en": "Other",
2369
+ "brand_zh": "其他品牌",
2370
+ "product_name_en": null,
2371
+ "product_name_zh": "優麗雅保濕護唇膏4g",
2372
+ "category_en": null,
2373
+ "category_zh": null,
2374
+ "price_value": null,
2375
+ "price_currency": null,
2376
+ "source_url": null
2377
+ },
2378
+ {
2379
+ "id": "other_vc004_300ml",
2380
+ "brand_en": "Other",
2381
+ "brand_zh": "其他品牌",
2382
+ "product_name_en": null,
2383
+ "product_name_zh": "薇姿溫泉舒緩噴霧300ml",
2384
+ "category_en": null,
2385
+ "category_zh": null,
2386
+ "price_value": null,
2387
+ "price_currency": null,
2388
+ "source_url": null
2389
+ },
2390
+ {
2391
+ "id": "other_vc013_r_360_15ml",
2392
+ "brand_en": "Other",
2393
+ "brand_zh": "其他品牌",
2394
+ "product_name_en": null,
2395
+ "product_name_zh": "薇姿R激光360度全能眼霜15ml",
2396
+ "category_en": null,
2397
+ "category_zh": null,
2398
+ "price_value": null,
2399
+ "price_currency": null,
2400
+ "source_url": null
2401
+ },
2402
+ {
2403
+ "id": "other_vc045_m89_50ml",
2404
+ "brand_en": "Other",
2405
+ "brand_zh": "其他品牌",
2406
+ "product_name_en": null,
2407
+ "product_name_zh": "薇姿M89火山能量微精華50ml",
2408
+ "category_en": null,
2409
+ "category_zh": null,
2410
+ "price_value": null,
2411
+ "price_currency": null,
2412
+ "source_url": null
2413
+ },
2414
+ {
2415
+ "id": "other_xp001_xhekpon_40ml",
2416
+ "brand_en": "Other",
2417
+ "brand_zh": "其他品牌",
2418
+ "product_name_en": null,
2419
+ "product_name_zh": "Xhekpon西班牙頸紋霜40ml",
2420
+ "category_en": null,
2421
+ "category_zh": null,
2422
+ "price_value": null,
2423
+ "price_currency": null,
2424
+ "source_url": null
2425
+ }
2426
+ ]
requirements.txt CHANGED
@@ -16,4 +16,7 @@ gradio_client==1.3.0
16
 
17
  pydantic==2.10.6
18
 
19
- pillow
 
 
 
 
16
 
17
  pydantic==2.10.6
18
 
19
+ pillow
20
+
21
+ faiss-cpu
22
+ sentence-transformers
tools/build_index.py ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os, json, faiss, numpy as np
2
+ from pathlib import Path
3
+ from sentence_transformers import SentenceTransformer
4
+
5
+ DATA_CANDIDATES = [
6
+ "data/cosmetics_full_en_zh.jsonl",
7
+ "data/cosmetic_full_en_zh.jsonl", # user variant
8
+ "cosmetics_full_en_zh.jsonl",
9
+ "cosmetic_full_en_zh.jsonl",
10
+ ]
11
+
12
+ def find_dataset():
13
+ for p in DATA_CANDIDATES:
14
+ if os.path.exists(p):
15
+ return p
16
+ raise FileNotFoundError("Could not find dataset. Put it at data/cosmetics_full_en_zh.jsonl (or cosmetic_full_en_zh.jsonl).")
17
+
18
+ DATA_PATH = find_dataset()
19
+ INDEX_DIR = Path("indexes"); INDEX_DIR.mkdir(parents=True, exist_ok=True)
20
+ INDEX_PATH = INDEX_DIR / "cosmetics_faiss_ip.index"
21
+ META_PATH = INDEX_DIR / "cosmetics_meta.json"
22
+
23
+ print(f"✅ Using dataset: {DATA_PATH}")
24
+
25
+ # 1) Load
26
+ records = [json.loads(l) for l in open(DATA_PATH, "r", encoding="utf-8")]
27
+
28
+ # 2) Build the text to embed (EN + ZH)
29
+ def text_of(r):
30
+ return " \n".join([
31
+ str(r.get("product_name_en") or ""),
32
+ str(r.get("product_name_zh") or ""),
33
+ str(r.get("category_en") or ""),
34
+ str(r.get("category_zh") or ""),
35
+ str(r.get("description_en") or ""),
36
+ str(r.get("description_zh") or ""),
37
+ str(r.get("concerns_en") or ""),
38
+ str(r.get("concerns_zh") or ""),
39
+ str(r.get("key_ingredients_en") or ""),
40
+ str(r.get("key_ingredients_zh") or ""),
41
+ str(r.get("usage_en") or ""),
42
+ str(r.get("usage_zh") or ""),
43
+ ]).strip()
44
+
45
+ corpus = [text_of(r) for r in records]
46
+
47
+ # 3) Encode (multilingual)
48
+ model_id = os.environ.get("EMB_MODEL_ID", "intfloat/multilingual-e5-base")
49
+ print(f"🧠 Embedding with: {model_id}")
50
+ model = SentenceTransformer(model_id)
51
+ embs = model.encode(corpus, normalize_embeddings=True, batch_size=64)
52
+
53
+ # 4) FAISS index (cosine via inner product on normalized vectors)
54
+ d = embs.shape[1]
55
+ index = faiss.IndexFlatIP(d)
56
+ index.add(embs.astype("float32"))
57
+ faiss.write_index(index, str(INDEX_PATH))
58
+
59
+ # 5) Light metadata (quick lookup after search)
60
+ meta = []
61
+ for r in records:
62
+ meta.append({
63
+ "id": r.get("id"),
64
+ "brand_en": r.get("brand_en"),
65
+ "brand_zh": r.get("brand_zh"),
66
+ "product_name_en": r.get("product_name_en"),
67
+ "product_name_zh": r.get("product_name_zh"),
68
+ "category_en": r.get("category_en"),
69
+ "category_zh": r.get("category_zh"),
70
+ "price_value": r.get("price_value"),
71
+ "price_currency": r.get("price_currency"),
72
+ "source_url": r.get("source_url"),
73
+ })
74
+
75
+ with open(META_PATH, "w", encoding="utf-8") as f:
76
+ json.dump(meta, f, ensure_ascii=False, indent=2)
77
+
78
+ print("🎉 Built index + metadata")
79
+ print(f" - {INDEX_PATH}")
80
+ print(f" - {META_PATH}")
tools/reranker.py ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # /tools/reranker.py
2
+ from transformers import AutoTokenizer, AutoModelForSequenceClassification
3
+ import torch
4
+
5
+ class Reranker:
6
+ def __init__(self, model_id="BAAI/bge-reranker-base"):
7
+ self.tokenizer = AutoTokenizer.from_pretrained(model_id)
8
+ self.model = AutoModelForSequenceClassification.from_pretrained(model_id)
9
+ self.model.eval()
10
+
11
+ @torch.no_grad()
12
+ def rerank(self, query: str, docs: list[str], top_k: int = 5):
13
+ """Re-rank a list of doc texts for a query and return sorted indices."""
14
+ pairs = [(query, d) for d in docs]
15
+ inputs = self.tokenizer(
16
+ pairs,
17
+ padding=True,
18
+ truncation=True,
19
+ return_tensors="pt",
20
+ max_length=512
21
+ )
22
+ scores = self.model(**inputs, return_dict=True).logits.squeeze(-1)
23
+ sorted_ids = torch.argsort(scores, descending=True)
24
+ top = sorted_ids[:top_k]
25
+ return top.tolist(), scores[top].tolist()
tools/retriever.py ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os, json, faiss, numpy as np
2
+ from pathlib import Path
3
+ from sentence_transformers import SentenceTransformer
4
+ # from tools.retriever import search
5
+ # from tools.reranker import Reranker
6
+
7
+ INDEX_PATH = os.environ.get("INDEX_PATH", "indexes/cosmetics_faiss_ip.index")
8
+ META_PATH = os.environ.get("META_PATH", "indexes/cosmetics_meta.json")
9
+ EMB_MODEL = os.environ.get("EMB_MODEL_ID", "intfloat/multilingual-e5-base")
10
+
11
+ _embedder = None
12
+ _index = None
13
+ _meta = None
14
+ # reranker = Reranker()
15
+
16
+ # def refined_search(query, k_initial=20, k_final=5):
17
+ # # 1. retrieve coarse top-20
18
+ # cands = search(query, k=k_initial)
19
+ # texts = [f"{c['brand_en']} {c['product_name_en']} {c['description_en']}" for c in cands]
20
+
21
+ # # 2. re-rank with cross-encoder
22
+ # idxs, scores = reranker.rerank(query, texts, top_k=k_final)
23
+ # return [cands[i] | {"rerank_score": scores[j]} for j, i in enumerate(idxs)]
24
+
25
+ def _load():
26
+ global _embedder, _index, _meta
27
+ if _embedder is None:
28
+ _embedder = SentenceTransformer(EMB_MODEL)
29
+ if _index is None:
30
+ _index = faiss.read_index(INDEX_PATH)
31
+ if _meta is None:
32
+ _meta = json.load(open(META_PATH, "r", encoding="utf-8"))
33
+ return _embedder, _index, _meta
34
+
35
+ def search(query: str, k: int = 8):
36
+ emb, idx, meta = _load()
37
+ q = emb.encode([query], normalize_embeddings=True).astype("float32")
38
+ D, I = idx.search(q, k)
39
+ out = []
40
+ for score, i in zip(D[0], I[0]):
41
+ if int(i) < 0: # in case FAISS returns -1 for empty index
42
+ continue
43
+ m = meta[int(i)]
44
+ m["_score"] = float(score)
45
+ out.append(m)
46
+ return out