about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlexander Kabui2024-01-26 12:55:10 +0300
committerGitHub2024-01-26 12:55:10 +0300
commitcf51516b6f9d673c2ad9ec35604d25b831c48b5f (patch)
tree9d4c56cb38abb813089a1215bd83cf62352ce05e
parentb9a8d3d23f3c239c42c1c4a7ce1c59c2c9a1c450 (diff)
downloadgenenetwork3-cf51516b6f9d673c2ad9ec35604d25b831c48b5f.tar.gz
Feature/gn llm caching (#148)
* add logic for querying user gnqa search result

* add api endpoints for querying users:qnqa-search-terms,gnqa-results
-rw-r--r--gn3/api/llm.py60
-rw-r--r--gn3/llms/process.py22
2 files changed, 78 insertions, 4 deletions
diff --git a/gn3/api/llm.py b/gn3/api/llm.py
index 3dd75fa..60a213a 100644
--- a/gn3/api/llm.py
+++ b/gn3/api/llm.py
@@ -3,10 +3,16 @@
 # pylint: skip-file
 
 from flask import jsonify, request, Blueprint, current_app
+from gn3.auth.authorisation.oauth2.resource_server import require_oauth
 
 from gn3.llms.process import get_gnqa
-
 from gn3.llms.process import rate_document
+from gn3.llms.process import get_user_queries
+from gn3.llms.process import fetch_query_results
+
+from redis import Redis
+import json
+from datetime import timedelta
 
 GnQNA = Blueprint("GnQNA", __name__)
 
@@ -22,13 +28,20 @@ def gnqa():
         task_id, answer, refs = get_gnqa(
             query, auth_token)
 
-        return jsonify({
+        response = {
             "task_id": task_id,
             "query": query,
             "answer": answer,
             "references": refs
+        }
+        with (Redis.from_url(current_app.config["REDIS_URI"],
+                             decode_responses=True) as redis_conn):
+            # The key will be deleted after 60 seconds
+            redis_conn.setex(f"LLM:random_user-{query}", timedelta(days=10), json.dumps(response))
+        return jsonify({
+            **response,
+            "prev_queries": get_user_queries("random_user", redis_conn)
         })
-
     except Exception as error:
         return jsonify({"query": query, "error": f"Request failed-{str(error)}"}), 500
 
@@ -46,3 +59,44 @@ def rating(task_id, doc_id, rating):
         }),
     except Exception as error:
         return jsonify({"error": str(error), doc_id: doc_id}), 500
+
+
+@GnQNA.route("/history/<query>", methods=["GET"])
+@require_oauth("profile user")
+def fetch_user_hist(query):
+    try:
+
+        with (require_oauth.acquire("profile user") as the_token, Redis.from_url(current_app.config["REDIS_URI"],
+                                                                                 decode_responses=True) as redis_conn):
+            return jsonify({
+                **fetch_query_results(query, the_token.user.id, redis_conn),
+                "prev_queries": get_user_queries("random_user", redis_conn)
+            })
+
+    except Exception as error:
+        return jsonify({"error": str(error)}), 500
+
+
+@GnQNA.route("/historys/<query>", methods=["GET"])
+def fetch_users_hist_records(query):
+    """method to fetch all users hist:note this is a test functionality to be replaced by fetch_user_hist"""
+    try:
+
+        with Redis.from_url(current_app.config["REDIS_URI"], decode_responses=True) as redis_conn:
+            return jsonify({
+                **fetch_query_results(query, "random_user", redis_conn),
+                "prev_queries": get_user_queries("random_user", redis_conn)
+            })
+
+    except Exception as error:
+        return jsonify({"error": str(error)}), 500
+
+
+@GnQNA.route("/get_hist_names", methods=["GET"])
+def fetch_prev_hist_ids():
+    try:
+        with (Redis.from_url(current_app.config["REDIS_URI"], decode_responses=True)) as redis_conn:
+            return jsonify({"prev_queries": get_user_queries("random_user", redis_conn)})
+
+    except Exception as error:
+        return jsonify({"error": str(error)}), 500
diff --git a/gn3/llms/process.py b/gn3/llms/process.py
index b4fd507..e4d33c7 100644
--- a/gn3/llms/process.py
+++ b/gn3/llms/process.py
@@ -8,10 +8,10 @@ from urllib.parse import urljoin
 from urllib.parse import quote
 import requests
 
-
 from gn3.llms.client import GeneNetworkQAClient
 from gn3.llms.response import DocIDs
 
+
 BASE_URL = 'https://genenetwork.fahamuai.com/api/tasks'
 
 
@@ -84,3 +84,23 @@ def get_gnqa(query, auth_token):
         return task_id, answer, references
     else:
         return task_id, "Unfortunately, I have nothing on the query", []
+
+
+def fetch_query_results(query, user_id, redis_conn):
+    """this method fetches prev user query searches"""
+    result = redis_conn.get(f"LLM:{user_id}-{query}")
+    if result:
+        return json.loads(result)
+    return {
+        "query": query,
+        "answer": "Sorry No answer for you",
+        "references": [],
+        "task_id": None
+    }
+
+
+def get_user_queries(user_id, redis_conn):
+    """methos to fetch all queries for a specific user"""
+
+    results = redis_conn.keys(f"LLM:{user_id}*")
+    return [query for query in [result.partition("-")[2] for result in results] if query != ""]