25 lines
706 B
Python
25 lines
706 B
Python
import asyncio
|
|
|
|
from openai import DefaultAsyncHttpxClient
|
|
|
|
|
|
class ForgeAsyncHttpxClientWrapper(DefaultAsyncHttpxClient):
|
|
"""
|
|
Wrapper around OpenAI's AsyncHttpxClientWrapper to mask teardown races.
|
|
|
|
The upstream `__del__` checks `self.is_closed`, but during interpreter
|
|
shutdown httpx internals may already be None, which raises:
|
|
|
|
AttributeError: 'NoneType' object has no attribute 'CLOSED'
|
|
|
|
We defensively swallow that destructor error so shutdown logs stay clean.
|
|
"""
|
|
|
|
def __del__(self) -> None:
|
|
try:
|
|
if self.is_closed:
|
|
return
|
|
asyncio.get_running_loop().create_task(self.aclose())
|
|
except Exception:
|
|
pass
|