Spaces:
Sleeping
Sleeping
| 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() | |