# ============================================================
# [실습] 최종 프로젝트: 도구 쓰는 RAG 에이전트 (자기완결)
#
# 작은 RAG 를 직접 구성해 검색·계산을 도구로 달고, 메모리 가진 에이전트로 콘솔 대화한다.
# 구현 항목:
#  1) search_docs(query): 벡터스토어 검색 결과를 문자열로 반환.
#  2) calculator(expression): 안전한 eval 로 계산.
#  3) create_agent(llm, TOOLS, system_prompt=..., checkpointer=MemorySaver()).
#  4) main(): thread_id 고정 config 로 입력 루프를 돌며 run_agent 로 thinking 을 출력한다.
# ============================================================

from dotenv import load_dotenv
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_chroma import Chroma
from langchain_core.documents import Document
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_core.tools import tool
from langchain.agents import create_agent
from langgraph.checkpoint.memory import MemorySaver

from agent_utils import run_agent

load_dotenv()

DOCS = [
    "NVMe는 PCIe 버스를 사용하는 SSD 인터페이스로, SATA보다 훨씬 빠르다.",
    "SATA SSD의 최대 대역폭은 약 550MB/s로, NVMe(수 GB/s)보다 낮다.",
    "RAID 0은 속도를 위한 스트라이핑, RAID 1은 안정성을 위한 미러링 구성이다.",
]
splits = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=50).split_documents(
    [Document(page_content=d) for d in DOCS])
vectorstore = Chroma.from_documents(
    splits, OpenAIEmbeddings(model="text-embedding-3-small"), collection_name="agent_finale")


# 1) 여기에 코드를 작성하세요 (@tool search_docs(query) → similarity_search(k=3) 결과)


# 2) 여기에 코드를 작성하세요 (@tool calculator(expression))


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

# 3) 여기에 코드를 작성하세요 (agent = create_agent(llm, [search_docs, calculator], system_prompt=..., checkpointer=MemorySaver()))


# 4) 여기에 코드를 작성하세요
def main():
    # config = {"configurable": {"thread_id": "console"}}
    # 입력 루프를 돌며 run_agent(agent, q, config=config)
    pass


if __name__ == "__main__":
    main()
