Skip to content

Commit d6a1d6a

Browse files
dm36claude
andauthored
fix: preserve result body in async FAILURE responses (#178)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 365934d commit d6a1d6a

2 files changed

Lines changed: 43 additions & 1 deletion

File tree

launch/model_endpoint.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ def get(self, timeout: Optional[float] = None) -> EndpointResponse:
290290
client=self.client,
291291
status=status,
292292
result_url=None,
293-
result=None,
293+
result=async_response.get("result", None),
294294
traceback=async_response.get("traceback", None),
295295
status_code=async_response.get("status_code", None),
296296
)

tests/test_model_endpoint.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,45 @@ 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():
81+
"""FAILURE responses should expose the result string (stringified exception) from the server."""
82+
mock_client = MagicMock()
83+
mock_client._get_async_endpoint_response.return_value = {
84+
"status": "FAILURE",
85+
"result": "Out of memory",
86+
"traceback": "Traceback (most recent call last): ...\nRuntimeError: Out of memory",
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.result == "Out of memory"
98+
assert response.traceback == "Traceback (most recent call last): ...\nRuntimeError: Out of memory"
99+
assert response.result_url is None
100+
101+
102+
def test_endpoint_response_future_failure_no_result_body():
103+
"""FAILURE responses with no result body should still work (e.g. pod crash with no response)."""
104+
mock_client = MagicMock()
105+
mock_client._get_async_endpoint_response.return_value = {
106+
"status": "FAILURE",
107+
"result": None,
108+
"traceback": None,
109+
"status_code": 500,
110+
}
111+
112+
from launch.model_endpoint import EndpointResponseFuture
113+
114+
future = EndpointResponseFuture(mock_client, "test-endpoint", "task-456")
115+
response = future.get()
116+
117+
assert response.status == "FAILURE"
118+
assert response.result is None
119+
assert response.traceback is None

0 commit comments

Comments
 (0)