import streamlit as st import json from typing import Dict, List, Any def format_project_response(project: dict) -> str: """Format project details with clear separation""" response = [f"\n• {project['name']}:"] response.append(f" Description: {project['description']}") if 'skills_used' in project: response.append(f"\n Technologies Used:") response.append(f" {', '.join(project['skills_used'])}") if 'status' in project: response.append(f"\n Current Status: {project['status']}") if 'confidentiality_note' in project: response.append(f" Note: {project['confidentiality_note']}") return '\n'.join(response) + '\n' def get_philosophical_response(query: str, knowledge_base: dict) -> str: """Handle philosophical or market-related queries""" query_lower = query.lower() # Market-related response if any(word in query_lower for word in ['market', 'job', 'opportunity', 'down']): return """I believe success in any market comes down to quality of effort and preparation. While the market may have cycles, I focus on: • Continuous Skill Development: - Building practical projects that solve real problems - Staying updated with latest ML/AI trends - Enhancing my technical portfolio • Value Proposition: - Unique combination of business and technical skills - Focus on practical implementation - Strong problem-solving approach I see this period as an opportunity to strengthen my skills and build more impactful projects.""" # Off-topic response if any(word in query_lower for word in ['weather', 'temperature', 'climate']): return """I'm focused on discussing my ML/AI journey and projects. For weather information, I'd recommend checking local weather services. Would you like to know about: • My ML projects and technical skills? • My journey from commerce to tech? • My approach to the current job market?""" return None # Return None if not a philosophical query def generate_response(query: str, knowledge_base: dict) -> str: """Enhanced response generation with better handling of various queries""" query_lower = query.lower() # First check for philosophical/off-topic queries philosophical_response = get_philosophical_response(query, knowledge_base) if philosophical_response: return philosophical_response # Handle project listing requests if any(word in query_lower for word in ['list', 'project', 'portfolio', 'built', 'created', 'developed']): response_parts = ["Here are my key projects:"] # Major Projects response_parts.append("\nMajor Projects (In Development):") for project in knowledge_base['projects']['major_projects']: response_parts.append(format_project_response(project)) # Algorithm Projects response_parts.append("\nCompleted Algorithm Implementation Projects:") for project in knowledge_base['projects']['algorithm_practice_projects']: response_parts.append(format_project_response(project)) response = '\n'.join(response_parts) # Add relevant links if 'online_presence' in knowledge_base.get('personal_details', {}): response += f"\n\nView my complete portfolio: {knowledge_base['personal_details']['online_presence']['portfolio']}" return response # [Rest of your existing response handlers] def main(): st.title("💬 Chat with Manyue's Portfolio") # Initialize session state if "messages" not in st.session_state: st.session_state.messages = [] if "knowledge_base" not in st.session_state: try: with open('knowledge_base.json', 'r', encoding='utf-8') as f: st.session_state.knowledge_base = json.load(f) except FileNotFoundError: st.error("Knowledge base file not found.") return # Display welcome message if "displayed_welcome" not in st.session_state: st.write(""" Hi! I'm Manyue's AI assistant. I can tell you about: - My journey from commerce to ML/AI - My technical skills and projects - My fit for ML/AI roles - You can also paste job descriptions to see how my profile matches! """) st.session_state.displayed_welcome = True # Create two columns with proper sizing col1, col2 = st.columns([3, 1]) with col1: # Chat container for better scrolling chat_container = st.container() with chat_container: for message in st.session_state.messages: with st.chat_message(message["role"]): st.markdown(message["content"]) # Chat input if prompt := st.chat_input("Ask me anything or paste a job description...", key="chat_input"): # Add user message with st.chat_message("user"): st.markdown(prompt) st.session_state.messages.append({"role": "user", "content": prompt}) # Generate and display response with st.chat_message("assistant"): try: response = generate_response(prompt, st.session_state.knowledge_base) st.markdown(response) st.session_state.messages.append({"role": "assistant", "content": response}) except Exception as e: st.error(f"An error occurred: {str(e)}") with col2: st.subheader("Quick Questions") example_questions = [ "Tell me about your ML projects", "What are your technical skills?", "What makes you stand out?", "What's your journey into ML?", "Your view on the current market?" ] # Handle quick questions with proper keys for i, question in enumerate(example_questions): if st.button(question, key=f"btn_{i}"): with st.chat_message("user"): st.markdown(question) st.session_state.messages.append({"role": "user", "content": question}) with st.chat_message("assistant"): try: response = generate_response(question, st.session_state.knowledge_base) st.markdown(response) st.session_state.messages.append({"role": "assistant", "content": response}) except Exception as e: st.error(f"An error occurred: {str(e)}") st.rerun() st.markdown("---") if st.button("Clear Chat", key="clear_chat"): st.session_state.messages = [] st.rerun() if __name__ == "__main__": main()