One approach that's fairly straightforward is to wrap that upstream async client in a sync channel interface.
The basic idea is you have a request channel that you use something like blocking_send() to send a pair of the request body and a one-shot response channel. You then block on the response channel for the reply.
The wrapped API then sits in a loop spawned from main that pulls requests off the other end, spawns the task to invoke them and send the response back on the one-shot.
Most of the thinking is about how much buffering you need and error handling, it's otherwise fairly simple to pull off.
Less efficient of course, but you're already making network calls here, it shouldn't tip the needle. And you can put anything you want in the request, of course, so you can batch up work or whatever.