ASNVS's picture
it a update
9a31d86 verified
raw
history blame
5.99 kB
import gradio as gr
import requests
import os
import subprocess
import threading
# API credentials for job search
API_KEY = "c1b9b6be0amsh11316ef9a922bdbp1789f5jsn18a0023eef11"
API_HOST = "jsearch.p.rapidapi.com"
# Securely set Groq API key (for Career Counselor)
GROQ_API_KEY = "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"
os.environ["GROQ_API_KEY"] = GROQ_API_KEY
# Function to fetch job openings
def get_job_openings(job_title, location, location_type, employment_type, salary_min, salary_max):
url = "https://jsearch.p.rapidapi.com/search"
querystring = {
"query": f"{job_title} in {location}",
"page": "1",
"num_pages": "1",
"remote_jobs_only": "true" if location_type == "REMOTE" else "false",
"employment_types": employment_type,
"salary_min": salary_min,
"salary_max": salary_max
}
headers = {
"x-rapidapi-key": API_KEY,
"x-rapidapi-host": API_HOST
}
response = requests.get(url, headers=headers, params=querystring)
return response.json().get('data', []) if response.status_code == 200 else f"Error {response.status_code}: {response.text}"
# Function for job search UI
def search_jobs(job_title, location, location_type, employment_type, salary_min, salary_max):
jobs = get_job_openings(job_title, location, location_type, employment_type, salary_min, salary_max)
if isinstance(jobs, str):
return jobs
if not jobs:
return "No job openings found. Please try different inputs."
return "\n\n".join(
f"{idx}. {job.get('job_title', 'No Title')}\n"
f"Company: {job.get('employer_name', 'Unknown')}\n"
f"Location: {job.get('job_city', 'Unknown')}, {job.get('job_country', '')}\n"
f"Type: {job.get('job_employment_type', 'N/A')}\n"
f"Salary: {job.get('job_salary_currency', '')} {job.get('job_salary_min', 'N/A')} - {job.get('job_salary_max', 'N/A')}\n"
f"Posted On: {job.get('job_posted_at_datetime_utc', 'N/A')}\n"
f"Deadline: {job.get('job_offer_expiration_datetime_utc', 'N/A')}\n"
f"[View Job Posting]({job.get('job_apply_link', '#')})"
for idx, job in enumerate(jobs, start=1)
)
# Function to launch Career Counselor App in a separate thread
def launch_career_counselor():
def run_streamlit():
# Write the Streamlit app code to career_counselor.py
with open("career_counselor.py", "w") as f:
f.write("""
import os
import streamlit as st
from groq import Groq
GROQ_API_KEY = os.getenv("GROQ_API_KEY")
client = Groq(api_key=GROQ_API_KEY)
st.title("Career Counselor App")
st.write("Get career guidance based on your skills, interests, and experience.")
st.header("Tell us about yourself")
skills = st.text_area("List your skills (e.g., Python, teamwork, CAD):")
interests = st.text_area("What areas of interest do you have? (e.g., AI, design, civil engineering):")
experience = st.text_area("Describe your experience (if any):")
def suggest_careers_groq(skills, interests, experience):
try:
prompt = f"Suggest careers based on Skills: {skills}, Interests: {interests}, Experience: {experience}"
chat_completion = client.chat.completions.create(
messages=[{"role": "user", "content": prompt}],
model="llama-3.3-70b-versatile",
stream=False,
)
return chat_completion.choices[0].message.content
except Exception as e:
st.error(f"Error: {e}")
return None
if st.button("Get Career Advice"):
if not skills or not interests:
st.error("Please provide skills and interests for better suggestions.")
else:
st.subheader("Career Recommendations")
response = suggest_careers_groq(skills, interests, experience)
st.write(response if response else "No recommendations available.")
st.markdown("---")
st.markdown("<p style='text-align: center;'>Designed by Career Expert</p>", unsafe_allow_html=True)
""")
# Use a clean environment and launch via the Python module to avoid extra flags.
env = os.environ.copy()
subprocess.Popen(
["python", "-m", "streamlit", "run", "career_counselor.py"],
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
env=env
)
threading.Thread(target=run_streamlit, daemon=True).start()
# Function to handle option selection
def main(option):
if option == "Career Connect (Job Search)":
return gr.update(visible=True), gr.update(visible=False), ""
elif option == "Career Counselor App":
launch_career_counselor()
return gr.update(visible=False), gr.update(visible=True), "πŸš€ Career Counselor App is launching..."
# Gradio Interface
with gr.Blocks() as iface:
gr.Markdown("# 🌟 Career Guidance & Job Search")
gr.Markdown("Choose between job searching or AI-powered career guidance.")
option = gr.Radio(["Career Connect (Job Search)", "Career Counselor App"], label="Select an Option")
# Job search UI
job_search_interface = gr.Interface(
fn=search_jobs,
inputs=[
gr.Textbox(label="Enter Job Title", placeholder="e.g., Node.js Developer"),
gr.Textbox(label="Enter Location", placeholder="e.g., New York"),
gr.Radio(["ANY", "ON_SITE", "REMOTE", "HYBRID"], label="Location Type"),
gr.CheckboxGroup(["FULLTIME", "PARTTIME", "INTERN", "CONTRACTOR"],
label="Select Employment Type", value=["FULLTIME", "INTERN"]),
gr.Number(label="Minimum Salary ($)", value=0, minimum=0),
gr.Number(label="Maximum Salary ($)", value=100000, minimum=0)
],
outputs=gr.Textbox(label="Job Openings"),
visible=False
)
counselor_status = gr.Markdown("", visible=False)
option.change(main, inputs=option, outputs=[job_search_interface, counselor_status, gr.Textbox(label="Status")])
iface.launch()