1616from server .api .constants import SUPABASE_AUDIO_MESSAGES_BUCKET_NAME , LLM
1717from server .api .utils import add_memories , authorize_user , get_stream_content
1818from prisma import Prisma , enums , types
19- from datetime import datetime
19+ from pydantic import BaseModel
20+ from datetime import datetime , timedelta
2021from server .api .analytics import track_sent_message
2122from server .agent .index import generate_response
2223from server .logger .index import fetch_logger
@@ -92,8 +93,14 @@ async def call_update_chat(
9293 audio_messages_enabled : bool ,
9394 audio_id : Optional [str ],
9495):
95- new_user_message = next (msg for msg in reversed (messages ) if msg ["role" ] == "user" )
96- new_user_message = message_to_fixed_string_content (new_user_message )["content" ]
96+ # We default the new_user_message to empty if the length of the messages array is 1
97+ # This handles the case where the agent is sending the first message in the conversation to greet the user
98+ new_user_message = ""
99+ if len (messages ) > 1 :
100+ new_user_message = next (
101+ msg for msg in reversed (messages ) if msg ["role" ] == "user"
102+ )
103+ new_user_message = message_to_fixed_string_content (new_user_message )["content" ]
97104
98105 data = {
99106 "new_user_message" : new_user_message ,
@@ -129,10 +136,9 @@ def stream_and_update_chat(
129136 user_first_name : str ,
130137 user_gender : str ,
131138 audio_messages_enabled : bool ,
132- audio_id : Optional [ str ] = None ,
133- skip_final_processing : Optional [ bool ] = False ,
139+ audio_id : str ,
140+ skip_final_processing : bool ,
134141):
135- user_message_timestamp = datetime .now ()
136142 client = OpenAI (
137143 api_key = os .environ .get ("OPENAI_API_KEY" ),
138144 )
@@ -171,6 +177,8 @@ def stream_and_update_chat(
171177 content = choice .delta .content
172178 agent_response += content
173179
180+ user_message_timestamp = datetime .now ()
181+ agent_message_timestamp = user_message_timestamp - timedelta (seconds = 1 )
174182 # Run asynchronous operations in a separate thread, which is necessary to prevent the main
175183 # thread from getting blocked during synchronous tasks with high latency, like network requests.
176184 # This is important when streaming voice responses because the voice will pause in the middle of
@@ -192,6 +200,7 @@ def stream_and_update_chat(
192200 user_message_timestamp = user_message_timestamp ,
193201 audio_messages_enabled = audio_messages_enabled ,
194202 audio_id = audio_id ,
203+ agent_message_timestamp = agent_message_timestamp ,
195204 )
196205 ),
197206 daemon = True ,
@@ -208,9 +217,8 @@ async def final_processing_coroutine(
208217 user_message_timestamp : datetime ,
209218 audio_messages_enabled : bool ,
210219 audio_id : Optional [str ],
220+ agent_message_timestamp : datetime ,
211221) -> None :
212- agent_message_timestamp = datetime .now ()
213-
214222 await call_update_chat (
215223 messages = messages ,
216224 agent_response = agent_response ,
@@ -256,6 +264,7 @@ def stream_text(
256264 user_gender = user_gender ,
257265 audio_messages_enabled = audio_messages_enabled ,
258266 audio_id = audio_id ,
267+ skip_final_processing = False ,
259268 )
260269 for chunk in stream :
261270 for choice in chunk .choices :
@@ -349,6 +358,7 @@ def sync_function():
349358 user_id = user_id ,
350359 chat_type = "type" ,
351360 user_message_timestamp = user_message_timestamp ,
361+ agent_message_timestamp = datetime .timestamp (),
352362 audio_messages_enabled = audio_messages_enabled ,
353363 audio_id = audio_id ,
354364 )
@@ -435,15 +445,16 @@ async def handle_update_chat(request: UpdateChatRequest):
435445 audio_messages_enabled = request .audio_messages_enabled
436446
437447 # Create new user chat message
438- await prisma .chatmessages .create (
439- data = types .ChatMessagesCreateInput (
440- chatId = chat_id ,
441- role = enums .OpenAIRole .user ,
442- content = new_user_message ,
443- created = datetime .fromtimestamp (request .user_message_timestamp ),
444- displayType = "text" ,
448+ if len (new_user_message ) > 0 :
449+ await prisma .chatmessages .create (
450+ data = types .ChatMessagesCreateInput (
451+ chatId = chat_id ,
452+ role = enums .OpenAIRole .user ,
453+ content = new_user_message ,
454+ created = datetime .fromtimestamp (request .user_message_timestamp ),
455+ displayType = "text" ,
456+ )
445457 )
446- )
447458
448459 display_type = "audio" if audio_messages_enabled else "text"
449460
0 commit comments