1 line
4.5 KiB
JSON
1 line
4.5 KiB
JSON
{"repo": "ashleshakadam/utd-jsom-chatbot", "files": {"app.py": {"24261162656c40a012f9dac41db0d2e460a55abb": {"t": 1785674364.311221, "n": 4180, "h": "900b821ca3bebb2f", "c": "import os\nimport streamlit as st\nimport requests\nfrom datetime import datetime\nfrom dotenv import load_dotenv\n\nfrom langchain_community.document_loaders import JSONLoader\nfrom langchain.text_splitter import CharacterTextSplitter\nfrom langchain_community.embeddings import HuggingFaceEmbeddings\nfrom langchain_community.vectorstores import FAISS\nfrom langchain.chains import RetrievalQA\n\n# ==== Load environment variables ====\nload_dotenv()\nOPENROUTER_API_KEY = os.getenv(\"OPENROUTER_API_KEY\")\n\n# ==== Load and preprocess website content ====\nloader = JSONLoader(file_path=\"data/full_site.json\", jq_schema=\".[]\", text_content=True)\ndocuments = loader.load()\n\ntext_splitter = CharacterTextSplitter(chunk_size=800, chunk_overlap=100)\ndocs = text_splitter.split_documents(documents)\n\n# ==== Build embeddings and retriever ====\nembeddings = HuggingFaceEmbeddings(model_name=\"all-MiniLM-L6-v2\")\nvectorstore = FAISS.from_documents(docs, embeddings)\nretriever = vectorstore.as_retriever(search_kwargs={\"k\": 3})\n\n# ==== OpenRouter query ====\ndef query_openrouter(prompt, api_key):\n url = \"https://openrouter.ai/api/v1/chat/completions\"\n headers = {\n \"Authorization\": f\"Bearer {api_key}\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://utd-jsom-chatbot.streamlit.app\"\n }\n payload = {\n \"model\": \"mistralai/mistral-7b-instruct\",\n \"messages\": [{\"role\": \"user\", \"content\": prompt}],\n }\n response = requests.post(url, headers=headers, json=payload)\n response.raise_for_status()\n return response.json()[\"choices\"][0][\"message\"][\"content\"]\n\n# ==== Streamlit Page Setup ====\nst.set_page_config(page_title=\"🤖 JSOM Chatbot\", layout=\"wide\")\n\n# ==== Custom CSS for UI polish ====\nst.markdown(\"\"\"\n <style>\n .title {\n font-size: 2.8rem;\n font-weight: 700;\n color: #0d3c61;\n text-align: center;\n margin-top: 1rem;\n }\n .subtitle {\n text-align: center;\n font-size: 1.2rem;\n color: #444;\n margin-bottom: 2rem;\n }\n .answer-box {\n background-color: #f0f6ff;\n border-left: 5px solid #0078d4;\n padding: 1rem;\n border-radius: 8px;\n margin-top: 1.5rem;\n font-size: 1.1rem;\n }\n .chunk-box {\n background-color: #fdfdfd;\n border: 1px dashed #ccc;\n border-radius: 5px;\n padding: 0.75rem;\n margin-bottom: 1rem;\n font-size: 0.95rem;\n }\n .footer {\n text-align: center;\n color: #888;\n font-size: 0.9rem;\n margin-top: 2rem;\n }\n .stTextInput > div > div > input {\n font-size: 1.05rem;\n }\n </style>\n\"\"\", unsafe_allow_html=True)\n\n# ==== Title & Subtitle ====\nst.markdown('<div class=\"title\">🤖 JSOM Chatbot</div>', unsafe_allow_html=True)\nst.markdown('<div class=\"subtitle\">Accurate answers from the official Jindal School of Management website</div>', unsafe_allow_html=True)\n\n# ==== Query Input ====\nquery = st.text_input(\"🔍 Ask me anything about JSOM:\")\n\nif query:\n with st.spinner(\"🤖 Thinking...\"):\n try:\n relevant_docs = retriever.get_relevant_documents(query)\n context = \"\\n\\n\".join(doc.page_content for doc in relevant_docs)\n\n prompt = f\"Use the following JSOM information to answer:\\n\\n{context}\\n\\nQuestion: {query}\"\n answer = query_openrouter(prompt, OPENROUTER_API_KEY)\n\n st.markdown(f'<div class=\"answer-box\"><strong>Answer:</strong> {answer}</div>', unsafe_allow_html=True)\n\n with st.expander(\"📄 View Sources Used\"):\n for i, doc in enumerate(relevant_docs):\n st.markdown(f'<div class=\"chunk-box\"><strong>Snippet {i+1}:</strong> {doc.page_content.strip()}</div>', unsafe_allow_html=True)\n\n except Exception as e:\n st.error(f\"❌ Error: {e}\")\n\n# ==== Footer with timestamp ====\nlast_updated = datetime.now().strftime(\"%B %d, %Y at %I:%M %p\")\nst.markdown(f'<div class=\"footer\">📅 Last updated: {last_updated}</div>', unsafe_allow_html=True)\n"}}}} |