utils.py 1.1 KB

1234567891011121314151617181920212223242526272829303132333435
  1. from typing import Any, Optional
  2. def merge_metadata_dict(left: Optional[dict[str, Any]], right: Optional[dict[str, Any]]) -> Optional[dict[str, Any]]:
  3. """
  4. Merge the metadatas of two BaseMessage types.
  5. Args:
  6. left (dict[str, Any]): metadata of human message
  7. right (dict[str, Any]): metadata of AI message
  8. Returns:
  9. dict[str, Any]: combined metadata dict with dedup
  10. to be saved in db.
  11. """
  12. if not left and not right:
  13. return None
  14. elif not left:
  15. return right
  16. elif not right:
  17. return left
  18. merged = left.copy()
  19. for k, v in right.items():
  20. if k not in merged:
  21. merged[k] = v
  22. elif type(merged[k]) != type(v):
  23. raise ValueError(f'additional_kwargs["{k}"] already exists in this message,' " but with a different type.")
  24. elif isinstance(merged[k], str):
  25. merged[k] += v
  26. elif isinstance(merged[k], dict):
  27. merged[k] = merge_metadata_dict(merged[k], v)
  28. else:
  29. raise ValueError(f"Additional kwargs key {k} already exists in this message.")
  30. return merged