kltn21110 commited on
Commit
b76157c
·
verified ·
1 Parent(s): e5429bd

Upload 12 files

Browse files
Files changed (12) hide show
  1. .env +16 -0
  2. 1.ipynb +66 -0
  3. Dockerfile +25 -0
  4. Pipfile +28 -0
  5. README.md +106 -10
  6. README.txt +108 -0
  7. api_key.txt +16 -0
  8. ca.pem +25 -0
  9. config.yaml +53 -0
  10. decode_token.py +61 -0
  11. main.py +99 -0
  12. requirements.txt +41 -0
.env ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ DB_HOST=mysql-8356ec7-student-d6e5.d.aivencloud.com
2
+ DB_USER=avnadmin
3
+ DB_PASSWORD=AVNS_6o6CpIYAun6eV9jzcf-
4
+ DB_NAME=demohmdrinks
5
+ DB_PORT=19908
6
+ # DB_HOST=localhost
7
+ # DB_USER=root
8
+ # DB_PASSWORD=Yahana0509@
9
+ # DB_NAME=demohmdrinks
10
+ # DB_PORT=4000
11
+ GROQ_API_KEY=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
12
+ COHERE_API_KEY=v34SUVXvG16NlmEZQt1mtwSeUbbdbxCy5KCFue11
13
+ GOOGLE_API_KEY_1=AIzaSyCO-RlqYewC4e9BEPoC8m-AxHUY7J3_o2E
14
+ COHERE_API_KEY_2= v34SUVXvG16NlmEZQt1mtwSeUbbdbxCy5KCFue11
15
+ COHERE_API_KEY_3= v34SUVXvG16NlmEZQt1mtwSeUbbdbxCy5KCFue11
16
+ GOOGLE_API_KEY=AIzaSyCO-RlqYewC4e9BEPoC8m-AxHUY7J3_o2E
1.ipynb ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "id": "80d89913",
6
+ "metadata": {},
7
+ "source": [
8
+ "![total_spending_by_category_pie.png](https://res.cloudinary.com/dgj8n2ggn/image/upload/v1747565702/vlsezbqi8xx9ia2uibkk.png)"
9
+ ]
10
+ },
11
+ {
12
+ "cell_type": "markdown",
13
+ "id": "02f97aae",
14
+ "metadata": {},
15
+ "source": [
16
+ "intermediate_stepsChào bạn, đây là danh sách các sản phẩm gần đây của cửa hàng mình ạ:\n",
17
+ "\n",
18
+ "* **Trà hoa nhài:**\n",
19
+ " * Size L: Giá 25.000đ, còn 10 suất.\n",
20
+ "\n",
21
+ " ![Trà hoa nhài](https://res.cloudinary.com/dwkklrxyj/image/upload/v1739460894/upload-10837309341698561276.jpg)\n",
22
+ " ![Trà hoa nhài](https://res.cloudinary.com/dwkklrxyj/image/upload/v1739460897/upload-16715087870409096557.jpg)\n",
23
+ " * Size M: Giá 20.000đ, còn 10 suất.\n",
24
+ "\n",
25
+ " ![Trà hoa nhài](https://res.cloudinary.com/dwkklrxyj/image/upload/v1739460894/upload-10837309341698561276.jpg)\n",
26
+ " ![Trà hoa nhài](https://res.cloudinary.com/dwkklrxyj/image/upload/v1739460897/upload-16715087870409096557.jpg)\n",
27
+ " * Size S: Giá 15.000đ, còn 10 suất.\n",
28
+ "\n",
29
+ " ![Trà hoa nhài](https://res.cloudinary.com/dwkklrxyj/image/upload/v1739460894/upload-10837309341698561276.jpg)\n",
30
+ " ![Trà hoa nhài](https://res.cloudinary.com/dwkklrxyj/image/upload/v1739460897/upload-16715087870409096557.jpg)\n",
31
+ "* **Trà lá sen:**\n",
32
+ " * Size L: Giá 25.000đ, còn 8 suất.\n",
33
+ "\n",
34
+ " ![Trà lá sen](https://res.cloudinary.com/dwkklrxyj/image/upload/v1739460548/upload-11246682783004057086.jpg)\n",
35
+ " * Size M: Giá 20.000đ, còn 9 suất.\n",
36
+ "\n",
37
+ " ![Trà lá sen](https://res.cloudinary.com/dwkklrxyj/image/upload/v1739460548/upload-11246682783004057086.jpg)\n",
38
+ " * Size S: Giá 15.000đ, còn 9 suất.\n",
39
+ "\n",
40
+ " ![Trà lá sen](https://res.cloudinary.com/dwkklrxyj/image/upload/v1739460548/upload-11246682783004057086.jpg)\n",
41
+ "* **Gấu ca cao sữa:**\n",
42
+ " * Size L: Giá 45.000đ, còn 10 suất.\n",
43
+ "\n",
44
+ " ![Gấu ca cao sữa](https://res.cloudinary.com/dwkklrxyj/image/upload/v1739460237/upload-7450042973315016719.jpg)\n",
45
+ " * Size M: Giá 35.000đ, còn 10 suất.\n",
46
+ "\n",
47
+ " ![Gấu ca cao sữa](https://res.cloudinary.com/dwkklrxyj/image/upload/v1739460237/upload-7450042973315016719.jpg)\n",
48
+ " * Size S: Giá 25.000đ, còn 10 suất.\n",
49
+ "\n",
50
+ " ![Gấu ca cao sữa](https://res.cloudinary.com/dwkklrxyj/image/upload/v1739460237/upload-7450042973315016719.jpg)\n",
51
+ "* **Matcha sữa gấu:**\n",
52
+ " * Size L: Giá 45.000đ, còn 9 suất.\n",
53
+ "\n",
54
+ " ![Matcha sữa gấu](https://res.cloudinary.com/dwkklrxyj/image/upload/v1739460021/upload-3247929565531478708.jpg)\n",
55
+ " ![Matcha sữa gấu](https://res.cloudinary.com/dwkklrxyj/image/upload/v1739460023/upload-12733255502780294470.jpg)"
56
+ ]
57
+ }
58
+ ],
59
+ "metadata": {
60
+ "language_info": {
61
+ "name": "python"
62
+ }
63
+ },
64
+ "nbformat": 4,
65
+ "nbformat_minor": 5
66
+ }
Dockerfile ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.11
2
+
3
+ WORKDIR /code
4
+ WORKDIR /code/temp
5
+ WORKDIR /nltk_data
6
+
7
+ RUN apt-get update && apt-get install ffmpeg libsm6 libxext6 -y
8
+
9
+ RUN mkdir -p /code
10
+ RUN mkdir -p /code/temp
11
+ RUN mkdir -p /nltk_data
12
+
13
+ USER root
14
+
15
+ RUN chmod -R 777 /nltk_data
16
+ RUN chmod -R 777 /code
17
+ RUN chmod -R 777 /code/temp
18
+
19
+
20
+ COPY ./requirements.txt /code/requirements.txt
21
+ RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
22
+ COPY . .
23
+
24
+ EXPOSE 8085
25
+ CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8085", "--reload"]
Pipfile ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [[source]]
2
+ url = "https://pypi.org/simple"
3
+ verify_ssl = true
4
+ name = "pypi"
5
+
6
+ [packages]
7
+ python-dotenv = "*"
8
+ google-generativeai = "*"
9
+ pymysql = "*"
10
+ pymongo = "*"
11
+ langchain = "==0.3.15"
12
+ langchain-experimental = "==0.3.4"
13
+ langchain-google-genai = "*"
14
+ pydantic = "==2.9.2"
15
+ pytz = "*"
16
+ mongoengine = "*"
17
+ fastapi = "*"
18
+ uvicorn = "*"
19
+ langchain-cohere = "*"
20
+ groq = "*"
21
+ langchain-openai = "*"
22
+ nltk = "*"
23
+ pandas = "*"
24
+
25
+ [dev-packages]
26
+
27
+ [requires]
28
+ python_version = "3.11"
README.md CHANGED
@@ -1,10 +1,106 @@
1
- ---
2
- title: Chatbot Server
3
- emoji:
4
- colorFrom: green
5
- colorTo: indigo
6
- sdk: docker
7
- pinned: false
8
- ---
9
-
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Hướng Dẫn Chạy File
2
+
3
+ ## Cấu hình .env - Chỉ áp dụng cho local
4
+ - Thay các tham số DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT
5
+ ```sh
6
+ DB_HOST=localhost
7
+ DB_USER=root
8
+ DB_PASSWORD=Yahana0509@
9
+ DB_NAME=demohmdrinks
10
+ DB_PORT=4000
11
+ # MYSQL_USER_NAME=LMjutwKKRG72ypx.root
12
+ # MYSQL_PASSWOR=mYF2H7KLqpH20XEK
13
+ # MYSQL_PORT=4000
14
+ # MYSQL_DATABASE=pychatbot
15
+ # MYSQL_HOST=gateway01.eu-central-1.prod.aws.tidbcloud.com
16
+ GROQ_API_KEY=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
17
+ COHERE_API_KEY=v34SUVXvG16NlmEZQt1mtwSeUbbdbxCy5KCFue11
18
+ GOOGLE_API_KEY_1=AIzaSyCO-RlqYewC4e9BEPoC8m-AxHUY7J3_o2E
19
+ COHERE_API_KEY_2= v34SUVXvG16NlmEZQt1mtwSeUbbdbxCy5KCFue11
20
+ COHERE_API_KEY_3= v34SUVXvG16NlmEZQt1mtwSeUbbdbxCy5KCFue11
21
+ GOOGLE_API_KEY=AIzaSyCO-RlqYewC4e9BEPoC8m-AxHUY7J3_o2E
22
+ OPENAI_API_KEY=
23
+ ```
24
+ ## Thay đổi đường dẫn db trong file chat.py
25
+ - Vào file chat.py thay dòng vui lòng chỉnh đổi password, port nếu không có password vui lòng chỉ để root
26
+ ```sh
27
+ db = SQLDatabase.from_uri("mysql+pymysql://root:Yahana0509%40@127.0.0.1:4000/demohmdrinks")
28
+ ```
29
+ - Nếu không có password MYSQL vui lòng tắt tại tại file chat.py
30
+ ```sh
31
+ db_config = {
32
+ "host": os.getenv("DB_HOST"),
33
+ "user": os.getenv("DB_USER"),
34
+ "password": os.getenv("DB_PASSWORD"),
35
+ "database": os.getenv("DB_NAME"),
36
+ "port": int(os.getenv("DB_PORT", 3306)),
37
+ "charset": "utf8mb4",
38
+ "cursorclass": pymysql.cursors.DictCursor,
39
+ }
40
+ ```
41
+
42
+ - Thực hiện comment lại:
43
+ ```sh
44
+ "password": os.getenv("DB_PASSWORD"),
45
+ ```
46
+ ## Thay đổi lại cấu hình connect MYSQL nếu không có Password.
47
+ - Vui lòng vào repository --> MySQL --> Config_Database_MySQL.py comment lại dòng:
48
+ ```sh
49
+ password=MYSQL_PASSWORD,
50
+ ```
51
+ - Sử dụng server online của MySQL(eg. TiDB) vui lòng chỉnh lại thành:
52
+ ```sh
53
+ def get_db_engine():
54
+ dsn = URL.create(
55
+ drivername="mysql+pymysql",
56
+ username=MYSQL_USER_NAME,
57
+ password=MYSQL_PASSWORD,
58
+ host=MYSQL_HOST,
59
+ port=MYSQL_PORT,
60
+ database=MYSQL_DATABASE
61
+ )
62
+ connect_args = {
63
+ "ssl_verify_cert": True,
64
+ "ssl_verify_identity": True,
65
+ "ssl_ca": 'cert.pem',
66
+ }
67
+ return create_engine(
68
+ dsn,
69
+ connect_args=connect_args,
70
+ )
71
+ ```
72
+ ## 🔹 Chạy với môi trường thông thường
73
+ ### Bước 1: Tạo môi trường ảo (venv)
74
+ ```sh
75
+ python -m venv venv
76
+ ```
77
+
78
+ ### Bước 2: Kích hoạt môi trường ảo
79
+ - Trên Windows (CMD):
80
+ ```sh
81
+ venv\Scripts\activate
82
+ ```
83
+ - Trên Windows (PowerShell):
84
+ ```sh
85
+ Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted -Force
86
+ Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force
87
+ ```
88
+ ```sh
89
+ Set-ExecutionPolicy Unrestricted -Scope Process
90
+ venv\Scripts\Activate.ps1
91
+ ```
92
+ - Trên macOS/Linux:
93
+ ```sh
94
+ source venv/bin/activate
95
+ ```
96
+
97
+ ### Bước 3: Cài đặt các thư viện cần thiết
98
+ ```sh
99
+ pip install -r requirements.txt
100
+ ```
101
+
102
+ ### Bước 4: Chạy server FastAPI
103
+ ```sh
104
+ python main.py
105
+ ```
106
+ Sau khi chạy server, truy cập API docs tại: [http://127.0.0.1:8085/docs](http://127.0.0.1:8085/docs) hoặc tại [https://rightly-poetic-amoeba.ngrok-free.app/docs](https://rightly-poetic-amoeba.ngrok-free.app/docs)
README.txt ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ HƯỚNG DẪN CHẠY FILE
2
+
3
+ ----------------------------------------
4
+ 1. CẤU HÌNH .env (Chỉ áp dụng cho local):
5
+ ----------------------------------------
6
+
7
+ Thay các tham số sau trong file .env:
8
+ DB_HOST=localhost
9
+ DB_USER=root
10
+ DB_PASSWORD=Yahana0509@
11
+ DB_NAME=demohmdrinks
12
+ DB_PORT=4000
13
+
14
+ GROQ_API_KEY=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
15
+ COHERE_API_KEY=v34SUVXvG16NlmEZQt1mtwSeUbbdbxCy5KCFue11
16
+ GOOGLE_API_KEY_1=AIzaSyCO-RlqYewC4e9BEPoC8m-AxHUY7J3_o2E
17
+ COHERE_API_KEY_2=v34SUVXvG16NlmEZQt1mtwSeUbbdbxCy5KCFue11
18
+ COHERE_API_KEY_3=v34SUVXvG16NlmEZQt1mtwSeUbbdbxCy5KCFue11
19
+ GOOGLE_API_KEY=AIzaSyCO-RlqYewC4e9BEPoC8m-AxHUY7J3_o2E
20
+ OPENAI_API_KEY=
21
+
22
+ Nếu bạn sử dụng server online như TiDB, có thể sử dụng các thông số bên dưới (hiện đang được comment lại trong .env):
23
+ MYSQL_USER_NAME=LMjutwKKRG72ypx.root
24
+ MYSQL_PASSWORD=mYF2H7KLqpH20XEK
25
+ MYSQL_PORT=4000
26
+ MYSQL_DATABASE=pychatbot
27
+ MYSQL_HOST=gateway01.eu-central-1.prod.aws.tidbcloud.com
28
+
29
+ ------------------------------------------------------
30
+ 2. THAY ĐỔI ĐƯỜNG DẪN DB TRONG FILE `chat.py`
31
+ ------------------------------------------------------
32
+
33
+ Mở file chat.py và chỉnh dòng kết nối database:
34
+
35
+ Nếu có mật khẩu:
36
+ db = SQLDatabase.from_uri("mysql+pymysql://root:Yahana0509%40@127.0.0.1:4000/demohmdrinks")
37
+
38
+ Nếu không có mật khẩu:
39
+ Tại phần:
40
+ db_config = {
41
+ "host": os.getenv("DB_HOST"),
42
+ "user": os.getenv("DB_USER"),
43
+ "password": os.getenv("DB_PASSWORD"),
44
+ ...
45
+ }
46
+ -> Hãy comment dòng "password": os.getenv("DB_PASSWORD"),
47
+
48
+ -------------------------------------------------------------
49
+ 3. THAY ĐỔI CẤU HÌNH MYSQL (KHÔNG DÙNG PASSWORD)
50
+ -------------------------------------------------------------
51
+
52
+ Vào file: repository/MySQL/Config_Database_MySQL.py
53
+
54
+ Tìm dòng:
55
+ password=MYSQL_PASSWORD,
56
+ -> và comment lại nếu không có password.
57
+
58
+ Nếu bạn sử dụng server MySQL Online (TiDB, PlanetScale...), thay function `get_db_engine()` bằng:
59
+
60
+ def get_db_engine():
61
+ dsn = URL.create(
62
+ drivername="mysql+pymysql",
63
+ username=MYSQL_USER_NAME,
64
+ password=MYSQL_PASSWORD,
65
+ host=MYSQL_HOST,
66
+ port=MYSQL_PORT,
67
+ database=MYSQL_DATABASE
68
+ )
69
+ connect_args = {
70
+ "ssl_verify_cert": True,
71
+ "ssl_verify_identity": True,
72
+ "ssl_ca": 'cert.pem',
73
+ }
74
+ return create_engine(
75
+ dsn,
76
+ connect_args=connect_args,
77
+ )
78
+
79
+ ------------------------------------------------------
80
+ 4. CHẠY ỨNG DỤNG VỚI MÔI TRƯỜNG THÔNG THƯỜNG
81
+ ------------------------------------------------------
82
+
83
+ Bước 1: Tạo môi trường ảo (venv)
84
+ python -m venv venv
85
+
86
+ Bước 2: Kích hoạt môi trường ảo
87
+
88
+ * Windows CMD:
89
+ venv\Scripts\activate
90
+
91
+ * Windows PowerShell:
92
+ Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted -Force
93
+ Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force
94
+ Set-ExecutionPolicy Unrestricted -Scope Process
95
+ venv\Scripts\Activate.ps1
96
+
97
+ * macOS/Linux:
98
+ source venv/bin/activate
99
+
100
+ Bước 3: Cài đặt thư viện cần thiết:
101
+ pip install -r requirements.txt
102
+
103
+ Bước 4: Chạy server FastAPI:
104
+ python main.py
105
+
106
+ Sau khi chạy, truy cập tài liệu API tại:
107
+ - http://127.0.0.1:8085/docs
108
+ - hoặc: https://rightly-poetic-amoeba.ngrok-free.app/docs
api_key.txt ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ AIzaSyBka2z9sIE-BIHXb9o2Z-hoZ6TPzXCDnac
2
+ AIzaSyAW23eFBB3u2bUfM0sxk-WS_nS2-sV4cUA
3
+ AIzaSyCioxvQEPb1pHgC5jKIHNtbJWLGepPGHhA
4
+ AIzaSyBHcreZ8NSVY52pb1WpLlqAD0BVMdtxqLM
5
+ AIzaSyD2hh16UhUIX7AbtW52_7o4VP7x5ieh99U
6
+ AIzaSyCqXTtiJVqt61CmZyJmRVnfsLH5FR_KSQk
7
+ AIzaSyBK9pkqQYDWe6H2oDNAzBcJ82nhXCL24mw
8
+ AIzaSyAw854X6H7i6X0fe15-UKSlj4bb2SUSaWw
9
+ AIzaSyAYoouBJ49A6qrbacuQUXKe9D-ZIuO1BiE
10
+ AIzaSyCiIljsse8oLS9O0rnpR_CxxaXcnVcL1lM
11
+ AIzaSyAj3A-CQq1C8f63-LrqkWAaAP512ibdcxI
12
+ AIzaSyA4eTxl-suN_D8COMiRA5UmrF-6vW7etys
13
+ AIzaSyCSFguBcRZfo7NUdmQzC0T6vn1PBK_KVI0
14
+ AIzaSyDAVIagntGC7kL93qmLgNZ-is1fsb7tsN4
15
+ AIzaSyD2hh16UhUIX7AbtW52_7o4VP7x5ieh99U
16
+ AIzaSyBn1oce5JdsicdWoueLn-nHg4HBk0whKaE
ca.pem ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEQTCCAqmgAwIBAgIUFqsjSRvknPy1wX8aRb830dN0CY8wDQYJKoZIhvcNAQEM
3
+ BQAwOjE4MDYGA1UEAwwvYjg2ODljMDMtNWIzOC00Y2ZkLWFjZDUtOWQ4NDhjMjg0
4
+ MDk0IFByb2plY3QgQ0EwHhcNMjQwNzA3MTkwNzQ1WhcNMzQwNzA1MTkwNzQ1WjA6
5
+ MTgwNgYDVQQDDC9iODY4OWMwMy01YjM4LTRjZmQtYWNkNS05ZDg0OGMyODQwOTQg
6
+ UHJvamVjdCBDQTCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAM/izeJO
7
+ vXfPnC1gwmWcixeq5rayCo9vnQnlZNzFetheAnG/+Z91TDMK7YfPxvRD5FfIRAeC
8
+ D45/tmyeO0KWJFkRTN4C+SCA1586RNLUSFRFKHwpCU36/sQ5PedG7omHvL58rQQz
9
+ /QcB8nhRtRtC+VcWtahVFmykqJolVFGV2IeJ/7VRdWyVlXdKTLALDvCsmImJg88W
10
+ dY0roTcMarAFUmJaTYha61EnFE0VTSLsltzQ3oh5fMXoEoiweQy52OxsrZU1tPJR
11
+ UE0fyG6PtQMu4a0XrGxTakCJW4zOyXnmF/CbO7u5kNJHBh1FoEEtOwTSvgX4x+pu
12
+ bUjmbKBTdk0bbbs7b1dLXm1Cppvk/CYSrX2tvHFRqkE7El/zt5Lv4z9YGzk6WLTf
13
+ +DpGXCx4i5lNWLliGg7wOn2OrrOQ5FopUX0wWi/jeRPScsfal8Daq7dCkFBEK68P
14
+ LhxOYV413ZcOCu40qltexc37KjBaiRGWkTNjXZpX6MkamDazMhZrwK1ctQIDAQAB
15
+ oz8wPTAdBgNVHQ4EFgQUfputUxQiaG5M02ytAYQIvUNWl2wwDwYDVR0TBAgwBgEB
16
+ /wIBADALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQEMBQADggGBACWanEczGMHMN1wK
17
+ +GQO8b+w1jmG9MbQYXRNSrEtEQ9QTQJd5onFroMGh/6Ev441cqPo0ovtPjFtfoXe
18
+ D3DPCAi7d6UMKaKyHvSTTPgBu8X3eI9AKvWnVwuKY+KBCFksu1QCm+2CY/gtYtqD
19
+ Xm57bxH9VWdXgRJtSXR4aOEnHgZaoeQgig/J0jPpGTU0iDTMIT6dOKThyrrKzdDe
20
+ RCy0UfvfEF4CF4JnhS727PwsTzDhOMsNC6aByOLN2QOZ7elG/G9WVB3ZenglZzL5
21
+ 6zNu8FRzeXSPuqniPYy+cPtGypZPU8Bw/xAeOfM+wvE1X8N2ULdWvD8LdCIhdSYU
22
+ n1+xIwP1Uap8SQKHLk/kwPj/YEdMhXG0c6fOyRubr4eOX0ufp6tRGbtX2Eaf4rul
23
+ +MXgez9W87TAJHbPMMU37L9ngRAJqfdKjqn0We2T7oquCSjyig0LdPXGQaiJ5Ysq
24
+ eF+/9qmjVsPUdo420PQuDJh3MaLU7XiCN5DxRQoURObS10ulIg==
25
+ -----END CERTIFICATE-----
config.yaml ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ frontend:
2
+ web_payment_base: "http://localhost:5173"
3
+ base: "http://localhost:5173"
4
+ web_redirect_paths:
5
+ zalo: "payment-online-status"
6
+ momo: "payment-online-status-momo"
7
+ payos: "payment-online-status-payos"
8
+ vnpay: "payment-online-status-vnpay"
9
+ android_redirect_base: "myapp://open/order-complete"
10
+ android_group_redirect_base: "myapp://open/order-group-complete"
11
+
12
+
13
+ callback_urls:
14
+ base: http://localhost:1010
15
+ zalo:
16
+ single:
17
+ web:
18
+ callback: api/payment/zalo/callback
19
+ android:
20
+ callback: api/payment/zalo/callback
21
+ group:
22
+ android:
23
+ callback: api/payment-group/zalo/callback
24
+
25
+ momo:
26
+ single:
27
+ web:
28
+ callback: api/payment/momo/callback
29
+ android:
30
+ callback: api/payment/momo/callback
31
+ group:
32
+ android:
33
+ callback: api/payment-group/momo/callback
34
+
35
+ payos:
36
+ single:
37
+ web:
38
+ callback: api/payment/payOS/callback
39
+ android:
40
+ callback: api/payment/payOS/callback
41
+ group:
42
+ android:
43
+ callback: api/payment-group/payOS/callback
44
+
45
+ vnpay:
46
+ single:
47
+ web:
48
+ callback: api/payment/vnpay_ipn
49
+ android:
50
+ callback: api/payment/vnpay_ipn
51
+ group:
52
+ android:
53
+ callback: api/payment-group/vnpay_ipn
decode_token.py ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import jwt
2
+ import base64
3
+ from fastapi import FastAPI, HTTPException, Depends, Request
4
+ from fastapi.middleware.cors import CORSMiddleware
5
+ from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
6
+ import os, sys
7
+ BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../"))
8
+ sys.path.insert(0, BASE_DIR)
9
+ from repository.MySQL import UserRepository
10
+ def verify_accesstoken(token:str):
11
+ user_id = UserRepository.getUserIdByAccessToken(token)
12
+ if user_id is None:
13
+ return False
14
+ else:
15
+ return True
16
+
17
+ class JwtService:
18
+ SECRET_KEY = "404E635266556A586E3272357538782F413F4428472B4B6250645367566B5970"
19
+ ALGORITHM = "HS256"
20
+
21
+ @staticmethod
22
+ def get_secret_key():
23
+ """Chuyển đổi secret key thành dạng bytes nếu cần"""
24
+ try:
25
+ return base64.b64decode(JwtService.SECRET_KEY)
26
+ except Exception:
27
+ return JwtService.SECRET_KEY.encode()
28
+
29
+
30
+ @staticmethod
31
+ def extract_user_id(token: str):
32
+ """
33
+ Giải mã token và lấy UserId
34
+ """
35
+ try:
36
+ payload = jwt.decode(token, JwtService.get_secret_key(), algorithms=[JwtService.ALGORITHM])
37
+ check = verify_accesstoken(token)
38
+ if check is False:
39
+ raise HTTPException(status_code=404, detail="Not found Token")
40
+ return payload.get("UserId", None) # Lấy giá trị "UserId" từ payload
41
+ except jwt.ExpiredSignatureError:
42
+ raise HTTPException(status_code=401, detail="Token Expired")
43
+ except jwt.InvalidTokenError:
44
+ raise HTTPException(status_code=401, detail="Invalid token.")
45
+
46
+
47
+ @staticmethod
48
+ def extract_user_role(token: str):
49
+ """
50
+ Giải mã token và lấy UserId
51
+ """
52
+ try:
53
+ payload = jwt.decode(token, JwtService.get_secret_key(), algorithms=[JwtService.ALGORITHM])
54
+ check = verify_accesstoken(token)
55
+ if check is False:
56
+ raise HTTPException(status_code=404, detail="Not found Token")
57
+ return payload.get("Roles", None)
58
+ except jwt.ExpiredSignatureError:
59
+ raise HTTPException(status_code=401, detail="Token Expired")
60
+ except jwt.InvalidTokenError:
61
+ raise HTTPException(status_code=401, detail="Invalid token.")
main.py ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, HTTPException, Depends, Request
2
+ from fastapi.middleware.cors import CORSMiddleware
3
+ from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
4
+ import decode_token
5
+ import function.recommender
6
+ import function.recommender.recommend
7
+ from controller import CallbackController,ChatController,RedirectController,GroupOrderController
8
+ from request import RequestChat
9
+ from typing import Dict
10
+ from fastapi.responses import RedirectResponse
11
+
12
+ app = FastAPI(
13
+ title="ChatBot HMDrinks",
14
+ description="ChatBot HMDrinks for Customizing Chatbots by Nguyen Le Gia Han(21110432) & Nguyen Thuy Diem My(21110)",
15
+ version="1.0.0",
16
+ contact={
17
+ "name": "Nguyen Le Gia Han",
18
+ "url": "https://pychatbot1.streamlit.app",
19
+ "email": "21110432@student.hcmute.edu.vn",
20
+ },
21
+ license_info={
22
+ "name": "Apache 2.0",
23
+ "url": "https://www.apache.org/licenses/LICENSE-2.0.html",
24
+ },
25
+ swagger_ui_parameters={
26
+ "syntaxHighlight.theme": "monokai"
27
+ }
28
+ )
29
+
30
+
31
+ app.add_middleware(
32
+ CORSMiddleware,
33
+ allow_origins=["http://localhost:1010"],
34
+ allow_credentials=True,
35
+ allow_methods=["*"],
36
+ allow_headers=["*"],
37
+ )
38
+
39
+ class JWTBearer(HTTPBearer):
40
+ def __init__(self, auto_error: bool = True):
41
+ super(JWTBearer, self).__init__(auto_error=auto_error)
42
+
43
+ async def __call__(self, request: Request):
44
+ credentials: HTTPAuthorizationCredentials = await super(JWTBearer, self).__call__(request)
45
+ if credentials:
46
+ if credentials.scheme != "Bearer":
47
+ raise HTTPException(status_code=401, detail="Invalid authentication scheme.")
48
+ return credentials.credentials
49
+ else:
50
+ raise HTTPException(status_code=401, detail="Invalid authorization code.")
51
+
52
+ jwt_bearer = JWTBearer()
53
+ from fastapi.responses import JSONResponse
54
+
55
+ @app.post("/api/v1/recommend", tags=["Recommend"])
56
+ async def get_chat_details(request: RequestChat.RecommendRequest,token: str = Depends(jwt_bearer)):
57
+ try:
58
+ user_id_token = decode_token.JwtService.extract_user_id(token)
59
+ data = await function.recommender.recommend.recommend(int(user_id_token),request.number)
60
+ return data
61
+ except Exception as e:
62
+ print("Lỗi khi gọi recommend:", e)
63
+ return JSONResponse(content={"error": "Internal server error"}, status_code=500)
64
+
65
+
66
+ @app.get("/grouporder/",tags=["GroupOrder"])
67
+ async def group_order_redirect(request: Request):
68
+ try:
69
+ params: Dict[str, str] = dict(request.query_params)
70
+ code = params.get("code")
71
+ print(code)
72
+ if not code:
73
+ return RedirectResponse(url="myapp://open/group-order?status=-1")
74
+
75
+ return RedirectResponse(url=f"myapp://open/group-order?status=1&code={code}")
76
+ except Exception as e:
77
+ print("Lỗi khi gọi group order:", e)
78
+ return JSONResponse(content={"error": "Internal server error"}, status_code=500)
79
+
80
+ app.include_router(CallbackController.router, prefix="/api/v1/callback",tags=["CallBack"])
81
+ app.include_router(ChatController.router, prefix="/api/v1/chat",tags=["ChatBot"])
82
+ app.include_router(RedirectController.router, prefix="/api/v1/redirect",tags=["Redirect"])
83
+ app.include_router(GroupOrderController.router, prefix="/api/v1/group-order",tags=["GroupOrder"])
84
+
85
+ import nest_asyncio
86
+ from uvicorn import run
87
+ nest_asyncio.apply()
88
+ from pyngrok import ngrok
89
+ NGROK_STATIC_DOMAIN = "rightly-poetic-amoeba.ngrok-free.app"
90
+ NGROK_TOKEN = "2fEEmIGqKqV2EoE6n5lBRgObtov_4KmEfqwPJLdMi2G7GKnXU"
91
+
92
+ # NGROK_STATIC_DOMAIN = "living-accurately-mackerel.ngrok-free.app"
93
+ # NGROK_TOKEN = "2osXAUfmjMduYmyQUwjR2wSbUJ7_2nr9qR43nduNTWrwEYHmq"
94
+
95
+ if __name__ == "__main__":
96
+ ngrok.set_auth_token(NGROK_TOKEN)
97
+ ngrok_tunnel = ngrok.connect(8085, domain=NGROK_STATIC_DOMAIN)
98
+ print('Public URL:', ngrok_tunnel.public_url)
99
+ run(app, port=8085)
requirements.txt ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ python-dotenv
2
+ google-generativeai
3
+ pymysql
4
+ pymongo
5
+ langchain==0.3.15
6
+ langchain_experimental==0.3.4
7
+ langchain_google_genai
8
+ pydantic==2.9.2
9
+ pytz
10
+ mongoengine
11
+ fastapi
12
+ uvicorn
13
+ langchain_cohere
14
+ groq
15
+ langchain_openai
16
+ nltk
17
+ pandas
18
+ PyJWT
19
+ langchain_huggingface
20
+ langchain-google-vertexai
21
+ unstructured
22
+ pdfminer.six==20221105
23
+ pi-heif==0.21.0
24
+ unstructured_inference
25
+ pillow-heif
26
+ pdf2image
27
+ pytesseract
28
+ unstructured_pytesseract
29
+ chromadb
30
+ docx2txt
31
+ sqlparse
32
+ seaborn
33
+ matplotlib
34
+ google
35
+ google_genai==1.14.0
36
+ pyngrok
37
+ email-validator
38
+ cloudinary
39
+ sqlglot
40
+ rank_bm25
41
+ faiss-cpu