def bot_response(history): if not interview_state.interview_history: reset_interview_action(interview_state.selected_interviewer) if interview_state.interview_history[-1]["role"] == "user": interview_state.question_count += 1 voice = interview_state.get_voice_setting() if interview_state.question_count > interview_state.n_of_questions: response = "That's all for now. Thank you for your time!" interview_state.interview_finished = True else: # Select prompts based on interview type if interview_state.interview_type == "hr": if not interview_state.knowledge_retrieval_setup: response = get_default_hr_questions( interview_state.question_count ) else: if interview_state.question_count == 1: response = get_initial_question( interview_state.interview_chain ) else: response = get_next_response( interview_state.interview_chain, interview_state.interview_history[-1]["content"] if interview_state.interview_history[-1]["role"] == "user" else "", [ msg["content"] for msg in interview_state.interview_history if msg.get("role") == "user" ], interview_state.question_count, ) elif interview_state.interview_type == "sarah": response = get_next_response( interview_state.interview_chain, interview_state.interview_history[-1]["content"] if interview_state.interview_history[-1]["role"] == "user" else "", [ msg["content"] for msg in interview_state.interview_history if msg.get("role") == "user" ], interview_state.question_count, ) elif interview_state.interview_type == "aaron": response = get_next_response( interview_state.interview_chain, interview_state.interview_history[-1]["content"] if interview_state.interview_history[-1]["role"] == "user" else "", [ msg["content"] for msg in interview_state.interview_history if msg.get("role") == "user" ], interview_state.question_count, ) else: response = "Invalid interview type." audio_buffer = BytesIO() convert_text_to_speech(response, audio_buffer, voice) audio_buffer.seek(0) with tempfile.NamedTemporaryFile( suffix=".mp3", delete=False ) as temp_file: temp_audio_path = temp_file.name temp_file.write(audio_buffer.getvalue()) interview_state.temp_audio_files.append(temp_audio_path) history.append({"role": "assistant", "content": response}) interview_state.interview_history.append({"role": "assistant", "content": response}) if interview_state.interview_finished: conclusion_message = "Thank you for being here. We will review your responses and provide feedback soon." history.append( {"role": "system", "content": conclusion_message} ) interview_state.interview_history.append({"role": "system", "content": conclusion_message}) txt_path = save_interview_history( [msg["content"] for msg in history if msg["role"] != "system"], interview_state.language ) if txt_path: return ( history, gr.Audio( value=temp_audio_path, autoplay=True, visible=True, ), gr.File(visible=True, value=txt_path), gr.Textbox(interactive=False) ) else: return ( history, gr.Audio( value=temp_audio_path, autoplay=True, visible=True, ), None, gr.Textbox(interactive=False) ) return ( history, gr.Audio( value=temp_audio_path, autoplay=True, visible=True ), None, gr.Textbox(interactive=True) )