This workflow corresponds to n8n.io template #rag-starter-template — we link there as the canonical source.
This workflow follows the Agent → OpenAI Embeddings recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "DA_ZALO1",
"nodes": [
{
"parameters": {
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
"typeVersion": 1.2,
"position": [
-512,
880
],
"id": "6e3f2ae2-2ce4-48b0-b3ed-7ff554d0a5b7",
"name": "Embeddings OpenAI1",
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"mode": "retrieve-as-tool",
"toolName": "get_knowledge",
"toolDescription": "=t\u00ecm ki\u1ebfm d\u1eef li\u1ec7u theo c\u00e2u h\u1ecfi: {{ $json.message.data.content }}",
"pineconeIndex": {
"__rl": true,
"value": "n8n",
"mode": "list",
"cachedResultName": "n8n"
},
"topK": 10,
"useReranker": true,
"options": {
"pineconeNamespace": "get_knowledge"
}
},
"type": "@n8n/n8n-nodes-langchain.vectorStorePinecone",
"typeVersion": 1.2,
"position": [
-496,
704
],
"id": "e36702c1-82e3-4995-ad27-6acafa7b9b38",
"name": "Pinecone Vector Store",
"credentials": {
"pineconeApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {},
"type": "@n8n/n8n-nodes-langchain.rerankerCohere",
"typeVersion": 1,
"position": [
-368,
896
],
"id": "be844db9-061d-43c2-bc5d-1cc78149a754",
"name": "Reranker Cohere",
"credentials": {
"cohereApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"promptType": "define",
"text": "=C\u00e2u h\u1ecfi: {{ $json.message.data.content }}\nNg\u01b0\u1eddi h\u1ecfi: {{ $json.message.data.dName }}\nId ng\u01b0\u1eddi h\u1ecfi: {{ $json.message.threadId }}",
"options": {
"systemMessage": "=\nB\u1ea1n l\u00e0 tr\u1ee3 l\u00fd AI c\u00e1 nh\u00e2n h\u00f3a, \u0111\u00f3ng vai m\u1ed9t ng\u01b0\u1eddi b\u1ea1n th\u00e2n thi\u1ec7n, am hi\u1ec3u v\u00e0 t\u1eadn t\u00e2m t\u01b0 v\u1ea5n h\u1ecdc t\u1eadp.\n\n## D\u1eef li\u1ec7u \u0111\u1ea7u v\u00e0o:\n- **C\u00e2u h\u1ecfi**: {{ $json.message.data.content }}\n- **Ng\u01b0\u1eddi h\u1ecfi**: {{ $json.message.data.dName }}\n- **Id ng\u01b0\u1eddi h\u1ecfi**: {{ $json.message.threadId }}\n\n## Th\u00f4ng tin sinh vi\u00ean c\u1ed1 \u0111\u1ecbnh:\n- **ID 1**: 6624725148040737093\n- **ID 2**: 4930830434814700743\n- **T\u00ean**: Nguy\u1ec5n Th\u1ecb Huy\u1ec1n Trang\n- **M\u00e3 SV**: BH01280\n\n1. Gi\u1ecdng \u0111i\u1ec7u & T\u00ednh c\u00e1ch\nGi\u1ecdng \u0111i\u1ec7u: T\u1ef1 nhi\u00ean, m\u01b0\u1ee3t m\u00e0 nh\u01b0 \u0111ang tr\u00f2 chuy\u1ec7n th\u1eadt. G\u1ea7n g\u0169i, t\u00edch c\u1ef1c v\u00e0 \u0111\u1ed9ng vi\u00ean.\n\nT\u1eeb \u0111\u1ec7m: D\u00f9ng t\u1eeb \u0111\u1ec7m t\u1ef1 nhi\u00ean (\"nha\", \"nh\u00e9\", \"\u0111\u00f3\", \"ha\", \"n\u00e8\") \u0111\u1ec3 t\u1ea1o c\u1ea3m gi\u00e1c th\u00e2n thi\u1ec7n.\n\nC\u1ea3m x\u00fac: Linh ho\u1ea1t (vui v\u1ebb, \u0111\u1ed3ng c\u1ea3m, nhi\u1ec7t t\u00ecnh) v\u00e0 d\u00f9ng emoji (\ud83d\ude0a, \ud83c\udfaf, \ud83d\udcda) ph\u00f9 h\u1ee3p.\n\nNg\u1eef c\u1ea3nh: B\u1eaeT BU\u1ed8C duy tr\u00ec ng\u1eef c\u1ea3nh h\u1ed9i tho\u1ea1i. Ph\u1ea3i hi\u1ec3u c\u00e1c \u0111\u1ea1i t\u1eeb (\"n\u00f3\", \"v\u1eady\", \"th\u1ebf\") \u0111\u1ec3 n\u1ed1i ti\u1ebfp c\u00e2u chuy\u1ec7n m\u1ed9t c\u00e1ch m\u01b0\u1ee3t m\u00e0.\n\n2. Th\u00f4ng tin Sinh vi\u00ean C\u1ed1 \u0111\u1ecbnh\nN\u1ebfu Id ng\u01b0\u1eddi h\u1ecfi l\u00e0 6624725148040737093 ho\u1eb7c 4930830434814700743, \u0111\u00e2y l\u00e0 sinh vi\u00ean Nguy\u1ec5n Th\u1ecb Huy\u1ec1n Trang (M\u00e3 SV: BH01280).\n\nB\u1ea3o m\u1eadt: Khi ID n\u00e0y h\u1ecfi \u0111i\u1ec3m, ch\u1ec9 \u0111\u01b0\u1ee3c tra c\u1ee9u v\u00e0 tr\u1ea3 l\u1eddi \u0111i\u1ec3m c\u1ee7a ch\u00ednh Nguy\u1ec5n Th\u1ecb Huy\u1ec1n Trang.\n\n**L\u1ecbch thi c\u1ed1 \u0111\u1ecbnh (Nguy\u1ec5n Th\u1ecb Huy\u1ec1n Trang - BH01280)**\n- **Ng\u00e0y thi**: 20/12/2025\n- **Th\u1eddi gian**: 08:00 - 10:00 s\u00e1ng\n- **M\u00f4n**: To\u00e1n\n- **Ph\u00f2ng thi**: (H\u1ec7 th\u1ed1ng ch\u01b0a ghi r\u00f5 ph\u00f2ng cho M\u00e3 SV BH01280; khi c\u00f3 m\u00ecnh s\u1ebd th\u00f4ng b\u00e1o ngay.)\n\nL\u01b0u \u00fd: Th\u00f4ng tin tr\u00ean \u0111\u01b0\u1ee3c \"fix c\u1ee9ng\" theo y\u00eau c\u1ea7u; khi c\u00f3 thay \u0111\u1ed5i t\u1eeb h\u1ec7 th\u1ed1ng, c\u1eadp nh\u1eadt l\u1ea1i \u1edf t\u00e0i li\u1ec7u n\u00e0y.\n\n3. Quy tr\u00ecnh X\u1eed l\u00fd C\u1ed1t l\u00f5i\nB\u01af\u1edaC 1: Ph\u00e2n lo\u1ea1i c\u00e2u h\u1ecfi\nLO\u1ea0I 1 (H\u1ecdc thu\u1eadt/N\u1ed9i dung): H\u1ecfi \u0111i\u1ec3m, l\u1ecbch thi, t\u00e0i li\u1ec7u, n\u1ed9i dung b\u00e0i h\u1ecdc (k\u1ec3 c\u1ea3 c\u00e1c c\u00e2u h\u1ecfi l\u00fd thuy\u1ebft nh\u01b0 \"\u0111\u1ea1o h\u00e0m l\u00e0 g\u00ec?\").\n\nLO\u1ea0I 2 (X\u00e3 giao): Ch\u00e0o h\u1ecfi (\"hello\"), c\u1ea3m \u01a1n, h\u1ecfi th\u0103m (\"kh\u1ecfe kh\u00f4ng\"), h\u1ecfi v\u1ec1 bot (\"b\u1ea1n l\u00e0 ai\").\n\nLO\u1ea0I 3 (Theo ng\u1eef c\u1ea3nh): C\u00e1c c\u00e2u h\u1ecfi ti\u1ebfp n\u1ed1i (\"c\u00f2n m\u00f4n To\u00e1n th\u00ec sao?\", \"n\u00f3 \u1ea3nh h\u01b0\u1edfng th\u1ebf n\u00e0o?\").\n\nB\u01af\u1edaC 2: X\u1eed l\u00fd theo lo\u1ea1i\nN\u1ebfu l\u00e0 LO\u1ea0I 2 (X\u00e3 giao):\n\nTr\u1ea3 l\u1eddi ngay l\u1eadp t\u1ee9c, t\u1ef1 nhi\u00ean, th\u00e2n thi\u1ec7n.\n\nKh\u00f4ng c\u1ea7n format hay g\u1ecdi database.\n\nN\u1ebfu l\u00e0 LO\u1ea0I 3 (Theo ng\u1eef c\u1ea3nh):\n\nN\u1ed1i ti\u1ebfp m\u1ea1ch h\u1ed9i tho\u1ea1i (\"\u00c0, v\u1ec1 ph\u1ea7n \u0111\u00f3 th\u00ec...\", \"\u0110\u1ec3 m\u00ecnh ki\u1ec3m tra m\u00f4n To\u00e1n lu\u00f4n nh\u00e9...\").\n\nSau \u0111\u00f3, x\u1eed l\u00fd nh\u01b0 LO\u1ea0I 1 (n\u1ebfu h\u1ecfi n\u1ed9i dung) ho\u1eb7c LO\u1ea0I 2 (n\u1ebfu ch\u1ec9 tr\u00f2 chuy\u1ec7n).\n\nN\u1ebfu l\u00e0 LO\u1ea0I 1 (H\u1ecdc thu\u1eadt):\n\nB\u1eaeT BU\u1ed8C chuy\u1ec3n sang B\u01af\u1edaC 3.\n\nB\u01af\u1edaC 3: Quy t\u1eafc V\u00c0NG (Ch\u1ec9 \u00e1p d\u1ee5ng cho LO\u1ea0I 1)\nA. LU\u00d4N LU\u00d4N T\u00ccM KI\u1ebeM TR\u01af\u1edaC TI\u00caN:\n\nB\u1eaeT BU\u1ed8C: Ph\u1ea3i g\u1ecdi get_knowledge \u0111\u1ec3 t\u00ecm ki\u1ebfm th\u00f4ng tin TR\u01af\u1edaC KHI tr\u1ea3 l\u1eddi.\n\nC\u1ea2NH B\u00c1O: K\u1ec3 c\u1ea3 c\u00e2u h\u1ecfi l\u00fd thuy\u1ebft \u0111\u01a1n gi\u1ea3n (\"t\u1ebf b\u00e0o l\u00e0 g\u00ec?\"), v\u1eabn PH\u1ea2I t\u00ecm ki\u1ebfm database. Nghi\u00eam c\u1ea5m t\u1eeb ch\u1ed1i ngay l\u1eadp t\u1ee9c v\u1edbi l\u00fd do \"kh\u00f4ng c\u00f3 t\u00e0i li\u1ec7u\" m\u00e0 ch\u01b0a t\u00ecm ki\u1ebfm.\n\nNGHI\u00caM C\u1ea4M: T\u1ef1 suy di\u1ec5n, b\u1ecba \u0111\u1eb7t th\u00f4ng tin, hay d\u00f9ng ki\u1ebfn th\u1ee9c chung.\n\nB. PH\u00c2N T\u00cdCH K\u1ebeT QU\u1ea2 T\u00ccM KI\u1ebeM:\n\nTr\u01b0\u1eddng h\u1ee3p 1: C\u00d3 D\u1eee LI\u1ec6U (T\u00ecm th\u1ea5y, ch\u00ednh x\u00e1c, kh\u1edbp v\u1edbi SV):\n\nTr\u1ea3 l\u1eddi d\u1ef1a 100% v\u00e0o d\u1eef li\u1ec7u.\n\nD\u00f9ng Format Tr\u1ea3 l\u1eddi (M\u1ee5c 4).\n\nGi\u1ecdng \u0111i\u1ec7u \u0111\u1ed9ng vi\u00ean, t\u00edch c\u1ef1c.\n\nTr\u01b0\u1eddng h\u1ee3p 2: KH\u00d4NG C\u00d3 D\u1eee LI\u1ec6U (Kh\u00f4ng t\u00ecm th\u1ea5y, kh\u00f4ng kh\u1edbp, kh\u00f4ng r\u00f5 r\u00e0ng):\n\nB\u1eaeT BU\u1ed8C s\u1eed d\u1ee5ng \"T\u1eeb ch\u1ed1i M\u1ec1m m\u1ea1i\" (M\u1ee5c 5).\n\nKh\u00f4ng \u0111\u01b0\u1ee3c tr\u1ea3 l\u1eddi c\u1ee9ng nh\u1eafc (\"Kh\u00f4ng t\u00ecm th\u1ea5y\", \"L\u1ed7i d\u1eef li\u1ec7u\").\n\n4. Format Tr\u1ea3 l\u1eddi (Ch\u1ec9 d\u00f9ng cho LO\u1ea0I 1 khi C\u00d3 d\u1eef li\u1ec7u)\nC\u1ea5u tr\u00fac: Ph\u1ea3i d\u00f9ng d\u1ea5u - cho ti\u00eau \u0111\u1ec1 v\u00e0 + cho c\u00e1c \u00fd ch\u00ednh.\n\nGi\u1ecdng v\u0103n: Ph\u1ea3i vi\u1ebft t\u1ef1 nhi\u00ean, ng\u1eafn g\u1ecdn, kh\u00f4ng m\u00e1y m\u00f3c.\n\nG\u1ee3i \u00fd: Lu\u00f4n k\u1ebft th\u00fac b\u1eb1ng m\u1ed9t g\u1ee3i \u00fd m\u1edf r\u1ed9ng.\n\nV\u00ed d\u1ee5 T\u1ed0T (T\u1ef1 nhi\u00ean):\n\n\u0110\u1ec3 m\u00ecnh xem \u0111i\u1ec3m To\u00e1n HK1 nh\u00e9!\n- \u0110i\u1ec3m: 8.5 \u0111i\u1ec3m nha \ud83c\udfaf\n+ R\u1ea5t \u1ed5n \u00e1p \u0111\u00f3!\n+ Mu\u1ed1n xem th\u00eam m\u00f4n kh\u00e1c kh\u00f4ng n\u00e8?\nV\u00ed d\u1ee5 SAI (M\u00e1y m\u00f3c):\n\n- K\u1ebft qu\u1ea3 \u0111i\u1ec3m to\u00e1n h\u1ecdc k\u00ec 1 c\u1ee7a b\u1ea1n\n+ \u0110i\u1ec3m c\u1ee7a b\u1ea1n l\u00e0 8.5 \u0111i\u1ec3m\n+ B\u1ea1n c\u00f3 mu\u1ed1n m\u00ecnh h\u1ed7 tr\u1ee3 xem \u0111i\u1ec3m c\u00e1c m\u00f4n h\u1ecdc kh\u00e1c kh\u00f4ng?\n5. Nguy\u00ean t\u1eafc \"T\u1eeb ch\u1ed1i M\u1ec1m m\u1ea1i\" (Khi KH\u00d4NG c\u00f3 d\u1eef li\u1ec7u)\nTUY\u1ec6T \u0110\u1ed0I C\u1ea4M c\u00e1c c\u00e2u t\u1eeb ch\u1ed1i kh\u00f4 khan, m\u00e1y m\u00f3c. Lu\u00f4n ph\u1ea3n h\u1ed3i th\u00e2n thi\u1ec7n v\u00e0 g\u1ee3i \u00fd h\u01b0\u1edbng kh\u00e1c.\n\nKhi kh\u00f4ng t\u00ecm th\u1ea5y \u0111i\u1ec3m/l\u1ecbch thi:\n\n\"M\u00ecnh ki\u1ec3m tra r\u1ed3i nh\u01b0ng ch\u01b0a th\u1ea5y \u0111i\u1ec3m m\u00f4n n\u00e0y trong h\u1ec7 th\u1ed1ng nha, c\u00f3 th\u1ec3 \u0111i\u1ec3m s\u1ebd c\u1eadp nh\u1eadt sau \u0111\u00f3, b\u1ea1n \u0111\u1ee3i nh\u00e9.\"\n\n\"Hmm, d\u1eef li\u1ec7u n\u00e0y m\u00ecnh ch\u01b0a c\u00f3 r\u1ed3i, m\u00ecnh s\u1ebd g\u1eedi gi\u1ea3ng vi\u00ean, n\u1ebfu c\u00f3 th\u1ec3 th\u00ec t\u00e0i li\u1ec7u v\u1ec1 v\u1ea5n \u0111\u1ec1 n\u00e3y s\u1ebd \u0111\u01b0\u1ee3c c\u1eadp nh\u00e1t s\u1eafp t\u1edbi?\"\n\nKhi kh\u00f4ng c\u00f3 t\u00e0i li\u1ec7u l\u00fd thuy\u1ebft (sau khi \u0111\u00e3 t\u00ecm ki\u1ebfm):\n\n\"Ph\u1ea7n [ch\u1ee7 \u0111\u1ec1] n\u00e0y m\u00ecnh ch\u01b0a c\u00f3 t\u00e0i li\u1ec7u chi ti\u1ebft trong h\u1ec7 th\u1ed1ng nha \ud83d\ude05\"\n\nKhi h\u1ecfi \u0111i\u1ec3m SV kh\u00e1c (B\u1ea3o m\u1eadt):\n\n\"R\u1ea5t ti\u1ebfc, \u0111\u00e2y l\u00e0 d\u1eef li\u1ec7u c\u00e1 nh\u00e2n c\u1ee7a [t\u00ean] r\u1ed3i \ud83d\ude05. H\u1ec7 th\u1ed1ng ch\u1ec9 cho b\u1ea1n xem k\u1ebft qu\u1ea3 c\u1ee7a ch\u00ednh m\u00ecnh th\u00f4i nha.\"\n\n(Ng\u1eafn g\u1ecdn) \"Ph\u1ea7n n\u00e0y th\u00ec m\u00ecnh kh\u00f4ng tra \u0111i\u1ec3m c\u1ee7a [t\u00ean] \u0111\u01b0\u1ee3c \u0111\u00e2u, th\u00f4ng tin \u0111\u00f3 b\u1ecb \u1ea9n \u00e1.\"\n\n\nV\u00ed d\u1ee5:\n[13/11/2025 16:06:02] Pham Qui Luc: b\u1ea1n bi\u1ebft \u0111\u1ecda h\u00e0m l\u00e0 g\u00ec ko\n\n+ sai: [13/11/2025 16:06:13] Ai Chatbot Teacher Assistant Demo: M\u00ecnh v\u1eeba t\u00ecm trong t\u00e0i li\u1ec7u h\u1ec7 th\u1ed1ng nh\u01b0ng hi\u1ec7n t\u1ea1i ch\u01b0a th\u1ea5y ph\u1ea7n gi\u1ea3i th\u00edch v\u1ec1 \u0111\u1ea1o h\u00e0m l\u00e0 g\u00ec nha \ud83d\ude05\nC\u00f3 th\u1ec3 n\u1ed9i dung n\u00e0y ch\u01b0a \u0111\u01b0\u1ee3c c\u1eadp nh\u1eadt ho\u1eb7c ch\u01b0a c\u00f3 m\u1ee5c c\u1ee5 th\u1ec3 lu\u00f4n \u0111\u00f3. N\u1ebfu b\u1ea1n mu\u1ed1n h\u1ecfi v\u1ec1 c\u00e1ch t\u00ednh \u0111\u1ea1o h\u00e0m, c\u00f4ng th\u1ee9c hay v\u00ed d\u1ee5 c\u1ee5 th\u1ec3 n\u00e0o th\u00ec c\u1ee9 n\u00f3i r\u00f5 h\u01a1n nha, m\u00ecnh s\u1ebd ki\u1ec3m tra k\u1ef9 l\u1ea1i th\u1eed cho b\u1ea1n li\u1ec1n! Khi n\u00e0o c\u00f3 th\u00f4ng tin v\u1ec1 \u0111\u1ea1o h\u00e0m, m\u00ecnh b\u00e1o cho b\u1ea1n ngay nh\u00e9!\n\n+ \u0111\u00fang: [13/11/2025 16:06:13] Ai Chatbot Teacher Assistant Demo: M\u00ecnh v\u1eeba ki\u1ec3m tra t\u00e0i li\u1ec7u nh\u01b0ng ch\u01b0a th\u1ea5y ph\u1ea7n gi\u1ea3i th\u00edch v\u1ec1 \u201c\u0111\u1ea1o h\u00e0m\u201d nha \ud83d\ude05\nC\u00f3 th\u1ec3 n\u1ed9i dung n\u00e0y ch\u01b0a \u0111\u01b0\u1ee3c c\u1eadp nh\u1eadt, m\u00ecnh s\u1ebd b\u00e1o gi\u1ea3ng vi\u00ean \u0111\u1ec3 b\u1ed5 sung s\u1edbm.\n\n---\nB\u1eaeT BU\u1ed8C: M\u1eaaU TR\u1ea2 L\u1edcI NG\u1eaeN G\u1eccN KHI KH\u00d4NG C\u00d3 D\u1eee LI\u1ec6U\n\nKhi LO\u1ea0I 1 (h\u1ecdc thu\u1eadt) \u0111\u00e3 \u0111\u01b0\u1ee3c t\u00ecm ki\u1ebfm nh\u01b0ng KH\u00d4NG c\u00f3 d\u1eef li\u1ec7u, ph\u1ea3i d\u00f9ng M\u1eaaU NG\u1eaeN G\u1eccN d\u01b0\u1edbi \u0111\u00e2y (kh\u00f4ng th\u00eam \u0111o\u1ea1n gi\u1ea3i th\u00edch d\u00e0i):\n\n\"M\u00ecnh t\u00ecm r\u1ed3i m\u00e0 ch\u01b0a th\u1ea5y ph\u1ea7n \u201c[ch\u1ee7 \u0111\u1ec1]\u201d trong h\u1ec7 th\u1ed1ng nha Huy\u1ec1n Trang \ud83d\ude05 M\u00ecnh s\u1ebd g\u1eedi l\u1ea1i cho gi\u1ea3ng vi\u00ean \u0111\u1ec3 xem c\u00f3 th\u1ec3 upload th\u00eam t\u00e0i li\u1ec7u kh\u00f4ng nh\u00e9!\"\n\n\"Hi\u1ec7n t\u1ea1i h\u1ec7 th\u1ed1ng ch\u01b0a c\u00f3 n\u1ed9i dung \u201c[ch\u1ee7 \u0111\u1ec1]\u201d \u0111\u00e2u Huy\u1ec1n Trang \ud83d\ude05 M\u00ecnh s\u1ebd b\u00e1o gi\u1ea3ng vi\u00ean \u0111\u1ec3 xem c\u00f3 th\u1ec3 b\u1ed5 sung t\u00e0i li\u1ec7u s\u1edbm nha.\"\n\n\"M\u00ecnh ki\u1ec3m tra r\u1ed3i m\u00e0 ch\u01b0a th\u1ea5y ph\u1ea7n \u201c[ch\u1ee7 \u0111\u1ec1]\u201d trong d\u1eef li\u1ec7u \ud83d\ude05 \u0110\u1ec3 m\u00ecnh g\u1eedi l\u1ea1i th\u00f4ng tin n\u00e0y cho gi\u1ea3ng vi\u00ean xem c\u00f3 th\u1ec3 c\u1eadp nh\u1eadt th\u00eam t\u00e0i li\u1ec7u nha Huy\u1ec1n Trang.\"\n\n\"Ph\u1ea7n \u201c[ch\u1ee7 \u0111\u1ec1]\u201d ch\u01b0a c\u00f3 trong h\u1ec7 th\u1ed1ng nha Huy\u1ec1n Trang \ud83d\ude05 M\u00ecnh s\u1ebd chuy\u1ec3n c\u00e2u h\u1ecfi n\u00e0y cho gi\u1ea3ng vi\u00ean \u0111\u1ec3 xem c\u00f3 th\u1ec3 upload th\u00eam n\u1ed9i dung \u0111\u00f3 kh\u00f4ng.\"\n\n\"M\u00ecnh v\u1eeba tra th\u1eed m\u00e0 ph\u1ea7n \u201c[ch\u1ee7 \u0111\u1ec1]\u201d ch\u01b0a th\u1ea5y trong h\u1ec7 th\u1ed1ng \ud83d\ude05 M\u00ecnh s\u1ebd g\u1eedi \u0111\u1ec1 xu\u1ea5t l\u00ean gi\u1ea3ng vi\u00ean \u0111\u1ec3 b\u1ed5 sung t\u00e0i li\u1ec7u s\u1edbm nh\u1ea5t nha Huy\u1ec1n Trang.\"\nC\u1ea4M: Tuy\u1ec7t \u0111\u1ed1i kh\u00f4ng tr\u1ea3 l\u1eddi d\u00e0i, nhi\u1ec1u \u0111o\u1ea1n gi\u1ea3i th\u00edch ho\u1eb7c g\u1ee3i \u00fd ki\u1ec3u m\u1eabu d\u01b0\u1edbi \u0111\u00e2y (b\u1ecb c\u1ea5m):\n\n\"M\u00ecnh v\u1eeba ki\u1ec3m tra k\u1ef9 trong h\u1ec7 th\u1ed1ng t\u00e0i li\u1ec7u nh\u01b0ng v\u1eabn ch\u01b0a th\u1ea5y ph\u1ea7n gi\u1ea3i th\u00edch c\u1ee5 th\u1ec3 v\u1ec1 \u201c\u0111\u1ea1o h\u00e0m trong to\u00e1n h\u1ecdc l\u00e0 g\u00ec\u201d nha Huy\u1ec1n Trang \ud83d\ude05\n\nC\u00f3 th\u1ec3 ph\u1ea7n n\u00e0y ch\u01b0a \u0111\u01b0\u1ee3c c\u1eadp nh\u1eadt ho\u1eb7c \u0111ang \u0111\u1ee3i b\u1ed5 sung th\u00eam t\u00e0i li\u1ec7u \u0111\u00f3. N\u1ebfu b\u1ea1n c\u1ea7n m\u00ecnh h\u1ed7 tr\u1ee3 c\u00f4ng th\u1ee9c \u0111\u1ea1o h\u00e0m, c\u00e1c v\u00ed d\u1ee5 t\u00ednh \u0111\u1ea1o h\u00e0m hay m\u1ed9t d\u1ea1ng b\u00e0i t\u1eadp c\u1ee5 th\u1ec3 th\u00ec n\u00f3i m\u00ecnh bi\u1ebft nha, m\u00ecnh s\u1ebd t\u00ecm th\u00eam gi\u00fap b\u1ea1n! Khi n\u00e0o c\u00f3 n\u1ed9i dung m\u1edbi v\u1ec1 \u0111\u1ea1o h\u00e0m, m\u00ecnh s\u1ebd b\u00e1o cho b\u1ea1n li\u1ec1n nh\u00e9!\"\n\n(M\u1ee5c \u0111\u00edch: ng\u0103n tr\u1ea3 l\u1eddi qu\u00e1 d\u00e0i, gi\u1eef ph\u1ea3n h\u1ed3i ng\u1eafn g\u1ecdn v\u00e0 th\u00e2n thi\u1ec7n.)"
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 2.1,
"position": [
-688,
496
],
"id": "4c804e8f-2f03-43a4-ac50-5e8bc403aeeb",
"name": "X\u1eed l\u00ed c\u00e2u h\u1ecfi"
},
{
"parameters": {
"method": "POST",
"url": "https://matilde-biogeographical-robena.ngrok-free.dev/api/notifications/",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "=Bearer {{ $json.access_token }}"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"notification_type\": \"{{ $('Json').item.json.notification_type }}\",\n \"title\": \"{{ $('Json').item.json.title }}\",\n \"message\": \"{{ $('Json').item.json.message }}\",\n \"user_id\": {{ $('Json').item.json.user_id }},\n \"event_id\": null,\n \"scheduled_at\":\"{{ $('Json').item.json.scheduled_at }}\" \n}",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
480,
176
],
"id": "276fe5bb-60b3-4195-9b24-cc7f44e0aa2a",
"name": "/notifications"
},
{
"parameters": {
"jsCode": "const results = [];\n\nfor (const item of items) {\n const rawOutput = item.json.output;\n\n try {\n // Tr\u01b0\u1eddng h\u1ee3p \u0111\u1eb7c bi\u1ec7t: \"null\" d\u1ea1ng chu\u1ed7i ho\u1eb7c gi\u00e1 tr\u1ecb null\n if (rawOutput === \"null\" || rawOutput === null) {\n results.push({\n json: {\n info: \"Output is null\",\n raw: rawOutput\n }\n });\n continue;\n }\n\n const parsed = JSON.parse(rawOutput);\n\n // N\u1ebfu parse xong v\u1eabn l\u00e0 null\n if (parsed === null) {\n results.push({\n json: {\n info: \"Parsed result is null\",\n raw: rawOutput\n }\n });\n continue;\n }\n\n // \u0110\u01b0a v\u1ec1 m\u1ea3ng n\u1ebfu kh\u00f4ng ph\u1ea3i m\u1ea3ng\n const normalized = Array.isArray(parsed) ? parsed : [parsed];\n\n for (const obj of normalized) {\n // \u0110\u1ea3m b\u1ea3o obj l\u00e0 object (kh\u00f4ng ph\u1ea3i string, number, boolean,...)\n if (typeof obj === 'object' && obj !== null) {\n results.push({ json: obj });\n } else {\n results.push({\n json: {\n error: true,\n message: \"Parsed item is not an object\",\n value: obj\n }\n });\n }\n }\n } catch (err) {\n results.push({\n json: {\n error: true,\n message: \"Failed to parse output\",\n raw: rawOutput,\n }\n });\n }\n}\n\nreturn results;\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-64,
192
],
"id": "5e8a0bd8-7939-4110-8626-a5f33fdb8773",
"name": "Json"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "4a1f8c37-e90f-4909-bf12-89699bf0b6a3",
"leftValue": "={{ $json.notification_type }}",
"rightValue": "general",
"operator": {
"type": "string",
"operation": "equals",
"name": "filter.operator.equals"
}
}
],
"combinator": "or"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
128,
192
],
"id": "32765c1d-d0b0-48c2-ae17-92a52c35468e",
"name": "False"
},
{
"parameters": {
"promptType": "define",
"text": "=Y\u00eau c\u1ea7u: {{ $json.message.data.content }}\nUser_Id: {{ $json.message.threadId }}",
"options": {
"systemMessage": "# PROMPT CHO AI AGENT - T\u1ea0O TH\u00d4NG B\u00c1O THEO S\u1ed0 L\u01af\u1ee2NG L\u1edaP\n\n## TH\u00d4NG TIN \u0110\u1ea6U V\u00c0O:\n**Y\u00eau c\u1ea7u:** {{ $json.body.question }}\n**User_Id:** {{ $json.body.student_info.database_user_id }}\n\n## DANH S\u00c1CH L\u1edaP V\u00c0 CHANNEL_ID:\n- **ENT06303:** 3490028549161409221\n- **SU06303:** 3454839233573804120\n- **SE06303:** 8462078403090882501\n\n## NHI\u1ec6M V\u1ee4 AI AGENT:\n\n### 1. PH\u00c2N T\u00cdCH Y\u00caU C\u1ea6U:\n- \u0110\u1ecdc n\u1ed9i dung trong `{{ $json.body.question }}`\n- **NH\u1eacN D\u1ea0NG C\u00c1C T\u1eea KH\u00d3A Y\u00caU C\u1ea6U:** \"Th\u00f4ng b\u00e1o\", \"Nh\u1eafc nh\u1edf\", \"G\u1eedi th\u00f4ng b\u00e1o\", \"Th\u00f4ng tin\", \"B\u00e1o cho\", \"N\u00f3i v\u1edbi\", \"Chuy\u1ec3n \u0111\u1ea1t\", \"G\u1eedi tin\", \"G\u1eedi l\u1eddi\", \"Truy\u1ec1n \u0111\u1ea1t\", \"Th\u00f4ng tri\", \"Th\u00f4ng t\u00edn\", \"Giao nhi\u1ec7m v\u1ee5\", \"Ra l\u1ec7nh\"\n- **\u0110\u1ebeM CH\u00cdNH X\u00c1C** s\u1ed1 l\u01b0\u1ee3ng l\u1edbp \u0111\u01b0\u1ee3c \u0111\u1ec1 c\u1eadp trong c\u00e2u y\u00eau c\u1ea7u\n- Tr\u00edch xu\u1ea5t n\u1ed9i dung th\u00f4ng b\u00e1o t\u1eeb c\u00e1c d\u1ea5u: `\"\"`, `''`, `{}`, `[]`, `()`\n- **TH\u00caM T\u00caN L\u1edaP V\u00c0O MESSAGE:** K\u1ebft h\u1ee3p n\u1ed9i dung th\u00f4ng b\u00e1o v\u1edbi t\u00ean l\u1edbp \u0111\u1ec3 r\u00f5 r\u00e0ng\n- Tr\u00edch xu\u1ea5t th\u1eddi gian g\u1eedi (n\u1ebfu c\u00f3)\n - **KH\u00d4NG R\u00daT G\u1eccN HO\u1eb6C C\u1eaeT D\u1ea4U:** Gi\u1eef nguy\u00ean \u0111\u1ea7y \u0111\u1ee7 d\u1ea5u ti\u1ebfng Vi\u1ec7t v\u00e0 n\u1ed9i dung th\u00f4ng b\u00e1o (kh\u00f4ng t\u00e1ch/vi\u1ebft t\u1eaft t\u1eeb nh\u01b0 \"Ngh\u1ec9\" \u2192 \"ngh\").\n - **M\u1eaaU MESSAGE (PH\u1ea2I TU\u00c2N THEO):**\n - V\u1edbi 1 l\u1edbp: `\"L\u1edbp {CHANNEL_NAME} {N\u1ed8I_DUNG_TH\u00d4NG_B\u00c1O}\"` \u2192 v\u00ed d\u1ee5: `\"L\u1edbp ENT06303 ngh\u1ec9 h\u1ecdc v\u00e0o ng\u00e0y mai v\u00e0 h\u1ecdc b\u00f9 v\u00e0o th\u1ee9 3\"`.\n - V\u1edbi N l\u1edbp (m\u1ed7i output ri\u00eang): M\u1ed7i JSON object v\u1eabn ph\u1ea3i c\u00f3 1 message ri\u00eang theo m\u1eabu tr\u00ean, thay `{CHANNEL_NAME}` t\u01b0\u01a1ng \u1ee9ng v\u1edbi l\u1edbp \u0111\u00f3.\n - KH\u00d4NG t\u1ea1o 1 message chung ch\u1ee9a nhi\u1ec1u t\u00ean l\u1edbp khi tr\u1ea3 v\u1ec1 nhi\u1ec1u JSON objects. Thay v\u00e0o \u0111\u00f3, t\u1ea1o ri\u00eang cho t\u1eebng l\u1edbp.\n\n### 2. X\u00c1C \u0110\u1ecaNH DANH S\u00c1CH L\u1edaP:\n- So kh\u1edbp t\u00ean l\u1edbp trong y\u00eau c\u1ea7u v\u1edbi danh s\u00e1ch tr\u00ean\n- L\u1ea5y channel_id t\u01b0\u01a1ng \u1ee9ng cho m\u1ed7i l\u1edbp\n- **V\u00cd D\u1ee4 MAPPING:**\n - \"ENT06303\" \u2192 channel_id: \"3490028549161409221\"\n - \"SU06303\" \u2192 channel_id: \"3454839233573804120\" \n - \"SE06303\" \u2192 channel_id: \"8462078403090882501\"\n\n### **\u26a0\ufe0f TR\u01af\u1edcNG H\u1ee2P \u0110\u1eb6C BI\u1ec6T - T\u1ea4T C\u1ea2 L\u1edaP:**\n**C\u00e1c t\u1eeb kh\u00f3a ch\u1ec9 \"t\u1ea5t c\u1ea3 l\u1edbp\":**\n- \"t\u1ea5t c\u1ea3 c\u00e1c l\u1edbp\"\n- \"h\u1ebft c\u00e1c l\u1edbp\" \n- \"g\u1eedi cho t\u1ea5t\"\n- \"t\u1ea5t c\u1ea3\"\n- \"to\u00e0n b\u1ed9 l\u1edbp\"\n- \"c\u1ea3 3 l\u1edbp\"\n- \"all classes\"\n\n**Khi g\u1eb7p c\u00e1c t\u1eeb kh\u00f3a n\u00e0y \u2192 G\u1eedi \u0111\u1ebfn T\u1ea4T C\u1ea2 3 L\u1edaP:**\n- ENT06303: 3490028549161409221\n- SU06303: 3454839233573804120\n- SE06303: 8462078403090882501\n\n- Kh\u00f4ng c\u00f3 n\u0103m th\u00ec m\u1eb7c \u0111\u1ecbnh l\u00e0 2025\n\n### \u26a0\ufe0f L\u01afU \u00dd V\u1ec0 X\u00c1C NH\u1eacN NG\u01af\u1edcI D\u00d9NG (TEXT CONFIRMATION)\n- Khi h\u1ec7 th\u1ed1ng c\u1ea7n t\u1ea1o 1 tin nh\u1eafn x\u00e1c nh\u1eadn cho ng\u01b0\u1eddi d\u00f9ng (v\u00ed d\u1ee5: \"\u2705 \u0110\u00e3 \u0111\u1eb7t th\u00f4ng b\u00e1o: ...\"), **KH\u00d4NG** d\u00f9ng t\u1ed5ng h\u1ee3p n\u1ed9i dung b\u1eb1ng c\u00e1ch c\u1eaft/gh\u00e9p k\u00fd t\u1ef1 c\u1ee7a n\u1ed9i dung th\u00f4ng b\u00e1o. Thay v\u00e0o \u0111\u00f3, t\u1ea1o v\u0103n b\u1ea3n ng\u1eafn g\u1ecdn v\u00e0 r\u00f5 r\u00e0ng, v\u00ed d\u1ee5:\n - `\"\u2705 \u0110\u00e3 \u0111\u1eb7t th\u00f4ng b\u00e1o cho L\u1edbp ENT06303: Ngh\u1ec9 h\u1ecdc v\u00e0o ng\u00e0y mai v\u00e0 h\u1ecdc b\u00f9 v\u00e0o th\u1ee9 3 (g\u1eedi l\u00fac 21:50 14/11)\"`\n - N\u1ebfu l\u00e0 \"t\u1ea5t c\u1ea3 l\u1edbp\": t\u1ea1o x\u00e1c nh\u1eadn d\u1ea1ng li\u1ec7t k\u00ea ng\u1eafn g\u1ecdn ho\u1eb7c n\u00eau r\u00f5 \"t\u1ea5t c\u1ea3 3 l\u1edbp\" nh\u01b0ng KH\u00d4NG bi\u1ebfn \u0111\u1ed5i n\u1ed9i dung th\u00f4ng b\u00e1o: `\"\u2705 \u0110\u00e3 \u0111\u1eb7t th\u00f4ng b\u00e1o cho t\u1ea5t c\u1ea3 3 l\u1edbp: Ngh\u1ec9 h\u1ecdc v\u00e0o ng\u00e0y mai v\u00e0 h\u1ecdc b\u00f9 v\u00e0o th\u1ee9 3 (g\u1eedi l\u00fac 21:50 14/11)\"`.\n - Kh\u00f4ng vi\u1ebft t\u1eaft ho\u1eb7c c\u1eaft ch\u1eef trong t\u00ean l\u1edbp ho\u1eb7c n\u1ed9i dung (v\u00ed d\u1ee5 sai: \"L\u1edbp ngh, ngh, ngh ...\").\n\n### **\u26a0\ufe0f X\u1eec L\u00dd TH\u1edcI GIAN:**\n**\u0110\u1ecbnh d\u1ea1ng th\u1eddi gian nh\u1eadn v\u00e0o:**\n- \"11h16 ng\u00e0y 23/9\" \u2192 \"2025-09-23T11:16:00.000Z\"\n- \"12h30 06/08/2025\" \u2192 \"2025-08-06T12:30:00.000Z\"\n- \"6h00 07/08/2025\" \u2192 \"2025-08-07T06:00:00.000Z\"\n\n**Quy t\u1eafc chuy\u1ec3n \u0111\u1ed5i:**\n- Gi\u1edd:ph\u00fat + ng\u00e0y/th\u00e1ng(/n\u0103m) \u2192 ISO 8601 format\n- Kh\u00f4ng c\u00f3 n\u0103m \u2192 m\u1eb7c \u0111\u1ecbnh 2025\n- M\u00fai gi\u1edd: UTC (th\u00eam .000Z)\n**Output:** Array ch\u1ee9a 3 JSON objects (m\u1ed9t cho m\u1ed7i l\u1edbp)\n\n### 3. QUY T\u1eaeC S\u1ed0 L\u01af\u1ee2NG OUTPUT:\n**\u26a0\ufe0f TUY\u1ec6T \u0110\u1ed0I: S\u1ed0 L\u1edaP = S\u1ed0 OUTPUT**\n\n- **1 l\u1edbp \u0111\u01b0\u1ee3c \u0111\u1ec1 c\u1eadp** \u2192 Tr\u1ea3 v\u1ec1 **1 JSON object** (KH\u00d4NG ph\u1ea3i array)\n- **2 l\u1edbp \u0111\u01b0\u1ee3c \u0111\u1ec1 c\u1eadp** \u2192 Tr\u1ea3 v\u1ec1 **array ch\u1ee9a 2 JSON objects**\n- **3 l\u1edbp \u0111\u01b0\u1ee3c \u0111\u1ec1 c\u1eadp** \u2192 Tr\u1ea3 v\u1ec1 **array ch\u1ee9a 3 JSON objects**\n- **N l\u1edbp \u0111\u01b0\u1ee3c \u0111\u1ec1 c\u1eadp** \u2192 Tr\u1ea3 v\u1ec1 **array ch\u1ee9a N JSON objects**\n- **\"T\u1ea5t c\u1ea3 l\u1edbp\" (t\u1eeb kh\u00f3a \u0111\u1eb7c bi\u1ec7t)** \u2192 Tr\u1ea3 v\u1ec1 **array ch\u1ee9a 3 JSON objects** (t\u1ea5t c\u1ea3 l\u1edbp c\u00f3 s\u1eb5n)\n\n## FORMAT JSON OUTPUT:\n\n### TR\u01af\u1edcNG H\u1ee2P 1: M\u1ed8T L\u1edaP DUY NH\u1ea4T\n```json\n{\n \"notification_type\": \"general\",\n \"title\": \"[T\u1eeb n\u1ed9i dung suy lu\u1eadn title, t\u1ed1i \u0111a 3 t\u1eeb]\",\n \"message\": \"[N\u1ed9i dung th\u00f4ng b\u00e1o + t\u00ean l\u1edbp \u0111\u1ec3 r\u00f5 r\u00e0ng]\",\n \"user_id\": [User_Id ho\u1eb7c 1 n\u1ebfu null],\n \"event_id\": null,\n \"scheduled_at\": \"[Th\u1eddi gian ISO format]\",\n \"channel_name\": \"[T\u00ean l\u1edbp ch\u00ednh x\u00e1c]\",\n \"channel_id\": \"[Channel_Id t\u01b0\u01a1ng \u1ee9ng]\"\n}\n```\n\n### TR\u01af\u1edcNG H\u1ee2P 2: NHI\u1ec0U L\u1edaP (2+)\n```json\n[\n {\n \"notification_type\": \"general\",\n \"title\": \"[Title gi\u1ed1ng nhau]\",\n \"message\": \"[N\u1ed9i dung th\u00f4ng b\u00e1o + t\u00ean l\u1edbp 1]\",\n \"user_id\": [User_Id ho\u1eb7c 1 n\u1ebfu null],\n \"event_id\": null,\n \"scheduled_at\": \"[Th\u1eddi gian gi\u1ed1ng nhau]\",\n \"channel_name\": \"[T\u00ean l\u1edbp 1]\",\n \"channel_id\": \"[Channel_Id l\u1edbp 1]\"\n },\n {\n \"notification_type\": \"general\",\n \"title\": \"[Title gi\u1ed1ng nhau]\",\n \"message\": \"[N\u1ed9i dung th\u00f4ng b\u00e1o + t\u00ean l\u1edbp 2]\",\n \"user_id\": [User_Id ho\u1eb7c 1 n\u1ebfu null],\n \"event_id\": null,\n \"scheduled_at\": \"[Th\u1eddi gian gi\u1ed1ng nhau]\",\n \"channel_name\": \"[T\u00ean l\u1edbp 2]\",\n \"channel_id\": \"[Channel_Id l\u1edbp 2]\"\n }\n]\n```\n\n## V\u00cd D\u1ee4 C\u1ee4 TH\u1ec2:\n\n### V\u00cd D\u1ee4 0: THI\u1ebeU TH\u00d4NG TIN \u2192 NULL\n**Input:** \"Xin ch\u00e0o b\u1ea1n\"\n**Ph\u00e2n t\u00edch:** Kh\u00f4ng c\u00f3 th\u00f4ng tin v\u1ec1 th\u00f4ng b\u00e1o, l\u1edbp h\u1ecdc\n**Output:** `null`\n\n**Input:** \"T\u00f4i mu\u1ed1n h\u1ecfi v\u1ec1 \u0111i\u1ec1u g\u00ec \u0111\u00f3\"\n**Ph\u00e2n t\u00edch:** Kh\u00f4ng li\u00ean quan \u0111\u1ebfn th\u00f4ng b\u00e1o l\u1edbp h\u1ecdc\n**Output:** `null`\n\n### V\u00cd D\u1ee4 1: M\u1ed8T L\u1edaP \u2192 M\u1ed8T OUTPUT\n**Input:** \"Th\u00f4ng b\u00e1o l\u1edbp ENT06303 'C\u1ea3 l\u1edbp n\u1ed9p asm final m\u00f4n cu\u1ed1i tu\u1ea7n h\u1ebft h\u1ea1n' g\u1eedi l\u00fac 12h30 06/08/2025\"\n**Ph\u00e2n t\u00edch:** 1 l\u1edbp (ENT06303)\n\n**Output:**\n{\n \"notification_type\": \"general\",\n \"title\": \"N\u1ed9p ASM Final\",\n \"message\": \"C\u1ea3 l\u1edbp ENT06303 n\u1ed9p asm final m\u00f4n cu\u1ed1i tu\u1ea7n h\u1ebft h\u1ea1n\",\n \"user_id\": 1,\n \"event_id\": null,\n \"scheduled_at\": \"2025-08-06T12:30:00.000Z\",\n \"channel_name\": \"ENT06303\",\n \"channel_id\": \"3490028549161409221\"\n}\n\n### V\u00cd D\u1ee4 1B: S\u1eec D\u1ee4NG T\u1eea \"NH\u1eaeC NH\u1ede\" \u2192 M\u1ed8T OUTPUT\n**Input:** \"Nh\u1eafc nh\u1edf l\u1edbp SE06303 'L\u00e0m b\u00e0i t\u1eadp \u0111\u1ea7y \u0111\u1ee7 v\u1ec1 nh\u00e0.' g\u1eedi l\u00fac 11h16 ng\u00e0y 23/9\"\n**Ph\u00e2n t\u00edch:** 1 l\u1edbp (SE06303), t\u1eeb kh\u00f3a \"Nh\u1eafc nh\u1edf\"\n\n**Output:**\n{\n \"notification_type\": \"general\",\n \"title\": \"L\u00e0m B\u00e0i T\u1eadp\",\n \"message\": \"L\u1edbp SE06303 l\u00e0m b\u00e0i t\u1eadp \u0111\u1ea7y \u0111\u1ee7 v\u1ec1 nh\u00e0.\",\n \"user_id\": 1,\n \"event_id\": null,\n \"scheduled_at\": \"2025-09-23T11:16:00.000Z\",\n \"channel_name\": \"SE06303\",\n \"channel_id\": \"8462078403090882501\"\n}\n\n### V\u00cd D\u1ee4 2: HAI L\u1edaP \u2192 HAI OUTPUT\n**Input:** \"Th\u00f4ng b\u00e1o l\u1edbp ENT06303, SU06303 'C\u1ea3 l\u1edbp n\u1ed9p asm final m\u00f4n cu\u1ed1i tu\u1ea7n h\u1ebft h\u1ea1n' g\u1eedi l\u00fac 12h30 06/08/2025\"\n**Ph\u00e2n t\u00edch:** 2 l\u1edbp (ENT06303, SU06303)\n\n**Output:**\n[\n {\n \"notification_type\": \"general\",\n \"title\": \"N\u1ed9p ASM Final\",\n \"message\": \"C\u1ea3 l\u1edbp ENT06303 n\u1ed9p asm final m\u00f4n cu\u1ed1i tu\u1ea7n h\u1ebft h\u1ea1n\",\n \"user_id\": 1,\n \"event_id\": null,\n \"scheduled_at\": \"2025-08-06T12:30:00.000Z\",\n \"channel_name\": \"ENT06303\",\n \"channel_id\": \"3490028549161409221\"\n },\n {\n \"notification_type\": \"general\",\n \"title\": \"N\u1ed9p ASM Final\",\n \"message\": \"C\u1ea3 l\u1edbp SU06303 n\u1ed9p asm final m\u00f4n cu\u1ed1i tu\u1ea7n h\u1ebft h\u1ea1n\",\n \"user_id\": 1,\n \"event_id\": null,\n \"scheduled_at\": \"2025-08-06T12:30:00.000Z\",\n \"channel_name\": \"SU06303\",\n \"channel_id\": \"3454839233573804120\"\n }\n]\n\n### V\u00cd D\u1ee4 4: T\u1ea4T C\u1ea2 L\u1edaP \u2192 BA OUTPUT\n**Input:** \"Th\u00f4ng b\u00e1o t\u1ea5t c\u1ea3 c\u00e1c l\u1edbp 'Ngh\u1ec9 h\u1ecdc h\u00f4m nay do m\u01b0a b\u00e3o' g\u1eedi l\u00fac 6h00 07/08/2025\"\n**Ph\u00e2n t\u00edch:** T\u1eeb kh\u00f3a \"t\u1ea5t c\u1ea3 c\u00e1c l\u1edbp\" \u2192 3 l\u1edbp (ENT06303, SU06303, SE06303)\n**Ph\u00e2n t\u00edch:** T\u1eeb kh\u00f3a \"t\u1ea5t c\u1ea3 c\u00e1c l\u1edbp\" \u2192 3 l\u1edbp (ENT06303, SU06303, SE06303)\n**Ph\u00e2n t\u00edch:** T\u1eeb kh\u00f3a \"t\u1ea5t c\u1ea3 c\u00e1c l\u1edbp\" \u2192 3 l\u1edbp (ENT06303, SU06303, SE06303)\n\n**Output:**\n[\n {\n \"notification_type\": \"general\",\n \"title\": \"Ngh\u1ec9 H\u1ecdc\",\n \"message\": \"L\u1edbp ENT06303 ngh\u1ec9 h\u1ecdc h\u00f4m nay do m\u01b0a b\u00e3o\",\n \"user_id\": 1,\n \"event_id\": null,\n \"scheduled_at\": \"2025-08-07T06:00:00.000Z\",\n \"channel_name\": \"ENT06303\",\n \"channel_id\": \"3490028549161409221\"\n },\n {\n \"notification_type\": \"general\",\n \"title\": \"Ngh\u1ec9 H\u1ecdc\",\n \"message\": \"L\u1edbp SU06303 ngh\u1ec9 h\u1ecdc h\u00f4m nay do m\u01b0a b\u00e3o\",\n \"user_id\": 1,\n \"event_id\": null,\n \"scheduled_at\": \"2025-08-07T06:00:00.000Z\",\n \"channel_name\": \"SU06303\",\n \"channel_id\": \"3454839233573804120\"\n },\n {\n \"notification_type\": \"general\",\n \"title\": \"Ngh\u1ec9 H\u1ecdc\",\n \"message\": \"L\u1edbp SE06303 ngh\u1ec9 h\u1ecdc h\u00f4m nay do m\u01b0a b\u00e3o\",\n \"user_id\": 1,\n \"event_id\": null,\n \"scheduled_at\": \"2025-08-07T06:00:00.000Z\",\n \"channel_name\": \"SE06303\",\n \"channel_id\": \"8462078403090882501\"\n }\n]\n\n## QUY T\u1eaeC QUAN TR\u1eccNG:\n\n### \ud83c\udfaf QUY T\u1eaeC V\u00c0NG:\n1. **KI\u1ec2M TRA T\u1eea KH\u00d3A \"T\u1ea4T C\u1ea2\" TR\u01af\u1edaC:** T\u00ecm c\u00e1c t\u1eeb kh\u00f3a ch\u1ec9 \"t\u1ea5t c\u1ea3 l\u1edbp\"\n2. **\u0110\u1ebeM CH\u00cdNH X\u00c1C** s\u1ed1 l\u01b0\u1ee3ng l\u1edbp trong y\u00eau c\u1ea7u (n\u1ebfu kh\u00f4ng ph\u1ea3i \"t\u1ea5t c\u1ea3\")\n3. **T\u1ea0O \u0110\u00daNG S\u1ed0 L\u01af\u1ee2NG** output = s\u1ed1 l\u1edbp\n4. **FORMAT \u0110\u00daNG:**\n - 1 l\u1edbp: `{...}` (object)\n - 2+ l\u1edbp: `[{...}, {...}]` (array)\n - \"T\u1ea5t c\u1ea3 l\u1edbp\": `[{...}, {...}, {...}]` (array 3 elements)\n\n### \ud83d\udd0d LOGIC PH\u00c2N T\u00cdCH:\n**B\u01b0\u1edbc 0:** Ki\u1ec3m tra th\u00f4ng tin \u0111\u1ea7u v\u00e0o\n- N\u1ebfu thi\u1ebfu th\u00f4ng tin c\u1ea7n thi\u1ebft \u2192 Tr\u1ea3 v\u1ec1 `null`\n- N\u1ebfu \u0111\u1ea7y \u0111\u1ee7 \u2192 Chuy\u1ec3n sang b\u01b0\u1edbc 1\n\n**B\u01b0\u1edbc 1:** Ki\u1ec3m tra t\u1eeb kh\u00f3a \"t\u1ea5t c\u1ea3\"\n- N\u1ebfu c\u00f3 \u2192 T\u1ea1o 3 outputs cho t\u1ea5t c\u1ea3 l\u1edbp\n- N\u1ebfu kh\u00f4ng \u2192 Chuy\u1ec3n sang b\u01b0\u1edbc 2\n\n**B\u01b0\u1edbc 2:** \u0110\u1ebfm s\u1ed1 l\u1edbp c\u1ee5 th\u1ec3 \u0111\u01b0\u1ee3c \u0111\u1ec1 c\u1eadp\n- \"ENT06303\" \u2192 1 l\u1edbp\n- \"ENT06303, SU06303\" \u2192 2 l\u1edbp \n- \"ENT06303, SU06303, SE06303\" \u2192 3 l\u1edbp\n\n**B\u01b0\u1edbc 3:** T\u1ea1o output theo s\u1ed1 l\u01b0\u1ee3ng \u0111\u00e3 x\u00e1c \u0111\u1ecbnh\n\n### \ud83d\udd27 CHI TI\u1ebeT K\u1ef8 THU\u1eacT:\n- **notification_type:** Lu\u00f4n l\u00e0 \"general\"\n- **title:** T\u1ed1i \u0111a 3 t\u1eeb, s\u00fac t\u00edch\n- **message:** N\u1ed9i dung th\u00f4ng b\u00e1o + t\u00ean l\u1edbp \u0111\u1ec3 r\u00f5 r\u00e0ng (v\u00ed d\u1ee5: \"C\u1ea3 l\u1edbp ENT06303 n\u1ed9p asm final...\")\n- **user_id:** T\u1eeb input ho\u1eb7c 1 n\u1ebfu null\n- **event_id:** Lu\u00f4n l\u00e0 null\n- **scheduled_at:** Format ISO 8601\n- **channel_name:** T\u00ean l\u1edbp ch\u00ednh x\u00e1c t\u1eeb y\u00eau c\u1ea7u\n- **channel_id:** ID t\u01b0\u01a1ng \u1ee9ng t\u1eeb danh s\u00e1ch\n\n### \ud83d\udeab TUY\u1ec6T \u0110\u1ed0I KH\u00d4NG:\n- \u274c T\u1ea1o th\u00f4ng b\u00e1o khi thi\u1ebfu th\u00f4ng tin c\u1ea7n thi\u1ebft\n- \u274c Sai s\u1ed1 l\u01b0\u1ee3ng output so v\u1edbi s\u1ed1 l\u1edbp\n- \u274c Tr\u1ea3 v\u1ec1 array khi ch\u1ec9 c\u00f3 1 l\u1edbp\n- \u274c Tr\u1ea3 v\u1ec1 object khi c\u00f3 2+ l\u1edbp\n- \u274c S\u1eed d\u1ee5ng ```json code blocks\n- \u274c T\u1ea1o nhi\u1ec1u responses ri\u00eang bi\u1ec7t\n- \u274c Sai channel_id cho channel_name\n\n### \u26a0\ufe0f TR\u01af\u1edcNG H\u1ee2P THI\u1ebeU TH\u00d4NG TIN:\n**Tr\u1ea3 v\u1ec1 `null` khi:**\n- Kh\u00f4ng c\u00f3 n\u1ed9i dung th\u00f4ng b\u00e1o r\u00f5 r\u00e0ng\n- Kh\u00f4ng c\u00f3 t\u00ean l\u1edbp c\u1ee5 th\u1ec3 ho\u1eb7c t\u1eeb kh\u00f3a \"t\u1ea5t c\u1ea3\"\n- Th\u00f4ng tin \u0111\u1ea7u v\u00e0o kh\u00f4ng \u0111\u1ea7y \u0111\u1ee7 \u0111\u1ec3 t\u1ea1o th\u00f4ng b\u00e1o\n\n**Output:** `null` (kh\u00f4ng ph\u1ea3i JSON object ho\u1eb7c array)\n\n### \u2705 LU\u00d4N LU\u00d4N:\n- \u2705 **KI\u1ec2M TRA TH\u00d4NG TIN \u0110\u1ea6U V\u00c0O TR\u01af\u1edaC**\n- \u2705 **KI\u1ec2M TRA T\u1eea KH\u00d3A \"T\u1ea4T C\u1ea2\" TR\u01af\u1edaC TI\u00caN**\n- \u2705 \u0110\u1ebfm ch\u00ednh x\u00e1c s\u1ed1 l\u1edbp tr\u01b0\u1edbc khi t\u1ea1o output (n\u1ebfu kh\u00f4ng ph\u1ea3i \"t\u1ea5t c\u1ea3\")\n- \u2705 Mapping \u0111\u00fang channel_name v\u1edbi channel_id\n- \u2705 Format JSON thu\u1ea7n t\u00fay (kh\u00f4ng c\u00f3 markdown)\n- \u2705 Ki\u1ec3m tra k\u1ef9 tr\u01b0\u1edbc khi tr\u1ea3 v\u1ec1\n\n### \ud83d\udcdd C\u00c1C T\u1eea KH\u00d3A \"T\u1ea4T C\u1ea2 L\u1edaP\":\n- \"t\u1ea5t c\u1ea3 c\u00e1c l\u1edbp\"\n- \"h\u1ebft c\u00e1c l\u1edbp\"\n- \"g\u1eedi cho t\u1ea5t\"\n- \"t\u1ea5t c\u1ea3\" \n- \"to\u00e0n b\u1ed9 l\u1edbp\"\n- \"c\u1ea3 3 l\u1edbp\"\n- \"all classes\"\n- \"m\u1ecdi l\u1edbp\"\n- \"c\u00e1c l\u1edbp\"\n\n**Khi g\u1eb7p b\u1ea5t k\u1ef3 t\u1eeb kh\u00f3a n\u00e0o \u2192 T\u1ea1o 3 outputs cho t\u1ea5t c\u1ea3 l\u1edbp c\u00f3 s\u1eb5n**\n"
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 2.1,
"position": [
-368,
192
],
"id": "8b5a33ca-feb5-47ff-9cac-33ece09a9b0d",
"name": "X\u1eed l\u00ed th\u00f4ng b\u00e1o"
},
{
"parameters": {
"method": "POST",
"url": "https://matilde-biogeographical-robena.ngrok-free.dev/auth/login",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Name",
"value": "Content-Type"
},
{
"name": "Value",
"value": "application/x-www-form-urlencoded"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "username",
"value": "admin@gmail.com"
},
{
"name": "password",
"value": "Admin123!"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
320,
176
],
"id": "d0a25477-3fef-411f-aa45-187aa459c5bc",
"name": "L\u1ea5y Token13"
},
{
"parameters": {
"jsCode": "// L\u1ea5y danh s\u00e1ch th\u00f4ng b\u00e1o t\u1eeb input\nconst notifications = items.map(item => item.json);\n\n// N\u1ebfu kh\u00f4ng c\u00f3 th\u00f4ng b\u00e1o\nif (notifications.length === 0) {\n return [\n {\n json: {\n status: \"error\",\n message: \"\u274c Kh\u00f4ng c\u00f3 l\u1edbp n\u00e0o \u0111\u1ec3 th\u00f4ng b\u00e1o.\"\n }\n }\n ];\n}\n\n// Gom nh\u00f3m theo ph\u1ea7n message sau t\u00ean l\u1edbp\nconst messageMap = {};\n\nfor (const n of notifications) {\n // T\u00e1ch t\u00ean l\u1edbp (sau ch\u1eef \"L\u1edbp\")\n const match = n.message.match(/L\u1edbp\\s+([A-Z0-9]+)/i);\n const className = match ? match[1] : \"Kh\u00f4ng x\u00e1c \u0111\u1ecbnh\";\n\n // L\u1ea5y ph\u1ea7n n\u1ed9i dung c\u00f2n l\u1ea1i sau t\u00ean l\u1edbp\n const messageBody = n.message.replace(/L\u1edbp\\s+[A-Z0-9]+\\s*/i, \"\").trim();\n\n // Gom c\u00e1c l\u1edbp c\u00f3 c\u00f9ng n\u1ed9i dung messageBody\n if (!messageMap[messageBody]) messageMap[messageBody] = [];\n messageMap[messageBody].push(className);\n}\n\n// T\u1ea1o danh s\u00e1ch k\u1ebft qu\u1ea3\nconst results = [];\n\nfor (const [body, classes] of Object.entries(messageMap)) {\n const combinedClasses = classes.join(\", \");\n const lecturerMessage = `\u2705 \u0110\u00e3 \u0111\u1eb7t th\u00f4ng b\u00e1o: L\u1edbp ${combinedClasses} ${body}`;\n results.push({\n json: {\n status: \"success\",\n lecturerMessage\n }\n });\n}\n\nreturn results;\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
656,
176
],
"id": "37635054-f937-4190-a4c0-9c5c4b2a7113",
"name": "Code in JavaScript"
},
{
"parameters": {},
"type": "n8n-nodes-zalos-user.zaloMessageTrigger",
"typeVersion": 1,
"position": [
-1008,
336
],
"id": "45c3dcae-037a-4fbf-a58a-0085a7226389",
"name": "Zalo Trigger",
"credentials": {
"zaloApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"threadId": "={{ $('Zalo Trigger').item.json.message.threadId }}",
"message": "={{ $json.output }}",
"quote": {},
"mentions": {}
},
"type": "n8n-nodes-zalo-tools.zaloSendMessage",
"typeVersion": 4,
"position": [
-160,
432
],
"id": "867d2f51-6dcb-4aac-ab60-23a52580389a",
"name": "Zalo C\u00e1 Nh\u00e2n",
"credentials": {
"zaloApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"threadId": "={{ $('Zalo Trigger').item.json.message.threadId }}",
"type": 1,
"message": "={{ $json.output }}",
"quote": {},
"mentions": {}
},
"type": "n8n-nodes-zalo-tools.zaloSendMessage",
"typeVersion": 4,
"position": [
-160,
576
],
"id": "0db058c3-8f84-494e-a241-4d60596c9810",
"name": "Zalo Nh\u00f3m",
"credentials": {
"zaloApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "13d22bde-799d-40d1-b2b7-d1e8b6d3a890",
"leftValue": "={{ $('Zalo Trigger').item.json.message.type }}",
"rightValue": 0,
"operator": {
"type": "number",
"operation": "equals"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
-384,
496
],
"id": "eb43b7c9-0ad6-4f57-9c33-780b60c9fcfb",
"name": "If3"
},
{
"parameters": {
"sessionIdType": "customKey",
"sessionKey": "={{ $('Zalo Trigger').item.json.message.threadId }}",
"contextWindowLength": 10
},
"type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
"typeVersion": 1.3,
"position": [
-672,
736
],
"id": "06a0550c-1102-4f72-8a01-849a57d3fdde",
"name": "Postgres Chat Memory",
"credentials": {
"postgres": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"model": {
"__rl": true,
"value": "gpt-4.1",
"mode": "list",
"cachedResultName": "gpt-4.1"
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"position": [
-816,
704
],
"id": "af60df46-0ca8-4c53-871e-2c44bba728d0",
"name": "OpenAI",
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "5fd1fefc-bd80-42fd-9816-b17e9a7ec66f",
"leftValue": "={{ $json.message.threadId }}",
"rightValue": "4691593985282203569",
"operator": {
"type": "string",
"operation": "equals",
"name": "filter.operator.equals"
}
}
],
"combinator": "and"
}
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "d9281062-614d-48f9-b7d3-e6f7affc5a50",
"leftValue": "",
"rightValue": "",
"operator": {
"type": "string",
"operation": "equals",
"name": "filter.operator.equals"
}
}
],
"combinator": "and"
}
}
]
},
"options": {}
},
"type": "n8n-nodes-base.switch",
"typeVersion": 3.2,
"position": [
-848,
336
],
"id": "ab407b41-2b9d-438c-a537-dfe0ff9cf761",
"name": "Switch"
},
{
"parameters": {
"model": {
"__rl": true,
"value": "gpt-3.5-turbo",
"mode": "list",
"cachedResultName": "gpt-3.5-turbo"
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"position": [
-368,
352
],
"id": "66bbec55-6d36-4db1-b148-51e763724e50",
"name": "OpenAI1",
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "3f32665a-e57c-4998-abcd-dcda8ff35002",
"leftValue": "={{ $json.output }}",
"rightValue": "false",
"operator": {
"type": "string",
"operation": "startsWith"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
384,
496
],
"id": "1eeb7771-b1f3-4317-b0de-aa7ffcc4af5d",
"name": "False T"
},
{
"parameters": {
"method": "POST",
"url": "https://matilde-biogeographical-robena.ngrok-free.dev/api/notifications/",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "=Bearer {{ $json.access_token }}"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"notification_type\": \"respond\",\n \"title\": \"{{ $('Code2').item.json.title }}\",\n \"message\": \"{{ $('Code2').item.json.message }}\",\n \"user_id\": {{ $('Code2').item.json.user_id }},\n \"event_id\": null,\n \"scheduled_at\": null\n}",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
976,
480
],
"id": "a86c6aeb-88de-42e9-b995-908540b11342",
"name": "notifications/"
},
{
"parameters": {
"method": "PATCH",
"url": "https://matilde-biogeographical-robena.ngrok-free.dev/api/notifications/respond-status",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "=Bearer {{ $json.access_token }}"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"message\": \"{{ $('/messages/search').item.json.content }}\",\n \"respond_status\": \"responded\"\n}",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1136,
-96
],
"id": "9692c716-bc46-4eac-a618-37b51ac9acd3",
"name": "notifications/respond-status"
},
{
"parameters": {
"promptType": "define",
"text": "=C\u00e2u h\u1ecfi\": {{ $('Zalo Trigger').item.json.message.data.content }}\nuser_id: 1\nC\u00e2u tr\u1ea3 l\u1eddi: {{ $('X\u1eed l\u00ed c\u00e2u h\u1ecfi').item.json.output }}",
"options": {
"systemMessage": "# Prompt X\u1eed L\u00fd C\u00e2u Tr\u1ea3 L\u1eddi Kh\u00f4ng C\u00f3 Th\u00f4ng Tin C\u1ee5 Th\u1ec3\n\n## M\u1ee5c \u0110\u00edch\nX\u1eed l\u00fd c\u00e1c tr\u01b0\u1eddng h\u1ee3p c\u00e2u tr\u1ea3 l\u1eddi AI kh\u00f4ng c\u00f3 th\u00f4ng tin c\u1ee5 th\u1ec3 ho\u1eb7c kh\u00f4ng ph\u00f9 h\u1ee3p, t\u1ef1 \u0111\u1ed9ng t\u1ea1o th\u00f4ng b\u00e1o d\u1ea1ng JSON \u0111\u1ec3 y\u00eau c\u1ea7u gi\u1ea3ng vi\u00ean h\u1ed7 tr\u1ee3.\n\n## Input Variables\n```\nC\u00e2u h\u1ecfi: {{ $json.output }}\nNg\u01b0\u1eddi h\u1ecfi: {{ $('Zalo').item.json.body.message.from.display_name }}\nId ng\u01b0\u1eddi h\u1ecfi: {{ $('Zalo').item.json.body.message.message_id }}\n```\n\n## Core Logic Flow\n\n### B\u01af\u1edaC 1: VALIDATION C\u00c2U H\u1eceI\n```\nKI\u1ec2M TRA CH\u1ee6 \u0110\u1ec0 GI\u00c1O D\u1ee4C:\n\n\u274c NON-EDUCATIONAL (RETURN false):\n- Ch\u00e0o h\u1ecfi: \"hi\", \"hello\", \"ch\u00e0o\"\n- V\u00f4 ngh\u0129a: \"ghigh\", \"asdf\", \"123\"\n- Th\u1eddi ti\u1ebft: \"th\u1eddi ti\u1ebft\", \"m\u01b0a\", \"n\u1eafng\"\n- Kinh t\u1ebf: \"gi\u00e1 v\u00e0ng\", \"ch\u1ee9ng kho\u00e1n\", \"ti\u1ec1n\"\n- Th\u1ec3 thao: \"b\u00f3ng \u0111\u00e1\", \"World Cup\", \"th\u1ec3 thao\"\n- \u1ea8m th\u1ef1c: \"n\u1ea5u \u0103n\", \"m\u00f3n ngon\", \"c\u00f4ng th\u1ee9c\"\n- L\u00e0m \u0111\u1eb9p: \"skincare\", \"ch\u0103m s\u00f3c da\", \"makeup\"\n- Ph\u01b0\u01a1ng ti\u1ec7n: \"xe m\u00e1y\", \"\u00f4 t\u00f4\", \"giao th\u00f4ng\"\n- B\u1ea5t \u0111\u1ed9ng s\u1ea3n: \"mua nh\u00e0\", \"gi\u00e1 \u0111\u1ea5t\", \"thu\u00ea\"\n- Gi\u1ea3i tr\u00ed: \"phim\", \"game\", \"\u00e2m nh\u1ea1c\"\n- Ch\u00ednh tr\u1ecb: \"b\u1ea7u c\u1eed\", \"ch\u00ednh ph\u1ee7\", \"lu\u1eadt\"\n\n\u2705 EDUCATIONAL (TI\u1ebeP T\u1ee4C):\n- BTEC: \"BTEC Computing\", \"BTEC Business\"\n- M\u00f4n h\u1ecdc: \"Programming\", \"Database\", \"Marketing\"\n- K\u1ef9 n\u0103ng: \"h\u1ecdc t\u1eadp\", \"ngh\u1ec1 nghi\u1ec7p\", \"soft skills\"\n- \u0110\u00e0o t\u1ea1o: \"kh\u00f3a h\u1ecdc\", \"ch\u01b0\u01a1ng tr\u00ecnh\", \"curriculum\"\n- Nghi\u00ean c\u1ee9u: \"assignment\", \"project\", \"thesis\"\n```\n\n### B\u01af\u1edaC 2: \u0110\u00c1NH GI\u00c1 CH\u1ea4T L\u01af\u1ee2NG C\u00c2U TR\u1ea2 L\u1edcI\n```\nC\u00c1C D\u1ea4U HI\u1ec6U C\u00c2U TR\u1ea2 L\u1edcI KH\u00d4NG PH\u00d9 H\u1ee2P:\n\n\ud83d\udd34 KH\u00d4NG C\u00d3 TH\u00d4NG TIN:\n- \"T\u00f4i kh\u00f4ng bi\u1ebft\"\n- \"Kh\u00f4ng c\u00f3 th\u00f4ng tin\"\n- \"Kh\u00f4ng t\u00ecm th\u1ea5y d\u1eef li\u1ec7u\"\n- \"ERROR: No data\"\n- \"CANNOT ANSWER\"\n\n\ud83d\udd34 TH\u00d4NG TIN SAI/KH\u00d4NG LI\u00caN QUAN:\n- Tr\u1ea3 l\u1eddi kh\u00f4ng \u0111\u00fang ch\u1ee7 \u0111\u1ec1\n- Th\u00f4ng tin qu\u00e1 chung chung\n- Kh\u00f4ng tr\u1ea3 l\u1eddi \u0111\u00fang c\u00e2u h\u1ecfi\n- N\u1ed9i dung kh\u00f4ng ch\u00ednh x\u00e1c\n\n\ud83d\udd34 KH\u00d4NG \u0110\u1ea6Y \u0110\u1ee6 - THI\u1ebeU TH\u00d4NG TIN QUAN TR\u1eccNG:\n- H\u1ecfi v\u1ec1 \u0110I\u1ec2M S\u1ed0 nh\u01b0ng kh\u00f4ng c\u00f3 \u0111i\u1ec3m c\u1ee5 th\u1ec3\n- H\u1ecfi v\u1ec1 DEADLINE nh\u01b0ng kh\u00f4ng c\u00f3 ng\u00e0y gi\u1edd\n- H\u1ecfi v\u1ec1 Y\u00caU C\u1ea6U b\u00e0i t\u1eadp nh\u01b0ng thi\u1ebfu chi ti\u1ebft\n- H\u1ecfi v\u1ec1 L\u1ecaCH H\u1eccC nh\u01b0ng kh\u00f4ng c\u00f3 th\u1eddi gian c\u1ee5 th\u1ec3\n- H\u1ecfi v\u1ec1 GI\u1ea2NG VI\u00caN nh\u01b0ng kh\u00f4ng c\u00f3 th\u00f4ng tin li\u00ean l\u1ea1c\n- Ch\u1ec9 tr\u1ea3 l\u1eddi m\u1ed9t ph\u1ea7n c\u1ee7a c\u00e2u h\u1ecfi\n- Kh\u00f4ng \u0111\u01b0a ra th\u00f4ng tin then ch\u00f3t m\u00e0 sinh vi\u00ean c\u1ea7n\n\n\ud83d\udd12 QUY T\u1eaeC RI\u00caNG T\u01af:\n- Kh\u00f4ng tr\u1ea3 l\u1eddi/kh\u00f4ng cung c\u1ea5p **\u0111i\u1ec3m s\u1ed1 c\u1ee7a ng\u01b0\u1eddi kh\u00e1c** (kh\u00f4ng ph\u1ea3i ng\u01b0\u1eddi h\u1ecfi) \u2192 RETURN: false\n- N\u1ebfu c\u00e2u h\u1ecfi y\u00eau c\u1ea7u th\u00f4ng tin nh\u1ea1y c\u1ea3m c\u1ee7a ng\u01b0\u1eddi kh\u00e1c (\u0111i\u1ec3m, th\u00f4ng tin li\u00ean h\u1ec7 c\u00e1 nh\u00e2n) \u2192 RETURN: false v\u00e0 KH\u00d4NG t\u1ea1o JSON\n\n\ud83d\udd34 PH\u00c2N T\u00cdCH C\u1ee4 TH\u1ec2 - C\u00c1C TR\u01af\u1edcNG H\u1ee2P TH\u01af\u1edcNG G\u1eb6P:\n- \"C\u00f3 th\u00f4ng tin chi ti\u1ebft v\u1ec1 \u0110I\u1ec2M\" \u2192 nh\u01b0ng ch\u1ec9 n\u00f3i th\u1eddi gian h\u1ecdc, kh\u00f4ng c\u00f3 \u0111i\u1ec3m\n- \"C\u00f3 l\u1ecbch thi kh\u00f4ng\" \u2192 ch\u1ec9 n\u00f3i m\u00f4n h\u1ecdc, kh\u00f4ng c\u00f3 ng\u00e0y thi\n- \"Assignment c\u1ea7n l\u00e0m g\u00ec\" \u2192 ch\u1ec9 n\u00f3i chung chung, thi\u1ebfu y\u00eau c\u1ea7u c\u1ee5 th\u1ec3\n- \"Gi\u1ea3ng vi\u00ean l\u00e0 ai\" \u2192 ch\u1ec9 n\u00f3i m\u00f4n h\u1ecdc, kh\u00f4ng c\u00f3 t\u00ean/contact\n\n\u2705 C\u00c2U TR\u1ea2 L\u1edcI T\u1ed0T:\n- Ch\u00ednh x\u00e1c v\u00e0 \u0111\u1ea7y \u0111\u1ee7 theo \u0111\u00fang c\u00e2u h\u1ecfi\n- Tr\u1ea3 l\u1eddi \u0110\u00daNG TR\u1eccNG T\u00c2M sinh vi\u00ean h\u1ecfi\n- C\u00f3 th\u00f4ng tin c\u1ee5 th\u1ec3, chi ti\u1ebft\n- \u0110\u00e1p \u1ee9ng \u0111\u01b0\u1ee3c nhu c\u1ea7u th\u00f4ng tin c\u1ee7a sinh vi\u00ean\n```\n\n### B\u01af\u1edaC 3: LOGIC QUY\u1ebeT \u0110\u1ecaNH\n```\nDECISION TREE:\n\n1. IF c\u00e2u_h\u1ecfi \u2208 NON_EDUCATIONAL:\n \u2192 RETURN: false\n\n2. IF c\u00e2u_h\u1ecfi requests OTHER_PERSON_SENSITIVE_DATA (e.g., \u0111i\u1ec3m c\u1ee7a ng\u01b0\u1eddi kh\u00e1c):\n \u2192 RETURN: false\n\n3. IF c\u00e2u_h\u1ecfi \u2208 EDUCATIONAL AND c\u00e2u_tr\u1ea3_l\u1eddi \u2208 GOOD_ANSWER:\n \u2192 RETURN: false\n\n4. IF c\u00e2u_h\u1ecfi \u2208 EDUCATIONAL AND c\u00e2u_tr\u1ea3_l\u1eddi \u2208 BAD_ANSWER:\n \u2192 RETURN: JSON_NOTIFICATION\n\nCRITICAL RULES:\n- ZERO TOLERANCE cho c\u00e2u h\u1ecfi kh\u00f4ng gi\u00e1o d\u1ee5c\n- Ch\u1ec9 t\u1ea1o JSON khi C\u1ea6N C\u1ea2I THI\u1ec6N c\u00e2u tr\u1ea3 l\u1eddi\n- JSON STRUCTURE ph\u1ea3i ch\u00ednh x\u00e1c 100%\n```\n\n## JSON Output Template\n```json\n{\n \"title\": \"{{ extract_short_title_from_question }}\",\n \"notification_type\": \"respond\", \n \"message\": \"{{ original_question_unchanged }}\",\n \"event_id\": null,\n \"user_id\": {{ user_id || 1 }},\n \"scheduled_at\": null\n}\n```\n\n### Title Generation Rules:\n```\n- T\u1ed1i \u0111a 5 t\u1eeb ti\u1ebfng Vi\u1ec7t\n- T\u00f3m t\u1eaft ch\u00ednh x\u00e1c n\u1ed9i dung c\u00e2u h\u1ecfi\n- Kh\u00f4ng d\u00f9ng t\u1eeb th\u1eeba \"C\u00e2u h\u1ecfi v\u1ec1\"\n\nEXAMPLES:\n\"BTEC Computing c\u00f3 nh\u1eefng m\u00f4n g\u00ec?\" \u2192 \"BTEC Computing m\u00f4n\"\n\"C\u00e1ch h\u1ecdc l\u1eadp tr\u00ecnh hi\u1ec7u qu\u1ea3?\" \u2192 \"H\u1ecdc l\u1eadp tr\u00ecnh\"\n\"Assignment n\u00e0y l\u00e0m th\u1ebf n\u00e0o?\" \u2192 \"H\u01b0\u1edbng d\u1eabn assignment\"\n\"Deadline submission khi n\u00e0o?\" \u2192 \"Deadline submission\"\n```\n\n## Test Cases & Examples\n\n### \u274c NON-EDUCATIONAL \u2192 FALSE\n```\nQ: \"ghigh\"\nA: \"ERROR: No data\"\nOUTPUT: false\n\nQ: \"hello\" \nA: \"Xin ch\u00e0o!\"\nOUTPUT: false\n\nQ: \"Th\u1eddi ti\u1ebft h\u00f4m nay?\"\nA: \"Tr\u1eddi \u0111\u1eb9p 25\u00b0C\"\nOUTPUT: false\n\nQ: \"Gi\u00e1 Bitcoin?\"\nA: \"Bitcoin hi\u1ec7n t\u1ea1i $30,000\"\nOUTPUT: false\n```\n\n### \u2705 EDUCATIONAL + GOOD ANSWER \u2192 FALSE\n```\nQ: \"BTEC Computing c\u00f3 nh\u1eefng m\u00f4n n\u00e0o?\"\nA: \"BTEC Computing g\u1ed3m: Programming Fundamentals, Database Design, Web Development, Network Security, Software Engineering, v\u00e0 Project Management.\"\nOUTPUT: false\n\nQ: \"C\u00e1ch vi\u1ebft CV hi\u1ec7u qu\u1ea3?\"\nA: \"CV hi\u1ec7u qu\u1ea3 c\u1ea7n: th\u00f4ng tin c\u00e1 nh\u00e2n r\u00f5 r\u00e0ng, m\u1ee5c ti\u00eau ngh\u1ec1 nghi\u1ec7p, kinh nghi\u1ec7m l\u00e0m vi\u1ec7c, k\u1ef9 n\u0103ng v\u00e0 h\u1ecdc v\u1ea5n. N\u00ean gi\u1eef CV trong 1-2 trang, s\u1eed d\u1ee5ng font ch\u1eef d\u1ec5 \u0111\u1ecdc v\u00e0 format nh\u1ea5t qu\u00e1n.\"\nOUTPUT: false\n```\n\n### Tr\u1ea3 l\u1eddi l\u1ecbch thi (m\u1eb7c \u0111\u1ecbnh tr\u1ea3 v\u1ec1 true khi h\u1ecfi m\u00f4n sinh h\u1ecdc)\n```\nQ: \"C\u00f3 l\u1ecbch thi m\u00f4n Sinh h\u1ecdc tu\u1ea7n t\u1edbi kh\u00f4ng?\"\nA: \"M\u00ecnh v\u1eeba ki\u1ec3m tra cho Trang nha, hi\u1ec7n t\u1ea1i trong l\u1ecbch thi tu\u1ea7n t\u1edbi ch\u1ec9 c\u00f3 m\u00f4n To\u00e1n th\u00f4i, kh\u00f4ng th\u1ea5y c\u00f3 l\u1ecbch thi m\u00f4n Sinh h\u1ecdc \u0111\u00e2u Trang \u01a1i \ud83d\ude05\\n\\nN\u1ebfu sau n\u00e0y c\u00f3 c\u1eadp nh\u1eadt l\u1ecbch thi m\u00f4n Sinh h\u1ecdc, m\u00ecnh s\u1ebd b\u00e1o Trang li\u1ec1n ha! C\u00f3 mu\u1ed1n m\u00ecnh tra th\u00eam l\u1ecbch thi m\u00f4n n\u00e0o kh\u00e1c n\u1eefa kh\u00f4ng n\u00e8?\"\nOUTPUT: \n{\n \"title\": \"l\u1ecbch thi\",\n \"notification_type\": \"respond\",\n \"message\": \"M\u00f4n sinh h\u1ecdc kh\u00f4ng c\u00f3 l\u1ecbch thi \u00e0?\",\n \"event_id\": null,\n \"user_id\": 123,\n \"scheduled_at\": null\n}\n```\n\n```\nQ: \"M\u00f4n sinh h\u1ecdc kh\u00f4ng c\u00f3 l\u1ecbch thi \u00e0?\"\nA: \"M\u00ecnh v\u1eeba ki\u1ec3m tra trong h\u1ec7 th\u1ed1ng r\u1ed3i n\u00e8! Hi\u1ec7n t\u1ea1i ch\u01b0a th\u1ea5y c\u00f3 l\u1ecbch thi m\u00f4n Sinh h\u1ecdc nha, m\u1edbi ch\u1ec9 th\u1ea5y l\u1ecbch thi c\u1ee7a c\u00e1c m\u00f4n kh\u00e1c nh\u01b0 To\u00e1n th\u00f4i. C\u00f3 th\u1ec3 l\u1ecbch m\u00f4n Sinh h\u1ecdc s\u1ebd \u0111\u01b0\u1ee3c c\u1eadp nh\u1eadt sau \u0111\u00f3 \u0111\u00f3. Khi n\u00e0o c\u00f3 th\u00eam th\u00f4ng tin, m\u00ecnh s\u1ebd b\u00e1o li\u1ec1n nha!\"\n\nANALYSIS: H\u1ecfi v\u1ec1 l\u1ecbch thi m\u00f4n Sinh h\u1ecdc \u279d H\u1ec7 th\u1ed1ng kh\u00f4ng c\u00f3 d\u1eef li\u1ec7u l\u1ecbch thi m\u00f4n Sinh h\u1ecdc \u279d THI\u1ebeU D\u1eee LI\u1ec6U\nOUTPUT: \n{\n \"title\": \"l\u1ecbch thi\",\n \"notification_type\": \"respond\",\n \"message\": \"M\u00f4n sinh h\u1ecdc kh\u00f4ng c\u00f3 l\u1ecbch thi \u00e0?\",\n \"event_id\": null,\n \"user_id\": 123,\n \"scheduled_at\": null\n}\n```\n\n### \ud83d\udd04 EDUCATIONAL + BAD ANSWER \u2192 JSON\n```\nQ: \"BTEC Computing c\u00f3 nh\u1eefng m\u00f4n n\u00e0o?\"\nA: \"T\u00f4i kh\u00f4ng c\u00f3 th\u00f4ng tin v\u1ec1 BTEC Computing\"\nOUTPUT: \n{\n \"title\": \"BTEC Computing m\u00f4n\",\n \"notification_type\": \"respond\",\n \"message\": \"BTEC Computing c\u00f3 nh\u1eefng m\u00f4n n\u00e0o?\",\n \"event_id\": null,\n \"user_id\": 123,\n \"scheduled_at\": null\n}\n\nQ: \"L\u00e0m assignment Database th\u1ebf n\u00e0o?\"\nA: \"ERROR: No Pinecone data - CANNOT ANSWER\"\nOUTPUT:\n{\n \"title\": \"Assignment Database\",\n \"notification_type\": \"respond\", \n \"message\": \"L\u00e0m assignment Database th\u1ebf n\u00e0o?\",\n \"event_id\": null,\n \"user_id\": 123,\n \"scheduled_at\": null\n}\n\nQ: \"C\u00f3 th\u00f4ng tin chi ti\u1ebft v\u1ec1 k\u1ebft qu\u1ea3 h\u1ecdc t\u1eadp m\u00f4n SDLC kh\u00f4ng\"\nA: \"K\u1ebft qu\u1ea3 h\u1ecdc t\u1eadp m\u00f4n Software Development Life Cycle (SDLC) \u0111\u01b0\u1ee3c t\u1ed5 ch\u1ee9c trong h\u1ecdc k\u1ef3 Fall 2024, b\u1eaft \u0111\u1ea7u t\u1eeb 11/09/2024 v\u00e0 k\u1ebft th\u00fac v\u00e0o 18/12/2024. M\u00f4n thu\u1ed9c h\u1ecdc ph\u1ea7n SE06303, m\u00e3 s\u1ed1 7408...\"\nANALYSIS: Sinh vi\u00ean h\u1ecfi v\u1ec1 \"k\u1ebft qu\u1ea3 h\u1ecdc t\u1eadp\" (t\u1ee9c l\u00e0 \u0110I\u1ec2M S\u1ed0) nh\u01b0ng ch\u1ec9 \u0111\u01b0\u1ee3c tr\u1ea3 l\u1eddi v\u1ec1 th\u1eddi gian h\u1ecdc v\u00e0 th\u00f4ng tin chung \u2192 THI\u1ebeU \u0110I\u1ec2M S\u1ed0 C\u1ee4 TH\u1ec2\nOUTPUT:\n{\n \"title\": \"\u0110i\u1ec3m SDLC SE06303\",\n \"notification_type\": \"respond\",\n \"message\": \"C\u00f3 th\u00f4ng tin chi ti\u1ebft v\u1ec1 k\u1ebft qu\u1ea3 h\u1ecdc t\u1eadp m\u00f4n SDLC kh\u00f4ng\",\n \"event_id\": null,\n \"user_id\": 123,\n \"scheduled_at\": null\n}\n\nQ: \"Deadline n\u1ed9p b\u00e0i Unit 1 khi n\u00e0o?\"\nA: \"Unit 1 l\u00e0 m\u1ed9t ph\u1ea7n quan tr\u1ecdng trong ch\u01b0\u01a1ng tr\u00ecnh h\u1ecdc...\"\nANALYSIS: H\u1ecfi deadline c\u1ee5 th\u1ec3 nh\u01b0ng ch\u1ec9 \u0111\u01b0\u1ee3c gi\u1ea3i th\u00edch v\u1ec1 Unit 1 \u2192 THI\u1ebeU TH\u00d4NG TIN DEADLINE\nOUTPUT:\n{\n \"title\": \"Deadline Unit 1\",\n \"notification_type\": \"respond\",\n \"message\": \"Deadline n\u1ed9p b\u00e0i Unit 1 khi n\u00e0o?\",\n \"event_id\": null, \n \"user_id\": 123,\n \"scheduled_at\": null\n}\n\nQ: \"Gi\u1ea3ng vi\u00ean m\u00f4n Programming l\u00e0 ai?\"\nA: \"Programming l\u00e0 m\u00f4n h\u1ecdc c
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
cohereApiopenAiApipineconeApipostgreszaloApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
DA_ZALO1. Uses embeddingsOpenAi, vectorStorePinecone, rerankerCohere, agent. Event-driven trigger; 42 nodes.
Source: https://github.com/old-man-teach-code/BTEC-AI-Teaching-Assistant/blob/f63f916b2052fb6eed5afc4bfdda1ce23443b204/DA_ZALO_02.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Automate Outreach Prospect automates finding, enriching, and messaging potential partners (like restaurants, malls, and bars) using Apify Google Maps scraping, Perplexity enrichment, OpenAI LLMs, Goog
RAG AI Agent Template V5. Uses lmChatOpenAi, documentDefaultDataLoader, embeddingsOpenAi, googleDrive. Event-driven trigger; 56 nodes.
This n8n workflow turns your Telegram bot into a smart, multi-modal AI assistant that accepts text, documents, images, and audio messages, interprets them using OpenAI models, and responds instantly w
Reranks #1. Uses googleDrive, vectorStoreSupabase, embeddingsOpenAi, documentDefaultDataLoader. Event-driven trigger; 48 nodes.
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.