Source code for langchain_community.chat_loaders.facebook_messenger
import json
import logging
from pathlib import Path
from typing import Iterator, Union
from langchain_core.chat_loaders import BaseChatLoader
from langchain_core.chat_sessions import ChatSession
from langchain_core.messages import HumanMessage
logger = logging.getLogger(__file__)
[docs]class SingleFileFacebookMessengerChatLoader(BaseChatLoader):
"""从单个文件加载`Facebook Messenger`聊天数据。
参数:
path (Union[Path, str]): 聊天文件的路径。
属性:
path (Path): 聊天文件的路径。"""
[docs] def __init__(self, path: Union[Path, str]) -> None:
super().__init__()
self.file_path = path if isinstance(path, Path) else Path(path)
[docs] def lazy_load(self) -> Iterator[ChatSession]:
"""从文件中延迟加载聊天数据。
生成:
ChatSession:包含已加载消息的聊天会话。
"""
with open(self.file_path) as f:
data = json.load(f)
sorted_data = sorted(data["messages"], key=lambda x: x["timestamp_ms"])
messages = []
for index, m in enumerate(sorted_data):
if "content" not in m:
logger.info(
f"""Skipping Message No.
{index+1} as no content is present in the message"""
)
continue
messages.append(
HumanMessage(
content=m["content"], additional_kwargs={"sender": m["sender_name"]}
)
)
yield ChatSession(messages=messages)
[docs]class FolderFacebookMessengerChatLoader(BaseChatLoader):
"""从文件夹中加载`Facebook Messenger`聊天数据。
参数:
path (Union[str, Path]): 包含聊天文件的目录路径。
属性:
path (Path): 包含聊天文件的目录路径。"""
[docs] def __init__(self, path: Union[str, Path]) -> None:
super().__init__()
self.directory_path = Path(path) if isinstance(path, str) else path
[docs] def lazy_load(self) -> Iterator[ChatSession]:
"""懒加载文件夹中的聊天数据。
生成:
ChatSession:包含已加载消息的聊天会话。
"""
inbox_path = self.directory_path / "inbox"
for _dir in inbox_path.iterdir():
if _dir.is_dir():
for _file in _dir.iterdir():
if _file.suffix.lower() == ".json":
file_loader = SingleFileFacebookMessengerChatLoader(path=_file)
for result in file_loader.lazy_load():
yield result