File size: 8,345 Bytes
2d63df8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
import streamlit as st
import json
import google.generativeai as genai

# Placeholder for your API key - securely manage this in your actual application
API_KEY = "AIzaSyCA4__JMC_ZIQ9xQegIj5LOMLhSSrn3pMw"

def fetch_data_from_json(filename):
    """Utility function to fetch data from a given JSON file."""
    try:
        with open(filename, 'r') as file:
            return json.load(file)
    except FileNotFoundError:
        st.error(f"File {filename} not found. Please ensure it's in the correct path.")
        return None

def app():
    st.title('Career Insights and Recommendations')

    # Paths to JSON files - adjust these paths as necessary
    json_files = {
        "core_values": "core_values_responses.json",
        "strengths": "strength_responses.json",
        "dream_job": "dream_job_info.json",
        "strengths2": "dynamic_strength_responses.json",
        "preferences": "preferences_sets.json",
        "skills_experience": "skills_and_experience_sets.json",
        "career_priorities": "career_priorities_data.json",
    }

    json_files["strengths"] = "strength_responses.json"
    merge_json_files("strength_responses.json", "dynamic_strength_responses.json", "strength_responses.json")

    

    comprehensive_data = {}
    for key, file_path in json_files.items():
        comprehensive_data[key] = fetch_data_from_json(file_path)

    # Generate and display a comprehensive analysis based on all aspects
    comprehensive_prompt = construct_comprehensive_prompt(comprehensive_data)
    st.subheader("Comprehensive Career Analysis")
    comprehensive_response_text = call_gemini(comprehensive_prompt)
    st.text("Comprehensive API Response:")
    st.write(comprehensive_response_text)

    # Save the comprehensive response
    save_responses("comprehensive_analysis", comprehensive_response_text)
    


def merge_json_files(file1, file2, output_file):
    """Merge the contents of two JSON files and save the result in another file."""
    try:
        with open(file1, 'r') as file:
            data1 = json.load(file)
        with open(file2, 'r') as file:
            data2 = json.load(file)
        
        # Ensure data1 and data2 are dictionaries
        if not isinstance(data1, dict):
            data1 = {}
        if not isinstance(data2, dict):
            data2 = {}
        
        merged_data = {**data1, **data2}
        
        with open(output_file, 'w') as file:
            json.dump(merged_data, file, indent=4)
        
        st.success(f"Merged data saved to {output_file}.")
    except FileNotFoundError:
        st.error("One or more input files not found. Please ensure they are in the correct path.")


def process_section(section_name, data):
    """
    Processes each section individually by constructing a tailored prompt,
    calling the Gemini API, and displaying the response.
    """
    prompt = construct_prompt(section_name, data)
    st.subheader(f"{section_name.replace('_', ' ').title()} Analysis")
    response_text = call_gemini(prompt)
    st.text(f"{section_name.replace('_', ' ').title()} API Response:")
    st.write(response_text)
    
    # Save the response
    save_responses(section_name, response_text)


def save_responses(section_name, response_text):
    """Saves the API responses to a JSON file."""
    try:
        # Attempt to load existing data
        with open('gemini_responses.json', 'r') as file:
            responses = json.load(file)
    except (FileNotFoundError, json.JSONDecodeError):
        # If the file does not exist or contains invalid data, start with an empty dictionary
        responses = {}
    
    # Update the dictionary with the new response
    responses[section_name] = response_text
    
    # Save the updated dictionary back to the file
    with open('gemini_responses.json', 'w') as file:
        json.dump(responses, file, indent=4)


def construct_prompt(section_name, data):
    """
    Constructs a detailed and tailored prompt for a specific section,
    guiding the model to provide insights and recommendations based on that section's data.
    """
    prompt_template = {
        "career_priorities": "Analyze and evaluate user's current skill level related to these career priorities: {details}.",
"core_values": "Assess how user's current behaviours and skills align with these core values: {details}.",
"strengths": "Evaluate and highlight user's competency levels across these strengths: {details}.",
"dream_job": "Compare user's current skills and experience to the requirements of this dream job: {details}.",
"strengths2": "Summarize how user's friend's/collegs/seniors view user's capabilities based on this feedback: {details}.",
"preferences": "Judge how well user's skills and attributes fit these preferences: {details}.",
"skills_experience": "Assess user's current skill level within this area of expertise: {details}.",
    }

    # Constructing the tailored prompt
    details = json.dumps(data, ensure_ascii=False)
    prompt = prompt_template.get(section_name, "Please provide data for analysis.").format(details=details)
    return prompt

def construct_comprehensive_prompt(data):
    prompt_parts = [
        "Given an individual's career aspirations, core values, strengths, preferences, and skills, provide a comprehensive analysis that identifies key strengths, aligns these with career values, and suggests career paths. Then, recommend the top 5 job descriptions that would be a perfect fit based on the analysis. Here are the details:",
        f"Career Priorities: {json.dumps(data['career_priorities'], ensure_ascii=False)}",
        f"Core Values: {json.dumps(data['core_values'], ensure_ascii=False)}",  
        "Rate the user's career priorities out of 100 and provide justification:",
        f"Strengths: {json.dumps(data['strengths'], ensure_ascii=False)}",
        "Rate the user's strengths out of 100 and provide justification:",        
        f"Dream Job Information: {json.dumps(data['dream_job'], ensure_ascii=False)}",
        "Rate the user's dream job alignment out of 100 and provide justification:",               
        f"Preferences: {json.dumps(data['preferences'], ensure_ascii=False)}",
        "Rate the user's preferences out of 100 and provide justification:",
        f"Skills and Experience: {json.dumps(data['skills_experience'], ensure_ascii=False)}",
        "Rate the user's skills and experience out of 100 and provide justification:",
        "Based on the analysis, suggest 2-3 areas for mindful upskilling and professional development for the user, along with relevant certifications that would help strengthen their profile:",
        "Consider the following in the further analysis:",
        "- Given the strengths and dream job aspirations, what are the top industries or roles that would be a perfect fit?",
        "- Based on the preferences, what work environment or company culture would be most suitable?",
        "Conclude with recommendations for the top 5 open job descriptions in India aligned to the user's goals, including any specific industries or companies where these roles may be in demand currently.",
    ]
    prompt = "\n\n".join(prompt_parts)
    return prompt

def call_gemini(prompt):
    """Calls the Gemini API with the given prompt and returns the response."""
    # Configure the API with your key
    genai.configure(api_key=API_KEY)

    # Set up the model configuration
    generation_config = {
        "temperature": 0.7,
        "top_p": 0.95,
        "max_output_tokens": 4096,
    }

    safety_settings = [
        {"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_MEDIUM_AND_ABOVE"},
        {"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_MEDIUM_AND_ABOVE"},
        {"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "threshold": "BLOCK_MEDIUM_AND_ABOVE"},
        {"category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "BLOCK_MEDIUM_AND_ABOVE"},
    ]

    # Create the model instance
    model = genai.GenerativeModel(model_name="gemini-1.0-pro",
                                  generation_config=generation_config,
                                  safety_settings=safety_settings)

    # Generate content
    response = model.generate_content([prompt])
    response_text = response.text
    return response_text


if __name__ == "__main__":
    app()