File size: 4,396 Bytes
0c9476c
dc73fb8
 
0c9476c
dc73fb8
1c3465f
 
0c9476c
dc73fb8
0c9476c
7ce7f0d
0c9476c
 
dc73fb8
 
3e086dd
 
 
 
 
dc73fb8
 
aee5d0d
dc73fb8
d3ab78b
3e086dd
dc73fb8
 
 
 
d3ab78b
cca8343
0b42653
 
cca8343
7ce7f0d
 
0c9476c
 
 
 
 
 
 
 
 
 
 
 
7ce7f0d
3e086dd
 
d3ab78b
dc73fb8
7ce7f0d
 
 
 
0c9476c
7ce7f0d
 
 
 
 
 
 
 
 
 
 
d1c1737
 
cca8343
d1c1737
cca8343
d1c1737
 
 
dc73fb8
cca8343
 
dc73fb8
cca8343
7ce7f0d
cca8343
 
0b42653
d3ab78b
 
 
 
7ce7f0d
0c9476c
7ce7f0d
d3ab78b
 
 
 
 
7ce7f0d
 
d3ab78b
 
 
 
 
 
 
 
 
 
 
 
cca8343
d3ab78b
d1c1737
 
cca8343
7ce7f0d
 
 
 
0c9476c
7ce7f0d
 
 
 
 
 
 
 
 
 
 
3e086dd
7ce7f0d
 
 
3e086dd
 
 
 
d3ab78b
 
cca8343
dc73fb8
d3ab78b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
from flask import Flask, Response, after_this_request, request, jsonify
from flask import render_template
from werkzeug.utils import secure_filename
from flask_cors import CORS

from langchain_community.embeddings import HuggingFaceInferenceAPIEmbeddings
import google.generativeai as genai
from langchain_chroma import Chroma

from utils import add_file_to_chroma, remove_file_from_chroma, generate_query_response
from db import init_db,add_file_to_db,remove_file_from_db,get_all_files
from env_vars import HF_TOKEN,GOOGLE_API_KEY,CHROMA_PATH,UPLOAD_FOLDER,DB_PATH,PROMPT_TEMPLATE
from logger import logger

import os

# make required folder for files to upload
os.makedirs(UPLOAD_FOLDER, exist_ok=True)    

# Initialize Hugging Face embeddings Model
hugging_face_ef = HuggingFaceInferenceAPIEmbeddings(
    api_key=HF_TOKEN,
    model_name="sentence-transformers/all-mpnet-base-v2"
)

# initialize LLM
genai.configure(api_key=GOOGLE_API_KEY)
llm_model = genai.GenerativeModel("gemini-1.5-flash")

app = Flask(__name__)
CORS(app)

# Initialize ChromaDB client
db = Chroma(persist_directory=CHROMA_PATH, embedding_function=hugging_face_ef)


# Initialize database
init_db(DB_PATH)

# log requests
@app.before_request
def log_details():
    method = request.method
    url = request.url

    @after_this_request
    def log_details_callback(response: Response):
        logger.info(f'method: {method}\n url: {url}\n status: {response.status}')
        return response

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/get-files', methods=['GET'])
def get_files():
    """Get list of all files."""
    try:
        files = get_all_files(DB_PATH)
        return jsonify({
            'status': 'success',
            'files': files
        }), 200
    except Exception as e:
        logger.error(f"Error fetching files: {str(e)}")
        return jsonify({
            'status': 'error',
            'error': str(e)
        }), 500

@app.route('/upload-file', methods=['POST'])
def upload_file():
    """Handle file uploads."""
    if 'file' not in request.files:
        return jsonify({'error': 'No file in request', 'status': 'error'}), 400
    
    file = request.files['file']
    file_id = request.form.get('file_count')
    
    if not file or not file.filename:
        return jsonify({'error': 'No file selected', 'status': 'error'}), 400
    
    filename = secure_filename(file.filename)
    file_type = filename.split('.')[-1].lower()
    file_path = os.path.join(UPLOAD_FOLDER, filename)
    file.save(file_path)
        
    try:
        # Add file chunks to ChromaDB
        add_file_to_chroma(file_path, file_id, hugging_face_ef, db, logger)
        
        # Add file to SQLite database
        add_file_to_db(file_id, filename, file_type,DB_PATH)
        
        return jsonify({
            'message': 'File uploaded successfully',
            'status': 'success',
            'file_info': {
                'file_id': file_id,
                'file_name': filename,
                'file_type': file_type
            }
        }), 200
    except ValueError as e:
        return jsonify({
            'error': str(e),
            'status': 'error'
        }), 400
    except Exception as e:
        return jsonify({
            'error': str(e),
            'status': 'error'
        }), 500

@app.route('/remove-file', methods=["POST"])
def remove_file():
    file_id = request.form.get('file_id')
    
    try:
        # Remove from ChromaDB
        if remove_file_from_chroma(file_id, db):
            # Remove from SQLite database
            remove_file_from_db(file_id,DB_PATH)
            return jsonify({
                'message': 'File deleted successfully',
                'status': 'success'
            }), 200
        else:
            return jsonify({
                'message': 'File Not Found',
                'status': 'fail'
            }), 404
    except Exception as e:
        logger.error(f"Error removing file: {str(e)}")
        return jsonify({
            'error': str(e),
            'status': 'error'
        }), 500

@app.route("/ask_query", methods=['POST'])
def ask_query():
    query = request.form.get("query")
    resp = generate_query_response(query, db, llm_model, PROMPT_TEMPLATE)
    return jsonify(resp), 200

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, debug=True, threaded=True)