Agents are supposed to be the future of how we build AI software. I am not so sure.
Prompts, Agents, and Workflows
First, there’s a terminology clarification worth making upfront. What many in the industry call “agents” are actually what Anthropic more precisely defines as “workflows” – predetermined chains of LLM calls orchestrated through fixed code paths.
True agents, by contrast, are autonomous systems that dynamically direct their own processes and tool usage.
Most of what we see deployed today are workflows: decomposing complex tasks into a hierarchy of specialized LLM calls, with routing layers orchestrating the interactions.
In a Workflow, each step maintains its own context, can call specific tools, and handles a narrow slice of the overall problem. These multi-step workflows are powerful abstractions, but they’re not the only way to build sophisticated AI behaviors.

True autonomous agents? They’re even further from what most applications actually need.
The Hidden Costs of Multi-Step Workflows
LLM workflows come with significant disadvantages that often get glossed over in the excitement of building AI Applications:
Errors compound. Each step in the workflow chain is non-deterministic. When you chain multiple LLM calls together, minor errors or unexpected outputs cascade through the system. You need evaluation frameworks for each step AND the entire workflow.
Latency adds up. Every workflow step means another round trip to an LLM. A simple request that spans three steps results in three sequential API calls, each with its own network and processing time.
Costs pile up. Multiple workflow steps mean multiple API calls, each processing similar context. This could result in significant API costs as the number of tokens goes up.
Predictability suffers. Debugging why a workflow produced a particular output requires tracing through multiple decision points, each with its own probabilistic behavior.
I had to make decisions around which concerns belong together and which should remain separate. I ended up with two LLM calls – the Guardrails Layer and the Main Layer.
The Guardrails Layer operates as a lightweight, independent LLM call. Content safety is a fundamentally different concern from the companion’s behavior. It requires different evaluation criteria, different error handling, and potentially a different model optimized for classification.
The Main Prompt combines three complementary, but separate, layers:
- Personality Layer: Defines the AI assistant’s identity and communication style (here is the default personality)
- Context Layer: Determines which user information may be relevant to the current prompt. For example, what books they are currently reading, previous messages in a conversation, etc.
- Directives Layer: Tool-use and output-formatting instructions for the prompt. I use a configuration-driven approach that lets you add multiple directives to a single prompt. You can think of Directives as sub-layers that drive the behavior and output of the prompt.

These three layers share a coherent purpose – they all contribute to HOW the AI companion responds. They get composed programmatically into a single system prompt.
This approach means just two LLM calls instead of a chain of four or five workflow steps. More importantly, each call has a clear, singular purpose.
With prompt caching, this architecture becomes incredibly efficient. That comprehensive system prompt costs almost nothing after the first request, and the lightweight guardrails check is minimal overhead.
What about Prompt Engineering?
A lot of prompt engineering thinking is stuck in 2023, when tokens were expensive, context windows were small (4K-8K), and models were less capable.
But look at what’s available in November 2025: Haiku 4.5 is a fast, cheap model with phenomenal capabilities. It handles tool use, follows complex instructions, and, with prompt caching, makes repeated calls incredibly efficient.
By combining software engineering principles with modern LLM capabilities, the approach I am taking offers:
- Reduced latency: One LLM call instead of multiple calls
- Lower costs: Reduced total number of tokens with prompt caching
- Extensibility: I can swap out the Agent Personality, or layer directives, or change the way I build the context
- Fewer errors (in aggregate): Just two prompts in the chain, with the Guardrails prompt being fairly deterministic
Where Workflows and Agents Fit In
Let me be clear about what I’m arguing against and what I’m not.
Workflows (predetermined chains of LLM calls) have their place. When you genuinely need different specialized processing steps that can’t be combined – say, translating content, then checking it for cultural appropriateness with other models – a workflow makes sense. But these cases are less common than current practice suggests.
True agents (autonomous systems that decide their own next steps) are valuable for tasks that are not fully specified or might have multiple solutions. Complex research tasks, multi-step debugging sessions or adaptive planning scenarios may be suitable for truly agentic approaches.
My observation is that the complex multi-step workflows or unpredictable “agentic” systems achieve what a well-structured prompt with sound context engineering can easily and cheaply handle. They’re adding architectural complexity and risk without significant benefits.
Moving Forward
The rapid evolution and improvement in LLM capabilities mean our architectural patterns need to evolve, too. What made sense with smaller models and tiny context windows doesn’t necessarily apply today.
My suggestion: start with prompt engineering. Apply software engineering principles. Push it to its limits. Layer your concerns appropriately. Use the model’s native capabilities.
You might be surprised how far a well-architected prompt system can take you.
Sometimes, prompting really is all you need.





