🔖 Справочник: LangGraph-агенты, инструменты, память

← К оглавлению урока

⚡ Минимум для старта

pip install langgraph langchain-google-genai langchain-community
agent = create_react_agent(llm, tools, checkpointer=MemorySaver())
config = {"configurable": {"thread_id": "abc123"}}
agent.invoke({"messages": [("user", "...")]}, config)

Установка пакетов

ПакетНазначение
langgraphСборка агента (create_react_agent) и память (MemorySaver)
langchain-google-genaiМодель Gemini как «мозг» агента
langchain-communityГотовые инструменты, в т.ч. TavilySearchResults
langchain-coreБазовые классы: Tool, HumanMessage
python-dotenvЧтение ключей из .env
pip install langgraph langchain-google-genai langchain-community python-dotenv

Ключи API

Нужны два ключа: Gemini (модель) и Tavily (поиск). Часть библиотек Google ждёт ключ именно в GOOGLE_API_KEY:

# .env
GEMINI_API_KEY=ваш_ключ_gemini
TAVILY_API_KEY=ваш_ключ_tavily

# в коде
os.environ["GOOGLE_API_KEY"] = os.getenv("GEMINI_API_KEY")
os.environ["TAVILY_API_KEY"] = os.getenv("TAVILY_API_KEY")
⚠️ Ключ Tavily — бесплатно на tavily.com (есть лимиты). Можно заменить поиск другим инструментом (SerpAPI, Wikipedia и др.).

Сборка агента (LangGraph)

КонструкцияНазначение
create_react_agent(llm, tools, checkpointer=memory)Создать ReAct-агента из модели, списка инструментов и памяти
MemorySaver()Память в оперативной памяти (история диалога)
config = {"configurable": {"thread_id": "abc123"}}Ключ диалога — по нему агент находит «свою» память
agent.invoke({"messages": [...]}, config)Один вызов агента (итоговый ответ)
agent.stream({"messages": [...]}, config, stream_mode="values")Пошаговый вывод (видно рассуждения и вызовы инструментов)

Инструменты (Tools)

КонструкцияНазначение
TavilySearchResults(max_results=2)Готовый инструмент: поиск в интернете
Tool(name=..., func=..., description=...)Свой инструмент — обёртка над любой функцией
tools = [search, date_tool]Список инструментов, доступных агенту
HumanMessage(content="...")Сообщение от пользователя во вход агента
description у инструмента — это не комментарий, а часть промпта. По нему LLM решает, когда вызвать инструмент. Пишите описание чётко и по делу (например, «Returns current datetime in ISO format»).
⚠️ Имена классов и API LangChain/LangGraph меняются между версиями (например, TavilySearchResults переезжал между пакетами; для своих функций есть декоратор @tool). Сверяйтесь с актуальной документацией.