Установка пакетов
| Пакет | Назначение |
|---|---|
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). Сверяйтесь с актуальной документацией.