From 8e131c2847024b9b34d228810b0225231ba0c8fc Mon Sep 17 00:00:00 2001 From: Firq <firelp42@gmail.com> Date: Sat, 7 Dec 2024 13:25:38 +0100 Subject: [PATCH] Finalized --- .gitignore | 2 ++ pipeline.indexing.png | Bin 0 -> 34791 bytes ...id-retrieval.png => pipeline.retrieval.png | Bin .../__pycache__/backend.cpython-310.pyc | Bin 5536 -> 5536 bytes server-implementation/app.py | 9 ++++++--- server-implementation/backend.py | 2 +- server-implementation/templates/results.html | 2 +- 7 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 pipeline.indexing.png rename hybrid-retrieval.png => pipeline.retrieval.png (100%) diff --git a/.gitignore b/.gitignore index 1ca6115..a7c73d9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,12 @@ # env .env *venv/ +**/__pycache__/ # Binaries for installation *.deb *.whl +.install/ # Test data data/pgvector.sql diff --git a/pipeline.indexing.png b/pipeline.indexing.png new file mode 100644 index 0000000000000000000000000000000000000000..a4900ea3c7b27d958e28c96665bcca0d178840e7 GIT binary patch literal 34791 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¯&pn|F64;TSM=w}X8_n@~fc_JlULQ^B*krDYp= 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 literal 0 HcmV?d00001 diff --git a/hybrid-retrieval.png b/pipeline.retrieval.png similarity index 100% rename from hybrid-retrieval.png rename to pipeline.retrieval.png diff --git a/server-implementation/__pycache__/backend.cpython-310.pyc b/server-implementation/__pycache__/backend.cpython-310.pyc index aaba6667f89a5b4a9a92df760a27a750d5c36562..782d9ece4911febf44e14d345d19c91e99de62c5 100644 GIT binary patch delta 22 ccmZ3Wy+E5cpO=@50SIE)Led{?<ee-E06ZuKoB#j- delta 22 ccmZ3Wy+E5cpO=@50SGSV1gAgQ$U9jS07HrfdH?_b diff --git a/server-implementation/app.py b/server-implementation/app.py index df75429..14123c0 100644 --- a/server-implementation/app.py +++ b/server-implementation/app.py @@ -1,7 +1,9 @@ import pathlib + from gevent.pywsgi import WSGIServer -from flask import Flask, request, render_template from tabulate import tabulate + +from flask import Flask, request, render_template from wtforms import Form, StringField, SubmitField from wtforms.validators import DataRequired @@ -47,5 +49,6 @@ def query_backend(): return backend.format_for_api(result) -http_server = WSGIServer(("0.0.0.0", 8000), app) -http_server.serve_forever() +if __name__ == "__main__": + http_server = WSGIServer(("0.0.0.0", 8000), app) + http_server.serve_forever() diff --git a/server-implementation/backend.py b/server-implementation/backend.py index 8032108..94473e6 100644 --- a/server-implementation/backend.py +++ b/server-implementation/backend.py @@ -27,7 +27,7 @@ class AIBackend: document_store: PgvectorDocumentStore documents: list[Document] = [] - def __init__(self, load_dataset = False): + def __init__(self, load_dataset=False): get_torch_info() try: self.gpu = ComponentDevice.from_str("cuda:0") diff --git a/server-implementation/templates/results.html b/server-implementation/templates/results.html index 1a09d22..09af5eb 100644 --- a/server-implementation/templates/results.html +++ b/server-implementation/templates/results.html @@ -73,7 +73,7 @@ flex-direction: column; position: relative; width: 220px; - height: 250px; + height: 275px; border: 2px solid #b86cff; margin: 1rem; justify-items: flex-start;