import os import subprocess import streamlit as st from dotenv import load_dotenv from xhtml2pdf import pisa import io from textwrap import dedent from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline # Load Model Resources def load_resources(): load_dotenv() huggingface_token = os.getenv("HUGGINGFACE_TOKEN") subprocess.run(["huggingface-cli", "login", "--token", huggingface_token], capture_output=True) tokenizer = AutoTokenizer.from_pretrained("istiak101/TinyLlama-1.1B-Chat-v0.6-rag-finetunedv2.0") model = AutoModelForCausalLM.from_pretrained("istiak101/TinyLlama-1.1B-Chat-v0.6-rag-finetunedv2.0") return model, tokenizer # Chat Prompt def create_test_prompt(question, context, tokenizer): prompt = dedent( f""" {question} Information: ``` {context} ``` """ ) messages = [ { "role": "system", "content": "Use only the information to answer the question", }, {"role": "user", "content": prompt}, ] return tokenizer.apply_chat_template( messages, tokenize=False, add_generation_prompt=True ) # Store model and tokenizer in session state if "llama_model" not in st.session_state or "llama_tokenizer" not in st.session_state: model, tokenizer = load_resources() st.session_state.llama_model = model st.session_state.llama_tokenizer = tokenizer st.set_page_config(page_title="Tell Me Why", page_icon="❓", layout="wide") def get_llama_response(query): # model = st.session_state.llama_model # tokenizer = st.session_state.llama_tokenizer # inputs = tokenizer(query, return_tensors="pt") # outputs = model.generate(**inputs, max_new_tokens=300) # response = tokenizer.decode(outputs[0]["generated_text"], skip_special_tokens=True) pipe = pipeline( task="text-generation", model=st.session_state.llama_model, tokenizer=st.session_state.llama_tokenizer, max_new_tokens=128, return_full_text=False, ) outputs = pipe(query) return outputs[0]["generated_text"] # PDF Generation def generate_pdf(convo, topic): html = f"
You: {msg['text']}
" elif msg["role"] == "assistant": html += f"AI Assistant: {msg['text']}
" result = io.BytesIO() pisa_status = pisa.CreatePDF(io.StringIO(html), dest=result) if pisa_status.err: return None return result # Session Init if "chat_sessions" not in st.session_state: st.session_state.chat_sessions = {} if "current_conversation" not in st.session_state: st.session_state.current_conversation = None if "edit_mode" not in st.session_state: st.session_state.edit_mode = {} # App Title st.title("💬 Tell Me Why") # Custom CSS st.markdown(""" """, unsafe_allow_html=True) # Sidebar: Conversations st.sidebar.title("Conversations") titles = list(st.session_state.chat_sessions.keys()) if titles: for topic in titles: col1, col2 = st.sidebar.columns([0.8, 0.2]) if col1.button(f"🎨 {topic}", key=f"select_{topic}"): st.session_state.current_conversation = topic st.rerun() if col2.button("🗑", key=f"delete_{topic}"): del st.session_state.chat_sessions[topic] if st.session_state.current_conversation == topic: st.session_state.current_conversation = None st.rerun() else: st.sidebar.write("No conversations yet. Start one below!") # New Conversation with st.sidebar.form(key='new_conversation_form', clear_on_submit=True): new_topic = st.text_input("New Conversation Name") submit_button = st.form_submit_button("Start New Conversation") if submit_button: if new_topic.strip() and new_topic not in st.session_state.chat_sessions: st.session_state.chat_sessions[new_topic] = [] st.session_state.current_conversation = new_topic st.sidebar.success(f"Started new conversation: {new_topic}") st.rerun() elif not new_topic.strip(): st.sidebar.warning("Please enter a name.") else: st.sidebar.warning("Conversation already exists!") # Main Chat Area if st.session_state.current_conversation: convo = st.session_state.chat_sessions[st.session_state.current_conversation] st.markdown('