Prathamesh Sable commited on
Commit
7ce7f0d
·
1 Parent(s): d3ab78b

added loading existing files

Browse files
Files changed (3) hide show
  1. app.py +49 -12
  2. db.py +39 -0
  3. templates/index.html +30 -0
app.py CHANGED
@@ -6,10 +6,11 @@ from apscheduler.schedulers.background import BackgroundScheduler
6
  from langchain_community.embeddings import HuggingFaceInferenceAPIEmbeddings
7
  import google.generativeai as genai
8
  from langchain.text_splitter import RecursiveCharacterTextSplitter
9
- from utils import add_file_to_chroma,remove_file_from_chroma,generate_query_response
10
 
11
- from langchain_chroma import Chroma
12
 
 
13
  import os
14
  from dotenv import load_dotenv
15
  import logging
@@ -25,6 +26,7 @@ HF_TOKEN = os.getenv('HF_TOKEN')
25
  GOOGLE_API_KEY = os.getenv('GOOGLE_API_KEY')
26
  CHROMA_PATH = "chroma"
27
  UPLOAD_FOLDER = "uploads"
 
28
  PROMPT_TEMPLATE = """
29
  Answer the given query based only on the context given below.
30
  context:
@@ -54,10 +56,30 @@ CORS(app)
54
  # Initialize ChromaDB client
55
  db = Chroma(persist_directory=CHROMA_PATH, embedding_function=hugging_face_ef)
56
 
 
 
 
 
57
  @app.route('/')
58
  def index():
59
  return render_template('index.html')
60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  @app.route('/upload-file', methods=['POST'])
62
  def upload_file():
63
  """Handle file uploads."""
@@ -71,6 +93,7 @@ def upload_file():
71
  return jsonify({'error': 'No file selected', 'status': 'error'}), 400
72
 
73
  filename = secure_filename(file.filename)
 
74
  file_path = os.path.join(UPLOAD_FOLDER, filename)
75
  file.save(file_path)
76
 
@@ -78,12 +101,16 @@ def upload_file():
78
  # Add file chunks to ChromaDB
79
  add_file_to_chroma(file_path, file_id, hugging_face_ef, db, logger)
80
 
 
 
 
81
  return jsonify({
82
  'message': 'File uploaded successfully',
83
  'status': 'success',
84
  'file_info': {
85
  'file_id': file_id,
86
- 'file_name': filename
 
87
  }
88
  }), 200
89
  except ValueError as e:
@@ -101,16 +128,26 @@ def upload_file():
101
  def remove_file():
102
  file_id = request.form.get('file_id')
103
 
104
- if remove_file_from_chroma(file_id, db):
105
- return jsonify({
106
- 'message': 'File deleted successfully',
107
- 'status': 'success'
108
- }), 200
109
- else:
 
 
 
 
 
 
 
 
 
 
110
  return jsonify({
111
- 'message': 'File Not Found',
112
- 'status': 'fail'
113
- }), 404
114
 
115
  @app.route("/ask_query", methods=['POST'])
116
  def ask_query():
 
6
  from langchain_community.embeddings import HuggingFaceInferenceAPIEmbeddings
7
  import google.generativeai as genai
8
  from langchain.text_splitter import RecursiveCharacterTextSplitter
9
+ from utils import add_file_to_chroma, remove_file_from_chroma, generate_query_response
10
 
11
+ from db import init_db,add_file_to_db,remove_file_from_db,get_all_files
12
 
13
+ from langchain_chroma import Chroma
14
  import os
15
  from dotenv import load_dotenv
16
  import logging
 
26
  GOOGLE_API_KEY = os.getenv('GOOGLE_API_KEY')
27
  CHROMA_PATH = "chroma"
28
  UPLOAD_FOLDER = "uploads"
29
+ DB_PATH = "files.db"
30
  PROMPT_TEMPLATE = """
31
  Answer the given query based only on the context given below.
32
  context:
 
56
  # Initialize ChromaDB client
57
  db = Chroma(persist_directory=CHROMA_PATH, embedding_function=hugging_face_ef)
58
 
59
+
60
+ # Initialize database
61
+ init_db()
62
+
63
  @app.route('/')
64
  def index():
65
  return render_template('index.html')
66
 
67
+ @app.route('/get-files', methods=['GET'])
68
+ def get_files():
69
+ """Get list of all files."""
70
+ try:
71
+ files = get_all_files()
72
+ return jsonify({
73
+ 'status': 'success',
74
+ 'files': files
75
+ }), 200
76
+ except Exception as e:
77
+ logger.error(f"Error fetching files: {str(e)}")
78
+ return jsonify({
79
+ 'status': 'error',
80
+ 'error': str(e)
81
+ }), 500
82
+
83
  @app.route('/upload-file', methods=['POST'])
84
  def upload_file():
85
  """Handle file uploads."""
 
93
  return jsonify({'error': 'No file selected', 'status': 'error'}), 400
94
 
95
  filename = secure_filename(file.filename)
96
+ file_type = filename.split('.')[-1].lower()
97
  file_path = os.path.join(UPLOAD_FOLDER, filename)
98
  file.save(file_path)
99
 
 
101
  # Add file chunks to ChromaDB
102
  add_file_to_chroma(file_path, file_id, hugging_face_ef, db, logger)
103
 
104
+ # Add file to SQLite database
105
+ add_file_to_db(file_id, filename, file_type)
106
+
107
  return jsonify({
108
  'message': 'File uploaded successfully',
109
  'status': 'success',
110
  'file_info': {
111
  'file_id': file_id,
112
+ 'file_name': filename,
113
+ 'file_type': file_type
114
  }
115
  }), 200
116
  except ValueError as e:
 
128
  def remove_file():
129
  file_id = request.form.get('file_id')
130
 
131
+ try:
132
+ # Remove from ChromaDB
133
+ if remove_file_from_chroma(file_id, db):
134
+ # Remove from SQLite database
135
+ remove_file_from_db(file_id)
136
+ return jsonify({
137
+ 'message': 'File deleted successfully',
138
+ 'status': 'success'
139
+ }), 200
140
+ else:
141
+ return jsonify({
142
+ 'message': 'File Not Found',
143
+ 'status': 'fail'
144
+ }), 404
145
+ except Exception as e:
146
+ logger.error(f"Error removing file: {str(e)}")
147
  return jsonify({
148
+ 'error': str(e),
149
+ 'status': 'error'
150
+ }), 500
151
 
152
  @app.route("/ask_query", methods=['POST'])
153
  def ask_query():
db.py ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sqlite3
2
+
3
+ # Initialize SQLite database for file tracking
4
+ def init_db(DB_PATH = "files.db"):
5
+ conn = sqlite3.connect(DB_PATH)
6
+ c = conn.cursor()
7
+ c.execute('''CREATE TABLE IF NOT EXISTS files
8
+ (file_id TEXT PRIMARY KEY,
9
+ file_name TEXT,
10
+ file_type TEXT,
11
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)''')
12
+ conn.commit()
13
+ conn.close()
14
+
15
+ def add_file_to_db(file_id, file_name, file_type,DB_PATH = "files.db"):
16
+ conn = sqlite3.connect(DB_PATH)
17
+ c = conn.cursor()
18
+ c.execute('INSERT INTO files (file_id, file_name, file_type) VALUES (?, ?, ?)',
19
+ (file_id, file_name, file_type))
20
+ conn.commit()
21
+ conn.close()
22
+
23
+ def remove_file_from_db(file_id,DB_PATH = "files.db"):
24
+ conn = sqlite3.connect(DB_PATH)
25
+ c = conn.cursor()
26
+ c.execute('DELETE FROM files WHERE file_id = ?', (file_id,))
27
+ conn.commit()
28
+ conn.close()
29
+
30
+ def get_all_files(DB_PATH = "files.db"):
31
+ conn = sqlite3.connect(DB_PATH)
32
+ c = conn.cursor()
33
+ c.execute('SELECT file_id, file_name, file_type, created_at FROM files ORDER BY created_at DESC')
34
+ files = [{'file_id': row[0],
35
+ 'file_name': row[1],
36
+ 'file_type': row[2],
37
+ 'created_at': row[3]} for row in c.fetchall()]
38
+ conn.close()
39
+ return files
templates/index.html CHANGED
@@ -421,6 +421,36 @@
421
  console.log("After Ajax")
422
  }
423
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
424
 
425
  // Toggle sidebar for mobile view
426
  document.getElementById('menu-toggle').addEventListener('click', function () {
 
421
  console.log("After Ajax")
422
  }
423
 
424
+ document.addEventListener("DOMContentLoaded", function () {
425
+ set_loading("Loading Files");
426
+
427
+ fetch('/get-files')
428
+ .then(response => response.json())
429
+ .then(data => {
430
+ if (data.status == 'success') {
431
+ let max_file_cnt = 0;
432
+ Array.from(data.files).forEach(file => {
433
+ file_list[file.file_id] = { name: file.file_name };
434
+ const listItem = document.createElement('li');
435
+ listItem.id = `file_item_${file.file_id}`
436
+ listItem.className = 'flex justify-between items-center bg-gray-200 dark:bg-gray-700 p-2 rounded';
437
+ listItem.innerHTML = `
438
+ <span style="width: 90%;overflow: hidden;">${file.file_name}</span>
439
+ <button class="text-red-500 w-20" onclick="removeFile(${file.file_id})">
440
+ <i class="fas fa-times"></i>
441
+ </button>`;
442
+ fileList.appendChild(listItem);
443
+
444
+ max_file_cnt = max_file_cnt < file.file_id ? file.file_id : max_file_cnt;
445
+ });
446
+ file_count = max_file_cnt + 1;
447
+ manageEmptyFileList();
448
+ }
449
+ }).then(() => {
450
+ remove_loading();
451
+ })
452
+ .catch(error => console.error("Error fetching files:", error));
453
+ });
454
 
455
  // Toggle sidebar for mobile view
456
  document.getElementById('menu-toggle').addEventListener('click', function () {