The obvious reflex when you read “AI agent” is to assume more capability. Felix, a developer who builds on n8n, ran an experiment that challenges that instinct directly. He took the same invoice classification workflow and built it twice: once the boring deterministic way, once with an AI Agent node and Gemini as the reasoning engine. The agent version works. He’s sticking with the deterministic one anyway.
Here’s why that’s the right call, and what the experiment reveals about where agents actually earn their place.
⚙️ What Both Workflows Do
The original workflow uses the easybits Extractor node to classify uploaded invoices (PDF, PNG, JPG), route each file to the correct Google Drive folder, and flag low-confidence documents to Slack for human review. The Extractor returns two fields: document_class and confidence_score. A single IF node branches on those values.
The agentic version swaps that structure for an AI Agent node with Gemini as the chat model and seven tools attached: six “move to folder” tools plus one Slack alert. The agent sees the file ID, decides the category, and calls the matching tool. Functionally, the output is the same file in the same folder.

Four Reasons the Agent Lost
1. Non-determinism in a task that doesn’t need it
Invoice classification is a solved deterministic problem. Adding an LLM in the routing path means the same invoice can land in a different folder on two separate runs. For a process that’s supposed to be boring and reliable, that’s a regression, not an upgrade.
2. Debugging becomes a guessing game
When the deterministic workflow breaks, an IF node either fires or it doesn’t. Felix reports he can identify the exact failure reason in ten seconds. When the agent misroutes, the tool calls are visible in the execution logs but the reasoning behind a wrong call is not. Reverse-engineering what the model was thinking is a different and slower kind of debugging.
3. Confidence scoring degrades to vibes
The easybits Extractor returns null when it genuinely can’t extract a field. That’s a clean, branchable signal. An agent’s self-reported confidence is not equivalent. Felix notes the agent will report 90% certainty on a document it misclassified. You can’t build a reliable human-review gate on a number like that.
4. More failure modes, identical output
Building the agentic version, Felix ran into tool loops, missing $fromAI parameters, schema mismatches, and binary-passing issues between the agent and tool nodes. Each is a new production failure mode. The end result after navigating all of them is the same file in the same folder as the deterministic version produces without any of those failure modes.
The Transferable Pattern
Felix’s framing is direct: agents make sense when you actually need reasoning, specifically for ambiguous decisions, multi-step planning, or work that can’t be expressed as a graph. Invoice classification is none of those. The category either matches a known class or it doesn’t. A well-structured extraction node handles that without any of the LLM overhead.
The practical test for your own workflows: ask whether the decision you’re handing to an agent is genuinely ambiguous or just unfamiliar. If it’s the latter, a deterministic branch will outperform an agent on reliability, debuggability, and confidence signal quality every time.
️ Setup: The Deterministic Version
If you want to run the easybits Extractor version yourself:
- Cloud users: the easybits Extractor node is already available. Search for it in the node panel.
- Self-hosted: go to Settings, then Community Nodes, and install
@easybits/n8n-nodes-extractor. - Create a pipeline at extractor.easybits.tech with two fields:
document_classandconfidence_score. - Free tier covers 50 requests per month.
Both workflows are available to compare directly. The agentic version is on GitHub and the deterministic version is on n8n.io.
