Spaces:
Sleeping
Sleeping
File size: 4,689 Bytes
4602937 fada25c 4615482 4602937 fada25c 162343b dd1c2fe 2b44908 fada25c 7c5507d 19e8df5 7c5507d fada25c a9cd3f2 fada25c 3430157 7c5507d fada25c 7c5507d fada25c 2b44908 fada25c 19e8df5 7c5507d 2b44908 fada25c 7c5507d fada25c 6dd9499 7c5507d 5ef12ee 6dd9499 fada25c 6dd9499 7c5507d 6dd9499 fada25c 2b44908 fada25c 2b44908 fada25c 2b44908 fada25c 7c5507d 72baf27 7c5507d 72baf27 2b44908 162343b 7c5507d 162343b 19e8df5 7c5507d 19e8df5 162343b 0a5200d 7adc402 7c5507d 455007f 7c5507d 0a5200d 7c5507d |
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 dotenv import load_dotenv
import gradio as gr
import os
from llama_index.core import StorageContext, load_index_from_storage, VectorStoreIndex, SimpleDirectoryReader, ChatPromptTemplate, Settings
from llama_index.llms.huggingface import HuggingFaceInferenceAPI
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
import firebase_admin
from firebase_admin import db, credentials
import datetime
import uuid
import random
# Load environment variables
load_dotenv()
# Initialize Firebase with provided credentials and URL
cred = credentials.Certificate("redfernstech-fd8fe-firebase-adminsdk-g9vcn-0537b4efd6.json")
firebase_admin.initialize_app(cred, {"databaseURL": "https://redfernstech-fd8fe-default-rtdb.firebaseio.com/"})
# Configure Llama index settings
Settings.llm = HuggingFaceInferenceAPI(
model_name="meta-llama/Meta-Llama-3-8B-Instruct",
tokenizer_name="meta-llama/Meta-Llama-3-8B-Instruct",
context_window=3000,
token=os.getenv("HF_TOKEN"),
max_new_tokens=512,
generate_kwargs={"temperature": 0.1},
)
Settings.embed_model = HuggingFaceEmbedding(
model_name="BAAI/bge-small-en-v1.5"
)
# Define directories
PERSIST_DIR = "db"
PDF_DIRECTORY = 'data'
# Ensure directories exist
os.makedirs(PDF_DIRECTORY, exist_ok=True)
os.makedirs(PERSIST_DIR, exist_ok=True)
# Dictionary to store chat histories for different sessions
session_chat_histories = {}
def select_random_name():
names = ['Clara', 'Lily']
return random.choice(names)
def data_ingestion_from_directory():
documents = SimpleDirectoryReader(PDF_DIRECTORY).load_data()
storage_context = StorageContext.from_defaults()
index = VectorStoreIndex.from_documents(documents)
index.storage_context.persist(persist_dir=PERSIST_DIR)
def handle_query(session_id, query):
chat_text_qa_msgs = [
(
"user",
"""
As Clara, your goal is to provide code to the user.
Your task is to give code to the model and offer guidance on creating a website using Django, HTML, CSS, and Bootstrap.
{context_str}
Question:
{query_str}
"""
)
]
text_qa_template = ChatPromptTemplate.from_messages(chat_text_qa_msgs)
storage_context = StorageContext.from_defaults(persist_dir=PERSIST_DIR)
index = load_index_from_storage(storage_context)
context_str = ""
if session_id in session_chat_histories:
for past_query, response in reversed(session_chat_histories[session_id]):
if past_query.strip():
context_str += f"User asked: '{past_query}'\nBot answered: '{response}'\n"
query_engine = index.as_query_engine(text_qa_template=text_qa_template, context_str=context_str)
answer = query_engine.query(query)
if hasattr(answer, 'response'):
response = answer.response
elif isinstance(answer, dict) and 'response' in answer:
response = answer['response']
else:
response = "Sorry, I couldn't find an answer."
if session_id not in session_chat_histories:
session_chat_histories[session_id] = []
session_chat_histories[session_id].append((query, response))
message_data = {
"query": query,
"response": response,
"timestamp": datetime.datetime.now().isoformat()
}
save_chat_message(session_id, message_data)
return response
def save_chat_message(session_id, message_data):
ref = db.reference(f'/chat_history/{session_id}')
ref.push().set(message_data)
def chat_interface(message, history):
# Retrieve or create a new session ID based on history
session_id = history[0][1] if history and history[0][1] else str(uuid.uuid4())
history.append((message, session_id)) # Append the session ID to history
response = handle_query(session_id, message)
return response, history
css = '''
.circle-logo {
display: inline-block;
width: 40px;
height: 40px;
border-radius: 50%;
overflow: hidden;
margin-right: 10px;
vertical-align: middle;
}
.circle-logo img {
width: 100%;
height: 100%;
object-fit: cover;
}
.response-with-logo {
display: flex;
align-items: center;
margin-bottom: 10px;
}
footer {
display: none !important;
background-color: #F8D7DA;
}
label.svelte-1b6s6s {display: none}
'''
# Load data and start Gradio interface
print("Processing PDF ingestion from directory:", PDF_DIRECTORY)
data_ingestion_from_directory()
gr.ChatInterface(fn=chat_interface,
css=css,
description="Clara",
clear_btn=None, undo_btn=None, retry_btn=None).launch()
|