← Back to blog

How much rope we give the AI

Every time we add an AI feature, we have to decide how loose or locked-down its output should be. Four options were on the whiteboard:

  • Free-form chat. The AI just talks. The user reads the reply. Warm and simple, but the app can’t actually do anything with prose.
  • Structured output (JSON). The AI fills in a fixed form — no chat, just fields. The app reads the fields and acts. Predictable, but cold.
  • Tool calls. The AI chats normally, and when it wants to do something (log a set, tweak your plan), it picks from a menu we defined. Feels like a conversation; the app stays in control.
  • Split endpoints. Some flows are chat (coaching you through a session). Others aren’t (working out what kind of athlete you are from your last 30 sessions). Same model, different harness.

Where we landed:

  • Coach = tool calls. It suggests, never silently changes your plan.
  • Behind-the-scenes stuff (profiling, grading its own advice) = structured output on a separate endpoint.
  • Pure free-form? Almost never. An AI with no rails either makes things up or rambles.

The rule we wrote down: give the AI rope where conversation is the point. Rails everywhere else.