Abstract illustration of software architecture transforming into a flow of autonomous agents
Agentic workflows turn prompts into executable plans across services and tools.

The Shift from Prompting to Planning: How Agentic Workflows are Redefining Software Architecture in the LLM Era

Practical guide for engineers: move from prompting to planning with agentic workflows, architecture patterns, and a hands-on example.

The Shift from Prompting to Planning: How Agentic Workflows are Redefining Software Architecture in the LLM Era

Modern large language models (LLMs) made one thing trivial: getting text back from a prompt. The real challenge engineers now face is building systems that convert high-level human intent into reliable, observable, and maintainable behavior. That transition is less about crafting better prompts and more about designing agentic workflows — systems that plan, delegate, and execute across tools and services.

This post is a compact, practical guide for engineers who must design systems in the LLM era. You’ll get definitions, architectural patterns, pitfalls, and a code example showing the planner-executor pattern. The goal: stop treating LLMs as glorified text generators and start treating them as components in deterministic workflows.

Why the shift matters

Prompting optimizes for single-turn text outputs. It produces useful language but offers limited structure for multi-step tasks, error handling, or integration with external tools. Agentic workflows, by contrast, introduce a planning layer that:

The outcome is not just better semantics from the model; it is software you can test, monitor, and operate.

Not an either/or choice

This is not a repudiation of prompt engineering. Prompts still matter — they define the planner and the reasoning style. The difference is that prompts feed a planning engine rather than trying to encode all orchestration within a single prompt response.

Core concepts: planner, executor, tools, and memory

Designing agentic systems means decomposing responsibilities.

Separating these responsibilities reduces coupling and makes the system testable: you can unit-test planners (logic and reasoning) separately from executors (integration and resilience).

Architectural patterns

Below are pragmatic patterns that work at different scales.

Planner-as-service (centralized reasoning)

Run a dedicated planning service that receives intents, consults memory, and returns plans. Pros: single place to evolve reasoning logic; easier to enforce policies. Cons: can become a bottleneck and single point of failure.

Distributed planners (near tools)

Attach light planners to tool clusters where latency or privacy matters (e.g., on-prem databases). Pros: lower latency, better data locality. Cons: increased coordination complexity.

Hybrid orchestration

Use a central planner for global intent and local planners for domain-specific refinement. This is the common pattern in scaled systems: a global plan delegates subplans to domain agents.

Event-driven execution

Treat plan steps as events/messages. Executors pick up tasks from queues, run tools, and emit results. This fits well with autoscaling and observable architectures.

Design concerns: determinism, observability, safety

Agentic workflows surface non-determinism from LLMs. Address it deliberately:

Observability: each step should emit structured logs, metrics (latency, success rate), and traces. Instrument the planner to expose confidence scores and alternatives so ops can surface ambiguous plans.

Safety: enforce capability caps and sandbox tools. The planner should be capability-aware and constrained by a policy layer.

Example: planner-executor sketch

This example demonstrates the canonical flow: intent -> planner -> plan -> executor -> tools. The code is intentionally minimal to highlight the mechanics rather than the LLM integration details.

class Planner:
    def __init__(self, llm):
        self.llm = llm

    def create_plan(self, intent, context):
        prompt = f"Plan steps to achieve: {intent}\nContext: {context}"
        # llm.generate returns a structured plan (string or JSON)
        plan_text = self.llm.generate(prompt)
        # parse_plan is a domain-specific parser that turns text into steps
        plan = parse_plan(plan_text)
        return plan

class Executor:
    def __init__(self, tools, store):
        self.tools = tools
        self.store = store

    def run_plan(self, plan, run_id):
        results = []
        for step in plan.steps:
            tool = self.tools.get(step.tool)
            try:
                res = tool.invoke(step.args)
                results.append((step, res))
                self.store.append(run_id, step, res)
            except Exception as e:
                # retry policy or fail-fast, depending on step
                handle_failure(step, e)
                raise
        return results

# usage
planner = Planner(llm)
plan = planner.create_plan("summarize repo and open PR", repo_context)
executor = Executor(available_tools, run_store)
executor.run_plan(plan, run_id="run-123")

Notes:

Testing and evolution

Design your planner and executor to be testable independently:

Version the planner outputs and store plan schema versions to avoid broken executors.

Operational playbook

Common anti-patterns

When to use agentic workflows

If your app is purely content generation with no side effects, classic prompting may still be the simplest pattern.

Checklist: shipping agentic workflows

Summary

The era of LLMs shifts the engineering problem from crafting better single-shot prompts to building reliable workflows that can plan, delegate, and execute. Agentic architectures introduce a planner that reasons about intent and an executor that runs steps against tools. This separation gives you testability, observability, and safety — properties essential to production systems.

Treat LLMs as reasoning components, not oracles. Make their outputs structured, auditable, and executable. When you do, software architecture becomes about building robust chains of responsibility that turn human intent into safe, observable actions.

Related

Get sharp weekly insights