dtyago commited on
Commit
acdfb5c
1 Parent(s): 97db660

Cleanup project structure

Browse files
Dockerfile CHANGED
@@ -10,18 +10,14 @@ RUN apt-get update && apt-get install -y \
10
  RUN useradd -m -u 1000 user
11
 
12
  # Set environment variables for the non-root user
13
- # Name -> Name of the app container
14
- # EC_ADMIN_PWD -> A secret
15
- # HF_MODEL_NAME -> Name of the Hugging Face Hub model
16
- # GGUF_MODEL_URL -> For special loading for GGUF
17
- # MODEL_CLASS -> A switch to load 'gguf' or 'hf'
18
  ENV HOME=/home/user \
19
  PATH=/home/user/.local/bin:$PATH \
20
  NAME=EduConnect \
21
  EC_ADMIN_PWD='$2b$12$wGncNhE7OVmsb7TKFuNPKuJfKOIKdGtw302VMDJbAPrHrY73jqID.' \
22
  HF_MODEL_NAME="BitBasher/llama-2-7b-mini-ibased-GGUF" \
23
  GGUF_MODEL_URL='https://huggingface.co/BitBasher/llama-2-7b-mini-ibased-GGUF/resolve/main/llama-2-7b-mini-ibased.Q5_K_M.gguf' \
24
- MODEL_CLASS='gguf'
 
25
 
26
  # Set the non-root user's home directory as the working directory
27
  WORKDIR $HOME
@@ -32,34 +28,39 @@ RUN mkdir -p ./data && chown user:user ./data
32
  # Change to the non-root user
33
  USER user
34
 
35
- # Set the working directory to where the application files will be located
36
- WORKDIR $HOME/app
37
-
38
  # Copy only the requirements.txt first to leverage Docker cache
39
- COPY --chown=user:user requirements.txt ./
 
 
 
 
40
 
41
  # Install any needed packages specified in requirements.txt
42
- # As the non-root user, ensure packages are installed to the user's home directory
43
- RUN pip install --no-cache-dir --user -r requirements.txt
 
 
44
 
45
  # Copy the rest of the application files into the container
46
- COPY --chown=user:user . .
47
 
48
  # Make port 7860 available to the world outside this container
49
  EXPOSE 7860
50
 
51
  # Indicate that a volume is expected at /home/user/data
52
- # This directory is intended for persistent storage
53
  VOLUME /home/user/data
54
 
55
- # Copy the entrypoint script into the container and ensure it is executable
56
- COPY --chown=user:user entrypoint.sh $HOME
57
 
58
  # Change permission of entrypoint.sh and make sure it is executable
59
- RUN chmod +x $HOME/entrypoint.sh
 
 
 
60
 
61
- # Set the entrypoint script to be executed when the container starts
62
- ENTRYPOINT ["./entrypoint.sh"]
63
 
64
- # Run the FastAPI application using Uvicorn, binding to port 7860
65
- CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "7860"]
 
10
  RUN useradd -m -u 1000 user
11
 
12
  # Set environment variables for the non-root user
 
 
 
 
 
13
  ENV HOME=/home/user \
14
  PATH=/home/user/.local/bin:$PATH \
15
  NAME=EduConnect \
16
  EC_ADMIN_PWD='$2b$12$wGncNhE7OVmsb7TKFuNPKuJfKOIKdGtw302VMDJbAPrHrY73jqID.' \
17
  HF_MODEL_NAME="BitBasher/llama-2-7b-mini-ibased-GGUF" \
18
  GGUF_MODEL_URL='https://huggingface.co/BitBasher/llama-2-7b-mini-ibased-GGUF/resolve/main/llama-2-7b-mini-ibased.Q5_K_M.gguf' \
19
+ MODEL_CLASS='gguf' \
20
+ CHROMADB_LOC='/home/user/data/chromadb'
21
 
22
  # Set the non-root user's home directory as the working directory
23
  WORKDIR $HOME
 
28
  # Change to the non-root user
29
  USER user
30
 
 
 
 
31
  # Copy only the requirements.txt first to leverage Docker cache
32
+ COPY --chown=user:user requirements.txt $HOME/app/
33
+
34
+ # Copy Static files for Jinja2 templates
35
+ COPY --chown=user:user ./static /home/user/app/static
36
+
37
 
38
  # Install any needed packages specified in requirements.txt
39
+ RUN pip install --no-cache-dir --user -r $HOME/app/requirements.txt
40
+
41
+ # Set the working directory to where the application files will be located
42
+ WORKDIR $HOME/app
43
 
44
  # Copy the rest of the application files into the container
45
+ COPY --chown=user:user ./app .
46
 
47
  # Make port 7860 available to the world outside this container
48
  EXPOSE 7860
49
 
50
  # Indicate that a volume is expected at /home/user/data
 
51
  VOLUME /home/user/data
52
 
53
+ # Adjust the COPY command for the entrypoint script to ensure correct placement
54
+ COPY --chown=user:user entrypoint.sh /home/user/entrypoint.sh
55
 
56
  # Change permission of entrypoint.sh and make sure it is executable
57
+ RUN chmod +x /home/user/entrypoint.sh
58
+
59
+ # Update the ENTRYPOINT command to use the full path to entrypoint.sh
60
+ ENTRYPOINT ["/home/user/entrypoint.sh"]
61
 
62
+ # Set Python path just to make sure
63
+ ENV PYTHONPATH="/home/user/app:${PYTHONPATH}"
64
 
65
+ # Adjust the CMD to ensure it correctly references the FastAPI app
66
+ CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]
README.md CHANGED
@@ -11,7 +11,7 @@ license: apache-2.0
11
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
12
 
13
  ```
14
- EduConnect/
15
  ├── app/
16
  │ ├── __init__.py # Initializes the FastAPI app and global configurations
17
  │ ├── main.py # Entry point for the FastAPI application, defining routes
@@ -43,5 +43,5 @@ EduConnect/
43
  ├── Dockerfile # Docker configuration for setting up the environment
44
  ├── requirements.txt # Lists all Python library dependencies
45
  ├── entrypoint.sh # To download model from hugging face
46
- └── .env # Environment variables for configuration settings
47
  ```
 
11
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
12
 
13
  ```
14
+ **EduConnect/
15
  ├── app/
16
  │ ├── __init__.py # Initializes the FastAPI app and global configurations
17
  │ ├── main.py # Entry point for the FastAPI application, defining routes
 
43
  ├── Dockerfile # Docker configuration for setting up the environment
44
  ├── requirements.txt # Lists all Python library dependencies
45
  ├── entrypoint.sh # To download model from hugging face
46
+ └── .env # Environment variables for configuration settings**
47
  ```
app/admin/admin_functions.py CHANGED
@@ -1,19 +1,18 @@
 
 
1
  from fastapi import HTTPException, UploadFile, File, Form
2
  from typing import Optional
3
  import bcrypt
4
  import os
5
  import shutil
6
 
 
 
 
7
  # Import vector store for database operations
8
- from langchain.vectorstores import Chroma
9
  # Import embeddings module from langchain for vector representations of text
10
- from langchain.embeddings import HuggingFaceEmbeddings
11
- from app.main import CHROMADB_LOC
12
-
13
- from app.utils.chat_rag import sanitize_collection_name
14
- from ..utils import get_user_cropped_image_from_photo
15
-
16
-
17
 
18
  # Registrering a face
19
  async def register_user(db, email: str, name: str, role: str, file: UploadFile = File(...)):
@@ -104,7 +103,7 @@ def faces_count(client, db):
104
  def remove_all_faces(client, user_faces_collection="user_faces_db"):
105
  # Fetch all user IDs from the user_faces_db collection
106
  all_user_ids = client.get_all_ids(collection_name=user_faces_collection)
107
-
108
  # Loop through all user IDs and delete associated collections
109
  for user_id in all_user_ids:
110
  sanitized_collection_name = sanitize_collection_name(user_id)
 
1
+ import hashlib
2
+ import re
3
  from fastapi import HTTPException, UploadFile, File, Form
4
  from typing import Optional
5
  import bcrypt
6
  import os
7
  import shutil
8
 
9
+ from utils.chat_rag import sanitize_collection_name
10
+ from utils.ec_image_utils import get_user_cropped_image_from_photo
11
+
12
  # Import vector store for database operations
13
+ from langchain_community.vectorstores import Chroma
14
  # Import embeddings module from langchain for vector representations of text
15
+ from langchain_community.embeddings import HuggingFaceEmbeddings
 
 
 
 
 
 
16
 
17
  # Registrering a face
18
  async def register_user(db, email: str, name: str, role: str, file: UploadFile = File(...)):
 
103
  def remove_all_faces(client, user_faces_collection="user_faces_db"):
104
  # Fetch all user IDs from the user_faces_db collection
105
  all_user_ids = client.get_all_ids(collection_name=user_faces_collection)
106
+ CHROMADB_LOC = os.getenv('CHROMADB_LOC')
107
  # Loop through all user IDs and delete associated collections
108
  for user_id in all_user_ids:
109
  sanitized_collection_name = sanitize_collection_name(user_id)
app/api/userchat.py CHANGED
@@ -1,7 +1,7 @@
1
  from fastapi import APIRouter, Depends, HTTPException, Body
2
- from ..dependencies import get_current_user
3
- from ..utils.chat_rag import llm_infer
4
- from ..utils.chat_rag import sanitize_collection_name
5
  from typing import Any
6
 
7
  router = APIRouter()
 
1
  from fastapi import APIRouter, Depends, HTTPException, Body
2
+ from dependencies import get_current_user
3
+ from utils.chat_rag import llm_infer
4
+ from utils.chat_rag import sanitize_collection_name
5
  from typing import Any
6
 
7
  router = APIRouter()
app/api/userlogin.py CHANGED
@@ -1,9 +1,9 @@
1
  from datetime import datetime, timedelta
2
  from typing import Optional
3
  from fastapi import APIRouter, File, UploadFile, HTTPException
4
- from ..utils.db import tinydb_helper, chromadb_face_helper
5
- from ..utils.jwt_utils import create_access_token
6
- from ..utils.ec_image_utils import get_user_cropped_image_from_photo
7
  import os
8
  import uuid
9
 
 
1
  from datetime import datetime, timedelta
2
  from typing import Optional
3
  from fastapi import APIRouter, File, UploadFile, HTTPException
4
+ from utils.db import tinydb_helper, chromadb_face_helper
5
+ from utils.jwt_utils import create_access_token
6
+ from utils.ec_image_utils import get_user_cropped_image_from_photo
7
  import os
8
  import uuid
9
 
app/api/userlogout.py CHANGED
@@ -1,7 +1,7 @@
1
  from typing import Any
2
  from fastapi import APIRouter, Depends, HTTPException
3
- from ..utils.db import tinydb_helper # Ensure this import is correct based on our project structure
4
- from ..dependencies import get_current_user, oauth2_scheme
5
 
6
  router = APIRouter()
7
 
 
1
  from typing import Any
2
  from fastapi import APIRouter, Depends, HTTPException
3
+ from utils.db import tinydb_helper # Ensure this import is correct based on our project structure
4
+ from dependencies import get_current_user, oauth2_scheme
5
 
6
  router = APIRouter()
7
 
app/api/userupload.py CHANGED
@@ -1,10 +1,10 @@
1
  from typing import Any
2
  from fastapi import APIRouter, Depends, UploadFile, File, HTTPException
3
  import os
4
- from app.dependencies import get_current_user
5
  # Assuming a utility for processing PDFs and generating embeddings
6
- from ..utils.doc_ingest import ingest_document
7
- from ..utils.chat_rag import sanitize_collection_name
8
 
9
  router = APIRouter()
10
 
 
1
  from typing import Any
2
  from fastapi import APIRouter, Depends, UploadFile, File, HTTPException
3
  import os
4
+ from dependencies import get_current_user
5
  # Assuming a utility for processing PDFs and generating embeddings
6
+ from utils.doc_ingest import ingest_document
7
+ from utils.chat_rag import sanitize_collection_name
8
 
9
  router = APIRouter()
10
 
app/dependencies.py CHANGED
@@ -1,8 +1,8 @@
1
  from fastapi import Depends, HTTPException, status
2
  from fastapi.security import OAuth2PasswordBearer
3
  from jose import jwt, JWTError # Ensure this is correctly imported
4
- from .utils.db import tinydb_helper # Ensure this instance is correctly initialized elsewhere
5
- from .utils.jwt_utils import SECRET_KEY, ALGORITHM, decode_jwt
6
 
7
  oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
8
 
 
1
  from fastapi import Depends, HTTPException, status
2
  from fastapi.security import OAuth2PasswordBearer
3
  from jose import jwt, JWTError # Ensure this is correctly imported
4
+ from utils.db import tinydb_helper # Ensure this instance is correctly initialized elsewhere
5
+ from utils.jwt_utils import SECRET_KEY, ALGORITHM, decode_jwt
6
 
7
  oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
8
 
app/main.py CHANGED
@@ -7,15 +7,15 @@ from fastapi.staticfiles import StaticFiles
7
  from fastapi.responses import HTMLResponse, RedirectResponse
8
  from fastapi.templating import Jinja2Templates
9
 
10
- from .admin import admin_functions as admin
11
- from .utils.db import UserFaceEmbeddingFunction,ChromaDBFaceHelper
12
- from .api import userlogin, userlogout, userchat, userupload
13
- from .utils.db import ChromaDBFaceHelper
14
-
15
- CHROMADB_LOC = "/home/user/data/chromadb"
16
 
17
  app = FastAPI()
18
 
 
 
19
  # Add middleware
20
  # Set all origins to wildcard for simplicity, but we should limit this in production
21
  app.add_middleware(
@@ -43,10 +43,10 @@ async def startup_event():
43
  print(f"MODEL_PATH in main.py = {os.getenv('MODEL_PATH')} ")
44
 
45
  # Mount static files
46
- app.mount("/static", StaticFiles(directory="static"), name="static")
47
 
48
  # Setup Jinja2Templates to point to the templates directory
49
- templates = Jinja2Templates(directory="app/admin/templates")
50
 
51
  @app.get("/")
52
  async def get_admin_login(request: Request):
@@ -90,7 +90,7 @@ async def handle_user_registration(request: Request, email: str = Form(...), nam
90
  @app.get("/admin/data_management", response_class=HTMLResponse)
91
  async def get_db_details(request: Request):
92
  # Render the Chroma DB details
93
- faces = admin.faces_count(user_faces_db)
94
  return templates.TemplateResponse("data_management.html", {
95
  "request": request,
96
  "faces" : faces
 
7
  from fastapi.responses import HTMLResponse, RedirectResponse
8
  from fastapi.templating import Jinja2Templates
9
 
10
+ from admin import admin_functions as admin
11
+ from utils.db import UserFaceEmbeddingFunction,ChromaDBFaceHelper
12
+ from api import userlogin, userlogout, userchat, userupload
13
+ from utils.db import ChromaDBFaceHelper
 
 
14
 
15
  app = FastAPI()
16
 
17
+ CHROMADB_LOC = os.getenv('CHROMADB_LOC')
18
+
19
  # Add middleware
20
  # Set all origins to wildcard for simplicity, but we should limit this in production
21
  app.add_middleware(
 
43
  print(f"MODEL_PATH in main.py = {os.getenv('MODEL_PATH')} ")
44
 
45
  # Mount static files
46
+ app.mount("/home/user/app/static", StaticFiles(directory="static"), name="static")
47
 
48
  # Setup Jinja2Templates to point to the templates directory
49
+ templates = Jinja2Templates(directory="admin/templates")
50
 
51
  @app.get("/")
52
  async def get_admin_login(request: Request):
 
90
  @app.get("/admin/data_management", response_class=HTMLResponse)
91
  async def get_db_details(request: Request):
92
  # Render the Chroma DB details
93
+ faces = admin.faces_count(ec_client, user_faces_db)
94
  return templates.TemplateResponse("data_management.html", {
95
  "request": request,
96
  "faces" : faces
app/utils/__init__.py CHANGED
@@ -1,2 +1 @@
1
- # In utils/__init__.py
2
- from .ec_image_utils import get_user_cropped_image_from_photo
 
1
+ # In utils/__init__.py
 
app/utils/chat_rag.py CHANGED
@@ -2,6 +2,7 @@
2
  import os
3
  import re
4
  import hashlib
 
5
  from langchain.document_loaders import PyPDFLoader
6
 
7
  # Import embeddings module from langchain for vector representations of text
@@ -23,13 +24,13 @@ from langchain.chains.router import MultiPromptChain
23
  from langchain.chains import ConversationChain
24
  from langchain.chains.llm import LLMChain
25
  from langchain.prompts import PromptTemplate
26
- from langchain.memory import ConversationBufferMemory
27
  from langchain.chains import ConversationalRetrievalChain
28
 
29
  from langchain.callbacks.manager import CallbackManager
30
  from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
31
 
32
- CHROMADB_LOC = "/home/user/data/chromadb"
33
 
34
  def sanitize_collection_name(email):
35
  # Replace invalid characters with an underscore
@@ -47,7 +48,9 @@ def sanitize_collection_name(email):
47
 
48
  # Modify vectordb initialization to be dynamic based on user_id
49
  def get_vectordb_for_user(user_collection_name):
50
-
 
 
51
  vectordb = Chroma(
52
  collection_name=user_collection_name,
53
  embedding_function=HuggingFaceEmbeddings(model_name='sentence-transformers/all-MiniLM-L6-v2'),
@@ -57,6 +60,10 @@ def get_vectordb_for_user(user_collection_name):
57
 
58
 
59
  def pdf_to_vec(filename, user_collection_name):
 
 
 
 
60
  document = []
61
  loader = PyPDFLoader(filename)
62
  document.extend(loader.load()) #which library is this from?
@@ -111,6 +118,9 @@ def load_llm():
111
 
112
  #step 5, to instantiate once to create default_chain,router_chain,destination_chains into chain and set vectordb. so will not re-create per prompt
113
  def default_chain(llm, user_collection_name):
 
 
 
114
  vectordb = get_vectordb_for_user(user_collection_name) # Use the dynamic vectordb based on user_id
115
  sum_template = """
116
  As a machine learning education specialist, our expertise is pivotal in deepening the comprehension of complex machine learning concepts for both educators and students.
@@ -162,9 +172,16 @@ def default_chain(llm, user_collection_name):
162
  for p_info in prompt_infos:
163
  name = p_info["name"]
164
  prompt_template = p_info["prompt_template"]
 
165
  prompt = PromptTemplate(template=prompt_template, input_variables=["input"])
166
- chain = LLMChain(llm=llm, prompt=prompt)
 
 
 
 
 
167
  destination_chains[name] = chain
 
168
  #default_chain = ConversationChain(llm=llm, output_key="text")
169
  #memory = ConversationBufferMemory(memory_key='chat_history', return_messages=True)
170
 
 
2
  import os
3
  import re
4
  import hashlib
5
+
6
  from langchain.document_loaders import PyPDFLoader
7
 
8
  # Import embeddings module from langchain for vector representations of text
 
24
  from langchain.chains import ConversationChain
25
  from langchain.chains.llm import LLMChain
26
  from langchain.prompts import PromptTemplate
27
+ from langchain.memory import ConversationBufferMemory, VectorStoreRetrieverMemory
28
  from langchain.chains import ConversationalRetrievalChain
29
 
30
  from langchain.callbacks.manager import CallbackManager
31
  from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
32
 
33
+
34
 
35
  def sanitize_collection_name(email):
36
  # Replace invalid characters with an underscore
 
48
 
49
  # Modify vectordb initialization to be dynamic based on user_id
50
  def get_vectordb_for_user(user_collection_name):
51
+ # Get Chromadb location
52
+ CHROMADB_LOC = os.getenv('CHROMADB_LOC')
53
+
54
  vectordb = Chroma(
55
  collection_name=user_collection_name,
56
  embedding_function=HuggingFaceEmbeddings(model_name='sentence-transformers/all-MiniLM-L6-v2'),
 
60
 
61
 
62
  def pdf_to_vec(filename, user_collection_name):
63
+
64
+ # Get Chromadb location
65
+ CHROMADB_LOC = os.getenv('CHROMADB_LOC')
66
+
67
  document = []
68
  loader = PyPDFLoader(filename)
69
  document.extend(loader.load()) #which library is this from?
 
118
 
119
  #step 5, to instantiate once to create default_chain,router_chain,destination_chains into chain and set vectordb. so will not re-create per prompt
120
  def default_chain(llm, user_collection_name):
121
+ # Get Chromadb location
122
+ CHROMADB_LOC = os.getenv('CHROMADB_LOC')
123
+
124
  vectordb = get_vectordb_for_user(user_collection_name) # Use the dynamic vectordb based on user_id
125
  sum_template = """
126
  As a machine learning education specialist, our expertise is pivotal in deepening the comprehension of complex machine learning concepts for both educators and students.
 
172
  for p_info in prompt_infos:
173
  name = p_info["name"]
174
  prompt_template = p_info["prompt_template"]
175
+ #vectordb=p_info["vector"]
176
  prompt = PromptTemplate(template=prompt_template, input_variables=["input"])
177
+ embeddings = HuggingFaceEmbeddings(model_name='sentence-transformers/all-MiniLM-L6-v2') #new
178
+ vectordb= Chroma(persist_directory = CHROMADB_LOC, embedding_function = embeddings) #new
179
+ retriever = vectordb.as_retriever()#new
180
+ memory = VectorStoreRetrieverMemory(retriever=retriever) #new
181
+
182
+ chain = LLMChain(llm=llm, prompt=prompt, verbose=True, memory=memory) #new memory=memory
183
  destination_chains[name] = chain
184
+
185
  #default_chain = ConversationChain(llm=llm, output_key="text")
186
  #memory = ConversationBufferMemory(memory_key='chat_history', return_messages=True)
187
 
app/utils/db.py CHANGED
@@ -1,4 +1,5 @@
1
 
 
2
  from tinydb import TinyDB, Query, where
3
  from tinydb.storages import MemoryStorage
4
  import chromadb
@@ -7,7 +8,6 @@ from keras_facenet import FaceNet
7
  from typing import Any
8
  from datetime import datetime, timedelta
9
 
10
- CHROMADB_LOC = "/home/user/data/chromadb"
11
 
12
  class TinyDBHelper:
13
  def __init__(self):
@@ -77,4 +77,4 @@ class ChromaDBFaceHelper:
77
 
78
  # Initialize these helpers globally if they are to be used across multiple modules
79
  tinydb_helper = TinyDBHelper()
80
- chromadb_face_helper = ChromaDBFaceHelper(CHROMADB_LOC) # Initialization requires db_path
 
1
 
2
+ import os
3
  from tinydb import TinyDB, Query, where
4
  from tinydb.storages import MemoryStorage
5
  import chromadb
 
8
  from typing import Any
9
  from datetime import datetime, timedelta
10
 
 
11
 
12
  class TinyDBHelper:
13
  def __init__(self):
 
77
 
78
  # Initialize these helpers globally if they are to be used across multiple modules
79
  tinydb_helper = TinyDBHelper()
80
+ chromadb_face_helper = ChromaDBFaceHelper(os.getenv('CHROMADB_LOC')) # Initialization requires db_path
docker-compose.yml DELETED
@@ -1,17 +0,0 @@
1
- version: '3.8'
2
- services:
3
- educonnect:
4
- image: python:3.9
5
- command: ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "7860", "--reload"]
6
- volumes:
7
- - /Users/tyago/Workspace/EduConnect:/home/user/app
8
- ports:
9
- - "7860:7860"
10
- environment:
11
- - HOME=/home/user
12
- - PATH=/home/user/.local/bin:$PATH
13
- - NAME=EduConnect
14
- user: "1000:1000"
15
- working_dir: /home/user/app
16
- env_file:
17
- - .env
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
entrypoint.sh CHANGED
@@ -1,18 +1,19 @@
1
  #!/bin/bash
2
 
 
 
3
  # Authenticate with Hugging Face
4
  export HF_HOME=/home/user/data/hf_cache
5
-
6
- # Assuming HF_TOKEN is already exported to the environment
7
  echo "Using Hugging Face API token for authentication"
8
 
9
  # Navigate to the directory where download_model.py is located
10
  echo "Determining model path..."
11
- cd /home/user/app/app/utils
 
12
 
13
  # Execute the download_model script
14
  python download_model.py || { echo "Model download failed"; exit 1; }
15
- # export MODEL_PATH
16
  # Read the model path from model_path.txt and export it
17
  MODEL_PATH=$(cat /home/user/data/models/model_path.txt)
18
  export MODEL_PATH
@@ -20,6 +21,8 @@ echo "@ Entrypoint - MODEL_PATH exported=${MODEL_PATH}"
20
 
21
  # Navigate back to the app directory
22
  cd /home/user/app
 
23
 
24
  # Execute the main command of the container
 
25
  exec "$@"
 
1
  #!/bin/bash
2
 
3
+ echo "Starting entrypoint script..."
4
+
5
  # Authenticate with Hugging Face
6
  export HF_HOME=/home/user/data/hf_cache
 
 
7
  echo "Using Hugging Face API token for authentication"
8
 
9
  # Navigate to the directory where download_model.py is located
10
  echo "Determining model path..."
11
+ cd /home/user/app/utils
12
+ echo "Current directory for model download: $(pwd)"
13
 
14
  # Execute the download_model script
15
  python download_model.py || { echo "Model download failed"; exit 1; }
16
+
17
  # Read the model path from model_path.txt and export it
18
  MODEL_PATH=$(cat /home/user/data/models/model_path.txt)
19
  export MODEL_PATH
 
21
 
22
  # Navigate back to the app directory
23
  cd /home/user/app
24
+ echo "Returning to app directory: $(pwd)"
25
 
26
  # Execute the main command of the container
27
+ echo "Executing main command..."
28
  exec "$@"
requirements.txt CHANGED
@@ -18,4 +18,5 @@ tinydb # The in memory database for storing JWT tokens
18
  langchain # Langgchain for RAG
19
  llama-cpp-python # To load the model
20
  sentence-transformers # For text embeddings
21
- pypdf # Handling PDF files
 
 
18
  langchain # Langgchain for RAG
19
  llama-cpp-python # To load the model
20
  sentence-transformers # For text embeddings
21
+ pypdf # Handling PDF files
22
+ langchain-community # Latest library to prevent dprecated warnings