Spaces:
Runtime error
Runtime error
| import json | |
| from src.utils import OpenAIClient | |
| from src.config import logger | |
| from ._bot_actions_service import BotActionService | |
| class WebRTCService: | |
| def __init__(self): | |
| self.openai_client = OpenAIClient | |
| self.bot_action_service = BotActionService() | |
| async def __aenter__(self): | |
| return self | |
| async def __aexit__(self, *args): | |
| pass | |
| async def handle_voice_conversion( | |
| self, websocket, conversation_id, user_id, conversation_history, redis_client | |
| ): | |
| while True: | |
| data = await websocket.receive_text() | |
| message = json.loads(data) | |
| # user_status = await redis_client.get(f"session:{conversation_id}") | |
| # if not user_status: | |
| # logger.error("User session has ended") | |
| # raise Exception("A max 25 minute session has ended") | |
| openai_server_events = { | |
| "session_created": message["type"] == "session.created", | |
| "function_call": ( | |
| message["type"] == "response.function_call_arguments.done" | |
| ), | |
| "input_transcription": ( | |
| message["type"] | |
| == "conversation.item.input_audio_transcription.completed" | |
| ), | |
| "output_transcription": ( | |
| message["type"] == "response.done" | |
| and message["response"]["status"] == "completed" | |
| and message["response"]["output"][0]["type"] == "message" | |
| ), | |
| } | |
| if openai_server_events["session_created"]: | |
| create_conversation_event = { | |
| "type": "conversation.item.create", | |
| "previous_item_id": None, | |
| "item": { | |
| "type": "message", | |
| "role": "user", | |
| "content": [ | |
| { | |
| "type": "input_text", | |
| "text": f"Conversation History: {conversation_history}\n\n", | |
| } | |
| ], | |
| }, | |
| } | |
| await websocket.send_text(json.dumps(create_conversation_event)) | |
| await websocket.send_text(json.dumps({"type": "response.create"})) | |
| if openai_server_events["function_call"]: | |
| response = await self.bot_action_service.handle_ai_function_call( | |
| data=message, user_id=user_id | |
| ) | |
| event_response = { | |
| "type": "conversation.item.create", | |
| "previous_item_id": None, | |
| "item": { | |
| "type": "message", | |
| "role": "user", | |
| "content": [ | |
| { | |
| "type": "input_text", | |
| "text": response, | |
| } | |
| ], | |
| }, | |
| } | |
| await websocket.send_text(json.dumps(event_response)) | |
| event_response_2 = {"type": "response.create"} | |
| await websocket.send_text(json.dumps(event_response_2)) | |
| elif openai_server_events["input_transcription"]: | |
| user_message = message["transcript"] | |
| await self.bot_action_service.handle_user_message( | |
| message_content=user_message, conversation_id=conversation_id | |
| ) | |
| elif openai_server_events["output_transcription"]: | |
| ai_response = message["response"]["output"][0]["content"][0][ | |
| "transcript" | |
| ] | |
| await self.bot_action_service.handle_ai_message( | |
| message_content=ai_response, conversation_id=conversation_id | |
| ) | |
| elif message["type"] == "error": | |
| logger.error(f"Error: {message['error']}") | |