change the method to save the whole conversation history instead of one msg

This commit is contained in:
fadingNA
2024-10-14 11:53:52 -04:00
parent a8bb992569
commit 3e32724729
3 changed files with 32 additions and 25 deletions

View File

@@ -1,7 +1,6 @@
import sys
import redis import redis
import time import time
from datetime import datetime import json
from application.core.settings import settings from application.core.settings import settings
from application.utils import get_hash from application.utils import get_hash
@@ -19,7 +18,7 @@ def make_redis():
db=settings.REDIS_DB, db=settings.REDIS_DB,
) )
def gen_cache_key(messages, model="docgpt"): def gen_cache_key(*messages, model="docgpt"):
""" """
Generate a unique cache key based on the latest user message and model. Generate a unique cache key based on the latest user message and model.
@@ -40,17 +39,11 @@ def gen_cache_key(messages, model="docgpt"):
Returns: Returns:
str: A unique cache key generated by hashing the combined model name and latest user message. str: A unique cache key generated by hashing the combined model name and latest user message.
""" """
if not all(isinstance(msg, dict) for msg in messages):
raise ValueError("All messages must be dictionaries.")
if not messages: messages_str = json.dumps(list(messages), sort_keys=True)
raise ValueError("No messages found in the conversation to generate a cache key.") combined = f"{model}_{messages_str}"
if not isinstance(messages, list):
raise ValueError("Messages must be a list of dictionaries.")
latest_user_prompt = next((msg['content'] for msg in reversed(messages) if msg.get('role') == 'user'), None)
if latest_user_prompt is None:
raise ValueError("No user message found in the conversation to generate a cache key.")
combined = f"{model}_{latest_user_prompt}"
cache_key = get_hash(combined) cache_key = get_hash(combined)
return cache_key return cache_key
@@ -69,15 +62,16 @@ def gen_cache(func):
def wrapper(self, model, messages, *args, **kwargs): def wrapper(self, model, messages, *args, **kwargs):
try: try:
cache_key = gen_cache_key(messages=messages) cache_key = gen_cache_key(*messages)
redis_client = make_redis() redis_client = make_redis()
cached_response = redis_client.get(cache_key) cached_response = redis_client.get(cache_key)
if cached_response: if cached_response:
print(f"Cache hit for key: {cache_key}")
return cached_response.decode('utf-8') return cached_response.decode('utf-8')
result = func(self, model, messages, *args, **kwargs) result = func(self, model, messages, *args, **kwargs)
redis_client.set(cache_key, result, ex=3600) redis_client.set(cache_key, result, ex=3600)
print(f"Cache saved for key: {cache_key}")
return result return result
except ValueError as e: except ValueError as e:
print(e) print(e)
@@ -100,16 +94,17 @@ def stream_cache(func):
(self._raw_gen, decorators=decorators, model=model, messages=messages, stream=stream, *args, **kwargs (self._raw_gen, decorators=decorators, model=model, messages=messages, stream=stream, *args, **kwargs
""" """
def wrapper(self, model, messages, stream, *args, **kwargs): def wrapper(self, model, messages, stream, *args, **kwargs):
cache_key = gen_cache_key(messages=messages) cache_key = gen_cache_key(*messages)
try: try:
# we are using lrange and rpush to simulate streaming # we are using lrange and rpush to simulate streaming
redis_client = make_redis() redis_client = make_redis()
cached_response = redis_client.lrange(cache_key, 0, -1) cached_response = redis_client.get(cache_key)
if cached_response: if cached_response:
#print(f"Cache hit for stream key: {cache_key}") print(f"Cache hit for stream key: {cache_key}")
cached_response = json.loads(cached_response.decode('utf-8'))
for chunk in cached_response: for chunk in cached_response:
yield chunk.decode('utf-8') yield chunk
# need to slow down the response to simulate streaming # need to slow down the response to simulate streaming
# because the cached response is instantaneous # because the cached response is instantaneous
# and redis is using in-memory storage # and redis is using in-memory storage
@@ -117,17 +112,17 @@ def stream_cache(func):
return return
result = func(self, model, messages, stream, *args, **kwargs) result = func(self, model, messages, stream, *args, **kwargs)
stream_cache_data = []
for chunk in result: for chunk in result:
redis_client.rpush(cache_key, chunk) stream_cache_data.append(chunk)
yield chunk yield chunk
# expire the cache after 30 minutes # expire the cache after 30 minutes
redis_client.expire(cache_key, 1800) redis_client.set(cache_key, json.dumps(stream_cache_data), ex=1800)
print(f"Stream cache saved for key: {cache_key}") print(f"Stream cache saved for key: {cache_key}")
except ValueError as e: except ValueError as e:
print(e) print(e)
yield "Error: No user message found in the conversation to generate a cache key." yield "Error: No user message found in the conversation to generate a cache key."
return wrapper return wrapper

View File

@@ -1675,7 +1675,7 @@
"version": "18.3.0", "version": "18.3.0",
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz",
"integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==",
"devOptional": true, "dev": true,
"dependencies": { "dependencies": {
"@types/react": "*" "@types/react": "*"
} }

12
results.txt Normal file
View File

@@ -0,0 +1,12 @@
Base URL:http://petstore.swagger.io,https://api.example.com
Path1: /pets
description: None
parameters: []
methods:
get=A paged array of pets
post=Null response
Path2: /pets/{petId}
description: None
parameters: []
methods:
get=Expected response to a valid request