skip to content

When is a hand-written ReAct text protocol still better than native tool calling?

level: seniorimportance: should knowfreq 42%

answer

  1. the pattern survives, the protocol changes
  2. who enforces the handoff, you or the API
  3. parsing prose is a permanent tax
  4. local models may follow text more reliably
  5. some action spaces are not function-shaped

basics

~20 s

Rarely, as of mid-2026 — mainly with models that lack reliable structured tool calling, with action spaces that are not function-shaped, or when you need a provider-portable transcript you fully control. Otherwise the structured interface removes the exemplars, the stop string and the parser.

solid answer

~50 s

As of mid-2026 the default is the provider's structured tool-calling interface: the model was post-trained on it, the API halts at the call boundary for you, arguments arrive as validated data, and you delete the exemplar block, the stop string and the fragile line parser. Hand-written Thought/Action/Observation text still earns its place in a few cases. Open-weight or small local models without a dependable tool-calling head often follow a plain-text convention more reliably. Some action spaces are not function-shaped — a domain DSL, a shell command, a diff — and forcing them through a schema adds friction. You may also want a single transcript format that ports unchanged across providers, or that becomes training data later. The honest cost of choosing text is that you own parse failures forever. The **pattern** is unchanged either way: reason, act, observe, repeat. Only the protocol moved.

go deeper

for a junior

Know that the same reason-act-observe loop can be expressed either as labelled text the model writes, or through a structured tool-calling interface where the model returns the call as data.

for a middle

Explain what the structured interface removes — the exemplar block, the stop sequence and the line parser — and why compliance is higher when the model was post-trained on that format.

for a senior

Give a clear default with honest exceptions: structured for hosted models, text for unreliable local models, non-function-shaped action spaces, or provider-portable transcripts, and state that choosing text means owning parse failures and a repair path.

for a principal

Own the portability and lock-in tradeoff across a fleet: one canonical trace format for evaluation, replay and future training data versus per-provider structured interfaces, and decide where in your stack that normalisation should live.

## The two ways to express the same loop ReAct describes a *pattern*: reason, take an action against the environment, read the observation, reason again. That pattern is protocol-neutral. There are two ways to express it. **As a text protocol.** You write a prompt that declares three labelled blocks, show a few complete exemplar trajectories, configure a stop string at the observation boundary, and write a parser that pulls the action out of the generated prose. Your runtime executes it and appends the real result as text. **Through a structured interface.** The provider accepts a list of tool definitions alongside the conversation. When the model decides to act, it emits a structured call rather than prose; generation halts at that boundary automatically; your runtime executes and returns the result as a structured result message. No labels, no stop string, no parser. Both run the same loop. What differs is who owns the encoding. ## Why structured is the default now By mid-2026 the structured route wins on almost every axis for mainstream hosted models: - **The model was trained for it.** Post-training targets this format directly, so compliance is far higher than for a convention you invented in a prompt. - **The boundary is enforced, not conventional.** The API stops at the call. The model cannot write the observation, because the observation is not a place in the text it can reach. - **Arguments are data.** You get typed fields rather than a substring you must interpret, and schema violations become a checkable condition rather than a regex surprise. - **The scaffolding disappears.** The few-shot block, the stop string, the label constants and the parser all go away. That is a large amount of prompt and code deleted. The practical consequence is that the text protocol is now mostly of *conceptual* importance — you should understand it because it explains what the structured interface is doing, not because you will usually build with it. ## Where text still wins Four situations genuinely favour hand-written text. **Models without dependable tool calling.** Small open-weight or locally hosted models vary enormously in how reliably they emit structured calls. Some follow a plain-text convention with a couple of exemplars far more consistently than they follow a schema. If your deployment constraint is a model on your own hardware, measure both; do not assume the structured path is available in practice just because it is nominally supported. **Action spaces that are not function-shaped.** A shell command, a patch, a query in a domain language, a sequence of edits — these have their own grammar. Wrapping them in a single string parameter of a schema is not a design win; it just relocates your parsing problem into an argument. Sometimes the honest encoding is the native one. **Portability and control of the transcript.** A text protocol is provider-agnostic by construction. If you run the same agent across several models, or you want one canonical trace format for evaluation, replay and later training data, owning the encoding has real value. The moment you have decided to fine-tune on trajectories, a stable text format you control becomes an asset rather than a liability. **Teaching, research and harnesses.** Where the point is to inspect and manipulate the reasoning surface directly — ablations, custom decoding, curriculum work — the transparent format is the whole point. ## The cost you accept with text Parse failures do not go away; they become your permanent operational burden. You need a repair path — return a parse-error observation naming the expected format and let the model retry, with a cap on retries — and you need to instrument the failure rate, because it silently degrades when you change models or edit exemplars. You also carry the fabricated-observation risk, which the structured interface eliminates by construction. ## What does not change Everything interesting survives the switch. You still decide which tools exist and how they are described. You still decide when the loop stops. You still handle oversized results, errors, retries and untrusted tool output. You still need the model to reason before acting — with structured calling that reasoning lives in the assistant's ordinary text output, or in a provider's extended-thinking surface, rather than after a `Thought:` label. Candidates who believe native tool calling replaced ReAct have confused the protocol with the pattern; the loop is the same loop. ## How to answer this in an interview Lead with the default — structured, because the model was trained on it and the boundary is enforced. Then name the two or three specific constraints that would push you back to text, and be explicit that choosing text means owning a parser and a repair path forever. That combination of a clear default plus honest exception conditions is what the question is testing.

  • If you keep the text protocol, how do you handle an action line your parser cannot read?
    Treat it as a recoverable step, not a crash. Append an observation stating the parse failure and restating the expected format, then let the model retry — with a hard cap of one or two attempts before you fail the step or escalate. Instrument the parse-failure rate as a first-class metric, because it drifts silently when you change models or edit exemplars.
  • Does adopting native tool calling mean you are no longer doing ReAct?
    No. ReAct is the pattern — reason, act, observe, repeat — not the text format. With a structured interface the same loop runs, with the reasoning in ordinary assistant output or a provider's thinking surface and the action in a structured call. What disappears is the scaffolding: exemplars, stop string and parser. Every design decision about tools, termination and result handling remains.
  • What would you measure before choosing the text protocol for a locally hosted open-weight model?
    Run both paths on the same task set and compare: rate of well-formed calls, argument correctness, and how often the model departs from the format under long transcripts. Some small models follow a demonstrated text convention far more consistently than a schema, and some are the reverse. It is an empirical question about that specific model, not a general truth.

saying these in an interview costs you the question

  • Thinks native tool calling replaced the ReAct pattern itself
  • Assumes every model reliably emits structured calls
  • Keeps a hand-rolled text parser with no repair path
  • Believes text protocols are safer because the trace is readable
  • Wraps a whole DSL in one schema string and calls it structured

context