Практычныя прытамулкі: Ментальная модель LangGraph: Каратачнік стандартизаванай архітектуры
Практычныя прытамулкі: Ментальная модель LangGraph: Каратачнік стандартизаванай архітектуры: контракты, пераконтрольваннія та шаблоны коду для команд, якія використоўваюць гэты патерн.
Наступныя прытамакі восстанавляюць практычны шлях для розумэння «LangGraph Mental Model: Адміністратыўныя вядомасцы пра стандартызаваную архітектуру для кожнага агента, які вы колі-небудзь створыце». Акцэнт ставіцца на контракты, перакананняя і месцы для коду, які можна легка заменіць, а не на мотывацыйныя аспекты. Калі працуеце над адглядам, спачатку запісайте контракт: неабяжныя вхідныя даны, сигнал успеху і тое, што выканаецца у разе частковага невыпалення. Такі список перакананняя дапамагае заліцварыць пазнейшыя змены ў кодзе. Волійце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, невыпаленне павінна вказваць на адную адпаведальнасць, а не на заплутаны ланцужок задач.
Вступ: Чаму код на базе LangGraph здаецца складным, нават калі сама концэпцыя — не
Вступ: Чаму код LangGraph здаецца складным, нават калі сама концэпцыя не працуе належна, як толькі якэнсабямы аб’ект. Запісаце адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметкі па поверненню да пачатковага стану пры розширэнні масштаба. Спрыяйце гэтам этапу як даўгастрахованню межа вхідных дадзеных і перакананых выходных рэзультатаў. Даце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад мовчанкавага частковага завершэння задачы. Задаце ліміт токенав на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэманстрацыям ператварыцца на неспакоючыя рахункі.
Загальная кантэкст: Чатыры модулі, адна парада файлав
Загальная карціна: чатыры модулі, адно падзеўкаванне файлоў — гэта формула, якая работае наякша, калі яе спрыяваць як мерыемую плошчу. Зберагачыце адну ідеальную транскрыпцію, адны прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштабы. Запісвайце час выканання і кост токеноў або запытаў праза функцыйнае рэзультат. Відразлівае паказанне костаў з’являецца рана, таму не будзе неспакойных счытанняў, калі праця пераходзіць з дэмаверсіі ў спакульнаныя сераўсы. Задаць бюджет на токены на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмаверсіям ператварыцца на неспакойныя счытанні.
langgraph_agent.py
│
├── MODULE 1: IMPORTS & CONFIGURATION
│ └── All your libraries, API keys, model setup
│
├── MODULE 2: STATE
│ └── The TypedDict that defines your agent's memory
│
├── MODULE 3: TOOLS (optional, but common)
│ └── Functions decorated with @tool that the LLM can call
│
├── MODULE 4: NODES
│ └── Functions that do the actual work at each graph step
│
├── MODULE 5: EDGES & ROUTING
│ └── Functions that decide what happens next
│
├── MODULE 6: GRAPH ASSEMBLY
│ └── Where you build, wire, and compile the graph
│
└── MODULE 7: ENTRYPOINT
└── The __main__ block or invoke() call that runs everything
Модуль 1: Імпорт і налашчэнні
Модуль 1: Імпорт та налашчванні працююць найэфектыўней, калі іх расследжваць як мерыябельную сфэру. Запісаце адна ідеальная версія, адзін прыклад неудачы і прыметкі па адвярненню змян пры расшырэнні масштаба. Зберагачыце налашчванні паза кодам прыкладнага програму. Файлы сэравіса, хранільнікі секретных данных та флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць пераглядаць іх без неабяжнага чытання всіх дадзеных. Встановіце ліміты на колькість токенав за раунд та за сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты запобегаюць таму, каб дэманстрацыі ператварыліся на неспакоўныя рахункі.
Канцэпцыя
Канцэпцыя працуе наўзяты, калі яе спрыяваць як вимерную паверхню. Зафіксавайце адны ідеальны прыклад, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштабы. Дакументавайце як шлях успеху, так і шлях вярнэння. Перапрыбуткі, людзкія контрольны пункты і обработка некоректных паведамленняў є часткай продукту, а не элементамі пазнейшай дапрацоўкі. Задаюце ліміт токенав на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўлівыя рахункі.
Ключовыя словы, якія вам трэба знать
«Ключоўыя словы, якія трэба знать», працюе найэфектывней, калі яго розглядаць як мерыемую структуру. Зафіксавайце адну ідеальную прымерку, адзін кейс неудачы і запіс пра вярнэнне да поперадньего стану, прычаму расширэння масштаба. Валідзіце невялікія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, прычына неудачы павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Задаўце ліміт токенав на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты запобегаюць таму, каб дэманстрацыі ператварыліся на неспакоўныя рахункі.
Стандартная шаблон
Стандартны шаблон работае наяўней, калі яго спрыяваць як мерыемую паверхню. Запісаце адна ідеальная версія, адзін прыклад неудачы і прыметку па адвярненню змян перш чым расширваць масштаб. Спрыявайце гэты этап як кантракт межа вхіднымі дадзеннямі і паверыжанымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад тыхоўскага частковага завершэння. Задзейце бюджет на токены за кожны раунд і за кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўныя рахункі.
# --- Standard Library ---
import os
from typing import TypedDict, Annotated, Literal
# --- LangChain Core ---
from langchain_openai import ChatOpenAI # or ChatAnthropic, ChatGroq, etc.
from langchain_core.messages import HumanMessage, AIMessage, SystemMessage, BaseMessage
from langchain_core.tools import tool
# --- LangGraph Core ---
from langgraph.graph import StateGraph, END
from langgraph.graph.message import add_messages # The message reducer
from langgraph.prebuilt import ToolNode # Pre-built node for tool execution
from langgraph.checkpoint.memory import MemorySaver
# --- Configuration ---
# Always name your model variable 'llm' - it's the standard in every node
llm = ChatOpenAI(
model="gpt-4o", # or "claude-3-5-sonnet-20241022", etc.
temperature=0, # 0 = deterministic; raise for creativity
api_key=os.environ.get("OPENAI_API_KEY")
)
Чаму самэ гэтае структураванне
Чаму самэйшая структура работае наякраща, калі яе спрыяваць як меравальную паверхню. Запісаце адна ідеальная версія роботы, адзін прыклад неудачы і прыметку па поверненню да пачатковага стану пры розшырэнні масштаба. Запісвайце часы выконання і кост токенав або запытаў праза функцыйнае рэзультат. Відкрытыя данні пра косцы з’являюцца рана, таму не будзе неспакою, калі праця перайдзе з дэмавайнага режыма ў спяльныя среды. Задаце бюджет токенав на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоючыя рахункі.
Модуль 2: Стан
Модуль 2: Стан системы працюе найкраща, калі яго розглядаць як вимерную плошчу. Зафіксавце адзін ідеальны прыклад, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваце сферу дзейнаў. Зберагаюце настройкі пазыром ад коду прыемлівача. Файлы сераўнавання, хранільнікі секрэтных данных і пазнакі функцый должны знаходзіцца ў адном месцы, куда аператары можуць адбавляць контроль без неабяжнага чытання всіх дадзеных. Устанавіце ліміты на колькість токеноў за раунд і за сесію. Інструменты з агентным режымам актыўна расширваюць контэкст; строгі ліміты запобегаюць таму, каб дэманстрацыі ператварыліся на неспакоючыя рахункі.
Канцэпцыя
Канцэпцыя працуе наўзяты, калі яе спрыяваць як мерыемую паверхню. Зафіксавайце адны ідеальны прыклад, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштабы. Дакументавайце як шлях успеху, так і шлях вяснавання. Перапрыбуткі, людзкія контрольны пункты і обработка некоректных паведамленняў є часткай продукту, а не элементамі пазнейшай дапрацоўкі. Задаюце бюджет на токены за кожны раунд і за кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўлівыя рахункі.
Ключовыя словы, якія вам трэба знать
«Ключоўыя словы, якія трэба знать», працюе найэфектывней, калі яго розглядаць як мерыемую структуру. Запісаўце адна ідеальная версія, адзін прыклад неудачы і прыметку па адкату перш чым расширваць масштабы. Валідзіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Задаўце ліміт токенав на кожны рунг і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты запобегаюць таму, каб дэманстрацыі ператварыліся на неспакоючыя рахункі.
Стандартны шаблон
Стандартны шаблон работае наяўней, калі яго спрыяваць як мерыемую паверхню. Запісаце адна ідеальная версія, адзін прыклад неудачы і прыметку па адвярненню змян перш чым расширваць масштаб. Спрыявайце гэты этап як кантракт межа вхіднымі дадзеннямі і паверыжанымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад тыхоўскага частковага завершэння. Задзейце бюджет токенав на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгія ліміты не дазволяюць дэмам ператварыцца на неспакоўныя рахункі.
# ============================================================
# MODULE 2: STATE
# ============================================================
class AgentState(TypedDict):
# 'messages' is the heartbeat of almost every LangGraph agent.
# Annotated[list, add_messages] means: "this is a list, and when
# a node writes to it, append - don't replace."
messages: Annotated[list[BaseMessage], add_messages]
# Add custom fields below for your specific agent's needs.
# Fields without a reducer are REPLACED each time a node writes to them.
# Example: a simple string field (gets replaced each write)
current_task: str
# Example: a list you want to accumulate (use operator.add as reducer)
# results: Annotated[list[str], operator.add]
# Example: a counter
# iteration_count: int
Ментальная модель скарацчыкавання
Ментальная модель Reducer працюе наякша, калі яе розглядаць як вимерную паверхню. Запісаце адна ідеальная транскрыпцыя, адзін прыклад неудачы і запіс працэў павернення да пачатковага стану пры розшырэнні масштаба. Запісвайце часы выканання і кост токенав або запытаў па боку ад функцыйнальных рэзультатаў. Візуабілізацыя костаў з самага пачатку запобегае неспакойным рахункам, калі працэс пераходзіць з дэмавай версіі ў спяльныя сераўры. Задаце бюджет токенав на адну партію і на адну сесію. Інструменты-агенты актыўна расширваюць контэкст; строгія ліміты не дазволяюць дэмавай версіям ператварыцца на неспакойныя рахункі.
Модуль 3: Інструменты
Модуль 3: Інструменты працююць найэфектывней, калі іх спрыяваць як меравальную паверхню. Зафіксавайце адна ідеальная транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць сферу дзеяння. Зберагаюце настройкі пазыроўна коду прыемлівання. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функцый должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць контроль без неабяжнага чытання всіх дадзеных. Установіце ліміты на колькість токенав за раунд і за сесію. Інструменты з агентным режымам агрэсіўна расширваюць контекст; строгі ліміты запобегаюць таму, каб дэманстрацыі ператварыліся на неспакоўныя рахункі.
Канцэпцыя
Канцэпцыя працуе наўзяты, калі яе спрыяваць як мерыемую паверхню. Зафіксавайце адна ідеальная версія, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштабы. Дакументавайце як шлях успеху, так і шлях вярнэння да нормальнага стану. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є часткай продукту, а не элементамі пазнейшай дапрацоўкі. Задаце бюджет на токены на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўлівыя рахункі.
Ключовыя словы, якія вам трэба знать
«Ключоўыя словы, якія трэба знать», працюе найэфектывней, калі яго розглядаць як мерыемую структуру. Запісаўце адна ідеальная версія, адзін прыклад неудачы і прыметку па адкату перш чым расширваць масштабы. Валічце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Задаўце ліміт токенав на кожны рунг і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўныя рахункі.
Стандартная шаблон
Стандартны шаблон работае наяўней, калі яго спрыяваць як мерыемую паверхню. Запісаце адна ідеальная версія, адзін прыклад неудачы і прыметку па адвярненню змян перш чым расширваць масштаб. Спрыявайце гэты этап як кантракт межа вхіднымі дадзеннямі і паверыжанымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад тыхоўскага частковага завершэння. Задзейце бюджет на токены за кожны раунд і за кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўныя рахункі.
# ============================================================
# MODULE 3: TOOLS
# ============================================================
@tool
def search_web(query: str) -> str:
"""Search the web for current information about a topic.
Use this when you need real-time information that is not in
your training data, such as recent news or live prices.
Args:
query: The search query string.
Returns:
A string containing search results.
"""
# Your actual implementation here (e.g., Tavily, SerpAPI, etc.)
# Placeholder for illustration:
return f"Search results for: {query}"
@tool
def calculate(expression: str) -> str:
"""Evaluate a mathematical expression and return the result.
Use this for any arithmetic, algebra, or numerical computation.
Args:
expression: A valid Python math expression as a string, e.g. '2 + 2 * 10'
Returns:
The computed result as a string.
"""
try:
return str(eval(expression))
except Exception as e:
return f"Error: {e}"
# Collect all tools into a list - this is the pattern you always follow
tools = [search_web, calculate]
# Bind tools to the LLM so it knows they exist and can choose to call them
llm_with_tools = llm.bind_tools(tools)
# Create the pre-built ToolNode that will execute tool calls automatically
tool_node = ToolNode(tools)
Докстрынг інструмента ўсёчы важны
Документацыя з’ядра інструмента ў моменты, калі яе спрыяюць як вимерную плошчу, працюе найэфектывнейша. Зберагачыце адна ідеальная версія выходных дадзеных, адзін прыклад неудачы і запіс працэй з вярненням да пачатковага стану пры розширэнні сферы застосоўвання. Запісваюце час выконання і вартасьць токенав або запытак праза функцыйнае рэзультат. Відразлівае прадставлення вартасцей запобегае неспакоўным рахункам, калі процес пераходзіць з дэмовай среды ў спакульную. Задаюце бюджет токенав на кожны раунд і на кожную сесію. Інструменты з агентнымі функцыямі агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўныя рахунки.
Модуль 4: Вузлы
Модуль 4: Узлы працуюць наякнайэфектывней, калі іх розглядаць як вимерную паверхню. Зафіксавце адны ідеальны прыклад, адну ситуацыю неудачы і прыметкі па анулюванні змян перш чым расширваць масштабы. Зберагаюце настройкі пазначыцельна ад коду прыемліка. Файлы сяродавішняе сераўісу, хранілішчы секрэтных дадзеных і пазнакі функцый должны знаходзіцца ў адном месцы, куды аператары можаць пераглядаць іх без неабяжнага чытання всіх дадзеных. Установіце ліміты токенаў на кожны раунд і на кожную сесію. Інструменты з агентным режымам актыўна расширваюць контэкст; строгі ліміты запобегаюць таму, каб дэманстрацыі ператварыліся на неспакоючыя рахункі.
Канцэпцыя
Канцэпцыя працуе наўзяты, калі яе спрыяваць як мерыемую паверхню. Зафіксавайце адна ідеальная версія, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштабы. Дакументавайце як шлях успеху, так і шлях вярнэння да нормальнага стану. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є часткай продукту, а не элементамі пазнейшай дапрацоўкі. Задаце бюджет на токены на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўлівыя рахункі.
Ключовыя словы, якія вам трэба знать
«Ключоўыя словы, якія трэба знать», працюе найэфектывней, калі яго розглядаць як мерыемую структуру. Запісаўце адна ідеальная версія, адзін прыклад неудачы і прыметку па адкату перш чым расширваць масштабы. Валідзіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Аккуратна распадзіліце бюджет на токены за кожны раунд і за кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты запобегаюць таму, каб дэманстрацыі ператварыліся на неспакоўныя рахункі.
Стандартная шаблон
Стандартны шаблон работае наяўней, калі яго спрыяваць як мерыемую паверхню. Запісаце адна ідеальная версія, адзін прыклад неудачы і прыметку па адвярненню змян перш чым расширваць масштаб. Спрыявайце гэты этап як кантракт межа вхіднымі дадзеннямі і паверыжанымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад тыхоўскага частковага завершэння. Задзейце бюджет на токены за кожны раунд і за кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўныя рахункі.
# ============================================================
# MODULE 4: NODES
# ============================================================
# ── Node: Agent (the reasoning brain) ───────────────────────
def agent_node(state: AgentState) -> dict:
"""The central reasoning node. Calls the LLM and decides
whether to respond or call a tool."""
# Build the message list to send to the LLM.
# Always include a system message to set behavior.
system_prompt = SystemMessage(content=(
"You are a helpful assistant. Use the available tools "
"when you need real-time information or computation. "
"Respond clearly and concisely."
))
# The LLM receives the system prompt + all previous messages in state
messages_to_send = [system_prompt] + state["messages"]
# Call the LLM. Use llm_with_tools if you have tools; plain llm if not.
response = llm_with_tools.invoke(messages_to_send)
# Return the LLM's response as a state update.
# add_messages will APPEND this AIMessage to state["messages"].
return {"messages": [response]}
# ── Node: Summarizer (example of a non-LLM processing node) ─
def summarize_node(state: AgentState) -> dict:
"""Summarizes the conversation so far to keep context short.
This shows that nodes don't have to call an LLM - they can
do any Python processing."""
all_messages = state["messages"]
# Summarize with the LLM (a different prompt, same LLM)
summary_prompt = [
SystemMessage(content="Summarize the following conversation in 2-3 sentences."),
HumanMessage(content=str(all_messages))
]
summary_response = llm.invoke(summary_prompt)
# Replace messages with a fresh start containing just the summary
return {
"messages": [AIMessage(content=f"[Summary] {summary_response.content}")]
}
Ментальная модель вузла
Модель мышлення Node працюе наявнасць калі яе розглядаць як вимерную паверхню. Запісаце адзін ідеальны прыклад роботы, адзін прыклад неудачы і прыметку па поверненню да пачатковага стану пры расширэнні масштаба. Запісвайце часы выканання і кост токенав або запита праз ці функцыональныя рэзултаты. Відразувая візуабельнасць костаў запобегае неспакойным рахункам, калі процес пераходзіць з дэмавайна ў спяльныя сераўысы.
Модуль 5: Канцы і маршрутызацыя
Модуль 5: Работа з краямі та маршрутамі ўсё краща, калі яе розглядаць як вимерную паверхню. Зберыце адна ідеальная транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Зберагаюце настройкі пазначынай ад коду прыемліка. Файлы сераўнавальной среды, хранільнікі секрэтных данных і флагі функцый должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць контроль без неабяжнага чытання всіх дадзеных. Установіце ліміты токенаў на кожны раунд і на кожную сесію. Інструменты з агентным режымам актыўна расширваюць контэкст; строгі ліміты запобегаюць таму, каб дэманстрацыі ператварыліся на неспакоючыя рахункі.
Канцэпцыя
Канцэпцыя працуе наўзяты, калі яе спрыяваць як мерыемую паверхню. Зафіксавайце адна ідеальная версія, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштабы. Дакументавайце як шлях успеху, так і шлях вярнэння да нормальнага стану. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є часткай продукту, а не элементамі пазнейшай дапрацоўкі. Задаце бюджет на токены на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўлівыя рахункі.
Ключовыя словы, якія вам трэба знать
«Ключоўыя словы, якія трэба знать», працюе найэфектывней, калі яго розглядаць як мерыемую структуру. Зафіксавайце адну ідеальную прымерку, адзін кейс неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштабы. Валідзіце невялікія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, прычына неудачы должна бяць асоўваная з адной конкрэтнаяя відпаведальнасцю, а не з заплутаным ланцужкам задач. Задаўце ліміт токенав на кожны рунг і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты запобегаюць таму, каб дэманстрацыі ператварыліся на неспакоюючыя рахункі.
Стандартны шаблон
Стандартны шаблон работае наяўней, калі яго спрыяваць як мерыемую паверхню. Запісаце адна ідеальная версія, адзін прыклад неудачы і прыметку па адвярненню змян перш чым расширваць масштаб. Спрыявайце гэты этап як кантракт межа вхіднымі дадзеннямі і паверыжанымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад тыхоўскага частковага завершэння. Задзейце бюджет на токены за кожны раунд і за кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўныя рахункі.
# ============================================================
# MODULE 5: EDGES & ROUTING
# ============================================================
# Import the pre-built tool routing function
from langgraph.prebuilt import tools_condition
# ── Custom Routing Function Example ─────────────────────────
def should_continue(state: AgentState) -> Literal["tools", "summarize", "__end__"]:
"""Custom router for the agent node.
Routing functions always:
1. Receive the current state as input
2. Return a string that maps to the next node (or END)
The return values must match the keys in add_conditional_edges' mapping.
"""
last_message = state["messages"][-1] # Look at what the LLM just said
# Case 1: The LLM decided to call a tool
if hasattr(last_message, "tool_calls") and last_message.tool_calls:
return "tools"
# Case 2: The conversation is getting long - summarize before continuing
if len(state["messages"]) > 20:
return "summarize"
# Case 3: The LLM gave a direct answer - we're done
return "__end__" # LangGraph's internal name for END
Ментальная модель маршрутацыі
Ментальная модель маршрутавання працюе наявнасць калі яе розглядаць як вимерную плошчу. Запісаце адзін ідеальны прыклад, адзін прыклад неудачы і прыметку па поверненні да пачатковага стану пры расширэнні масштаба. Запісвайце часы выканання і кост токенав або запита праз ці функцыональныя рэзултаты. Відразлівае прадстаўленне костаў з’являецца неспадзейкі па канцэ сум у момент, калі траекторыя пераходзіць з дэмавай версіі ў спяльныя сераўысы.
Модуль 6: Складанне графа
Модуль 6: Робота з асамбляжамі графа ўскладнюецца, калі яго спрыяваць як вимерную паверхню. Зберагчыце адна ідеальная транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштабы. Храніце настройкі парадульна коду прыемлена. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функций павінны знаходзіцца ў адном месцы, куды аператары можаць адрабатваць без падчытання всего графа. Задаеце ліміты токенав на кожны рунг і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўныя рахункі.
Канцэпцыя
Канцэпцыя працуе наўзяты, калі яе спрыяваць як мерымабельную паверхню. Зафіксавайце адны ідеальны прыклад, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Дакументавайце як шлях успеху, так і шлях вяснавання. Перапрыбуткі, людзкія контрольны пункты і обработка некоректных паведамленняў є часткай продукту, а не наступным этапам дорабачання. Задаце бюджет на токены на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты запобегаюць таму, каб дэманстрацыі ператварыліся на неспакоюючыя рахункі.
Ключовыя словы, якія вам трэба знать
«Ключоўыя словы, якія трэба знать», працюе найэфектывней, калі яго розглядаць як мерыемую структуру. Запісаўце адна ідеальная версія, адзін прыклад неудачы і прыметку па адкату перш чым расширваць масштабы. Валічце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Задаўце ліміт токенав на кожны рунг і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўныя рахункі.
Стандартная шаблон
Стандартны шаблон работае наяўней, калі яго спрыяваць як мерыемую паверхню. Запісаце адна ідеальная версія, адзін прыклад неудачы і прыметку па адвярненню змян перш чым расширваць масштаб. Спрыявайце гэты этап як кантракт межа вхіднымі дадзеннямі і паверыжанымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад тыхоўскага частковага завершэння. Задзейце бюджет на токены за кожны раунд і за кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўныя рахункі.
# ============================================================
# MODULE 6: GRAPH ASSEMBLY
# ============================================================
# ── Step 1: Initialize ──────────────────────────────────────
# Always pass your State class to StateGraph
graph_builder = StateGraph(AgentState)
# ── Step 2: Register All Nodes ──────────────────────────────
# Format: add_node("node_name_as_string", node_function)
# The string name is what you use in ALL edge definitions
graph_builder.add_node("agent", agent_node)
graph_builder.add_node("tools", tool_node) # The pre-built ToolNode from Module 3
graph_builder.add_node("summarize", summarize_node)
# ── Step 3: Set Entry Point ─────────────────────────────────
# Which node runs first when we invoke the graph?
graph_builder.set_entry_point("agent")
# ── Step 4: Wire the Edges ──────────────────────────────────
# Conditional edge from agent: check if we need tools, a summary, or we're done
graph_builder.add_conditional_edges(
"agent", # Source node
should_continue, # Routing function from Module 5
{
"tools": "tools", # If router returns "tools" → go to tools node
"summarize": "summarize", # If router returns "summarize" → go to summarize node
"__end__": END, # If router returns "__end__" → stop the graph
}
)
# Static edge: after tools run, always go back to agent (the ReAct loop)
graph_builder.add_edge("tools", "agent")
# Static edge: after summarization, always return to agent
graph_builder.add_edge("summarize", "agent")
# ── Step 5: Compile ─────────────────────────────────────────
# Without checkpointer: no persistent memory (stateless per invocation)
# With checkpointer: memory persists across turns (stateful conversations)
memory = MemorySaver()
graph = graph_builder.compile(checkpointer=memory)
Ментальная модель складання
Ментальная модель Асамблеі працюе наяўней, калі яе спрыяваць як вимерную паверхню. Запісаўце адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметку па адвярненню перад расшырэнням масштаба. Запісвайце часы выканання і кост токенав або запита праза функцыональныя рэзултаты. Відразлівасць костаў з самага пачатку запобегае неспакою, калі процес пераходзіць з дэмавайна ў спяльныя сераўы. Задазвайце бюджет токенав на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расшырваюць контекст; строгі ліміты не дазволяюць дэмавайнам ператварыцца на неспакойныя рахункі.
Модуль 7: Тачка входу і вызыв
Модуль 7: Entrypoint і процес вызывання працюють наякшым чынам, калі іх расследжваць як мэркаваныя аспекты. Зафіксавайце адны ідеальны прыклад работы, адну ситуацыю абярэння і прыметкі па поверненню да пачатковага стану пры расшырэнні масштаба. Зберагайце настройкі праза межаў коду прыемлівача. Файлы сяродавішчыны, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць аудыт без неабясненага чытання всіх элементаў. Задаце ліміты токенав на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширяюць контекст; строгі ліміты запобегаюць таму, каб дэманстрацыі ператварыліся на неспакоўныя рахункі.
Канцэпцыя
Канцэпцыя працуе наўзяты, калі яе спрыяваць як мерыемую паверхню. Зафіксавайце адны ідеальны прыклад, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштабы. Дакументавайце як шлях успеху, так і шлях вярнэння да нормальнага стану. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є часткай продукту, а не элементамі пазнейшай дапрацоўкі. Задаце бюджет на токены на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўлівыя рахункі.
Ключовыя словы, якія вам трэба знать
«Ключоўыя словы, якія трэба знать», працюе найэфектывней, калі яго розглядаць як мерыемую структуру. Запісаўце адна ідеальная версія, адзін прыклад неудачы і прыметку па адкату перш чым расширваць масштабы. Валічце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны процес. Задаўце ліміт токенав на кожны рунг і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўныя рахункі.
Стандартная шаблон
Стандартны шаблон работае наяўней, калі яго спрыяваць як мерыемую паверхню. Запісаце адна ідеальная версія, адзін прыклад неудачы і прыметку па адвярненню змян перш чым расширваць масштаб. Спрыявайце гэты этап як кантракт межа вхіднымі дадзеннямі і паверыжанымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад тыхоўскага частковага завершэння. Задзейце бюджет на токены за кожны раунд і за кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўныя рахункі.
# ============================================================
# MODULE 7: ENTRYPOINT & INVOCATION
# ============================================================
if __name__ == "__main__":
# ── Config: defines this conversation's memory session ──
# Change thread_id to start a fresh conversation.
# Keep the same thread_id to continue an existing one.
config = {"configurable": {"thread_id": "user-session-001"}}
# ── Single Invocation (synchronous) ─────────────────────
user_input = "What is the current price of Bitcoin?"
result = graph.invoke(
input={"messages": [HumanMessage(content=user_input)]},
config=config
)
# The result is the final state dictionary.
# Access the last message to get the agent's final answer.
final_answer = result["messages"][-1].content
print(f"Agent: {final_answer}")
# ── Streaming Invocation (for real-time output) ──────────
for chunk in graph.stream(
input={"messages": [HumanMessage(content=user_input)]},
config=config,
stream_mode="values" # Yields the full state after each node runs
):
# Each chunk is a state snapshot. The last message shows progress.
latest = chunk["messages"][-1]
if hasattr(latest, "content") and latest.content:
print(f"[Streaming] {latest.content}")
# ── Multi-turn Conversation Loop ─────────────────────────
print("\n--- Starting Interactive Session ---")
while True:
user_text = input("You: ").strip()
if user_text.lower() in ("exit", "quit", "bye"):
break
response = graph.invoke(
input={"messages": [HumanMessage(content=user_text)]},
config=config # Same config = same memory thread
)
print(f"Agent: {response['messages'][-1].content}\n")
Полны канонічны шаблон: Пূরны файл
Полная канонічная шаблон: Прынцыповы файл работае наяўней, калі яго спрыяваць як меравальную паверхню. Запісаце адна ідеальная версія, адзін прыклад неудачы і прыметку па адвярненню змян перш чым расширваць масштаб. Запісвайце часы выконання і косты токеноў або запытак па боку ад функцыйнаых рэзультаатаў. Візуабельнасць костоў з самага пачатку запобегае неспакойным рахункам, калі праця пераходзіць з дэмавай версіі ў спяльныя сераўысы. Задаце бюджет токеноў на кожны раунд і на кожную сесію. Інструменты з агентным падходам агрэсіўна расширваюць контекст; строгі ліміты не дазволяюць дэмавай версіям ператварыцца на неспакойныя рахункі.
# ============================================================
# LANGGRAPH CANONICAL AGENT TEMPLATE
# Modules: Imports → State → Tools → Nodes → Edges → Assembly → Entrypoint
# ============================================================
# ── MODULE 1: IMPORTS & CONFIGURATION ───────────────────────
import os
from typing import TypedDict, Annotated, Literal
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, AIMessage, SystemMessage, BaseMessage
from langchain_core.tools import tool
from langgraph.graph import StateGraph, END
from langgraph.graph.message import add_messages
from langgraph.prebuilt import ToolNode, tools_condition
from langgraph.checkpoint.memory import MemorySaver
llm = ChatOpenAI(model="gpt-4o", temperature=0)
# ── MODULE 2: STATE ─────────────────────────────────────────
class AgentState(TypedDict):
messages: Annotated[list[BaseMessage], add_messages]
# Add your custom fields here
# ── MODULE 3: TOOLS ─────────────────────────────────────────
@tool
def my_tool(input: str) -> str:
"""Describe clearly what this tool does and when the LLM should use it."""
return f"Result for: {input}"
tools = [my_tool]
llm_with_tools = llm.bind_tools(tools)
tool_node = ToolNode(tools)
# ── MODULE 4: NODES ─────────────────────────────────────────
def agent_node(state: AgentState) -> dict:
"""The reasoning node. Calls the LLM, optionally triggers tool calls."""
messages = [SystemMessage(content="You are a helpful assistant.")] + state["messages"]
response = llm_with_tools.invoke(messages)
return {"messages": [response]}
# ── MODULE 5: EDGES & ROUTING ───────────────────────────────
def should_continue(state: AgentState) -> Literal["tools", "__end__"]:
"""Decide: did the LLM call a tool, or did it give a final answer?"""
last_message = state["messages"][-1]
if hasattr(last_message, "tool_calls") and last_message.tool_calls:
return "tools"
return "__end__"
# ── MODULE 6: GRAPH ASSEMBLY ────────────────────────────────
graph_builder = StateGraph(AgentState)
graph_builder.add_node("agent", agent_node)
graph_builder.add_node("tools", tool_node)
graph_builder.set_entry_point("agent")
graph_builder.add_conditional_edges(
"agent",
should_continue,
{"tools": "tools", "__end__": END}
)
graph_builder.add_edge("tools", "agent")
memory = MemorySaver()
graph = graph_builder.compile(checkpointer=memory)
# ── MODULE 7: ENTRYPOINT ────────────────────────────────────
if __name__ == "__main__":
config = {"configurable": {"thread_id": "session-001"}}
while True:
user_text = input("You: ").strip()
if not user_text or user_text.lower() in ("exit", "quit"):
break
response = graph.invoke(
{"messages": [HumanMessage(content=user_text)]},
config=config
)
print(f"Agent: {response['messages'][-1].content}\n")
Развіты модуль: Системы з калькамі агентаў
Развітая модуль: Системы з кальманаўскімі агентамі працуюць найэфективней калі іх розглядаць як вимерную паверхню. Зафіксуйце адна ідеальная транскрыпцыю, адзін прыклад неудачы і прыметку па анулюванні змян перш чым расширваць сферу дзеяння. Зберагаюце настройкі пазыроўна ад коду прыемліка. Файлы сераўнавальнага сераўсу, хранілішчы секрэтных данных і флагі функций павінны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць перагляд без неабяжнага чытання всіх элементаў. Встановіце ліміты токенав на кожны раунд і на кожную сесію. Інструменты агентав агрэсывна расширваюць контекст; жорсткія ліміты запобегаюць таму, каб дэманстрацыі ператварыліся на неспакоючыя рахункі. Развітая модуль: Системы з кальманаўскімі агентамі працуюць найэфективней калі іх розглядаць як вимерную паверхню. Зафіксуйце адна ідеальная транскрыпцыю, адзін прыклад неудачы і прыметку па анулюванні змян перш чым расширваць сферу дзеяння. Вядомае прывяліце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг дзеяння.
Ключовыя словы, якія вам трэба знать (Multi-Agent)
Для ключоўых слов, якія трэба знать (Мульті-агент), перш чым змяніць код, неабходна визначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аператары должны магчымае перзапускіць крок з вядомай точкі контролю, не спрабоўваючы здогадвацца пра схованы стан. Спрыяйце цім этапу як даговору межа вхіднымі данымі і падтвердзенымі выходнымі данымі. Дайце назву рэзультатам, визначыце пераканальнікі успеху і адмовіцеся ад тыхнай частковай рэалізацыі без паведамлення. Калі наступны крок — це код або вызов інструмента, валідуйце структураваныя выходныя даны з валідацыёю схемы, а не просты прозаўны текст.
Структураваны шаблон для мульті-агента
Для структурнага шаблона з калькамі розмежавце вхідныя даны, адміністратара крока і крэтыры выходу пры перадзеяванні коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю без адгадвання схованага стану. Запісваюце час выконання і кост токеноў або запытаў па боку функцыйнаых рэзультатаў. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі маршрут пераходзіць з дэмавай версіі ў спяльныя среды. Калі наступны крок — це код або вызов інструмента, лепш выкарыстоўваць структураваныя выходныя даны з паўнай пераверкай схемы, чым вольнае пісьменне выказванне.
# ── MULTI-AGENT PATTERN ─────────────────────────────────────
# Each specialist is a compiled graph (a subgraph)
# Sub-agent 1: A researcher
researcher_graph = StateGraph(AgentState)
# ... (built with its own nodes, edges, and tools)
researcher = researcher_graph.compile()
# Sub-agent 2: A writer
writer_graph = StateGraph(AgentState)
# ... (built with its own nodes, edges, and tools)
writer = writer_graph.compile()
# ── SUPERVISOR NODE ─────────────────────────────────────────
def supervisor_node(state: AgentState) -> dict:
"""Decides which sub-agent should handle the current task."""
# The supervisor LLM decides: "researcher" or "writer" or "FINISH"
response = supervisor_llm.invoke(state["messages"])
return {"messages": [response], "next_agent": response.content}
def route_to_agent(state: AgentState) -> Literal["researcher", "writer", "__end__"]:
"""Routes to the appropriate sub-agent based on supervisor's decision."""
return state.get("next_agent", "__end__")
# ── SUPERVISOR GRAPH ────────────────────────────────────────
supervisor_builder = StateGraph(AgentState)
supervisor_builder.add_node("supervisor", supervisor_node)
supervisor_builder.add_node("researcher", researcher) # Subgraph as a node!
supervisor_builder.add_node("writer", writer) # Subgraph as a node!
supervisor_builder.set_entry_point("supervisor")
supervisor_builder.add_conditional_edges(
"supervisor",
route_to_agent,
{"researcher": "researcher", "writer": "writer", "__end__": END}
)
supervisor_builder.add_edge("researcher", "supervisor")
supervisor_builder.add_edge("writer", "supervisor")
supervisor_graph = supervisor_builder.compile(checkpointer=MemorySaver())
Карточка справакі з ключовымі словамі
Для карты-справакі з ключовымі словамі неабяжна практычна визначыць параметры вводу, адміністратара крока і критэрыя завершэння пры зміне коду. Аператары должны магчыма ўвайсці крок з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Конфігурацыю трэба залічваць паза кодам прыемлі. Файлы сераўнавання, хранальнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаяўшы весь ланцуг задач. Калі наступны крок — це код або вызов інструмента, лепш выкарыстоўваць структураваныя выходныя данні з пераканальванням схемы, чым вольнай формы тэкст. Для карты-справакі з ключовымі словамі неабяжна практычна визначыць параметры вводу, адміністратара крока і критэрыя завершэння пры зміне коду. Аператары должны магчыма ўвайсці крок з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Лепш выкарыстоўваць маленькія, тэставаныя елементы, чым велікія скрыпты. Калі крок не выйшоў, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцуг задач.
Заключэнне: «М’язовая памяць» LangGraph
Працюючы над раздзелам «Заключэнне: „М’язовая памяць“ LangGraph», спачатку запісайте угоду: неабяжлівыя даннэ, сигнал успеху і тое, што выходзіць пад часты няудачны результат. Такі список контроля дапамагае заліцварыць пасляэтапныя змены ў кодзе. Спрыятліва ставіцеся да гэтага этапу як да угоды межа даннэмі і пераканаленымі выходамі. Дайце назвы элементам, задаць критэрыя успеху і не прымайце тыхню частую рэалізацыю задання.
Чек-ліст для эксплуатацыі
Для чек-ліста для эксплуатацыі, перш чым зменяць код, задаць неабяжлівыя даннэ, адпаведальную особу за кожны крок і критэрыя завершэння. Аперацыйныя працавнікі должны магчыма ўвайсці крок з вядомага пункта контроля без неабяжлівага вычыслення скрытых станоў.
Запісвайце адно часовы шлях успеху і шлях вярнення. Прабавы, людзкіе контралі і обработка некоректных паведамленняў ёсць часткай продукту, а не пасляднім дапрацоўкам.
Калі наступны крок — гэта код чыя-небудзь вызов з інструментам, лепш выкарыстоўваць структураваныя выходны данні з паўерыванням схемы, чым вольныя тэкстовыя описы.
Стварайце контрольныя пункты пасля дорогіх крокаў. Система вярнення не павінна знову ставіць рахунак за той самы вызов LLM, калі аператар прабуе зноў выконаць пазнейшы элемент.
Фіксуйце версіі залежнасцяў і запісвайце хэш адобраза, які выканаў дэманстрацыю. Возможнасць перадаравання результатаў лепшая, чым традыцыйныя знання групы.
Запісвайце час выканання і кост токеноў чыя-небудзь запытаў разам з функцыйнальнымі результатамі. Візуабельнасць костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэманстрацыі ў спяльныя сераўеры.
Перш чым запускать стак, заморозьце версіі, зафіксавце «золаты» транскрыпты для критычнага шляху і паказвце способы абяроны. У спільных средах неабходны ліміты частоты запытанняў, пераконтроўкі прав на выкарыстоўванне ресурсаў і чысткі власнік для змены секрэтных даных. Лепш выбіраць простую надзею на надзейнасць, чым хітрыя експерыментальныя дэманстрацыі.
Прыметка для d02265f3bebf: не кладзіце ключы прадаўцаў у репазітарый, задаце верхнюю межу токенав на кожную сесію і зберагачыце транскрыпты празаўседы ў фіксы для ацэнкі, каб пазнейшыя замены моделяў заставаліся порównаннімі.