model abstraction for swappable AI providers