fix(responses): omit empty JSON body on DELETE response API requests

Azure OpenAI's responses-API DELETE endpoint rejects requests that carry
a JSON body with: "Unexpected body with size 2. This API method does
not accept a request body.". The default LiteLLMAiohttpTransport silently
elides empty-dict bodies on DELETE so this was masked, but the pure-httpx
transport (used when DISABLE_AIOHTTP_TRANSPORT=True or under vcrpy/respx
patching) sends literal '{}' (2 bytes), which Azure rejects.

Only attach json= when the provider's transform actually returned a
non-empty dict; otherwise issue a bodyless DELETE.
This commit is contained in:
mateo-berri 2026-04-30 17:55:27 -07:00
parent 265a94cd60
commit 8bdc46ea74

View File

@ -2536,9 +2536,16 @@ class BaseLLMHTTPHandler:
)
try:
response = await async_httpx_client.delete(
url=url, headers=headers, json=data, timeout=timeout
)
# Only send a JSON body when the provider supplied request data;
# some providers (e.g. Azure OpenAI) reject DELETE with a body.
delete_kwargs: Dict[str, Any] = {
"url": url,
"headers": headers,
"timeout": timeout,
}
if data:
delete_kwargs["json"] = data
response = await async_httpx_client.delete(**delete_kwargs)
except Exception as e:
raise self._handle_error(
@ -2620,9 +2627,16 @@ class BaseLLMHTTPHandler:
)
try:
response = sync_httpx_client.delete(
url=url, headers=headers, json=data, timeout=timeout
)
# Only send a JSON body when the provider supplied request data;
# some providers (e.g. Azure OpenAI) reject DELETE with a body.
delete_kwargs: Dict[str, Any] = {
"url": url,
"headers": headers,
"timeout": timeout,
}
if data:
delete_kwargs["json"] = data
response = sync_httpx_client.delete(**delete_kwargs)
except Exception as e:
raise self._handle_error(