
GPT-4 — the model that passed the bar exam — was given a straightforward task: plan a multi-day trip with flights, hotels, and restaurants within a budget. It succeeded 0.6% of the time. Not 60%. Not 6%. Zero point six.
A different system, one that used the same underlying AI but wrapped it in a fundamentally different architecture, hit 97% success on the same benchmark. The difference wasn't a smarter model. It was smarter engineering. This gap — between what AI can say and what AI can reliably do — is the most important problem in enterprise AI right now, and most organizations are on the wrong side of it. The fix is a design pattern called neuro-symbolic orchestration, and it changes how we think about building AI agents from the ground up.
The Wrapper Delusion
Over the past two years, the industry fell in love with a seductive idea: give a large language model some tools, a goal, and a prompt, and it will figure out the rest. Frameworks like AutoGPT and BabyAGI promised autonomous AI agents that could chain together API calls, make decisions, and complete complex workflows without human intervention.
We call this the "Wrapper Delusion" — the belief that a model designed to predict the next word in a sentence can be coerced into reliably executing multi-step business logic through clever prompting alone.
The math tells you why it doesn't work. Assume an LLM makes the right decision 90% of the time at each step — a generous estimate for complex reasoning. Chain ten steps together, and your overall success rate drops to about 34%. A typical flight booking involves more than ten operations: searching, filtering, selecting, entering passenger details, pricing, payment, ticketing. At that complexity, you're flipping coins, not running software.
The problem isn't that LLMs are bad at language. It's that orchestration isn't a language task.
Deciding what to do next in a rigid business process shouldn't be a matter of token prediction. "Proceed to payment" should only happen if "flight is selected" AND "price is confirmed." That's a boolean condition — true or false — not a probabilistic suggestion.
What the TravelPlanner Benchmark Actually Proved

The TravelPlanner benchmark, a rigorous evaluation designed to test AI agents on real-world trip planning, gave us the clearest picture yet of where pure LLM agents break down. The task: plan multi-day travel across the United States while respecting constraints on transportation, accommodation, dining, and budget.
The results were stark:
GPT-4 (pure LLM agent): 0.6% overall success rate, ~4.4% hard constraint pass rate
Neuro-symbolic agent (code-driven): 97% overall success, ~99% hard constraint pass rate
Both systems had access to the same information. The difference was entirely architectural. We explored this in depth in our interactive analysis of neuro-symbolic orchestration.
So why does the world's most advanced language model fail 99.4% of the time on a planning task it clearly understands?
Three failure patterns emerged, and they compound each other ruthlessly.
Context drift is the first. As the agent works through steps — searching flights, then hotels, then restaurants — the context window fills with intermediate data. The model's attention mechanism spreads thin across thousands of irrelevant tokens. By step ten, it has effectively "forgotten" the budget constraint it correctly identified in step two. Think of it like trying to do long division while someone reads you a novel — the signal gets buried in noise.
Hallucination cascades are the second. When the agent misreads a flight arrival time in step two — say, 2:00 PM instead of 2:00 AM — every downstream decision inherits that error. The hotel check-in gets booked for the wrong day. The API processes the request because it doesn't know the agent's intent, only its input. The agent sees a successful response and reinforces its own mistake. One small hallucination becomes a chain of confident, compounding errors.
Reasoning-action mismatch is the third. The model's internal reasoning correctly identifies a constraint — "I need a flight under $500" — but then generates a tool call for a $600 flight because that option appeared more prominently in the search results. The thinking is right. The doing is wrong. When text generation is your proxy for logic execution, that gap is inevitable.
A 0.6% success rate isn't a model problem. It's an architecture problem.
Why Enterprise APIs Make Everything Harder
If planning a trip exposes the fragility of LLM agents, actually booking one through enterprise systems reveals something closer to a structural impossibility.
Flight booking runs through Global Distribution Systems — Sabre, Amadeus, Travelport — platforms designed in the mainframe era that are completely intolerant of ambiguity. A booking transaction is a finite state machine: a precise sequence of operations that cannot be reordered, skipped, or improvised.
Authentication produces a session token that must be passed in every subsequent request. If the LLM "forgets" to include it — or hallucinates a new one — the entire transaction context evaporates. Search results return massive, nested payloads (often 50KB+) containing fare basis codes, baggage models, and segment references. LLMs routinely strip out the critical offer IDs needed for the next step when they summarize options for the user.
The pricing step demands that inputs match search outputs exactly, bit for bit. But LLMs act as lossy compressors — they "autocorrect" date formats, "fix" perceived typos in fare codes, normalize data in ways that break the cryptographic integrity the API requires.
PNR creation — the actual booking record — requires adding itinerary segments, passenger names (in strict LAST/FIRST MR format), contact elements, ticketing time limits, and a "received from" field, all in a specific order. Attempting to commit the booking before every mandatory field is populated produces cryptic errors like ERR 1209 - SEQUENCE ERROR. An LLM has no inherent concept of this required temporal sequence beyond what it absorbed from training data.
And when errors do occur? GDS error messages are nearly useless for an AI. A response like UC (Unable to Confirm) or NO RECAP gives the model no semantic clue about what went wrong. The typical LLM response is to retry the exact same request — leading to what we call the "Loop of Death," burning through tokens and API rate limits while banging against a wall it cannot understand.
The Fix: Let Code Manage, Let AI Work
The system that achieved 97% on TravelPlanner didn't use a better model. It used the LLM as a translator, not a planner. The AI parsed the user's request into a structured query, then handed that query to a deterministic algorithm — a solver — that executed the search and optimization using variables, not tokens.
This is the core of neuro-symbolic orchestration: fuse the two great traditions of AI — neural networks for perception and symbolic logic for reasoning — and assign each to what it does best.
Neural networks excel at pattern recognition, fuzzy matching, and natural language understanding. They're brilliant at figuring out what a user means when they say "I want a flight that isn't too early." Symbolic systems — rules, logic, code — excel at ensuring that if A is greater than B, then C always follows. They never drift, never hallucinate, never forget a constraint.
In our architecture, the LLM is the interface layer: it translates unstructured human intent into structured data. The graph — a hard-coded state machine — is the execution layer: it receives that structured data and runs the business logic with deterministic code.
We demoted the LLM from CEO to task worker. That's what made the system reliable.
The LLM doesn't decide what happens next. Code does. The LLM extracts a passenger name from an email. Code validates the format. The LLM resolves "book the second one" to a specific offer ID. Code constructs the API call. The LLM never touches the GDS directly, never formats a payload, never decides whether to proceed to payment.
For the full technical methodology behind this architecture, see our detailed research on deterministic AI agents.
How the Graph Actually Works

The technology that makes this possible is the cyclic state graph — specifically, frameworks like LangGraph that allow you to build workflows where edges can loop back to previous nodes based on conditional logic. Unlike traditional software pipelines that only move forward, these graphs support the retry-analyze-recover patterns that real-world agent tasks demand.
Three primitives make the system work.
State is a typed data structure — not a chat history — that serves as the single source of truth for the entire workflow. It tracks everything: session tokens, search criteria, selected offers, passenger details, approval status. Even if the LLM hallucinates, it cannot overwrite a field in the state unless a specific node is designed to allow that update.
Nodes are individual Python functions, each responsible for one task. Some call the LLM ("extract dates from this text"). Some call external APIs ("run this Amadeus search"). Some execute pure logic ("is this date format valid?"). By isolating API calls into code-only nodes, the system eliminates the possibility of the LLM injecting hallucinated parameters into a request.
Conditional edges are where the real control lives. Instead of the LLM deciding "call the search tool next" — a probabilistic guess — an edge function reads the state: if origin AND destination are populated, route to the search node; otherwise, route back to ask the user. This makes it physically impossible for the agent to attempt a booking before a flight is selected. The workflow can't skip steps because the graph won't allow it.
In a neuro-symbolic system, the LLM can't skip steps — not because it's told not to, but because the architecture won't let it.
State is persisted to a database after every node transition. If a user starts a booking, gets interrupted, and returns hours later, the graph reloads their exact state — "waiting for payment" — without re-reading the entire conversation and re-inferring context. And if something fails in production, developers can load the checkpoint just before the failure and replay the node execution to diagnose exactly what went wrong. That kind of observability is impossible with black-box LLM chains.
The Human in the Loop Isn't a Fallback — It's a Feature
Enterprise AI shouldn't aim for total autonomy. It should aim for augmented productivity, with clear moments where human judgment is required — legally, operationally, or both.
Pure LLM chains struggle to pause and wait for humans. In a graph architecture, this is a native capability. When a flight exceeds a corporate policy limit, the graph doesn't ask the LLM what to do. A conditional edge detects the violation, triggers an interrupt, freezes the state to a database, and sends an approval request to a manager. When the manager approves, the graph reloads the exact state and resumes at the booking node.
This also solves the compliance problem that keeps legal teams awake at night. An LLM trace is a mess of tokens — nearly impossible to audit. A graph produces a node execution log: timestamped, readable, showing exactly which rule fired, what the input was, and what decision was made. When the EU AI Act demands transparency for high-risk AI systems (which includes financial transactions), that log is the difference between passing an audit and failing one.
The Economics of Not Hallucinating
Beyond reliability, there's a straightforward cost argument. When an LLM agent gets stuck in a retry loop — hallucinating new parameters to fix a GDS error it doesn't understand — a single stuck session can burn $5–$10 in API credits before timing out. A hard-coded error handler catches the same error for essentially zero cost, maps it to a specific recovery strategy, and resolves it without involving the LLM at all.
Token usage drops dramatically too. Instead of feeding the LLM an entire 50KB GDS response, a code node parses the JSON, extracts the five relevant fields, and passes only those to the LLM for summarization. Our architecture reduces context window usage by roughly 90%, cutting both inference costs and latency.
What About Flexibility? Won't Hard-Coded Graphs Be Too Rigid?
This is the most common objection we hear, and it's a fair one. If you hard-code the workflow, don't you lose the adaptability that makes AI valuable in the first place?
The answer is that neuro-symbolic systems aren't rigid — they're selectively rigid. The graph enforces structure where structure is non-negotiable: you can't book before you search, you can't pay before you price, you can't skip compliance checks. But within each node, the LLM retains full flexibility. It can handle a user who says "something cheap to Paris next Tuesday" just as well as one who provides exact dates and airline preferences. The creativity lives inside the nodes. The discipline lives in the edges between them.
The real question isn't "rigid or flexible?" It's "where does each belong?" And right now, most organizations are putting flexibility where they need rigidity.
What This Means for Your Team
If you're building or buying AI agents for enterprise workflows, three principles should guide every architectural decision:
Never let the LLM decide what happens next in a critical workflow. Use it to understand intent, extract data, and generate responses. Use code for routing, validation, and API interaction.
Demand a state schema, not a chat history. If your agent's "memory" is a growing list of conversation turns, it will drift. Typed, persistent state is what makes workflows resumable, auditable, and debuggable.
Design for the error, not the demo. Every agent works in a demo. The architecture reveals itself when the GDS returns a cryptic error code, the user disappears mid-transaction, or the price changes between search and booking.
The gap between 0.6% and 97% isn't closed by better prompts or bigger models. It's closed by treating AI as a component in a well-engineered system — not as the system itself.
We'd welcome hearing from teams navigating this transition. If you're wrestling with the reliability of AI agents in production, the conversation is just getting started.