Skip to content

Commit 67a87c5

Browse files
authored
Consistently return Boolean for delete methods (#359)
Resolves #356 When deleting a model, Replicate's API returns with a 204 and an empty response body. The client library fails to decode this and raises and exception. This PR updates the `replicate.models.delete` method to return `bool` instead to indicate success. It also harmonizes the other delete methods for deployments and files to do the same. Signed-off-by: Mattt Zmuda <[email protected]>
1 parent d5f5e27 commit 67a87c5

File tree

3 files changed

+25
-24
lines changed

3 files changed

+25
-24
lines changed

replicate/deployment.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -358,31 +358,33 @@ async def async_update(
358358

359359
return _json_to_deployment(self._client, resp.json())
360360

361-
def delete(self, deployment_owner: str, deployment_name: str) -> None:
361+
def delete(self, deployment_owner: str, deployment_name: str) -> bool:
362362
"""
363363
Delete an existing deployment.
364364
365365
Args:
366366
deployment_owner: The owner of the deployment.
367367
deployment_name: The name of the deployment.
368368
"""
369-
self._client._request(
369+
resp = self._client._request(
370370
"DELETE",
371371
f"/v1/deployments/{deployment_owner}/{deployment_name}",
372372
)
373+
return resp.status_code == 204
373374

374-
async def async_delete(self, deployment_owner: str, deployment_name: str) -> None:
375+
async def async_delete(self, deployment_owner: str, deployment_name: str) -> bool:
375376
"""
376377
Delete an existing deployment asynchronously.
377378
378379
Args:
379380
deployment_owner: The owner of the deployment.
380381
deployment_name: The name of the deployment.
381382
"""
382-
await self._client._async_request(
383+
resp = await self._client._async_request(
383384
"DELETE",
384385
f"/v1/deployments/{deployment_owner}/{deployment_name}",
385386
)
387+
return resp.status_code == 204
386388

387389
@property
388390
def predictions(self) -> "DeploymentsPredictions":

replicate/file.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,15 +133,17 @@ async def async_list(self) -> List[File]:
133133
resp = await self._client._async_request("GET", "/v1/files")
134134
return [_json_to_file(obj) for obj in resp.json().get("results", [])]
135135

136-
def delete(self, file_id: str) -> None:
136+
def delete(self, file_id: str) -> bool:
137137
"""Delete an uploaded file by its ID."""
138138

139-
_ = self._client._request("DELETE", f"/v1/files/{file_id}")
139+
resp = self._client._request("DELETE", f"/v1/files/{file_id}")
140+
return resp.status_code == 204
140141

141-
async def async_delete(self, file_id: str) -> None:
142+
async def async_delete(self, file_id: str) -> bool:
142143
"""Delete an uploaded file by its ID asynchronously."""
143144

144-
_ = await self._client._async_request("DELETE", f"/v1/files/{file_id}")
145+
resp = await self._client._async_request("DELETE", f"/v1/files/{file_id}")
146+
return resp.status_code == 204
145147

146148

147149
def _create_file_params(

replicate/model.py

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -287,41 +287,38 @@ async def async_get(self, *args, **kwargs) -> Model:
287287
return _json_to_model(self._client, resp.json())
288288

289289
@overload
290-
def delete(self, key: str) -> Model: ...
290+
def delete(self, key: str) -> bool: ...
291291

292292
@overload
293-
def delete(self, owner: str, name: str) -> Model: ...
293+
def delete(self, owner: str, name: str) -> bool: ...
294294

295-
def delete(self, *args, **kwargs) -> Model:
295+
def delete(self, *args, **kwargs) -> bool:
296296
"""
297297
Delete a model by name.
298-
"""
299298
299+
Returns:
300+
`True` if deletion was successful, otherwise `False`.
301+
"""
300302
url = _delete_model_url(*args, **kwargs)
301303
resp = self._client._request("DELETE", url)
302-
303-
return _json_to_model(self._client, resp.json())
304+
return resp.status_code == 204
304305

305306
@overload
306-
async def async_delete(self, key: str) -> Model: ...
307+
async def async_delete(self, key: str) -> bool: ...
307308

308309
@overload
309-
async def async_delete(self, owner: str, name: str) -> Model: ...
310+
async def async_delete(self, owner: str, name: str) -> bool: ...
310311

311-
async def async_delete(self, *args, **kwargs) -> Model:
312+
async def async_delete(self, *args, **kwargs) -> bool:
312313
"""
313-
Delete a model by name.
314+
Asynchronously delete a model by name.
314315
315-
Args:
316-
key: The qualified name of the model, in the format `owner/name`.
317316
Returns:
318-
The model.
317+
`True` if deletion was successful, otherwise `False`.
319318
"""
320-
321319
url = _delete_model_url(*args, **kwargs)
322320
resp = await self._client._async_request("DELETE", url)
323-
324-
return _json_to_model(self._client, resp.json())
321+
return resp.status_code == 204
325322

326323
class CreateModelParams(TypedDict):
327324
"""Parameters for creating a model."""

0 commit comments

Comments
 (0)