From 951a145f16bb2de23884b665d537fe8a5034ffbb Mon Sep 17 00:00:00 2001 From: xic Date: Fri, 4 Sep 2026 11:22:06 +0800 Subject: [PATCH 1/2] refactor: migrate httpx to httpx2 with dual import Use the actively maintained httpx2 fork (Pydantic Services) when available, falling back to httpx. The HTTP transport module (qdrant_client/http/api_client.py) is the single call site for httpx in the runtime path; switching to the dual-import pattern keeps every currently-supported Python version working. The pyproject already permits httpx>=0.26,<1.0 which is compatible with the httpx2 2.x line, so no dependency change is needed. Refs: #1403 --- qdrant_client/http/api_client.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/qdrant_client/http/api_client.py b/qdrant_client/http/api_client.py index 4c907c3cf..03ba0cee6 100644 --- a/qdrant_client/http/api_client.py +++ b/qdrant_client/http/api_client.py @@ -3,7 +3,12 @@ from typing import Any, Awaitable, Callable, Dict, Generic, Type, TypeVar, overload from urllib.parse import urljoin -from httpx import AsyncClient, Client, Request, Response +# HTTPXodus Option A — dual import: prefer httpx2 (Pydantic-maintained +# fork), fall back to httpx on environments that only ship real httpx. +try: + from httpx2 import AsyncClient, Client, Request, Response +except ImportError: + from httpx import AsyncClient, Client, Request, Response from pydantic import ValidationError from qdrant_client.common.client_exceptions import ResourceExhaustedResponse from qdrant_client.http.api.aliases_api import AsyncAliasesApi, SyncAliasesApi From a239093720eaf082de2267566f77ba542d0d509d Mon Sep 17 00:00:00 2001 From: xic Date: Mon, 7 Sep 2026 18:14:43 +0800 Subject: [PATCH 2/2] fix: hard switch to httpx2 (no dual-import shim)\n\nDrop the try/except fall-back block; commit fully to httpx2.\n\nRefs: #1403 --- pyproject.toml | 2 +- qdrant_client/http/api_client.py | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ed2178fee..a8f8295b0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,7 @@ keywords = ["vector", "search", "neural", "matching", "client"] [tool.poetry.dependencies] python = ">=3.10" -httpx = { version = ">=0.20.0", extras = ["http2"] } +httpx2 = { version = ">=2.12.0", extras = ["http2"] } numpy = [ { version = ">=1.21,<2.3.0", python = ">=3.10,<3.11" }, { version = ">=1.21", python = ">=3.11,<3.12" }, diff --git a/qdrant_client/http/api_client.py b/qdrant_client/http/api_client.py index 03ba0cee6..7837b9053 100644 --- a/qdrant_client/http/api_client.py +++ b/qdrant_client/http/api_client.py @@ -3,12 +3,7 @@ from typing import Any, Awaitable, Callable, Dict, Generic, Type, TypeVar, overload from urllib.parse import urljoin -# HTTPXodus Option A — dual import: prefer httpx2 (Pydantic-maintained -# fork), fall back to httpx on environments that only ship real httpx. -try: - from httpx2 import AsyncClient, Client, Request, Response -except ImportError: - from httpx import AsyncClient, Client, Request, Response +from httpx2 import AsyncClient, Client, Request, Response from pydantic import ValidationError from qdrant_client.common.client_exceptions import ResourceExhaustedResponse from qdrant_client.http.api.aliases_api import AsyncAliasesApi, SyncAliasesApi