Skip to content

Commit 92e109c

Browse files
fix(client): preserve hardcoded query params when merging with user params
1 parent ffd8741 commit 92e109c

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

src/openai/_base_client.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,10 @@ def _build_request(
542542
files = cast(HttpxRequestFiles, ForceMultipartDict())
543543

544544
prepared_url = self._prepare_url(options.url)
545+
# preserve hard-coded query params from the url
546+
if params and prepared_url.query:
547+
params = {**dict(prepared_url.params.items()), **params}
548+
prepared_url = prepared_url.copy_with(raw_path=prepared_url.raw_path.split(b"?", 1)[0])
545549
if "_" in prepared_url.host:
546550
# work around https://github.com/encode/httpx/discussions/2880
547551
kwargs["extensions"] = {"sni_hostname": prepared_url.host.replace("_", "-")}

tests/test_client.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,30 @@ def test_default_query_option(self) -> None:
434434

435435
client.close()
436436

437+
def test_hardcoded_query_params_in_url(self, client: OpenAI) -> None:
438+
request = client._build_request(FinalRequestOptions(method="get", url="/foo?beta=true"))
439+
url = httpx.URL(request.url)
440+
assert dict(url.params) == {"beta": "true"}
441+
442+
request = client._build_request(
443+
FinalRequestOptions(
444+
method="get",
445+
url="/foo?beta=true",
446+
params={"limit": "10", "page": "abc"},
447+
)
448+
)
449+
url = httpx.URL(request.url)
450+
assert dict(url.params) == {"beta": "true", "limit": "10", "page": "abc"}
451+
452+
request = client._build_request(
453+
FinalRequestOptions(
454+
method="get",
455+
url="/files/a%2Fb?beta=true",
456+
params={"limit": "10"},
457+
)
458+
)
459+
assert request.url.raw_path == b"/files/a%2Fb?beta=true&limit=10"
460+
437461
def test_request_extra_json(self, client: OpenAI) -> None:
438462
request = client._build_request(
439463
FinalRequestOptions(
@@ -1466,6 +1490,30 @@ async def test_default_query_option(self) -> None:
14661490

14671491
await client.close()
14681492

1493+
async def test_hardcoded_query_params_in_url(self, async_client: AsyncOpenAI) -> None:
1494+
request = async_client._build_request(FinalRequestOptions(method="get", url="/foo?beta=true"))
1495+
url = httpx.URL(request.url)
1496+
assert dict(url.params) == {"beta": "true"}
1497+
1498+
request = async_client._build_request(
1499+
FinalRequestOptions(
1500+
method="get",
1501+
url="/foo?beta=true",
1502+
params={"limit": "10", "page": "abc"},
1503+
)
1504+
)
1505+
url = httpx.URL(request.url)
1506+
assert dict(url.params) == {"beta": "true", "limit": "10", "page": "abc"}
1507+
1508+
request = async_client._build_request(
1509+
FinalRequestOptions(
1510+
method="get",
1511+
url="/files/a%2Fb?beta=true",
1512+
params={"limit": "10"},
1513+
)
1514+
)
1515+
assert request.url.raw_path == b"/files/a%2Fb?beta=true&limit=10"
1516+
14691517
def test_request_extra_json(self, client: OpenAI) -> None:
14701518
request = client._build_request(
14711519
FinalRequestOptions(

0 commit comments

Comments
 (0)