Skip to content

Commit ad86471

Browse files
Tracebacks from endpoint failures are propagated to client (#36)
Add traceback as a field on EndpointResponse for debugging purposes Also fix unrelated table printing error in cli
1 parent 2ef52af commit ad86471

File tree

4 files changed

+41
-12
lines changed

4 files changed

+41
-12
lines changed

launch/cli/endpoints.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,15 @@ def list_endpoints(ctx: click.Context):
3737
servable_endpoint.model_endpoint.bundle_name,
3838
servable_endpoint.model_endpoint.status,
3939
servable_endpoint.model_endpoint.endpoint_type,
40-
(servable_endpoint.model_endpoint.worker_settings or {}).get(
41-
"min_workers"
40+
str(
41+
(servable_endpoint.model_endpoint.worker_settings or {}).get(
42+
"min_workers"
43+
)
4244
),
43-
(servable_endpoint.model_endpoint.worker_settings or {}).get(
44-
"max_workers"
45+
str(
46+
(servable_endpoint.model_endpoint.worker_settings or {}).get(
47+
"max_workers"
48+
)
4549
),
4650
servable_endpoint.model_endpoint.metadata or "{}",
4751
)

launch/connection.py

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,38 @@ def __eq__(self, other):
2626
)
2727

2828
def delete(self, route: str):
29-
return self.make_request({}, route, requests_command=requests.delete)
29+
return self.make_request(
30+
{},
31+
route,
32+
requests_command=requests.delete,
33+
)
3034

3135
def get(self, route: str):
32-
return self.make_request({}, route, requests_command=requests.get)
36+
return self.make_request(
37+
{},
38+
route,
39+
requests_command=requests.get,
40+
)
3341

3442
def post(self, payload: dict, route: str):
3543
return self.make_request(
36-
payload, route, requests_command=requests.post
44+
payload,
45+
route,
46+
requests_command=requests.post,
3747
)
3848

3949
def put(self, payload: dict, route: str):
40-
return self.make_request(payload, route, requests_command=requests.put)
50+
return self.make_request(
51+
payload,
52+
route,
53+
requests_command=requests.put,
54+
)
4155

4256
def make_request(
43-
self, payload: dict, route: str, requests_command=requests.post
57+
self,
58+
payload: dict,
59+
route: str,
60+
requests_command=requests.post,
4461
) -> dict:
4562
"""
4663
Makes a request to Launch endpoint and logs a warning if not

launch/model_endpoint.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ def __init__(
122122
status: str,
123123
result_url: Optional[str] = None,
124124
result: Optional[str] = None,
125+
traceback: Optional[str] = None,
125126
):
126127
"""
127128
Parameters:
@@ -140,14 +141,17 @@ def __init__(
140141
Exactly one of ``result_url`` or ``result`` will be populated,
141142
depending on the value of ``return_pickled`` in the request.
142143
144+
traceback: The stack trace if the inference endpoint raised an error. Can be used for debugging
145+
143146
"""
144147
self.client = client
145148
self.status = status
146149
self.result_url = result_url
147150
self.result = result
151+
self.traceback = traceback
148152

149153
def __str__(self) -> str:
150-
return f"status: {self.status}, result: {self.result}, result_url: {self.result_url}"
154+
return f"status: {self.status}, result: {self.result}, result_url: {self.result_url}, traceback: {self.traceback}"
151155

152156

153157
class EndpointResponseFuture:
@@ -188,13 +192,15 @@ def get(self) -> EndpointResponse:
188192
status=async_response["state"],
189193
result_url=async_response.get("result_url", None),
190194
result=async_response.get("result", None),
195+
traceback=None,
191196
)
192197
elif async_response["state"] == "FAILURE":
193198
return EndpointResponse(
194199
client=self.client,
195200
status=async_response["state"],
196201
result_url=None,
197202
result=None,
203+
traceback=async_response.get("traceback", None),
198204
)
199205
else:
200206
raise ValueError(
@@ -236,9 +242,10 @@ def predict(self, request: EndpointRequest) -> EndpointResponse:
236242
)
237243
return EndpointResponse(
238244
client=self.client,
239-
status=TASK_SUCCESS_STATE,
245+
status=raw_response.get("state"),
240246
result_url=raw_response.get("result_url", None),
241247
result=raw_response.get("result", None),
248+
traceback=raw_response.get("traceback", None),
242249
)
243250

244251
def status(self):
@@ -429,6 +436,7 @@ def single_request(inner_url, inner_task_id):
429436
status=raw_response["state"],
430437
result_url=raw_response.get("result_url", None),
431438
result=raw_response.get("result", None),
439+
traceback=raw_response.get("traceback", None),
432440
)
433441
self.responses[url] = response_object
434442

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ exclude = [
2626

2727
[tool.poetry]
2828
name = "scale-launch"
29-
version = "0.2.0"
29+
version = "0.2.1"
3030
description = "The official Python client library for Launch, the Data Platform for AI"
3131
authors = ["Your Name <you@example.com>"]
3232
readme = "README.md"

0 commit comments

Comments
 (0)