elevenlabs / elevenlabs-python

The official Python API for ElevenLabs Text to Speech.
https://elevenlabs.io/docs/api-reference/getting-started
MIT License
2.22k stars 258 forks source link

Timeout bug #373

Open drawnwren opened 1 month ago

drawnwren commented 1 month ago

Here's the type signature of the httpx:AsyncClient.request method:

    async def request(
        self,
        method: str,
        url: URL | str,
        *,
        content: RequestContent | None = None,
        data: RequestData | None = None,
        files: RequestFiles | None = None,
        json: typing.Any | None = None,
        params: QueryParamTypes | None = None,
        headers: HeaderTypes | None = None,
        cookies: CookieTypes | None = None,
        auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT,
        follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT,
        timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT,
        extensions: RequestExtensions | None = None,
    ) -> Response:

It's important that they use a custom type to indicate that no timeout is set. When you wrap their client here:

https://github.com/elevenlabs/elevenlabs-python/blob/317b471eebfea68c70c35839a1d5c6264018446f/src/elevenlabs/core/client_wrapper.py#L63

You use None as the default timeout, and pass the default timeout value to get here: https://github.com/elevenlabs/elevenlabs-python/blob/317b471eebfea68c70c35839a1d5c6264018446f/src/elevenlabs/core/http_client.py#L352

httpx treats timeout=None as no timeout at all (not the client default timeout), and this means that we're seeing some stuck connections in our code.