At the moment the plugin is able to execute a notebook, using Zeppelin. The notebook will be executed in the agent, after Zeppelin has spawned a JVM/interpreter (similar to an ipython kernel).
Another way - probably the most well known - to execute notebooks programmatically or via the command line is using nbconvert, e.g. `jupyter nbconvert --execute model.ipynb`. Which doesn't give you per-cell output, nor JSON output. But does execute the notebook, that could produce images, files elsewhere.
Or the user could have a JupyterHub instance somewhere, where we could start a kernel and remotely execute the notebook (would need to use API/tokens for JHub and for Jupyter Notebook).
We could create a custom extension point for an Execution Strategy. Each strategy then gets its own config.xml configuration jelly page. Where the user can configure the plug-in to choose how to run the model.