
Orchestrating Complex Enterprise Tasks via Cyclic Multi-Agent Architectures
While linear LLM pipelines (such as standard LangChain chains or sequential prompts) work well for basic question-answering, real-world business automation demands cyclical reasoning: an agent drafts code, another agent executes and unit-tests it, and if errors occur, the state loops back to the authoring agent with stack trace feedback. LangGraph models multi-agent workflows as stateful directed cyclic graphs, granting developers granular control over agent state transitions, human-in-the-loop approvals, and rollback persistence.
In this article
Core Concepts: State, Nodes, and Conditional Edges
- TypedDict State: A shared memory context updated by agent nodes across the execution lifecycle.
- Nodes: Individual worker functions or LLM agents (e.g., Researcher, Writer, Financial Reviewer) that consume the state and return delta updates.
- Edges: Conditional logic functions determining the next step: route to another node, retry the task, or terminate execution at
END.
Complete Python Code Example: Financial Auditor Agent Loop
from typing import TypedDict, Annotated, Sequence
import operator
from langgraph.graph import StateGraph, END
class AgentState(TypedDict):
draft_analysis: str
audit_feedback: str
is_approved: bool
iterations: int
def analyst_node(state: AgentState):
iter_count = state.get("iterations", 0) + 1
return {
"draft_analysis": f"Revised financial commentary version {iter_count}",
"iterations": iter_count
}
def auditor_node(state: AgentState):
if state["iterations"] >= 2:
return {"audit_feedback": "Passed all balance tests.", "is_approved": True}
return {"audit_feedback": "Discrepancy in Q3 Net Profit calculation.", "is_approved": False}
def route_next(state: AgentState):
if state["is_approved"] or state["iterations"] >= 3:
return END
return "analyst"
workflow = StateGraph(AgentState)
workflow.add_node("analyst", analyst_node)
workflow.add_node("auditor", auditor_node)
workflow.set_entry_point("analyst")
workflow.add_edge("analyst", "auditor")
workflow.add_conditional_edges("auditor", route_next)
app = workflow.compile()
final_state = app.invoke({"draft_analysis": "", "audit_feedback": "", "is_approved": False, "iterations": 0})
print("Workflow Final Result:", final_state)
Atul (AJ) builds office-automation and local-first AI tools as Atulya AI, and works with Excel, SAP and Oracle EPM every day. He writes about the shortcuts, macros and automations that actually save time — plus the occasional wacky fact. Videos on YouTube: Lazy Automator AI (@LazyAutomatorAI).
More posts by Atul →Stuck on a step? Ask a question and the AI answers using this article.