louiecerv's picture
added the cover image
7849f07
import streamlit as st
import os
import google.generativeai as genai
from huggingface_hub import hf_hub_download
from PIL import Image
import base64
MODEL_ID = "gemini-2.0-flash-exp" # Keep the model ID as is
try:
api_key = os.getenv("GEMINI_API_KEY")
model_id = MODEL_ID
genai.configure(api_key=api_key)
except Exception as e:
st.error(f"Error: {e}")
st.stop
model = genai.GenerativeModel(MODEL_ID)
chat = model.start_chat()
def download_pdf():
"""
Downloads the PDF file from the Hugging Face Hub using the correct repo path and filename.
"""
try:
hf_token = os.getenv("HF_TOKEN")
repo_id = "louiecerv/vqa_procurement_dataset" # Corrected dataset repo path
filename = "20250210-IRR-RA-12009-FRM.pdf"
filepath = hf_hub_download(repo_id=repo_id, filename=filename, token=hf_token, repo_type="dataset")
return filepath
except Exception as e:
st.error(f"Failed to download PDF from Hugging Face Hub: {e}")
st.stop() # Stop if the download fails
# Initialize conversation history in Streamlit session state
if "conversation_history" not in st.session_state:
st.session_state.conversation_history = []
if "uploaded_file_part" not in st.session_state: # Store the file *part*
st.session_state.uploaded_file_part = None
if "uploaded_pdf_path" not in st.session_state:
st.session_state.uploaded_pdf_path = download_pdf()
def multimodal_prompt(pdf_path, text_prompt):
"""
Sends a multimodal prompt to Gemini, handling file uploads efficiently.
Args:
pdf_path: The path to the PDF file.
text_prompt: The text prompt for the model.
Returns:
The model's response as a string, or an error message.
"""
try:
if st.session_state.uploaded_file_part is None: # First time, upload
pdf_part = genai.upload_file(pdf_path, mime_type="application/pdf")
st.session_state.uploaded_file_part = pdf_part
prompt = [text_prompt, pdf_part] # First turn includes the actual file
else: # Subsequent turns, reference the file
prompt = [text_prompt, st.session_state.uploaded_file_part] # Subsequent turns include the file reference
response = chat.send_message(prompt)
# Update conversation history
st.session_state.conversation_history.append({"role": "user", "content": text_prompt, "has_pdf": True})
st.session_state.conversation_history.append({"role": "assistant", "content": response.text})
return response.text
except Exception as e:
return f"An error occurred: {e}"
# Define roles and procurement types from the document
roles = ["End-user", "Procurement Staff", "Top Management", "Implementing Unit",
"BAC Chairperson", "BAC Member", "BAC Secretariat", "TWG Member", "Project Consultant"]
procurement_types = ["Competitive Bidding", "Limited Source Bidding", "Competitive Dialogue",
"Unsolicited Offer with Bid Matching", "Direct Contracting", "Direct Acquisition",
"Repeat Order", "Small Value Procurement", "Negotiated Procurement",
"Direct Sales", "Direct Procurement for Science, Technology and Innovation"]
def display_download_button(file_path, file_name):
try:
with open(file_path, "rb") as f:
file_bytes = f.read()
b64 = base64.b64encode(file_bytes).decode()
href = f'<a href="data:application/pdf;base64,{b64}" download="{file_name}">Download the source document (PDF)</a>'
st.markdown(href, unsafe_allow_html=True)
except FileNotFoundError:
st.error("File not found for download.")
except Exception as e:
st.error(f"Error during download: {e}")
# --- Sidebar ---
st.sidebar.title("🤖 Visual Q and A")
selected_role = st.sidebar.selectbox("Select Your Role", roles)
selected_procurement_type = st.sidebar.selectbox("Select Procurement Type", procurement_types)
st.sidebar.markdown("[Visit our Hugging Face Space!](https://huggingface.co/wvsuaidev)")
st.sidebar.markdown("© 2025 WVSU AI Dev Team 🤖 ✨")
# --- Main Page ---
st.title("📚❓Procurement Guide: 20250210-IRR-RA-12009-FRM.pdf")
about = """
**How to use this App**
This app leverages Gemini 2.0 to provide insights into procurement processes based on the 20250210-IRR-RA-12009-FRM.pdf document. It offers Q&A, a glossary, and checklists tailored to your selected role (e.g., End-user, Procurement Staff) and procurement type (e.g., Competitive Bidding, Direct Contracting).
Key features:
* **Role-based Information:** Information is customized based on your selected role, providing relevant details and perspectives.
* **Procurement Type Filtering:** Filter information by procurement type to focus on specific processes.
* **AI-Powered Q&A:** Ask questions about the document and receive AI-generated answers, including citations of relevant IRR sections.
* **Glossary:** Quickly access definitions of common procurement terms. You can also ask the AI for a definition.
* **Checklists:** Generate checklists tailored to your role and procurement type for specific tasks.
"""
with st.expander("How to use this App"):
st.markdown(about)
# --- Load the image ---
image = Image.open("procurement.png")
st.image(image, width=400)
# --- Tabs ---
tab1, tab2, tab3 = st.tabs(["Q and A", "Glossary", "Checklists"])
# --- Q and A Tab ---
with tab1:
st.header("Questions and Answers")
# Generate 5 questions based on the selected role
if selected_role == "End-user":
questions = [
"What are the key steps involved in the procurement process for an end-user?",
"How can I ensure that my procurement request aligns with the PPMP and APP?",
"What are the different modes of procurement available to me as an end-user?",
"What are my responsibilities in the post-qualification stage?",
"What are the common reasons for bid disqualification that I should be aware of?"
]
elif selected_role == "Procurement Staff":
questions = [
"What are the legal requirements for procurement staff in handling bid documents?",
"How can I ensure the security and integrity of the PhilGEPS system during procurement activities?",
"What are the criteria for evaluating the quality component of bids in the MEARB process?",
"What are the grounds for contract termination that I should monitor?",
"How can I contribute to the development of a Green Local Market?"
]
elif selected_role == "Top Management":
questions = [
"What are the key policy decisions that Top Management needs to make regarding public procurement?",
"How can we ensure alignment between our procurement strategy and the organization's overall goals?",
"What are the critical monitoring and evaluation metrics for assessing the effectiveness of our procurement program?",
"How can we leverage data analytics to enhance procurement planning and decision-making?",
"What are the key risks and challenges associated with public procurement, and how can we mitigate them?"
]
elif selected_role == "Implementing Unit":
questions = [
"What is the role of the Implementing Unit in the procurement process?",
"How can we ensure effective coordination between the Implementing Unit and the BAC?",
"What are the key steps involved in contract implementation and management?",
"What are the common challenges faced by Implementing Units in procurement projects?",
"How can we improve the efficiency and effectiveness of contract implementation?"
]
elif selected_role == "BAC Chairperson":
questions = [
"What are the primary responsibilities of the BAC Chairperson in the procurement process?",
"How can I ensure that the BAC operates in a transparent and accountable manner?",
"What are the key ethical considerations for BAC members?",
"How can I effectively manage and resolve bid protests?",
"What are the best practices for conducting bid evaluations and post-qualification?"
]
elif selected_role == "BAC Member":
questions = [
"What are the specific roles and responsibilities of a BAC Member?",
"How can I contribute to fair and competitive bid evaluations?",
"What are the critical factors to consider during post-qualification?",
"How can I ensure that procurement decisions are aligned with the law and the organization's policies?",
"What are the ethical guidelines that I should follow as a BAC Member?"
]
elif selected_role == "BAC Secretariat":
questions = [
"What are the key functions and responsibilities of the BAC Secretariat?",
"How can I effectively manage procurement documents and records?",
"What are the best practices for organizing and conducting pre-bid conferences?",
"How can I ensure timely and accurate communication with bidders?",
"What is the role of the BAC Secretariat in contract implementation and monitoring?"
]
elif selected_role == "TWG Member":
questions = [
"What is the purpose and function of a Technical Working Group (TWG) in procurement?",
"How can I contribute my technical expertise to the bid evaluation process?",
"What are the key factors to consider when reviewing technical specifications?",
"How can I ensure that procurement decisions are technically sound and aligned with project requirements?",
"What are the challenges and opportunities for TWG members in public procurement?"
]
elif selected_role == "Project Consultant":
questions = [
"What is the role of a Project Consultant in the procurement process?",
"How can I ensure that my consultancy services contribute to successful procurement outcomes?",
"What are the ethical considerations for Project Consultants in procurement projects?",
"How can I effectively collaborate with the Procuring Entity and the BAC?",
"What are the key challenges and opportunities for Project Consultants in public procurement?"
]
# Create a selection box
selected_question = st.selectbox("Choose a question", questions)
# Display a checkbox
if st.checkbox('Enter a question'):
# If the checkbox is checked, display a text box
selected_question = st.text_input('Enter a question')
if st.button("Ask AI"):
with st.spinner("AI is thinking..."):
if st.session_state.uploaded_pdf_path is None:
st.session_state.uploaded_pdf_path = download_pdf()
filepath = st.session_state.uploaded_pdf_path
text_prompt = f"Use the provided document to answer the following question in the context of {selected_role} and {selected_procurement_type} question: {selected_question}. Cite the relevant sections of the IRR."
response = multimodal_prompt(filepath, text_prompt) # Use the downloaded filepath
st.markdown(f"**Response:** {response}")
# --- Glossary Tab ---
with tab2:
st.header("Glossary")
# Define 10 common terms and their definitions
glossary = {
"ABC": "Approved Budget for the Contract",
"BAC": "Bids and Awards Committee",
"PhilGEPS": "Philippine Government Electronic Procurement System",
"CSE": "Common-Use Supplies and Equipment",
"GPP": "Green Public Procurement",
"HOPE": "Head of the Procuring Entity",
"IRR": "Implementing Rules and Regulations",
"LCB": "Lowest Calculated Bid",
"MEARB": "Most Economically Advantageous Responsive Bid",
"NGO": "Non-Government Organization"
}
for term, definition in glossary.items():
st.write(f"**{term}:** {definition}")
user_term = st.text_input("Enter a term to search:")
if user_term:
with st.spinner("AI is thinking..."):
if st.session_state.uploaded_pdf_path is None:
st.session_state.uploaded_pdf_path = download_pdf()
filepath = st.session_state.uploaded_pdf_path
text_prompt = f"Use the provided document to define in the context of {selected_role} and {selected_procurement_type} term: {user_term}"
response = multimodal_prompt(filepath, text_prompt) # Use the downloaded filepath
st.markdown(f"**Response:** {response}")
# --- Checklists Tab ---
with tab3:
st.header("Checklists")
# Generate a sample checklist based on selected role and procurement type
if selected_role == "End-user" and selected_procurement_type == "Competitive Bidding":
checklist = [
"Prepare and submit procurement request",
"Ensure alignment with PPMP and APP",
"Define technical specifications",
"Participate in pre-bid conference",
"Review bid documents",
"Submit bid",
"Attend bid opening",
"Participate in post-qualification",
"Sign contract"
]
elif selected_role == "Procurement Staff" and selected_procurement_type == "Competitive Bidding":
checklist = [
"Prepare bidding documents",
"Publish invitation to bid",
"Conduct pre-bid conference",
"Receive and open bids",
"Evaluate bids",
"Conduct post-qualification",
"Recommend award of contract",
"Issue notice of award",
"Facilitate contract signing"
]
elif selected_role == "Top Management" and selected_procurement_type == "Competitive Bidding":
checklist = [
"Approve procurement plan",
"Set procurement policies",
"Ensure budget availability",
"Monitor procurement process",
"Approve contract award",
"Oversee contract implementation",
"Address bid protests",
"Ensure compliance with laws and regulations"
]
elif selected_role == "Implementing Unit" and selected_procurement_type == "Competitive Bidding":
checklist = [
"Identify project needs",
"Prepare technical specifications",
"Develop PPMP",
"Participate in bid evaluation",
"Oversee project implementation",
"Monitor contractor performance",
"Accept project deliverables"
]
elif selected_role == "BAC Chairperson" and selected_procurement_type == "Competitive Bidding":
checklist = [
"Lead BAC meetings",
"Ensure compliance with procurement law",
"Oversee bid evaluation process",
"Resolve bid protests",
"Recommend contract award",
"Sign bid documents and notices"
]
elif selected_role == "BAC Member" and selected_procurement_type == "Competitive Bidding":
checklist = [
"Attend BAC meetings",
"Review bid documents",
"Evaluate bids",
"Participate in post-qualification",
"Submit recommendations to BAC Chairperson"
]
elif selected_role == "BAC Secretariat" and selected_procurement_type == "Competitive Bidding":
checklist = [
"Provide administrative support to BAC",
"Prepare meeting minutes and resolutions",
"Handle bid documents and records",
"Publish bidding opportunities",
"Assist in bid evaluation and post-qualification"
]
elif selected_role == "TWG Member" and selected_procurement_type == "Competitive Bidding":
checklist = [
"Review technical specifications",
"Evaluate bids based on technical criteria",
"Provide technical expertise to BAC",
"Prepare technical reports"
]
elif selected_role == "Project Consultant" and selected_procurement_type == "Competitive Bidding":
checklist = [
"Provide technical advice to Procuring Entity",
"Assist in preparing bidding documents",
"Participate in bid evaluation if requested",
"Monitor project implementation"
]
else:
checklist = []
for i, task in enumerate(checklist):
st.write(f"{i+1}. {task}")
user_task = st.text_input("Enter a task to get checklist:")
if user_task:
with st.spinner("AI is thinking..."):
if st.session_state.uploaded_pdf_path is None:
st.session_state.uploaded_pdf_path = download_pdf()
filepath = st.session_state.uploaded_pdf_path
text_prompt = f"Use the provided document to create a checklist in the context of {selected_role} and {selected_procurement_type} task: {user_task}"
response = multimodal_prompt(filepath, text_prompt) # Use the downloaded filepath
st.markdown(f"**Response:** {response}")
if st.session_state.uploaded_pdf_path:
display_download_button(st.session_state.uploaded_pdf_path, "Generative_AI_and_Education.pdf")