An LLM is a tool, not a feature. "Adding AI" isn't a goal; the goal is removing a specific pain for the user. With no pain, the assistant becomes a pretty button nobody presses.
Where an LLM shines
Where the user doesn't know the exact wording: semantic search, matching, drafts, summaries, turning a "human" request into something structured. In the PAINKILLER case that's AI try-on and size matching by parameters — the user doesn't write SQL, they just want "something basic, size M".
Where an LLM is bad
Where you need determinism: calculations, access control, charges, critical actions. Here the model at best suggests, and code decides. No "roughly calculated".
The model picks the action. Trusted code executes it — with validation and limits.
A good pattern is an agent with tools: the LLM chooses which tool to call, but the call itself is ordinary code with validation, idempotency and limits. You get the flexibility of language and the reliability of a system.
And always leave the human in control on irreversible steps. It's safer, more honest toward the user, and makes it far easier to audit what the model "generated".