From 8a3e6064abd9e155cf37b322dac45b60fd90fa45 Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Thu, 29 Oct 2026 11:31:38 -0700 Subject: [PATCH] fix(agentops): stop closing the shared sync http client after the auth call --- litellm/integrations/agentops/agentops.py | 22 +++++++++------------- tests/unit/integrations/test_agentops.py | 20 +++++++++++++++++++- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/litellm/integrations/agentops/agentops.py b/litellm/integrations/agentops/agentops.py index 3364520a8ae..3666cd88a9d 100644 --- a/litellm/integrations/agentops/agentops.py +++ b/litellm/integrations/agentops/agentops.py @@ -102,18 +102,14 @@ class AgentOps(OpenTelemetry): "Connection": "keep-alive", } - client: Final = get_httpx_client() - try: - response: Final = client.post( - url=auth_endpoint, - headers=headers, - json={"api_key": api_key}, - timeout=10, - ) + response: Final = get_httpx_client().post( + url=auth_endpoint, + headers=headers, + json={"api_key": api_key}, + timeout=10, + ) - if response.status_code != 200: - raise Exception(f"Failed to fetch auth token: {response.text}") + if response.status_code != 200: + raise Exception(f"Failed to fetch auth token: {response.text}") - return _DECODED_JSON.validate_python(response.json()) - finally: - client.close() + return _DECODED_JSON.validate_python(response.json()) diff --git a/tests/unit/integrations/test_agentops.py b/tests/unit/integrations/test_agentops.py index 5d4055ac75f..629722f8602 100644 --- a/tests/unit/integrations/test_agentops.py +++ b/tests/unit/integrations/test_agentops.py @@ -1,10 +1,14 @@ import os +from typing import Final from unittest.mock import MagicMock, patch import pytest +import respx - +import litellm +from litellm.caching.llm_caching_handler import LLMClientCache from litellm.integrations.agentops.agentops import AgentOps, AgentOpsConfig +from litellm.llms.custom_httpx.http_handler import get_httpx_client @pytest.fixture @@ -111,3 +115,17 @@ def test_agentops_initialization_no_auth(): assert agentops.resource_attributes["deployment.environment"] == "test_env" assert agentops.resource_attributes["telemetry.sdk.name"] == "agentops" assert "project.id" not in agentops.resource_attributes + + +def test_auth_fetch_leaves_the_shared_sync_client_open_for_other_callers( + monkeypatch: pytest.MonkeyPatch, respx_mock: respx.MockRouter +) -> None: + monkeypatch.setattr(litellm, "in_memory_llm_clients_cache", LLMClientCache()) + auth_endpoint: Final = "https://agentops.example/v3/auth/token" + respx_mock.post(auth_endpoint).respond(json={"token": "jwt", "project_id": "project-1"}) + client_another_caller_is_using: Final = get_httpx_client().client + + agentops: Final = AgentOps(config=AgentOpsConfig(api_key="key", auth_endpoint=auth_endpoint)) + + assert agentops.resource_attributes["project.id"] == "project-1" + assert not client_another_caller_is_using.is_closed