import asyncio import json import chainlit as cl from datetime import datetime from .utils_chain_parameters import prepare_chain_parameters from .utils_output import display_evaluation_results from .utils_voice import reply_with_voice async def do_simulation(client, session_state, message): if session_state.status == "active": chain = cl.user_session.get("chain") history = cl.user_session.get("history", []) history.append({"role": "user", "content": message}) session_state.previous_answer = message.content prompt_parm = prepare_chain_parameters(session_state, message, history) session_state.queries.append(prompt_parm) response_content = chain.invoke(prompt_parm) json_str = response_content.content.strip('```json\n').strip('```') try: this_response = json.loads(json_str) except json.JSONDecodeError as e: print(f"JSON Decode Error: {e}") print(response_content.content) print(f"Error at position {e.pos}: {json_str[max(0, e.pos-10):e.pos+10]}") this_response = {"Response": "Error receiving response from LLM"} llm_response = this_response.get("Response", "No response from LLM") print("LLM Response:") print(llm_response) session_state.llm_responses.append(this_response) print("Next question:") print(this_response.get("Question", "No question")) if session_state.question != "": session_state.responses.append({ "question_number": session_state.current_question_index, "question": session_state.question, "response": session_state.rep_answer, "ground_truth": session_state.ground_truth, "response_score": this_response.get("Score", "No score"), "response_evaluation": this_response.get("Evaluation", "No evaluation"), "mood_score": this_response.get("Mood Score", "No mood score"), "overall_score": this_response.get("Overall Score", "No overall score"), "overall_evaluation": this_response.get("Overall Evaluation", "No overall evaluation"), }) message_to_rep = llm_response + "\n\n" + this_response.get("Question", "No question") print("Checking to continue") print(session_state.current_question_index) print(len(session_state.questions)) if session_state.current_question_index < len(session_state.questions): if session_state.do_voice: await reply_with_voice(cl, client, message_to_rep) else: await cl.Message(content=message_to_rep, author="John Smith").send() # await cl.Message(this_response).send() history.append({"role": "assistant", "content": response_content}) cl.user_session.set("history", history) session_state.current_question_index += 1 else: final_message = message_to_rep conclusion = this_response.get("Conclusion", "") if conclusion != "": final_message = final_message + "\n\n" + conclusion if session_state.do_voice: await reply_with_voice(cl, client, final_message) else: await cl.Message(message_to_rep).send() session_state.status = "complete" end_time = datetime.now() session_state.end_time = end_time if session_state.start_time: try: duration = end_time - session_state.start_time duration_minutes = round(duration.total_seconds() / 60) except: print("Error calculating duration") duration = 130 duration_minutes = 2 session_state.duration_minutes = duration_minutes if session_state.do_evaluation: await display_evaluation_results(cl, session_state) else: await cl.Message(content="**Simulation Complete**").send() evaluate_actions = [ cl.Action(name="Evaluate Performance", value="evaluate", description="Evaluate Performance"), cl.Action(name="Display Queries and Responses", value="display_llm_responses", description="Display LLM Responses") ] await cl.Message(content="Click to evaluate performance", actions=evaluate_actions).send() await cl.Message(content="\n\n").send()