ReAct interleaves *thought*, *action*, and *observation*. Modern models do this natively through tool calling, but the pattern still explains why agents work: making the reasoning explicit before an action reduces impulsive, wrong tool calls.
- Thought: what do I know, what is missing? - Action: one tool call with concrete arguments. - Observation: the tool's real output, never invented.
text
Thought: I need the current ETH gas price before estimating the fee.
Action: http_get({"url": "https://api.example.com/gas"})
Observation: {"baseFeeGwei": 12.4}
Thought: Fee = 21000 * 12.4 gwei = 0.00026 ETH. I can answer now.
Answer: About 0.00026 ETH at the current base fee.With native tool calling, keep a short `"Think about what is missing before each call"` line in the system prompt: it is the cheapest accuracy improvement available.
Gotcha: never let the model write the observation itself. If your loop appends model-generated text as a tool result, the agent will happily hallucinate API responses.
Exercise: run the same question twice — once with a ReAct hint in the system prompt, once without — and count tool calls and wrong answers over ten runs.