Spaces:
Sleeping
Sleeping
import streamlit as st | |
import PyPDF2 | |
import os | |
from langchain.llms import HuggingFaceHub | |
from langchain.prompts import PromptTemplate | |
# Set up API token | |
os.environ["HUGGINGFACEHUB_API_TOKEN"] = st.secrets["HF_TOKEN"] | |
# Initialize LLM | |
llm = HuggingFaceHub( | |
repo_id="mistralai/Mistral-7B-Instruct-v0.3", | |
model_kwargs={"temperature": 0.5} | |
) | |
# Function to extract text from PDF | |
def extract_text_from_pdf(pdf_file): | |
pdf_reader = PyPDF2.PdfReader(pdf_file) | |
text = "" | |
for page in pdf_reader.pages: | |
text += page.extract_text() + "\n" | |
return text | |
# Streamlit UI | |
st.title("Cold Email & Cover Letter Generator for Professors") | |
# User inputs | |
position_details = st.text_area("Enter details about the research position:", | |
"e.g., Professor's name, research focus, university, lab details, etc.") | |
resume_file = st.file_uploader("Upload your CV/Resume (PDF)", type=["pdf"]) | |
if st.button("Generate Cold Email & Cover Letter"): | |
if position_details and resume_file: | |
# Extract text from the uploaded PDF | |
resume_text = extract_text_from_pdf(resume_file) | |
# Define prompt for cold email | |
email_prompt = PromptTemplate.from_template( | |
""" | |
Based on the following details of a research position and a student's CV, generate a professional cold email: | |
Research Position Details: | |
{position} | |
Student's CV: | |
{resume} | |
The email should be formal, concise, and engaging, expressing interest in the position while highlighting relevant skills. | |
""" | |
) | |
email_content = llm(email_prompt.format(position=position_details, resume=resume_text)) | |
# Define prompt for cover letter | |
cover_prompt = PromptTemplate.from_template( | |
""" | |
Generate a professional cover letter based on the following research position details and a student's CV: | |
Research Position Details: | |
{position} | |
Student's CV: | |
{resume} | |
The cover letter should be well-structured, highlighting the student's background, relevant skills, research interests, and motivation for applying. | |
""" | |
) | |
cover_content = llm(cover_prompt.format(position=position_details, resume=resume_text)) | |
# Display results | |
st.subheader("Generated Cold Email") | |
st.write(email_content) | |
st.subheader("Generated Cover Letter") | |
st.write(cover_content) | |
else: | |
st.warning("Please provide both the position details and upload a CV.") | |