I think they key problem here was that one of your functions did not use the Python session you created and thus evaluated into its own temporary session. If you use a session:
session = StartExternalSession[...]
Then all ExternalEvaluate calls should use that session:
ExternalEvaluate[session, ... ]
But some of your code used the following, which is evaluated as a one-shot evaluation:
ExternalEvaluate["Python", ... ]