import streamlit as st import os from langchain_huggingface import HuggingFaceEmbeddings from langchain_community.vectorstores import FAISS from langchain.memory import ConversationBufferMemory from langchain.chains import ConversationalRetrievalChain from langchain_groq import ChatGroq # Changed to import ChatGroq from langchain.prompts import ChatPromptTemplate # Import the new dynamic template components from htmlTemplates import css, user_template, get_bot_template, BOT_AVATARS_BASE64 # ------------------- Dynamic Bot Names ------------------- BOT_NAMES = { "Khamenei": "حاجاقا محسنی", "Sistani": "حاجاقا جوادی", "Golpaygani": "حاجاقا محمدی", } # ------------------- Conversation Chain Function ------------------- def get_conversation_chain(vectorstore, llm): memory = ConversationBufferMemory( memory_key='chat_history', return_messages=True ) return ConversationalRetrievalChain.from_llm( llm=llm, retriever=vectorstore.as_retriever(), memory=memory, ) # ------------------- Classify Question ------------------- def classify_question(question, llm): prompt = ChatPromptTemplate.from_template(""" متن زیر را بررسی کن و فقط یکی از این سه برچسب را برگردان: - greeting: اگر متن سلام و احوالپرسی یا جملات دوستانه است - islamic_fiqh: اگر پرسش درباره احکام شرعی و فقهی اسلام است - irrelevant: اگر غیر از این دو بود متن: {question} برچسب: """) chain = prompt | llm result = chain.invoke({"question": question}) return result.content.strip().lower() # ------------------- Generate Friendly Response ------------------- def generate_friendly_response(question, label, llm, selected_source_english): bot_name = BOT_NAMES.get(selected_source_english, "پاسخگوی شما") if "greeting" in label: prompt = ChatPromptTemplate.from_template(f""" کاربر به شما سلام یا احوالپرسی کرده است. نام شما {bot_name} هست. متن کاربر: {{question}} """) else: # irrelevant prompt = ChatPromptTemplate.from_template(f""" کاربر پرسشی غیرمرتبط با احکام شرعی پرسیده است. تو به عنوان {bot_name} مودبانه و دوستانه به او بگویید که وظیفهی شما فقط پاسخ به پرسشهای شرعی است و او را به مطرح کردن یک سؤال دینی تشویق کنید. متن کاربر: {{question}} """) chain = prompt | llm result = chain.invoke({"question": question}) return result.content.strip() # ------------------- Handle User Input (Logic Only) ------------------- def handle_userinput(user_question): if st.session_state.conversation is None: st.warning("منابع هنوز آماده نشدهاند.") return st.session_state.messages.append({"role": "user", "content": user_question}) label = classify_question(user_question, st.session_state.llm) if "islamic_fiqh" in label: response = st.session_state.conversation({'question': user_question}) bot_reply = response['answer'] else: bot_reply = generate_friendly_response(user_question, label, st.session_state.llm, st.session_state.selected_source_english) st.session_state.messages.append({"role": "bot", "content": bot_reply}) # ------------------- Main Streamlit App ------------------- def main(): st.set_page_config(page_title="شیخ جی پی تی", page_icon=":mosque:") st.write(css, unsafe_allow_html=True) st.markdown( "