Use AsyncHumeClient for anything EVI chat related and HumeClient only for sync operations like listing configs. Pass both config id and secret key in ChatConnectOptions when opening the EVI socket. For batch expression measurement jobs, write your own poll loop on the job status and pull predictions via get_job_predictions; the old await helpers are gone.

Context: Official Hume docs (Python SDK migration guide): documents the sync vs async client gotcha. The Fern-generated SDK splits into AsyncHumeClient and HumeClient. Calling async functionality like empathic_voice chat connect on the synchronous HumeClient is disallowed and errors; chatting with EVI requires the async client. Connecting also needs ChatConnectOptions with both a config id and a secret key, so the API key alone is not enough for the WebSocket handshake. Related: the Expression Measurement batch API dropped await_complete and download_predictions, so you must poll the job status yourself and fetch predictions with your own HTTP call.