Skip to content

Commit 66e738d

Browse files
dtmeadowsstainless-app[bot]
authored andcommitted
fix(client): preserve hardcoded query params when merging with user params
1 parent cfb47c0 commit 66e738d

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

src/anthropic/_base_client.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,12 @@ def _build_request(
553553
files = cast(HttpxRequestFiles, ForceMultipartDict())
554554

555555
prepared_url = self._prepare_url(options.url)
556+
# When the URL contains hardcoded query params (e.g. ?beta=true) and
557+
# additional params are provided, httpx will replace the URL's query
558+
# string with the params. Merge them to preserve both.
559+
if params and prepared_url.query:
560+
params = {**dict(prepared_url.params.items()), **params}
561+
prepared_url = prepared_url.copy_with(raw_path=prepared_url.path.encode())
556562
if "_" in prepared_url.host:
557563
# work around https://github.com/encode/httpx/discussions/2880
558564
kwargs["extensions"] = {"sni_hostname": prepared_url.host.replace("_", "-")}

tests/test_client.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,22 @@ def test_default_query_option(self) -> None:
453453

454454
client.close()
455455

456+
def test_hardcoded_query_params_in_url(self, client: Anthropic) -> None:
457+
request = client._build_request(FinalRequestOptions(method="get", url="/foo?beta=true"))
458+
url = httpx.URL(request.url)
459+
assert dict(url.params) == {"beta": "true"}
460+
461+
def test_hardcoded_query_params_with_extra_params(self, client: Anthropic) -> None:
462+
request = client._build_request(
463+
FinalRequestOptions(
464+
method="get",
465+
url="/foo?beta=true",
466+
params={"limit": "10", "page": "abc"},
467+
)
468+
)
469+
url = httpx.URL(request.url)
470+
assert dict(url.params) == {"beta": "true", "limit": "10", "page": "abc"}
471+
456472
def test_request_extra_json(self, client: Anthropic) -> None:
457473
request = client._build_request(
458474
FinalRequestOptions(
@@ -1458,6 +1474,22 @@ async def test_default_query_option(self) -> None:
14581474

14591475
await client.close()
14601476

1477+
def test_hardcoded_query_params_in_url(self, async_client: AsyncAnthropic) -> None:
1478+
request = async_client._build_request(FinalRequestOptions(method="get", url="/foo?beta=true"))
1479+
url = httpx.URL(request.url)
1480+
assert dict(url.params) == {"beta": "true"}
1481+
1482+
def test_hardcoded_query_params_with_extra_params(self, async_client: AsyncAnthropic) -> None:
1483+
request = async_client._build_request(
1484+
FinalRequestOptions(
1485+
method="get",
1486+
url="/foo?beta=true",
1487+
params={"limit": "10", "page": "abc"},
1488+
)
1489+
)
1490+
url = httpx.URL(request.url)
1491+
assert dict(url.params) == {"beta": "true", "limit": "10", "page": "abc"}
1492+
14611493
def test_request_extra_json(self, client: Anthropic) -> None:
14621494
request = client._build_request(
14631495
FinalRequestOptions(

0 commit comments

Comments
 (0)