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()