import json from utils.logger import logger from networks import OpenaiStreamOutputer class MessageParser: def __init__(self, outputer=OpenaiStreamOutputer()): self.delta_content_pointer = 0 self.outputer = outputer def parse(self, data, return_output=False): arguments = data["arguments"][0] if arguments.get("throttling"): throttling = arguments.get("throttling") # pprint.pprint(throttling) if arguments.get("messages"): for message in arguments.get("messages"): message_type = message.get("messageType") # Message: Displayed answer if message_type is None: # content = message["adaptiveCards"][0]["body"][0]["text"] content = message["text"] delta_content = content[self.delta_content_pointer :] logger.line(delta_content, end="") self.delta_content_pointer = len(content) # Message: Suggested Questions if message.get("suggestedResponses"): logger.note("\nSuggested Questions: ") suggestion_texts = [ suggestion.get("text") for suggestion in message.get("suggestedResponses") ] for suggestion_text in suggestion_texts: logger.file(f"- {suggestion_text}") if return_output: completions_output = self.outputer.output( delta_content, content_type="Completions" ) if message.get("suggestedResponses"): suggestions_output = self.outputer.output( suggestion_texts, content_type="SuggestedResponses", ) return [completions_output, suggestions_output] else: return completions_output # Message: Search Query elif message_type in ["InternalSearchQuery"]: search_query_str = message.get("hiddenText") if return_output: # output_str = self.outputer.output( # search_query_str, content_type="InternalSearchQuery" # ) # logger.note(output_str) # return output_str return None # Message: Internal Search Results elif message_type in ["InternalSearchResult"]: if message.get("groundingInfo"): web_search_results = message.get("groundingInfo").get( "web_search_results" ) invocation = message.get("invocation") if return_output: search_results_str = self.outputer.output( { "invocation": invocation, "web_search_results": web_search_results, }, content_type="InternalSearchResult", ) data = json.loads(search_results_str) logger.note(data["choices"][0]["delta"]["content"]) return search_results_str # Message: Loader status, such as "Generating Answers" elif message_type in ["InternalLoaderMessage"]: # logger.note("[Generating answers ...]\n") pass # Message: Internal thoughts, such as "I will generate my response to the user message" elif message_type in ["Internal"]: pass # Message: Internal Action Marker, no value elif message_type in ["InternalActionMarker"]: continue # Message: Render Cards for Webpages elif message_type in ["RenderCardRequest"]: continue elif message_type in ["ChatName"]: continue # Message: Not Implemented else: raise NotImplementedError( f"Not Supported Message Type: {message_type}" ) return None