Most agent runtimes are a while-loop with hope.
Call a model. Call a tool. Call the model again. If the tool is slow, the loop waits. If the tool fails halfway, you retry and double-charge the side effect. If ten users arrive together, you discover that “async” meant “threads until OOM.”
What Kafka gives the agent
Treat tool work and model steps as messages, not nested awaits:
Backpressure — consumers lag instead of melting the process
Retries with isolation — poison messages go to a DLQ, not into an infinite model retry
Fan-out — one “task created” event can wake planner, tool worker, and auditor
Audit — the log is the trace
This is the same reason we put payment capture and email sends on a bus.…