import gradio as gr from huggingface_hub import InferenceClient import re import traceback import os # Initialize the Inference Client with your model client = InferenceClient("HuggingFaceH4/zephyr-7b-beta", token=os.getenv("HUGGINGFACE_API_TOKEN")) def respond( message, history, max_tokens, temperature, top_p, current_salary ): """ Respond function to handle the conversation and update salary based on AI's assessment. """ # Define the system message for the conversation (hidden from the user) system_message = ( "You are a hiring manager negotiating a job offer with a candidate. " "Your initial salary offer is $60,000. " "Engage in a negotiation with the candidate, adjusting your offer based on their arguments." ) # Initialize the messages with the system prompt messages = [{"role": "system", "content": system_message}] # Append the conversation history to messages for user_msg, ai_msg in history: if user_msg: messages.append({"role": "user", "content": user_msg}) if ai_msg: messages.append({"role": "assistant", "content": ai_msg}) # Append the latest user message messages.append({"role": "user", "content": message}) # Generate the AI's response to the user's message try: response = client.chat_completion( messages, max_tokens=max_tokens, temperature=temperature, top_p=top_p, stop=None ).get("choices")[0].get("message").get("content") except Exception as e: response = f"An error occurred while communicating with the AI: {e}" traceback.print_exc() # Append the AI's response to the history history.append((message, response)) # Now, send the conversation to the AI to get the updated salary # Prepare the salary assessment prompt salary_assessment_prompt = ( "As the hiring manager, based on the conversation so far, " "what salary do you now offer to the candidate? " "Please provide only the salary amount as a number, without any additional text." ) # Prepare the messages for salary assessment assessment_messages = [{"role": "system", "content": salary_assessment_prompt}] # Include the conversation history for user_msg, ai_msg in history: if user_msg: assessment_messages.append({"role": "user", "content": user_msg}) if ai_msg: assessment_messages.append({"role": "assistant", "content": ai_msg}) # Generate the AI's salary assessment try: salary_response = client.chat_completion( assessment_messages, max_tokens=10, temperature=temperature, top_p=top_p, stop=None ).get("choices")[0].get("message").get("content") except Exception as e: salary_response = f"An error occurred while assessing salary: {e}" traceback.print_exc() salary_response = str(current_salary) # Parse the salary from the AI's response try: # Remove any non-digit characters salary_str = re.sub(r'[^\d]', '', salary_response) if salary_str: new_salary = int(salary_str) if new_salary != current_salary: # Update current_salary current_salary = new_salary else: # If parsing fails, keep the current salary pass except Exception as e: # If parsing fails, keep the current salary pass return history, "", current_salary # Return history, clear input, and update salary internally def reset_game(): """ Function to reset the game to initial state. """ return [], 60000 # Reset history and salary to $60,000 # Define the Gradio Blocks layout with gr.Blocks() as demo: gr.Markdown("# 💼 Salary Negotiation Game") gr.Markdown( """ **Objective:** Negotiate your salary starting from $60,000. **Instructions:** - Use the chat to negotiate your salary with the hiring manager. - Provide compelling reasons for a higher salary. - The hiring manager will consider your arguments and may adjust the offer. """ ) # Chat history to keep track of the conversation chat_history = gr.State([]) # Current salary (hidden from the user) current_salary_state = gr.State(60000) # Chat Interface chatbot = gr.Chatbot() # User input user_input = gr.Textbox( label="Your Message", placeholder="Enter your negotiation message here...", lines=2 ) send_button = gr.Button("Send") def handle_message(message, history, max_tokens, temperature, top_p, current_salary): """ Handles user messages and updates the conversation history and salary. """ history, _, current_salary = respond(message, history, max_tokens, temperature, top_p, current_salary) return history, "", current_salary send_button.click( handle_message, inputs=[ user_input, chat_history, gr.Number(value=512, label="Max New Tokens"), gr.Number(value=0.7, label="Temperature"), gr.Number(value=0.95, label="Top-p"), current_salary_state # Pass the current salary ], outputs=[ chatbot, user_input, # Clear the input textbox current_salary_state # Update the salary internally ] ) # Reset button to restart the game reset_btn = gr.Button("Reset Game") reset_btn.click(fn=reset_game, inputs=None, outputs=[chat_history, current_salary_state]) gr.Markdown( """ --- *Developed with ❤️ using Gradio and Hugging Face.* """ ) if __name__ == "__main__": demo.launch()