DEV Community

ForgeWorkflows
ForgeWorkflows

Posted on Originally published at forgeworkflows.com

How Engineers Actually Build Their AI Stacks in 2025

In 2024, McKinsey's State of AI report found that organizations are increasingly prioritizing transparency in AI implementation, specifically seeking detailed insights into how leading teams structure their technology stacks and operational workflows (McKinsey, 2024). That finding tracks with what I see every week: engineers don't want another "top 10 AI tools" list. They want to know what someone actually ran in production, what broke, and what they replaced it with.

The gap between AI marketing and AI engineering is widest in 2025. Every platform claims to be the orchestration layer you need. Every agent framework promises to handle the hard parts. But the engineers actually shipping products are making very different choices than the ones being promoted at conferences. This article documents three distinct setup philosophies, compares their tradeoffs directly, and gives you a framework for deciding which approach fits your project, not someone else's.


Why Agent Selection Is the Real Bottleneck

Most engineers assume model capability is the constraint. It rarely is. The actual friction lives in agent selection, task routing, and tool management - the plumbing that sits between your LLM and your user's outcome.

I learned this the hard way building our first Stripe integration. The API call included a recurring parameter set to null. We assumed omitting the value was the same as omitting the field. It wasn't. Stripe created two prices: one correct one-time payment at $297, and one spurious monthly subscription at $297. We caught it before a customer was charged monthly for a one-time product, but it took a manual archive in the Stripe Dashboard to fix. Now our factory pipeline never includes the recurring field at all - not null, not false, just absent. That kind of operational detail never appears in documentation. It only surfaces when someone who made the mistake tells you about it.

That's the core argument for setup transparency. The knowledge that saves you three days of debugging isn't in any README. It's in the head of the engineer who already lost those three days.


Setup A: The Minimal Orchestrator

The first pattern I see among engineers who've been building with AI agents for more than a year is aggressive minimalism. One reasoning model, one tool-calling layer, one persistent memory store. No agent frameworks. No multi-agent coordination. Just a well-structured prompt, a reliable LLM, and direct API calls to the services that matter.

The engineers running this setup cite one consistent reason: debuggability. When something fails in a single-agent pipeline, you know exactly where to look. When something fails in a five-agent swarm, you're reading logs across five execution contexts trying to reconstruct what happened.

The tradeoff is real. Minimal orchestration works well for tasks with clear input-output contracts: document summarization, classification, structured data extraction. It breaks down when the task requires genuine parallelism or when subtasks have meaningfully different tool requirements. Forcing a single agent to handle both web research and code execution in sequence is slower and less reliable than splitting those concerns.

For a deeper look at where this approach holds and where it doesn't, our post on why over-orchestration fails covers the specific failure modes we've observed.


Setup B: The Specialist Pipeline

The second pattern treats agents as specialists rather than generalists. A classification model routes the incoming task. A reasoning model handles the logic-heavy work. A separate module manages tool calls and external API interactions. Each component does one thing.

Engineers who prefer this setup are usually working on products where reliability matters more than iteration speed. The pipeline is more complex to build initially, but each component can be tested, monitored, and replaced independently. When the classification step starts misfiring, you fix the classifier without touching the reasoning layer.

The cost is coordination overhead. Every handoff between components is a potential failure point. You need clear contracts between stages: what format does the classifier output? What does the reasoning node expect as input? Mismatches here cause silent failures that are harder to catch than outright errors. I've seen teams spend more time debugging inter-component data formats than they spent building the components themselves.

This is also where tool management becomes a genuine engineering problem, not an afterthought. Each specialist component needs access to exactly the tools it requires and no others. Giving a reasoning module access to a database write tool it shouldn't be using is how you get unintended side effects that are difficult to trace back to their source. Scope your tool access tightly, per component, from the start.


Setup C: The Agentic Loop with Human Gates

The third pattern is what ForgeWorkflows calls agentic logic: an agent that can plan, execute, observe results, and revise its approach across multiple steps, but with explicit human checkpoints before any irreversible action. This is the setup most commonly described in AI engineering communities right now, and also the most commonly misimplemented.

The engineers doing this well share one characteristic: they treat the human gate as a first-class system component, not an afterthought. The gate has a defined trigger condition, a defined output format, and a defined timeout behavior. If the human doesn't respond within a set window, the system either pauses safely or escalates, never proceeds blindly.

The engineers doing this poorly treat the human gate as a UI element bolted onto an otherwise autonomous system. The agent runs, does something consequential, then surfaces a confirmation dialog. By the time the human sees it, the context is stale and the decision is effectively already made. That's not a gate. That's theater.

This setup works well for high-stakes tasks where the cost of an error exceeds the cost of a human review cycle: contract generation, financial data processing, customer-facing communications. It breaks down for high-volume, low-stakes tasks where human review becomes the bottleneck. Don't use agentic loops with human gates for tasks you could run a thousand times a day. The math doesn't work.


Comparing the Three: When to Use Which

The honest answer is that most production AI systems use all three patterns, applied to different parts of the same product. The mistake is picking one philosophy and applying it uniformly.

Here's the framework I use when advising on stack decisions:

  • Task has a clear, bounded scope with a known output format: Start with the minimal orchestrator. Add complexity only when you hit a specific, measurable limitation.
  • Task requires multiple distinct capabilities that benefit from independent testing: Build a specialist pipeline. Define your inter-component contracts before writing any component logic.
  • Task involves irreversible actions or high error costs: Use an agentic loop with explicit human gates. Design the gate as a system component, not a UI afterthought.

The pattern I see most often in failed AI projects is premature complexity. An engineer reads about multi-agent systems, builds a five-component pipeline for a task that a single well-prompted LLM could handle, and then spends months debugging coordination failures instead of shipping. The reasons AI-generated code fails in production often trace back to the same root cause: architectural decisions made before the problem was fully understood.

Start with the simplest thing that could work. Measure where it actually fails. Add the next layer of complexity to address that specific failure. Repeat.


What the Community Gets Right (and What It Misses)

The demand for setup transparency reflects something real: engineers are tired of learning from documentation written by people who haven't shipped the thing they're documenting. Community-driven knowledge, the kind that surfaces in Discord servers and engineering blogs, carries a different kind of authority because it includes failure.

Transparency about what didn't work builds more trust than a polished success story. When someone tells you they tried a particular agent framework and abandoned it after two weeks because the tool-calling reliability dropped below acceptable thresholds on complex tasks, that's more useful than any benchmark. Benchmarks measure the framework's best case. That engineer measured their actual case.

What the community often misses is comparative structure. Individual setup posts are valuable but hard to generalize from. One engineer's optimal stack reflects their specific constraints: their team size, their latency requirements, their error tolerance, their existing infrastructure. Without a framework for understanding which constraints drove which decisions, you can't adapt their choices to your situation. You can only copy them and hope your situation is similar enough.

That's the gap worth closing. Not more setup posts, but setup posts with explicit reasoning about the tradeoffs that shaped each decision. If you browse our full blueprint catalog, you'll notice each build includes the reasoning behind its architecture, not just the architecture itself. The decision log matters as much as the final design.


What We'd Do Differently

Define tool scope per component before writing any code. Every time we've added tool access incrementally, we've ended up with components that have broader permissions than they need. Scoping tool access after the fact requires refactoring the component's logic, not just its configuration. Start with the minimum viable tool set and expand only when a specific task requires it.

Build the monitoring layer before the agent layer. We've shipped agent pipelines without adequate observability and spent weeks reconstructing what happened during failures from incomplete logs. The monitoring infrastructure should exist before the first agent runs in any environment that touches real data. This is especially true for agentic loops, where the execution path is non-deterministic and failures can compound across steps before surfacing.

Treat the "what didn't work" documentation as a deliverable, not an afterthought. The Stripe recurring field incident I described earlier would have cost a customer money if we hadn't caught it. We documented it internally, but we should have documented it publicly from the start. The engineering community's knowledge compounds when failure cases are shared with the same rigor as success cases. If you're building with AI agents in 2025, your incident log is one of the most valuable things you can publish.

Top comments (0)