File size: 7,825 Bytes
caa66e0
 
 
 
 
 
 
 
 
 
 
865d06a
caa66e0
 
74239d9
 
caa66e0
 
 
 
 
81753b7
 
 
 
 
caa66e0
81753b7
caa66e0
 
 
 
 
 
 
 
 
 
 
 
17cc8b9
caa66e0
 
 
 
17cc8b9
caa66e0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17cc8b9
caa66e0
 
 
 
 
 
 
 
 
 
 
 
 
 
81753b7
caa66e0
81753b7
 
 
 
 
caa66e0
81753b7
caa66e0
 
 
7ae37d6
81753b7
caa66e0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
440f0d3
643318b
caa66e0
 
d05158c
440f0d3
d05158c
b442ab1
643318b
b442ab1
 
 
caa66e0
 
 
 
 
 
 
 
 
140fa55
caa66e0
 
 
 
 
 
140fa55
caa66e0
140fa55
caa66e0
 
 
 
 
 
 
 
 
 
 
786a48a
856a47e
caa66e0
 
 
 
786a48a
caa66e0
 
 
 
 
 
d05158c
caa66e0
 
 
 
 
ae612d3
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
import os
import gradio as gr
#from langchain_openai import ChatOpenAI
from langchain_groq import ChatGroq
from langchain_core.runnables import Runnable
from chat_engine import conversation_prompt
from chat_engine import chapter_index
from chat_engine import tree_index_list
from chat_engine import select_index
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
from pathlib import Path
#from chat_engine import prompt_query

groq_llm = ChatGroq(
    model_name="llama-3.3-70b-versatile",  
    temperature=0.2,  
    api_key=os.getenv('GROQ_API_KEY')
)

response_chain: Runnable = conversation_prompt | groq_llm

#groq_user_engg=ChatGroq(
 #   model_name="llama3-70b-8192",
  #  temperature=0,
   # api_key=os.getenv("GROQ_API")
    #)

#query_chain: Runnable = prompt_query | groq_user_engg

def gradio_chat(user_query, chat_history, index, tree_index_list=tree_index_list, chapter_index=chapter_index,response_chain=response_chain):
    
    if chat_history is None:
        chat_history=[]
    
    if user_query=="":
        chat_history.append(HumanMessage(user_query))
        chat_history.append(AIMessage("Kindly ask a question from the selected chapter."))
        return "Kindly ask a question from the selected chapter", chat_history
    
    vector_index=select_index(index)
    retriever1=vector_index.as_retriever(similarity_top_k=2)
    retrieved_nodes1=retriever1.retrieve(user_query)
    
    tree_index=tree_index_list[chapter_index[retrieved_nodes1[0].metadata["chapter"]]]
    if retrieved_nodes1[0].metadata["section"]=="poem":
        retriever = tree_index.as_retriever(similarity_top_k=4, retriever_mode="all_leaf")
        retrieved_nodes3=retriever.retrieve("summarize the poem")
        #answer = response_synthesizer.synthesize(query=user_query, nodes=retrieved_nodes3)
        pext=""
        for content in retrieved_nodes3:
            pext=pext+' '+content.text.strip()
        context='Author: '+retrieved_nodes1[0].metadata['author']+'\nSection: '+retrieved_nodes1[0].metadata['section']+'\nChapter: '+retrieved_nodes1[0].metadata['chapter']+'\nContext: '+pext
        
    else:
        contextt=[]
        for text in retrieved_nodes1:
            contextt.append((text.metadata['page'], text.text))
        contextt.sort(key=lambda x:x[0])
        context1=[x[1] for x in contextt]
    
        retriever = tree_index.as_retriever(similarity_top_k=1,retriever_mode="root", 
                                            search_kwargs={"num_children":3})

        retrieved_nodes2=retriever.retrieve("summarize this chapter")
        
        for text in retrieved_nodes2:
            context1.append(text.text.strip())
        context="\n".join(context1)
        context='Author: '+retrieved_nodes1[0].metadata['author']+'\nSection: '+retrieved_nodes1[0].metadata['section']+'\nChapter: '+retrieved_nodes1[0].metadata['chapter']+'\nContext: '+context

    chat_history.append(HumanMessage(user_query))
    response=response_chain.invoke({"chat_history":chat_history[-12:], "user_query":user_query, "document_context":context})
    chat_history.append(AIMessage(response.content))
    
    return response.content, chat_history

#def prompt_engg(message, chain_history, index, previous_index="Broken Images"):
    
    #if previous_index == index:
        #index_change=0 
    #else:
        #index_change=1
    #question=query_chain.invoke({"user_query":message, "chat_history":chain_history, "index":index, "index_change":index_change})
    
    #return question.content

def respond(message, chain_history, ui_history, index):

    ui_history.append({"role": "user", "content": message})
    #message=prompt_engg(message, chain_history, index)
    response_text, updated_history = gradio_chat(message, chain_history, index=index)
    
    if ui_history is None:
        ui_history = []
    
    ui_history.append({"role": "assistant", "content": response_text})
    #print(ui_history)
    return "", updated_history, ui_history

def download_file(index):
    filepath=chapter_dir[index]
    return filepath

custom_css = """
#chatbot_interface {
    background: #f0f0f0;
    padding: 20px;
    border-radius: 10px;
}

/* Center the markdown text */
#welcome_markdown {
    text-align: center;
    margin: auto;
}
"""

with gr.Blocks(css=custom_css,fill_width=True) as demo:
    gr.Markdown("""
    # I’m Shalini ☺️ # 
    Your Creative Muse — Where Literature Dances, Art Breathes, and Philosophy Whispers 🎨📖🪞  

    Welcome to *Kaleidoscope* —  
    Where words don’t just sit still — they swirl, they shimmer, they *sing*.   
    Have a question from the 12th NCERT English textbook *Kaleidoscope*?  
    Ask — and I’ll reply with words that wander, wonder, and land like truth. 📚🌿 
    ---
    Let’s begin this soulful journey together:
    1. Pick your chapter from the dropdown below.  
    2. Step into the story with your question.  
    3. I’ll craft a reply — rhythmic, radiant, and rich with meaning. 🖼️💫
    """,elem_id="welcome_markdown")
    
    chapter_dir={"Broken Images":"Dataset/Drama/Broken_images.pdf", 
                 "Blood":"Dataset/Poems/Blood.pdf", 
                 "Flim Making":"Dataset/non_fiction/Flim_making.pdf", 
                 "Kubla Khan":"Dataset/Poems/Kubla_khan.pdf", 
                 "One Centimeter":"Dataset/Stories/One_centimetre.pdf",
              "I Sell My Dreams":"Dataset/Stories/I_sell_my_dreams.pdf", 
              "Poems By Blake":"Dataset/Poems/The_divine_image.pdf", 
              "Time and Time Again":"Dataset/Poems/Time_and_time_again.pdf", 
              "On Time":"Dataset/Poems/On_time.pdf",
              "Trees":"Dataset/Poems/Trees_emily_dickinson.pdf", 
              "On Science Fiction":"Dataset/non_fiction/On_science_fiction.pdf", 
              "The Argumentative Indian":"Dataset/non_fiction/The_argumentative_indian.pdf", 
              "Why The Novel Matters":"Dataset/non_fiction/Why_the_novel_matters.pdf",
              "Tomorrow":"Dataset/Stories/Tomorrow.pdf", 
              "A Lecture Upon The Shadow":"Dataset/Poems/A_lecture_upon_the_shadow.pdf", 
              "Freedom":"Dataset/non_fiction/Freedom_freedom.pdf", 
              "A Wedding in Brownsville":"Dataset/Stories/A_wedding_in_brownsville.pdf",
              "Eveline":"Dataset/Stories/eveline.pdf", 
              "Chandalika":"Dataset/Drama/Chandalika.pdf", 
              "The Wild Swans At Coole":"Dataset/Poems/The_wild_swans_at_coole.pdf", 
              "The Mark On The Wall":"Dataset/non_fiction/The_mark_on_the_wall.pdf"}
    
    chatbot = gr.Chatbot(label="Chat Interface", elem_id="chatbot_interface", type="messages")
    
    index=gr.State()
    with gr.Row():
        index=gr.Dropdown(
            choices=list(chapter_dir.keys()),
            label="Chapter",
            value="Broken Images",
            info="Select the chapter on which you would like to ask questions."
        )
        msg = gr.Textbox(label="Enter your query:", placeholder="Type your question here...", lines=2)
        
        d = gr.DownloadButton("Download Selected Chapter", visible=True)
        index.change(fn=download_file, inputs=index, outputs=d)
        #d.click(download_file, index, [d])
    
    chain_history = gr.State([])  # For LangChain message objects
    ui_history = gr.State([])       # For display, a list of dictionaries
    
    gr.Button("Glide In🎨").click(respond, [msg, chain_history, ui_history, index], [msg, chain_history, chatbot])
    
    #clear = gr.ClearButton([msg, chatbot], size="sm")
    msg.submit(fn=respond, inputs=[msg, chain_history, ui_history, index], outputs=[msg, chain_history, chatbot])

demo.launch(allowed_paths=["Dataset/Stories","Dataset/Drama",
                           "Dataset/Poems","Dataset/non_fiction"])