A voice companion creates an uncomfortable engineering tension: users expect it to feel flexible, but they also expect a spoken “maybe” not to become an action.

An autonomous agent loop can make a compelling demo. In a real-time conversation, however, every extra planning step adds another place where the response can become stale, fail, or choose an action the user did not intend. Replacing that loop with deterministic control is not an admission that the AI is fake. It is a decision about where uncertainty is useful.

This tutorial builds a narrower architecture:

The LLM gets one opportunity to reply or propose an action.

The application validates the proposal against a closed schema.