# Five Architecture Paradigms vs λA Programming Paradigm

> **Date**: 2026-04-04
> **Context**: The AI agent framework landscape in 2025-2026 is shaped by three major shifts: MCP tool-calling standardization, A2A protocol emergence, and Context Engineering. Mainstream frameworks are classified into five architecture paradigms. This document shows that all five are special cases of λA.
>
> **Sources**: [Building Effective Agents — Anthropic](https://www.anthropic.com/research/building-effective-agents), [2025 AI Agent Architecture Survey — Zhihu](https://zhuanlan.zhihu.com/p/1945267976937926834), [Anthropic Multi-Agent Research System](https://www.anthropic.com/engineering/multi-agent-research-system)

---

## 1. Overview

The five paradigms classify frameworks by **implementation approach** — what technology you use to build agents. The λA paradigm classifies agents by **computational semantics** — what agents are mathematically. This is the fundamental distinction.

| Paradigm | Representative | λA Corresponding Constructs | Formal Semantics? | Type Checking? | Termination Guarantee? |
|----------|---------------|----------------------------|-------------------|---------------|----------------------|
| Graph State Machine | LangGraph | `Route(c, {lᵢ:aᵢ})` + `Loop(b, c, n)` | ❌ | ❌ | ❌ |
| Role-Driven | CrewAI | `GroupChat(agents, scheduler)` + `Handoff` | ❌ | ❌ | ❌ |
| Event-Driven | LlamaIndex, AgentScope | `Channel(name, cap)` + `Send/Receive` | ❌ | ❌ | ❌ |
| SDK Wrapper | OpenAI SDK, PydanticAI | `Lam(n, π, θ)` + `Tool(n, f)` | ❌ | PydanticAI partial | ❌ |
| Low-Code Platform | Dify | `from_config(YAML)` compiler | ❌ | ❌ | ❌ |
| **λA Paradigm** | **lambdagentpaas** | **All 11 constructs** | **✅ 23 rules** | **✅ 15 rules** | **✅ Theorem 5.4** |

---

## 2. Paradigm-by-Paradigm Analysis

### 2.1 Graph State Machine (LangGraph)

**Core idea**: An agent is a directed graph. Nodes are LLM/Tool calls, edges are conditional transitions.

```python
# LangGraph
graph = StateGraph(AgentState)
graph.add_node("think", think_node)
graph.add_node("search", search_node)
graph.add_node("answer", answer_node)
graph.add_edge("think", "search", condition=needs_search)
graph.add_edge("think", "answer", condition=has_answer)
graph.add_edge("search", "think")  # cycle back
```

**λA equivalent**:

```
Route(classifier, {
    "search" → Tool("search", web_search) >> Lam("think", prompt),
    "answer" → Lam("answer", prompt)
})
```

Graph state machine = `Route` (multi-way dispatch) + `Loop` (bounded fixpoint) + `Compose` (edges).

**What λA adds**:

| Issue | LangGraph | λA |
|-------|-----------|-----|
| Will a cycle deadlock? | Unknown until runtime | **Compile-time: `fix_n` guarantees termination in ≤n steps (Theorem 5.4)** |
| Are node types compatible? | Runtime crash | **Compile-time: T-Route requires all branches return same type** |
| Are two graphs semantically equivalent? | Cannot determine | **6 algebraic laws (route distribution, etc.)** |
| Is refactoring safe? | Trial and error | **Semantic-preserving transformations** |

**LangGraph's advantage**: Visual intuition — draw a graph, get a program. λA's `Route >> Loop` is less visual.

**Conclusion**: Graph state machine is a **special case** of λA (Route + Loop), lacking type safety and termination guarantees.

---

### 2.2 Role-Driven (CrewAI)

**Core idea**: Define roles (Role/Goal/Backstory), form teams, collaborate by process.

```python
# CrewAI
researcher = Agent(role="Researcher", goal="Find facts", backstory="...")
writer = Agent(role="Writer", goal="Write report", backstory="...")
crew = Crew(agents=[researcher, writer], process=Process.sequential)
```

**λA equivalent**:

```
# sequential = Compose (pipeline)
researcher >> writer

# hierarchical = Route (manager dispatches)
Route(manager_classifier, {
    "research" → researcher,
    "writing"  → writer
})

# collaborative = GroupChat (π-calculus N-agent discussion)
GroupChat([researcher, writer, reviewer], max_rounds=10)
```

**What λA adds**:

| Issue | CrewAI | λA |
|-------|--------|-----|
| Data type compatibility between roles? | Runtime crash (crewAIInc/crewAI#737) | **T-Compose compile-time check** |
| Does `max_iter` actually stop? | Not always (crewAIInc/crewAI#3847) | **`fix_n` theorem guarantees termination** |
| Will parallel roles overwrite each other? | Yes, no check | **Store independence compile-time check** |
| Max cost per run? | Unknown | **Graded types `(p, t, l, m)`** |

**CrewAI's advantage**: Natural-language role definition; business stakeholders can understand it. λA's `Lam("researcher", systemPrompt)` is less readable than `Agent(role="Researcher", goal="...")`.

**Conclusion**: Role-driven is **syntactic sugar** over λA's multi-agent extensions (GroupChat/Handoff), lacking formal guarantees.

---

### 2.3 Event-Driven (LlamaIndex Workflows / AgentScope)

**Core idea**: Agents publish events; other agents subscribe and respond. Loose coupling.

```python
# LlamaIndex Workflows
@step
async def research(self, ev: ResearchEvent) -> AnalysisEvent:
    result = await llm.complete(ev.query)
    return AnalysisEvent(data=result)

@step
async def analyze(self, ev: AnalysisEvent) -> ReportEvent:
    ...
```

**λA equivalent**:

```
# Event = Channel (π-calculus name passing)
research_ch = Channel("research_results", capacity=5)
analysis_ch = Channel("analysis_results", capacity=5)

# Agent publishes to channel = Send
Send(researcher, research_ch)

# Agent subscribes to channel = Receive
Receive(research_ch, handler=analyzer)
```

λA's `Channel + Send + Receive` are π-calculus communication primitives — the **formal foundation** of event-driven architecture.

**What λA adds**:

| Issue | LlamaIndex Workflows | λA |
|-------|---------------------|-----|
| Event type compatibility? | Python type hints (optional) | **Typed channels: `Channel<Str, Json>`** |
| Deadlock possible? | Unknown until runtime | **Channel capacity + bounded fixpoint → analyzable** |
| Does event order affect results? | Uncertain | **Pair confluence theorem: order-independent when stores are independent** |

**Event-driven advantage**: Natively async, loosely coupled, suits large-scale distributed systems. λA's Channels are currently in-process, not yet distributed.

**Conclusion**: Event-driven is the **engineering realization** of λA's π-calculus extension. λA provides formal communication semantics.

---

### 2.4 SDK Wrapper (OpenAI Agents SDK / PydanticAI)

**Core idea**: Thinnest possible wrapper — call LLM API directly, add tool calling and type validation.

```python
# OpenAI Agents SDK
agent = Agent(name="researcher", instructions="...", tools=[web_search])
result = Runner.run(agent, "Find recent AI papers")

# PydanticAI — with type validation
@agent.tool
def search(query: str) -> SearchResult:  # ← typed!
    ...
```

**λA equivalent**:

```
# Atomic form = Lam + Tool
Lam("researcher", "You are a research assistant")
Tool("search", web_search)  # Type: Str →^io SearchResult
```

This is λA's **atomic layer** — a single `Lam` and several `Tool`s.

**PydanticAI's interesting property**: It emphasizes **type safety** — tool inputs and outputs have Pydantic schema validation. This aligns with λA Paper III's T-Tool rule.

**What λA adds**:

| Issue | OpenAI SDK | PydanticAI | λA |
|-------|-----------|------------|-----|
| Single tool type validation | ❌ | ✅ (Pydantic) | ✅ (Json(S)) |
| **Cross-step type checking** | ❌ | **❌** | **✅ (T-Compose)** |
| Cost prediction | ❌ | ❌ | ✅ (graded types) |
| Composition semantics | None | None | ✅ (6 algebraic laws) |

**Key difference**: PydanticAI validates individual tool I/O but **does not validate composition boundaries**. λA's T-Compose verifies `f >> g` — that `output(f) <: input(g)`. PydanticAI cannot do this.

**SDK advantage**: Minimal learning curve, official maintenance, good ecosystem.

**Conclusion**: SDK wrapper is λA's **atomic layer** (Lam + Tool). PydanticAI's type validation is a subset of λA's type system.

---

### 2.5 Low-Code Platform (Dify)

**Core idea**: Visual drag-and-drop to build agent workflows.

```
[Input] → [LLM Node] → [Condition Branch] → [Tool Node] → [Output]
                              ↓
                        [Another LLM Node]
```

**λA equivalent**:

Dify's visual workflow = **YAML config**, and `from_config` compiler translates YAML to λA terms:

```
Dify canvas workflow
    ↓ export
YAML/JSON config
    ↓ from_config()
λA term (Compose, Route, Loop, ...)
    ↓ type_check() + lint() + compute_grade()
Type errors / dead loop risks / cost prediction
```

**What λA adds**:

| Issue | Dify | λA |
|-------|------|-----|
| Will the workflow run successfully? | Only after deployment | **Compile-time type checking** |
| Will a cycle deadlock? | Only at runtime | **Lint L004 + termination theorem** |
| Cost per run? | Check bill after running | **Compile-time cost prediction** |
| Are two workflows equivalent? | Cannot determine | **Algebraic laws** |

**Dify's advantage**: Non-technical users can use it. λA's YAML config is also declarative but less visual than drag-and-drop.

**Conclusion**: Low-code platforms generate configs that are λA's **compilation input**. lambdagentpaas can serve as Dify's **backend static analysis engine**.

---

## 3. Unification: Five Paradigms as Five Special Cases of λA

```
                        λA (11 constructs + type system + effect algebra)
                       /        |          |          |          \
                      /         |          |          |           \
           Compose+Route    GroupChat    Channel    Lam+Tool    from_config
           +Loop+If         +Handoff    +Send/Recv  (atomic)     (YAML)
              |                |           |           |            |
              ↓                ↓           ↓           ↓            ↓
         Graph State       Role-       Event-       SDK          Low-Code
         Machine           Driven      Driven       Wrapper      Platform
         LangGraph         CrewAI      LlamaIndex   OpenAI SDK   Dify
```

Each paradigm uses only a subset of λA's 11 constructs:

| Paradigm | λA Constructs Used | Not Used |
|----------|-------------------|----------|
| Graph State Machine | Route, Loop, Compose, Tool | Guard, Memory, Pair, Channel |
| Role-Driven | GroupChat, Handoff, Compose | Guard, Channel, Route (explicit) |
| Event-Driven | Channel, Send, Receive, Pair | Route, Loop (explicit), Guard |
| SDK Wrapper | Lam, Tool | Nearly all composition constructs |
| Low-Code | YAML → from_config (indirectly all) | No direct manipulation |

**λA's unification**: You don't need to choose "graph state machine OR role-driven." In λA, you compose 11 construct primitives to express exactly the pattern you need. A single agent can **simultaneously** use Route (graph-style dispatch) + GroupChat (role-style collaboration) + Channel (event-style communication) — because they are all composable Terms in λA.

---

## 4. Three Major Industry Shifts vs λA

| Shift | Industry Status | λA Response |
|-------|----------------|-------------|
| **MCP tool-calling standardization** | Frameworks adopting MCP | lambdagentpaas has `mcp_client.py` for consuming MCP tools, **and exposes its own capabilities as MCP Server** (integration-strategy.md) |
| **A2A protocol emergence** | Cross-framework agent discovery | lambdagentpaas has `a2a.py` (AgentCard) with **λA type signature embedded in `x-lambdagent` extension field** |
| **Context Engineering** | Context management becomes core competency | λA's `Memory` construct + `mem e σ` operational semantics + **effect system's `state(s)` precisely tracks context access** |

---

## 5. The Four-Step Decision Tree vs λA's Answer

The industry suggests choosing a framework by: team tech stack → core use case → cloud platform → model preference.

**λA's answer: you don't need to choose a framework.**

```
Traditional:
  "I use Python → LangGraph or CrewAI?"
  "I need multi-agent → CrewAI or AutoGen?"
  "I deploy on AWS → which framework?"

λA approach:
  1. Write agents in any framework you prefer
  2. Add lambdagent-guard as a safety layer
  3. Get: type safety + cost prediction + termination guarantee + parallel safety

  The framework is an implementation detail.
  λA is the safety guarantee.
  Like writing code in any language but using git for version control.
```

---

## 6. Detailed Construct Mapping

### 6.1 Anthropic's Six Composable Patterns → λA

Anthropic's "Building Effective Agents" guide defines six patterns. Each maps directly to λA constructs:

| Anthropic Pattern | Description | λA Term | λA Type Rule |
|-------------------|-------------|---------|-------------|
| **Prompt Chaining** | Sequential LLM calls with gates | `f >> g >> h` (Compose) | T-Compose: `output(f) <: input(g)` |
| **Routing** | Classify input → specialized handler | `Route(c, {lᵢ: aᵢ})` | T-Route: all branches return same type |
| **Parallelization** | Independent subtasks run concurrently | `Pair(f, g)` / `AsyncPar(f, g, h)` | T-Pair: effects use ∥ (max latency) |
| **Orchestrator-Workers** | Central LLM delegates dynamically | `Handoff(selector, registry)` | T-Route + dynamic dispatch |
| **Evaluator-Optimizer** | Generate → evaluate → refine loop | `Loop(body >> Guard(eval, P), c, n)` | T-Loop: `A →^{εⁿ} A` + T-Guard: `{x:B\|P(x)}` |
| **Autonomous Agents** | Tool-using loop with environment feedback | `fix_n(λself.λx. case (lam p θ) x [tools])` | Full ReAct = Y combinator + case dispatch |

**Key insight**: Anthropic's six patterns are exactly the **operational patterns** that arise from composing λA's 11 constructs. λA provides the formal semantics that Anthropic's guide describes informally.

### 6.2 Additional λA Constructs Not Covered by Any Paradigm

| λA Construct | What It Does | Which Paradigm Covers It? |
|-------------|--------------|--------------------------|
| `Guard(a, P, k)` | Output validation with retry | **None** — frameworks rely on ad-hoc try/catch |
| `Memory(a, s)` | Persistent state with typed store | **Partial** — frameworks have memory but untyped |
| `fix_n` bounded fixpoint | Guaranteed termination | **None** — all frameworks use while loops |
| Effect annotations `ε` | Track llm/io/state effects | **None** — no framework distinguishes pure from effectful agents |
| Graded types `(p,t,l,m)` | Static cost prediction | **None** — all frameworks only report cost after execution |
| Algebraic laws | Safe refactoring rules | **None** — no framework has equational theory |

These six capabilities are **unique to λA** and not available in any of the five paradigms.

---

## 7. Practical Implications

### For Framework Users

You don't need to abandon your framework. Use lambdagentpaas as a **safety layer on top**:

```
Your LangGraph code    → lambdagent-guard → Type errors caught before $$ spent
Your CrewAI config     → lambdagent lint  → Dead loops detected at compile time
Your AutoGen groupchat → lambdagent-guard → Empty-message loops auto-terminated
Your Dify workflow     → lambdagent lint  → Cost prediction before deployment
Your OpenAI SDK agent  → lambdagent MCP   → IDE shows inline warnings
```

### For Framework Designers

If you're building a new agent framework, consider adopting λA's formal foundations:

1. **Type your composition boundaries** — when `f >> g`, check `output(f) <: input(g)`
2. **Use bounded fixpoints** — `Loop(body, cond, maxSteps)` instead of `while True`
3. **Check store independence** — before running agents in parallel, verify they don't write to the same keys
4. **Annotate effects** — distinguish `pure`, `llm(model)`, `io`, `state(key)` at the type level
5. **Compute cost grades** — `(probability, tokens, latency, cost)` as static upper bounds

### For Researchers

The five paradigms are empirical classifications. λA provides a **formal unification**:

> We prove that the five mainstream agent architecture paradigms — graph state machine, role-driven, event-driven, SDK wrapper, and low-code platform — are respectively special cases of Route+Loop, GroupChat+Handoff, Channel+Send/Receive, Lam+Tool, and from_config in the λA calculus. λA, as a unified formal foundation, not only covers all five paradigms but also provides three static guarantees none of them offer: type safety (T-Compose), cost upper bounds (graded types), and termination (bounded fixpoint theorem).

---

## 8. Summary Table: What Each Paradigm Can and Cannot Do

| Capability | Graph SM | Role | Event | SDK | Low-Code | **λA** |
|-----------|----------|------|-------|-----|----------|--------|
| Define single agent | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Sequential pipeline | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ |
| Conditional routing | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ |
| Parallel execution | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ |
| Multi-agent discussion | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ |
| Event-based communication | ❌ | ❌ | ✅ | ❌ | ❌ | ✅ |
| Dynamic delegation | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ |
| Output validation + retry | ❌ | ❌ | ❌ | Partial | ❌ | ✅ |
| **Compile-time type check** | ❌ | ❌ | ❌ | Partial | ❌ | **✅** |
| **Termination guarantee** | ❌ | ❌ | ❌ | ❌ | ❌ | **✅** |
| **Static cost prediction** | ❌ | ❌ | ❌ | ❌ | ❌ | **✅** |
| **Parallel safety proof** | ❌ | ❌ | ❌ | ❌ | ❌ | **✅** |
| **Effect isolation (test/prod)** | ❌ | ❌ | ❌ | ❌ | ❌ | **✅** |
| **Algebraic optimization** | ❌ | ❌ | ❌ | ❌ | ❌ | **✅** |
| **Formal equivalence check** | ❌ | ❌ | ❌ | ❌ | ❌ | **✅** |
