-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathweb_server.py
More file actions
120 lines (90 loc) · 3.98 KB
/
web_server.py
File metadata and controls
120 lines (90 loc) · 3.98 KB
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
from flask import Flask, render_template, request, session
import socket
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
from flask_wtf.csrf import CSRFProtect
from forms.qforms import QuestionForm
from forms.clearform import ClearForm
from classes.logger import Logger
import datetime
import json
from classes.user_query import UserQuery
from classes.query_handler import QueryHandler
from classes.elastic_indexer import ElasticIndexer
from classes.prompter import Prompter
app = Flask(__name__)
app.config['SECRET_KEY'] = 'docdoc'
limiter = Limiter(
get_remote_address,
app=app,
default_limits=["200 per day", "50 per hour"]
)
csrf = CSRFProtect(app)
logger = Logger(filename="logs_webserver", write_file=True)
prompter = Prompter(model="gemma2")
@app.route('/')
def home():
form = QuestionForm()
clearform = ClearForm()
indexer = ElasticIndexer()
indices = indexer.get_all_indices()
return render_template('index.html', form=form, clearform=clearform, indices=indices)
@app.route('/ask', methods=['POST'])
@limiter.limit("5 per minute")
def ask_question():
client_ip = request.remote_addr
indexer = ElasticIndexer(index_name="")
indices = indexer.get_all_indices()
try:
client_hostname = socket.gethostbyaddr(client_ip)[0]
except socket.herror:
client_hostname = "Hostname unavailable"
form = QuestionForm()
# Initialize session history if it doesn't exist
if 'history' not in session:
session['history'] = []
if form.validate_on_submit():
question = form.question.data
selected_index = request.form.get('selected_index', 'pdf_chunks') # Default index
# Use the selected index for user_query and query_handler
user_query = UserQuery(index_name=selected_index)
query_handler = QueryHandler(index_name=selected_index)
# Query and process the response
response = user_query.query(question, method="rrf")
results = user_query.get_metadata_as_list(response)
print(results)
reranked_results = query_handler.rerank_results(question=question, results_as_list=results)
prompt = prompter.generate_prompt(reranked_results, question)
answer = prompter.get_response_from_ollama(prompt)
# Add the question and answer to session history
session['history'].append({'question': question, 'answer': answer})
log_data = {
'timestamp': datetime.datetime.now().isoformat(),
'question': question,
'client_ip': client_ip,
'client_hostname': client_hostname,
'response_code': 200
}
with open('logs/requests_log.json', 'a') as log_file:
log_file.write(json.dumps(log_data) + '\n')
logger.send_log("New request: " + question, client_ip, client_hostname, r_code=200, answer=answer)
# Update the session
session.modified = True # Indicate that the session has been modified
return render_template('index.html', response=answer, form=form, clearform=ClearForm(), indices=indices, history=session['history'])
else:
logger.send_log("Request failed validation", client_ip, client_hostname, r_code=400)
return render_template('index.html', form=form, clearform=ClearForm(), indices=indices, history=session['history'])
@app.route('/clear_history', methods=['POST'])
@limiter.limit("5 per minute")
def clear_history():
clearform = ClearForm()
indexer = ElasticIndexer()
indices = indexer.get_all_indices()
if clearform.validate_on_submit():
session.pop('history', None)
return render_template('index.html', form=QuestionForm(), clearform=ClearForm(), indices=indices, history=None)
@app.route('/reports')
def reports():
return render_template('reports.html')
if __name__ == '__main__':
app.run(debug=True, host="0.0.0.0")