|
import streamlit as st
|
|
import random
|
|
from langchain_community.chat_models import ChatOpenAI
|
|
from langchain.schema import HumanMessage, SystemMessage
|
|
from langchain_community.document_loaders import PyPDFLoader, TextLoader, UnstructuredMarkdownLoader, UnstructuredWordDocumentLoader
|
|
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
|
from langchain_huggingface import HuggingFaceEmbeddings
|
|
from langchain_community.vectorstores import FAISS
|
|
from langchain.chains import RetrievalQA
|
|
import os
|
|
from dotenv import load_dotenv
|
|
import tempfile
|
|
from PIL import Image
|
|
import io
|
|
|
|
|
|
load_dotenv()
|
|
|
|
AI71_BASE_URL = "https://api.ai71.ai/v1/"
|
|
AI71_API_KEY = "api71-api-92fc2ef9-9f3c-47e5-a019-18e257b04af2"
|
|
|
|
|
|
chat = ChatOpenAI(
|
|
model="tiiuae/falcon-180B-chat",
|
|
api_key=AI71_API_KEY,
|
|
base_url=AI71_BASE_URL,
|
|
streaming=True,
|
|
)
|
|
|
|
|
|
embeddings = HuggingFaceEmbeddings()
|
|
|
|
def process_documents(uploaded_files):
|
|
documents = []
|
|
for uploaded_file in uploaded_files:
|
|
file_extension = os.path.splitext(uploaded_file.name)[1].lower()
|
|
with tempfile.NamedTemporaryFile(delete=False, suffix=file_extension) as temp_file:
|
|
temp_file.write(uploaded_file.getvalue())
|
|
temp_file_path = temp_file.name
|
|
|
|
if file_extension == '.pdf':
|
|
loader = PyPDFLoader(temp_file_path)
|
|
elif file_extension == '.txt':
|
|
loader = TextLoader(temp_file_path)
|
|
elif file_extension == '.md':
|
|
loader = UnstructuredMarkdownLoader(temp_file_path)
|
|
elif file_extension in ['.doc', '.docx']:
|
|
loader = UnstructuredWordDocumentLoader(temp_file_path)
|
|
else:
|
|
st.warning(f"Unsupported file type: {file_extension}")
|
|
continue
|
|
|
|
documents.extend(loader.load())
|
|
os.unlink(temp_file_path)
|
|
|
|
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
|
|
texts = text_splitter.split_documents(documents)
|
|
|
|
vectorstore = FAISS.from_documents(texts, embeddings)
|
|
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
|
|
|
|
qa_chain = RetrievalQA.from_chain_type(
|
|
llm=chat,
|
|
chain_type="stuff",
|
|
retriever=retriever,
|
|
return_source_documents=True
|
|
)
|
|
|
|
return qa_chain
|
|
|
|
def generate_mnemonic(topic, user_preferences):
|
|
prompt = f"""
|
|
Generate a memorable mnemonic for the topic: {topic}.
|
|
Consider the user's preferences: {user_preferences}.
|
|
The mnemonic should be easy to remember and relate to the topic.
|
|
Also provide a brief explanation of how the mnemonic relates to the topic.
|
|
"""
|
|
response = chat.invoke([HumanMessage(content=prompt)])
|
|
return response.content
|
|
|
|
def generate_quiz_question(mnemonic):
|
|
quiz_prompt = f"""
|
|
Create a quiz question based on the mnemonic: {mnemonic}
|
|
Format your response as follows:
|
|
Question: [Your question here]
|
|
Answer: [Your answer here]
|
|
"""
|
|
quiz_response = chat.invoke([HumanMessage(content=quiz_prompt)])
|
|
content = quiz_response.content.strip()
|
|
|
|
try:
|
|
question_part, answer_part = content.split("Answer:", 1)
|
|
question = question_part.replace("Question:", "").strip()
|
|
answer = answer_part.strip()
|
|
except ValueError:
|
|
question = content
|
|
answer = "Unable to generate a specific answer. Please refer to the mnemonic."
|
|
|
|
return question, answer
|
|
|
|
def generate_image_prompt(mnemonic):
|
|
prompt = f"""
|
|
Create a detailed image prompt for Midjourney based on the mnemonic: {mnemonic}
|
|
The image should visually represent the key elements of the mnemonic.
|
|
"""
|
|
response = chat.invoke([HumanMessage(content=prompt)])
|
|
return response.content
|
|
|
|
def main():
|
|
st.set_page_config(page_title="S.H.E.R.L.O.C.K. Mnemonic Generator", page_icon="π§ ", layout="wide")
|
|
|
|
|
|
st.markdown("""
|
|
<style>
|
|
.stApp {
|
|
background-color: #f0f2f6;
|
|
}
|
|
.main .block-container {
|
|
padding-top: 2rem;
|
|
}
|
|
.stButton>button {
|
|
background-color: #4CAF50;
|
|
color: white;
|
|
font-weight: bold;
|
|
}
|
|
.stTextInput>div>div>input {
|
|
background-color: #ffffff;
|
|
}
|
|
</style>
|
|
""", unsafe_allow_html=True)
|
|
|
|
st.title("π§ S.H.E.R.L.O.C.K. Mnemonic Generator")
|
|
|
|
|
|
if 'generated_mnemonic' not in st.session_state:
|
|
st.session_state.generated_mnemonic = None
|
|
if 'quiz_question' not in st.session_state:
|
|
st.session_state.quiz_question = None
|
|
if 'quiz_answer' not in st.session_state:
|
|
st.session_state.quiz_answer = None
|
|
if 'image_prompt' not in st.session_state:
|
|
st.session_state.image_prompt = None
|
|
|
|
|
|
with st.sidebar:
|
|
st.header("π Document Upload")
|
|
uploaded_files = st.file_uploader("Upload documents (optional)", type=["pdf", "txt", "md", "doc", "docx"], accept_multiple_files=True)
|
|
if uploaded_files:
|
|
qa_chain = process_documents(uploaded_files)
|
|
st.success(f"{len(uploaded_files)} document(s) processed successfully!")
|
|
else:
|
|
qa_chain = None
|
|
|
|
st.header("π¨ User Preferences")
|
|
user_preferences = st.text_area("Enter your interests or preferences:")
|
|
|
|
|
|
col1, col2 = st.columns([2, 1])
|
|
|
|
with col1:
|
|
st.header("π Generate Mnemonic")
|
|
topic = st.text_input("Enter the topic for your mnemonic:")
|
|
|
|
if st.button("Generate Mnemonic"):
|
|
if topic:
|
|
with st.spinner("Generating mnemonic..."):
|
|
mnemonic = generate_mnemonic(topic, user_preferences)
|
|
st.session_state.generated_mnemonic = mnemonic
|
|
|
|
with st.spinner("Generating quiz question..."):
|
|
question, answer = generate_quiz_question(mnemonic)
|
|
st.session_state.quiz_question = question
|
|
st.session_state.quiz_answer = answer
|
|
|
|
with st.spinner("Generating image prompt..."):
|
|
image_prompt = generate_image_prompt(mnemonic)
|
|
st.session_state.image_prompt = image_prompt
|
|
else:
|
|
st.warning("Please enter a topic to generate a mnemonic.")
|
|
|
|
with col2:
|
|
if st.session_state.generated_mnemonic:
|
|
st.header("π Generated Mnemonic")
|
|
st.write(st.session_state.generated_mnemonic)
|
|
|
|
|
|
if st.session_state.quiz_question:
|
|
st.header("π§ Mnemonic Quiz")
|
|
st.write(st.session_state.quiz_question)
|
|
user_answer = st.text_input("Your answer:")
|
|
if st.button("Submit Answer"):
|
|
if user_answer.lower() == st.session_state.quiz_answer.lower():
|
|
st.success("π Correct! Well done.")
|
|
else:
|
|
st.error(f"β Not quite. The correct answer is: {st.session_state.quiz_answer}")
|
|
|
|
|
|
if st.session_state.image_prompt:
|
|
st.header("πΌοΈ Image Prompt")
|
|
st.write(st.session_state.image_prompt)
|
|
st.info("You can use this prompt with Midjourney or other image generation tools to create a visual representation of your mnemonic.")
|
|
|
|
|
|
if qa_chain:
|
|
st.header("π Document Q&A")
|
|
user_question = st.text_input("Ask a question about the uploaded document(s):")
|
|
if st.button("Get Answer"):
|
|
with st.spinner("Searching for the answer..."):
|
|
result = qa_chain({"query": user_question})
|
|
st.subheader("Answer:")
|
|
st.write(result["result"])
|
|
st.subheader("Sources:")
|
|
for source in result["source_documents"]:
|
|
st.write(source.page_content)
|
|
|
|
|
|
if st.session_state.generated_mnemonic:
|
|
st.header("π¨ Mnemonic Visualization")
|
|
visualization_type = st.selectbox("Choose visualization type:", ["Word Cloud", "Mind Map"])
|
|
if st.button("Generate Visualization"):
|
|
with st.spinner("Generating visualization..."):
|
|
visualization_prompt = f"""
|
|
Create a detailed description of a {visualization_type} based on the mnemonic:
|
|
{st.session_state.generated_mnemonic}
|
|
Describe the layout, key elements, and their relationships.
|
|
"""
|
|
visualization_description = chat.invoke([HumanMessage(content=visualization_prompt)]).content
|
|
st.write(visualization_description)
|
|
st.info("You can use this description to create a visual representation of your mnemonic using tools like Canva or Mindmeister.")
|
|
|
|
|
|
if st.session_state.generated_mnemonic:
|
|
st.header("π€ Export Options")
|
|
export_format = st.selectbox("Choose export format:", ["Text", "PDF", "Markdown"])
|
|
if st.button("Export Mnemonic"):
|
|
export_content = f"""
|
|
Topic: {topic}
|
|
|
|
Mnemonic:
|
|
{st.session_state.generated_mnemonic}
|
|
|
|
Quiz Question:
|
|
{st.session_state.quiz_question}
|
|
|
|
Quiz Answer:
|
|
{st.session_state.quiz_answer}
|
|
|
|
Image Prompt:
|
|
{st.session_state.image_prompt}
|
|
"""
|
|
|
|
if export_format == "Text":
|
|
st.download_button("Download Text", export_content, file_name="mnemonic_export.txt")
|
|
elif export_format == "PDF":
|
|
|
|
st.warning("PDF export not implemented in this example.")
|
|
elif export_format == "Markdown":
|
|
st.download_button("Download Markdown", export_content, file_name="mnemonic_export.md")
|
|
|
|
|
|
st.sidebar.markdown("---")
|
|
st.sidebar.markdown("Powered by Falcon-180B and Streamlit")
|
|
|
|
if __name__ == "__main__":
|
|
main() |