Skip to content

Commit d638fbb

Browse files
committed
fix: preserve result body in async FAILURE responses
1 parent 365934d commit d638fbb

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

launch/model_endpoint.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,11 +286,12 @@ def get(self, timeout: Optional[float] = None) -> EndpointResponse:
286286
status_code=async_response.get("status_code", None),
287287
)
288288
elif status == "FAILURE":
289+
result_body = async_response.get("result") or {}
289290
return EndpointResponse(
290291
client=self.client,
291292
status=status,
292-
result_url=None,
293-
result=None,
293+
result_url=result_body.get("result_url", None),
294+
result=result_body.get("result", None),
294295
traceback=async_response.get("traceback", None),
295296
status_code=async_response.get("status_code", None),
296297
)

tests/test_model_endpoint.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,44 @@ def test_status_returns_updated_value(requests_mock): # noqa: F811
7575
response=HTTPResponse(body=json.dumps(resp), status=200)
7676
)
7777
assert endpoint.status() == "SUCCESS"
78+
79+
80+
def test_endpoint_response_future_failure_preserves_result_body():
81+
"""FAILURE responses should expose the result body so callers can extract error details."""
82+
mock_client = MagicMock()
83+
mock_client._get_async_endpoint_response.return_value = {
84+
"status": "FAILURE",
85+
"result": {"result": '{"error": "Out of memory"}', "result_url": None},
86+
"traceback": None,
87+
"status_code": 500,
88+
}
89+
90+
from launch.model_endpoint import EndpointResponseFuture
91+
92+
future = EndpointResponseFuture(mock_client, "test-endpoint", "task-123")
93+
response = future.get()
94+
95+
assert response.status == "FAILURE"
96+
assert response.status_code == 500
97+
assert response.traceback is None
98+
assert response.result == '{"error": "Out of memory"}'
99+
100+
101+
def test_endpoint_response_future_failure_no_result_body():
102+
"""FAILURE responses with no result body should still work (e.g. pod crash with no response)."""
103+
mock_client = MagicMock()
104+
mock_client._get_async_endpoint_response.return_value = {
105+
"status": "FAILURE",
106+
"result": None,
107+
"traceback": None,
108+
"status_code": 500,
109+
}
110+
111+
from launch.model_endpoint import EndpointResponseFuture
112+
113+
future = EndpointResponseFuture(mock_client, "test-endpoint", "task-456")
114+
response = future.get()
115+
116+
assert response.status == "FAILURE"
117+
assert response.result is None
118+
assert response.traceback is None

0 commit comments

Comments
 (0)