import os import gradio as gr from openai import OpenAI from langchain_community.document_loaders import PyPDFDirectoryLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_community.vectorstores import Chroma from langchain_community.embeddings import HuggingFaceEmbeddings HF_TOKEN = os.environ.get("HF_TOKEN", "") print("š Initializing your PQC Tutor...") embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2") vectordb = Chroma(persist_directory="database/", embedding_function=embeddings) client = OpenAI(base_url="https://router.huggingface.co/v1", api_key=HF_TOKEN) print("⨠Ready!") def ask(question, history): docs = vectordb.similarity_search(question, k=3) context = "\n\n".join([doc.page_content for doc in docs]) sources = [] for doc in docs: filename = doc.metadata.get("source", "Unknown").split("\\")[-1] page = doc.metadata.get("page", "?") sources.append(f"š **{filename}** ā Page {int(page)+1}") prompt = f"""You are a PQC expert teacher. Use the context below to answer clearly and kindly. Context: {context} Question: {question} Answer:""" response = client.chat.completions.create( model="Qwen/Qwen2.5-7B-Instruct", messages=[{"role": "user", "content": prompt}], max_tokens=512, temperature=0.5 ) answer = response.choices[0].message.content sources_text = "\n\n---\nš **References from PQC papers:**\n" + "\n".join(set(sources)) return answer + sources_text css = """ * { box-sizing: border-box; } body, .gradio-container { background: #ffffff !important; max-width: 100% !important; padding: 0 40px !important; } #title { text-align: center; color: #222; font-size: 2.2em; font-family: 'Georgia', serif; padding: 20px 0 5px 0; } #subtitle { text-align: center; color: #666; font-size: 0.95em; margin-bottom: 15px; } .chatbot { background: #ffffff !important; border: 1px solid #e0e0e0 !important; border-radius: 16px !important; box-shadow: 0 2px 12px rgba(0,0,0,0.08) !important; } .user .message { background: #f5f5f5 !important; color: #111111 !important; border-radius: 18px 18px 4px 18px !important; border: none !important; padding: 12px 16px !important; } .bot .message { background: #f5f5f5 !important; color: #111111 !important; border-radius: 18px 18px 18px 4px !important; border: 1px solid #e0e0e0 !important; padding: 12px 16px !important; } .textbox textarea { background: #ffffff !important; border: 1.5px solid #4f46e5 !important; border-radius: 12px !important; color: #111 !important; font-size: 1em !important; } button.primary { background: #222222 !important; border: none !important; border-radius: 10px !important; color: white !important; } button.primary:hover { background: #4338ca !important; } footer { display: none !important; } """ with gr.Blocks(title="š PQC Bot") as demo: gr.HTML("""