Spaces:
Sleeping
Sleeping
Upload 12 files
Browse files- .env +16 -0
- 1.ipynb +66 -0
- Dockerfile +25 -0
- Pipfile +28 -0
- README.md +106 -10
- README.txt +108 -0
- api_key.txt +16 -0
- ca.pem +25 -0
- config.yaml +53 -0
- decode_token.py +61 -0
- main.py +99 -0
- 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 |
+
""
|
| 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 |
+
" \n",
|
| 22 |
+
" \n",
|
| 23 |
+
" * Size M: Giá 20.000đ, còn 10 suất.\n",
|
| 24 |
+
"\n",
|
| 25 |
+
" \n",
|
| 26 |
+
" \n",
|
| 27 |
+
" * Size S: Giá 15.000đ, còn 10 suất.\n",
|
| 28 |
+
"\n",
|
| 29 |
+
" \n",
|
| 30 |
+
" \n",
|
| 31 |
+
"* **Trà lá sen:**\n",
|
| 32 |
+
" * Size L: Giá 25.000đ, còn 8 suất.\n",
|
| 33 |
+
"\n",
|
| 34 |
+
" \n",
|
| 35 |
+
" * Size M: Giá 20.000đ, còn 9 suất.\n",
|
| 36 |
+
"\n",
|
| 37 |
+
" \n",
|
| 38 |
+
" * Size S: Giá 15.000đ, còn 9 suất.\n",
|
| 39 |
+
"\n",
|
| 40 |
+
" \n",
|
| 41 |
+
"* **Gấu ca cao sữa:**\n",
|
| 42 |
+
" * Size L: Giá 45.000đ, còn 10 suất.\n",
|
| 43 |
+
"\n",
|
| 44 |
+
" \n",
|
| 45 |
+
" * Size M: Giá 35.000đ, còn 10 suất.\n",
|
| 46 |
+
"\n",
|
| 47 |
+
" \n",
|
| 48 |
+
" * Size S: Giá 25.000đ, còn 10 suất.\n",
|
| 49 |
+
"\n",
|
| 50 |
+
" \n",
|
| 51 |
+
"* **Matcha sữa gấu:**\n",
|
| 52 |
+
" * Size L: Giá 45.000đ, còn 9 suất.\n",
|
| 53 |
+
"\n",
|
| 54 |
+
" \n",
|
| 55 |
+
" "
|
| 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 |
-
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|