From bb276b67e72511b6127fcf75e600af2d8e9f3cd2 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <41898282+claude[bot]@users.noreply.github.com> Date: Sun, 5 Apr 2026 03:26:09 +0000 Subject: [PATCH] fix: resolve ty type error for asyncio.Lock private attribute access Replace access to Lock._loop (private/unresolved attribute) with an explicit _client_lock_loop field to track which event loop the lock belongs to. Co-Authored-By: Claude Sonnet 4.6 --- django/aiservice/aiservice/llm.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/django/aiservice/aiservice/llm.py b/django/aiservice/aiservice/llm.py index 5a26a8dae..8ac5c9e4e 100644 --- a/django/aiservice/aiservice/llm.py +++ b/django/aiservice/aiservice/llm.py @@ -76,6 +76,7 @@ class LLMClient: self.client_loop: asyncio.AbstractEventLoop | None = None self.background_tasks: set[asyncio.Task[Any]] = set() self._client_lock: asyncio.Lock | None = None + self._client_lock_loop: asyncio.AbstractEventLoop | None = None async def call( self, @@ -96,8 +97,9 @@ class LLMClient: loop = asyncio.get_running_loop() # Create lock for this event loop if it doesn't exist - if self._client_lock is None or self._client_lock._loop is not loop: + if self._client_lock is None or self._client_lock_loop is not loop: self._client_lock = asyncio.Lock() + self._client_lock_loop = loop if loop is not self.client_loop: async with self._client_lock: @@ -110,14 +112,16 @@ class LLMClient: await self.openai_client.close() except Exception as e: logger.debug( - "Failed to close OpenAI client (already closed or transport error): %s", type(e).__name__ + "Failed to close OpenAI client (already closed or transport error): %s", + type(e).__name__, ) if self.anthropic_client is not None: try: await self.anthropic_client.close() except Exception as e: logger.debug( - "Failed to close Anthropic client (already closed or transport error): %s", type(e).__name__ + "Failed to close Anthropic client (already closed or transport error): %s", + type(e).__name__, ) self.client_loop = loop