# ============================================================
# [실습] 대화 메모리 (RunnableWithMessageHistory)
#
# LCEL 체인은 기본적으로 '한 번의 호출'만 안다. 이전 대화를 기억하게 하려면
# RunnableWithMessageHistory 로 세션별 메시지 기록을 체인에 붙인다. (최신 권장 방식)
# 아래 항목을 직접 구현하세요:
#  1) ChatPromptTemplate 에 MessagesPlaceholder("history") 를 넣어 과거 대화 자리를 만들고 chain 구성.
#  2) 세션 id → InMemoryChatMessageHistory 를 돌려주는 get_history 를 만들고,
#     RunnableWithMessageHistory 로 chain 을 감싸 같은 session_id 로 2번 invoke 해 기억을 확인한다.
# ============================================================

from dotenv import load_dotenv

load_dotenv()  # .env 에서 OPENAI_API_KEY 로드

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.output_parsers import StrOutputParser
from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory

llm = ChatOpenAI(model="gpt-4o-mini")

# 1) 여기에 코드를 작성하세요
#    - prompt = ChatPromptTemplate.from_messages([system, MessagesPlaceholder("history"), ("human","{input}")])
#    - chain = prompt | llm | StrOutputParser()

# 2) 여기에 코드를 작성하세요
#    - store = {} / get_history(session_id) → InMemoryChatMessageHistory
#    - chat = RunnableWithMessageHistory(chain, get_history, input_messages_key="input", history_messages_key="history")
#    - config = {"configurable": {"session_id": "user-1"}} 로 2번 invoke (이름 기억 확인)
