from loguru import logger def get_memory_key(langchain_object): """Get the memory key from the LangChain object's memory attribute. Given a LangChain object, this function retrieves the current memory key from the object's memory attribute. It then checks if the key exists in a dictionary of known memory keys and returns the corresponding key, or None if the current key is not recognized. """ mem_key_dict = { "chat_history": "history", "history": "chat_history", } # Check if memory_key attribute exists if hasattr(langchain_object.memory, "memory_key"): memory_key = langchain_object.memory.memory_key return mem_key_dict.get(memory_key) return None # or some other default value or action def update_memory_keys(langchain_object, possible_new_mem_key) -> None: """Update the memory keys in the LangChain object's memory attribute. Given a LangChain object and a possible new memory key, this function updates the input and output keys in the object's memory attribute to exclude the current memory key and the possible new key. It then sets the memory key to the possible new key. """ input_key = next( key for key in langchain_object.input_keys if key not in {langchain_object.memory.memory_key, possible_new_mem_key} ) output_key = next( key for key in langchain_object.output_keys if key not in {langchain_object.memory.memory_key, possible_new_mem_key} ) for key, attr in [(input_key, "input_key"), (output_key, "output_key"), (possible_new_mem_key, "memory_key")]: try: setattr(langchain_object.memory, attr, key) except ValueError as exc: logger.debug(f"{langchain_object.memory} has no attribute {attr} ({exc})")