Skip to content

Anthropic's 5 Workflow Patterns

Overview

While Andrew Ng focuses on discrete patterns (Reflection, Tool Use, Planning, Routing), Anthropic takes a workflow-oriented approach—viewing agent systems as compositions of distinct operational patterns.

These 5 patterns represent common workflow types across production agentic systems.


Pattern 1: Agentic Loop

What It Does

Agent iteratively perceives, reasons, acts, and reflects until goal is achieved.

The Flow

- ┌─────────────────────────────────────────┐
    - Start: Goal + Context           │
  - ┬──────────────────────┘
                   │
- ┌──────────▼──────────┐
    - Perceive + Reason   │
    - (What should I do?) │
  - ┬──────────┘
                   │
- ┌──────────▼──────────┐
    - Act (Call Tool)     │
  - ┬──────────┘
                   │
- ┌──────────▼──────────┐
    - Reflect             │
    - (Goal achieved?)    │
  - ┬──────────┘
                   │
- ┌──────────▼──────────┐
    - Continue or Stop?   │
  - ┬──────────┘
                   │
- ┌────────────┴────────────┐
      │                         │
   (No)                       (Yes)
      │                         │
  - ┐          ┌───────┘
             │          │
             ▼          ▼
        Loop Back    Return Result

Use Cases

  • Information gathering
  • Problem solving
  • Task completion
  • Iterative refinement

Example: Research Agent

class AgenticLoopResearchAgent:
    def run(self, goal: str) -> str:
        state = {"goal": goal, "findings": []}

        while True:
            # Perceive: What do I know?
            # Reason: What's the next step?
            next_action = self.llm.decide(state)

            # Act: Execute decision
            if next_action.type == "search":
                result = self.search_tool(next_action.query)
            elif next_action.type == "fetch":
                result = self.fetch_tool(next_action.url)
            elif next_action.type == "analyze":
                result = self.analyze_findings(state)

            # Reflect: Did it work?
            state["findings"].append(result)

            if self.goal_achieved(state):
                return self.compile_report(state)

Characteristics

  • Autonomy: Agent decides when to continue/stop
  • Iterative: Loop repeats until goal met
  • Reactive: Responds to environment feedback
  • Explainable: Each step is visible

When to Use

✅ Complex, multi-step goals
✅ Information gathering tasks
✅ Problems requiring exploration
❌ Simple one-shot requests
❌ Time-critical decisions


Pattern 2: Retrieval Augmented Generation (RAG)

What It Does

Retrieve relevant context before generating response, improving grounding and accuracy.

The Flow

User Query
    ↓
Retrieve Relevant Documents
    ↓
Augment Prompt with Context
    ↓
Generate Response
    ↓
Return Result

Use Cases

  • Knowledge-based Q&A
  • Document analysis
  • Customer support
  • Domain-specific assistance

Example: Documentation Agent

class RAGDocumentationAgent:
    def answer(self, question: str) -> str:
        # Retrieve: Find relevant docs
        relevant_docs = self.vector_store.search(question, top_k=5)

        # Augment: Add context to prompt
        context = "\n".join([doc.content for doc in relevant_docs])

        prompt = f"""
        Based on this documentation:
        {context}

        Answer the question: {question}
        """

        # Generate: Create response
        response = self.llm.generate(prompt)

        return response

Characteristics

  • Grounded: Responses based on specific documents
  • Fast: Single inference pass (no loop)
  • Deterministic: Same query → same retrieved docs
  • Traceable: Can show source documents

When to Use

✅ Document-based Q&A
✅ Knowledge bases
✅ Reducing hallucination
❌ Real-time information needs
❌ Tasks requiring exploration

Strengths vs Agentic Loop

                RAG        Agentic Loop
Speed           Fast       Slower (loop)
Accuracy        High       Very High
Cost            Low        Higher
Latency         <1s        Variable
Exploration     No         Yes

Pattern 3: Chain of Thought Prompting

What It Does

Force explicit step-by-step reasoning, improving quality on complex tasks.

The Flow

Complex Problem
    ↓
Prompt for Step-by-Step Reasoning
    ↓
LLM Generates Reasoning Steps
    ↓
LLM Arrives at Answer
    ↓
Return Reasoning + Answer

Use Cases

  • Complex reasoning tasks
  • Multi-step problems
  • Decision-making
  • Quality-critical applications

Example: Decision-Making Agent

class ChainOfThoughtAgent:
    def analyze(self, problem: str) -> dict:
        prompt = f"""
        Problem: {problem}

        Let me think through this step-by-step:
        1. First, I'll identify the key factors
        2. Then, I'll consider alternatives
        3. Next, I'll evaluate trade-offs
        4. Finally, I'll make a recommendation

        Step 1: Key factors are...
        """

        response = self.llm.generate(prompt)

        # Parse out reasoning and answer
        reasoning_steps = self.extract_steps(response)
        final_answer = self.extract_answer(response)

        return {
            "reasoning": reasoning_steps,
            "answer": final_answer,
            "confidence": self.assess_confidence(reasoning_steps)
        }

Characteristics

  • Transparent: Reasoning is visible
  • Higher quality: Better performance on hard tasks
  • More tokens: Uses extra tokens for thinking
  • Debuggable: Can see where reasoning goes wrong

When to Use

✅ Complex problems
✅ Quality is paramount
✅ Need to understand reasoning
❌ Simple tasks
❌ Latency-critical
❌ Cost-sensitive


Pattern 4: Function Calling

What It Does

Agent decides which tool/function to call based on task, enabling tool use and environment interaction.

The Flow

Task
    ↓
LLM Decides Which Function
    ↓
Call Selected Function
    ↓
Get Result
    ↓
Continue or Return

Use Cases

  • Calling APIs
  • Database queries
  • External tool integration
  • Structured data extraction

Example: Multi-Tool Agent

class FunctionCallingAgent:
    def __init__(self):
        self.tools = {
            "search": self.search_web,
            "calculate": self.calculate,
            "save": self.save_result,
            "fetch": self.fetch_url
        }

    def run(self, goal: str):
        messages = [{"role": "user", "content": goal}]

        while True:
            # Ask LLM which tool to use
            response = self.llm.generate(
                messages=messages,
                tools=list(self.tools.keys())
            )

            # Check if LLM wants to call a tool
            if response.tool_calls:
                for tool_call in response.tool_calls:
                    tool_name = tool_call.name
                    args = tool_call.arguments

                    # Call the tool
                    result = self.tools[tool_name](**args)

                    # Add result to messages
                    messages.append({
                        "role": "assistant",
                        "content": response.content
                    })
                    messages.append({
                        "role": "tool",
                        "content": str(result)
                    })
            else:
                # LLM generated final response
                return response.content

Characteristics

  • Action-oriented: Agent affects world
  • Standardized: Function calling APIs standardized (2023-2024)
  • Structured: Clear tool definitions
  • Composable: Tools can be chained

When to Use

✅ Need to interact with systems
✅ Taking action required
✅ Calling APIs/databases
❌ Pure reasoning tasks
❌ No external tools available


Pattern 5: Multi-Agent Coordination

What It Does

Multiple agents work together, coordinating through communication or shared state.

The Flow

- ┌──────────────┐
    - Orchestrator   │
  - ┬───────┘
                 │
- ┌──────────┼──────────┐
      │          │          │
   Agent A    Agent B    Agent C
      │          │          │
  - ┼──────────┘
                 │
          Result Aggregation

Use Cases

  • Complex workflows
  • Specialized subtasks
  • Parallel work
  • Knowledge combination

Example: Research Team

class MultiAgentResearchTeam:
    def __init__(self):
        self.researcher = ResearcherAgent()
        self.analyst = AnalystAgent()
        self.writer = WriterAgent()
        self.orchestrator = OrchestratorAgent()

    def run(self, goal: str):
        # Orchestrator decomposes task
        tasks = self.orchestrator.decompose(goal)

        # Agents work on their tasks
        results = {}

        # Researcher finds papers
        results["papers"] = self.researcher.find_papers(tasks["research"])

        # Analyst analyzes them
        results["analysis"] = self.analyst.analyze(
            papers=results["papers"],
            task=tasks["analysis"]
        )

        # Writer compiles report
        final_report = self.writer.write(
            analysis=results["analysis"],
            task=tasks["writing"]
        )

        return final_report

Characteristics

  • Specialized: Each agent has expertise
  • Scalable: Add agents for more capacity
  • Communicative: Agents coordinate
  • Complex: Harder to debug

When to Use

✅ Large, complex projects
✅ Multiple specializations needed
✅ Parallel work possible
❌ Simple tasks
❌ Tight coordination needed
❌ Real-time communication required


Comparing the 5 Patterns

Decision Matrix

Pattern Speed Quality Complexity Latency Cost
Agentic Loop Medium Very High High High High
RAG Very Fast High Low Low Low
Chain-of-Thought Slow Very High Low Medium Medium
Function Calling Medium High Medium Medium Medium
Multi-Agent Medium Very High Very High High High

Combining Patterns (Typical Production System)

Multi-Agent Orchestration
  - Agent 1: Agentic Loop
    - Uses Chain-of-Thought for complex reasoning
    - Uses Function Calling for tool use
│
  - Agent 2: RAG System
    - Retrieves documents
    - Generates answers
│
  - Agent 3: Function Calling
  - Integrates with external APIs

Real-World Example: Enterprise Research System

class EnterpriseResearchSystem:
    def process_request(self, request: str):
        # Multi-agent coordination
        research_team = {
            "search_agent": AgenticLoopAgent(
                tools=[web_search, academic_db]
            ),
            "rag_agent": RAGAgent(
                knowledge_base=company_kb
            ),
            "analysis_agent": ChainOfThoughtAgent(),
            "api_agent": FunctionCallingAgent(
                tools=api_registry
            )
        }

        # Orchestrator coordinates
        results = self.orchestrate(request, research_team)
        return results

Pattern Selection Guide

Choose Agentic Loop If:

  • Need iterative problem-solving
  • Complex, multi-step task
  • Environment interaction needed
  • Quality more important than speed

Choose RAG If:

  • Document-based Q&A
  • Knowledge base access
  • Speed important
  • Hallucination reduction needed

Choose Chain-of-Thought If:

  • Complex reasoning required
  • Quality paramount
  • Need to explain reasoning
  • Cost acceptable

Choose Function Calling If:

  • Tool integration needed
  • Structured data extraction
  • API calls required
  • Automation needed

Choose Multi-Agent If:

  • Very large/complex task
  • Multiple specializations
  • Parallel work possible
  • Team coordination needed

Hybrid Patterns (2025 Best Practice)

Most production systems use hybrid combinations:

Research System:
  Orchestrator (Multi-Agent)
    → Search Agent (Agentic Loop + Function Calling)
    → Analysis Agent (Chain-of-Thought)
    → Knowledge Agent (RAG)
    → Report Agent (Function Calling)

This combines: - Agentic Loop's exploration - RAG's grounding - Chain-of-Thought's reasoning - Function Calling's action - Multi-Agent's coordination


Key Takeaways

  1. Agentic Loop = Iterative problem-solving
  2. RAG = Grounded, fast answers
  3. Chain-of-Thought = Complex reasoning
  4. Function Calling = Tool integration
  5. Multi-Agent = Scalable, specialized work

Best Practice: Combine patterns based on task needs


Next: Read 12 Foundational Patterns


Last Updated: August 9, 2026