Init is split into a separate method. This may create a number of connections, and we'd better have an instance by that moment, for the case things will go wrong, so we can wrap init into try-catch and then call #cleanup within finally.
Optional
checkpointSaver: BaseCheckpointSaver<number>processMessages deals with both streaming and non-streaming approaches.
Agent simplifies interaction with LLM and reduces it to calling a few methods GthAgentRunner#init and GthAgentRunner#processMessages.