Handle the possibility of multiple concurrent calls to retrieve_conversation_item() in the OpenAIRealtimeBetaLLMService

This commit is contained in:
Paul Kompfner
2025-03-18 10:05:41 -04:00
parent 31317ce77d
commit 7b594093dd

View File

@@ -131,7 +131,13 @@ class OpenAIRealtimeBetaLLMService(LLMService):
async def retrieve_conversation_item(self, item_id: str): async def retrieve_conversation_item(self, item_id: str):
future = self.get_event_loop().create_future() future = self.get_event_loop().create_future()
self._retrieve_conversation_item_futures[item_id] = future retrieval_in_progress = False
if not self._retrieve_conversation_item_futures.get(item_id):
self._retrieve_conversation_item_futures[item_id] = []
else:
retrieval_in_progress = True
self._retrieve_conversation_item_futures[item_id].append(future)
if not retrieval_in_progress:
await self.send_client_event(events.ConversationItemRetrieveEvent(item_id=item_id)) await self.send_client_event(events.ConversationItemRetrieveEvent(item_id=item_id))
return await future return await future
@@ -474,9 +480,9 @@ class OpenAIRealtimeBetaLLMService(LLMService):
logger.warning(f"Transcript for unknown user message: {evt}") logger.warning(f"Transcript for unknown user message: {evt}")
async def _handle_conversation_item_retrieved(self, evt: events.ConversationItemRetrieved): async def _handle_conversation_item_retrieved(self, evt: events.ConversationItemRetrieved):
future = self._retrieve_conversation_item_futures.pop(evt.item.id, None) futures = self._retrieve_conversation_item_futures.pop(evt.item.id, None)
if future: if futures:
# print(f"[pk] setting result: {evt.item}") for future in futures:
future.set_result(evt.item) future.set_result(evt.item)
async def _handle_evt_response_done(self, evt): async def _handle_evt_response_done(self, evt):
@@ -543,8 +549,9 @@ class OpenAIRealtimeBetaLLMService(LLMService):
) )
if match: if match:
item_id = match.group(1) item_id = match.group(1)
future = self._retrieve_conversation_item_futures.pop(item_id, None) futures = self._retrieve_conversation_item_futures.pop(item_id, None)
if future: if futures:
for future in futures:
future.set_exception(Exception(evt.error.message)) future.set_exception(Exception(evt.error.message))
return True return True
return False return False