We need to provide clean abstractions and interfaces so that users can easily plug in their custom models.