truss 0.11.8rc5__py3-none-any.whl → 0.11.8rc6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of truss might be problematic. Click here for more details.
- truss/templates/control/control/application.py +28 -34
- {truss-0.11.8rc5.dist-info → truss-0.11.8rc6.dist-info}/METADATA +1 -1
- {truss-0.11.8rc5.dist-info → truss-0.11.8rc6.dist-info}/RECORD +6 -6
- {truss-0.11.8rc5.dist-info → truss-0.11.8rc6.dist-info}/WHEEL +0 -0
- {truss-0.11.8rc5.dist-info → truss-0.11.8rc6.dist-info}/entry_points.txt +0 -0
- {truss-0.11.8rc5.dist-info → truss-0.11.8rc6.dist-info}/licenses/LICENSE +0 -0
|
@@ -4,11 +4,11 @@ import logging.config
|
|
|
4
4
|
import re
|
|
5
5
|
import traceback
|
|
6
6
|
from pathlib import Path
|
|
7
|
-
from typing import Dict
|
|
7
|
+
from typing import Awaitable, Callable, Dict
|
|
8
8
|
|
|
9
9
|
import httpx
|
|
10
10
|
from endpoints import control_app
|
|
11
|
-
from fastapi import FastAPI, Request
|
|
11
|
+
from fastapi import FastAPI, Request, Response
|
|
12
12
|
from fastapi.responses import JSONResponse
|
|
13
13
|
from helpers.errors import ModelLoadFailed, PatchApplicatonError
|
|
14
14
|
from helpers.inference_server_controller import InferenceServerController
|
|
@@ -17,56 +17,53 @@ from helpers.inference_server_starter import async_inference_server_startup_flow
|
|
|
17
17
|
from helpers.truss_patch.model_container_patch_applier import ModelContainerPatchApplier
|
|
18
18
|
from shared import log_config
|
|
19
19
|
from starlette.datastructures import State
|
|
20
|
-
from starlette.middleware.base import BaseHTTPMiddleware
|
|
21
20
|
|
|
22
21
|
SANITIZED_EXCEPTION_FRAMES = 2
|
|
23
22
|
|
|
24
23
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
self.concise_msg = "".join(selected_frames).rstrip()
|
|
33
|
-
else:
|
|
34
|
-
self.concise_msg = f"{type(original_error).__name__}: {original_error}"
|
|
24
|
+
def create_sanitized_traceback(error: Exception, num_frames: int) -> str:
|
|
25
|
+
tb_lines = traceback.format_tb(error.__traceback__)
|
|
26
|
+
if tb_lines and num_frames > 0:
|
|
27
|
+
selected_frames = tb_lines[-num_frames:]
|
|
28
|
+
return "".join(selected_frames).rstrip()
|
|
29
|
+
else:
|
|
30
|
+
return f"{type(error).__name__}: {error}"
|
|
35
31
|
|
|
36
|
-
def __str__(self):
|
|
37
|
-
return self.concise_msg
|
|
38
32
|
|
|
39
|
-
|
|
40
|
-
|
|
33
|
+
def sanitize_exception(num_frames=SANITIZED_EXCEPTION_FRAMES):
|
|
34
|
+
def decorator(
|
|
35
|
+
handler_func: Callable[[Request, Exception], Awaitable[Response]],
|
|
36
|
+
) -> Callable[[Request, Exception], Awaitable[Response]]:
|
|
37
|
+
async def wrapper(request: Request, exc: Exception) -> Response:
|
|
38
|
+
sanitized_traceback = create_sanitized_traceback(exc, num_frames)
|
|
39
|
+
if hasattr(request.app.state, "logger"):
|
|
40
|
+
request.app.state.logger.error(sanitized_traceback)
|
|
41
41
|
|
|
42
|
+
return await handler_func(request, exc)
|
|
42
43
|
|
|
43
|
-
|
|
44
|
-
# that are very noisy for users.
|
|
45
|
-
class SanitizedExceptionMiddleware(BaseHTTPMiddleware):
|
|
46
|
-
def __init__(self, app, num_frames: int):
|
|
47
|
-
super().__init__(app)
|
|
48
|
-
self.num_frames = num_frames
|
|
44
|
+
return wrapper
|
|
49
45
|
|
|
50
|
-
|
|
51
|
-
try:
|
|
52
|
-
return await call_next(request)
|
|
53
|
-
except Exception as error:
|
|
54
|
-
raise SanitizedException(error, self.num_frames) from error
|
|
46
|
+
return decorator
|
|
55
47
|
|
|
56
48
|
|
|
57
|
-
|
|
49
|
+
@sanitize_exception()
|
|
50
|
+
async def handle_patch_error(request, exc):
|
|
58
51
|
error_type = _camel_to_snake_case(type(exc).__name__)
|
|
59
52
|
return JSONResponse(content={"error": {"type": error_type, "msg": str(exc)}})
|
|
60
53
|
|
|
61
54
|
|
|
62
|
-
|
|
55
|
+
@sanitize_exception()
|
|
56
|
+
async def generic_error_handler(request, exc):
|
|
57
|
+
print("CALLED GENERIC ========== ")
|
|
63
58
|
return JSONResponse(
|
|
64
59
|
content={"error": {"type": "unknown", "msg": f"{type(exc)}: {exc}"}}
|
|
65
60
|
)
|
|
66
61
|
|
|
67
62
|
|
|
68
|
-
|
|
63
|
+
@sanitize_exception()
|
|
64
|
+
async def handle_model_load_failed(request, error):
|
|
69
65
|
# Model load failures should result in 503 status
|
|
66
|
+
print("CALLED MODEL LOAD ========== ")
|
|
70
67
|
return JSONResponse({"error": str(error)}, 503)
|
|
71
68
|
|
|
72
69
|
|
|
@@ -126,9 +123,6 @@ def create_app(base_config: Dict):
|
|
|
126
123
|
)
|
|
127
124
|
app.state = app_state
|
|
128
125
|
app.include_router(control_app)
|
|
129
|
-
app.add_middleware(
|
|
130
|
-
SanitizedExceptionMiddleware, num_frames=SANITIZED_EXCEPTION_FRAMES
|
|
131
|
-
)
|
|
132
126
|
|
|
133
127
|
@app.on_event("shutdown")
|
|
134
128
|
def on_shutdown():
|
|
@@ -73,7 +73,7 @@ truss/templates/copy_cache_files.Dockerfile.jinja,sha256=Os5zFdYLZ_AfCRGq4RcpVTO
|
|
|
73
73
|
truss/templates/docker_server_requirements.txt,sha256=PyhOPKAmKW1N2vLvTfLMwsEtuGpoRrbWuNo7tT6v2Mc,18
|
|
74
74
|
truss/templates/server.Dockerfile.jinja,sha256=CUYnF_hgxPGq2re7__0UPWlwzOHMoFkxp6NVKi3U16s,7071
|
|
75
75
|
truss/templates/control/requirements.txt,sha256=nqqNmlTwFeV8sV4fqwItwzzd_egADBP_e-cEopXBJ4k,358
|
|
76
|
-
truss/templates/control/control/application.py,sha256=
|
|
76
|
+
truss/templates/control/control/application.py,sha256=FuL4DibeWy9ux81B5JhUnXuyu0Ro1t4UnmE-_W89gg4,4967
|
|
77
77
|
truss/templates/control/control/endpoints.py,sha256=VQ1lvZjFvR091yRkiFdvXw1Q7PiNGXT9rJwY7_sX6yg,11828
|
|
78
78
|
truss/templates/control/control/server.py,sha256=R4Y219i1dcz0kkksN8obLoX-YXWGo9iW1igindyG50c,3128
|
|
79
79
|
truss/templates/control/control/helpers/context_managers.py,sha256=W6dyFgLBhPa5meqrOb3w_phMtKfaJI-GhwUfpiycDc8,413
|
|
@@ -368,8 +368,8 @@ truss_train/deployment.py,sha256=lWWANSuzBWu2M4oK4qD7n-oVR1JKdmw2Pn5BJQHg-Ck,307
|
|
|
368
368
|
truss_train/loader.py,sha256=0o66EjBaHc2YY4syxxHVR4ordJWs13lNXnKjKq2wq0U,1630
|
|
369
369
|
truss_train/public_api.py,sha256=9N_NstiUlmBuLUwH_fNG_1x7OhGCytZLNvqKXBlStrM,1220
|
|
370
370
|
truss_train/restore_from_checkpoint.py,sha256=8hdPm-WSgkt74HDPjvCjZMBpvA9MwtoYsxVjOoa7BaM,1176
|
|
371
|
-
truss-0.11.
|
|
372
|
-
truss-0.11.
|
|
373
|
-
truss-0.11.
|
|
374
|
-
truss-0.11.
|
|
375
|
-
truss-0.11.
|
|
371
|
+
truss-0.11.8rc6.dist-info/METADATA,sha256=d2tJzaGAOT3N68nSAYVF3DmmN4SMdm29LYpmnvkjqmo,6680
|
|
372
|
+
truss-0.11.8rc6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
373
|
+
truss-0.11.8rc6.dist-info/entry_points.txt,sha256=-MwKfHHQHQ6j0HqIgvxrz3CehCmczDLTD-OsRHnjjuU,130
|
|
374
|
+
truss-0.11.8rc6.dist-info/licenses/LICENSE,sha256=FTqGzu85i-uw1Gi8E_o0oD60bH9yQ_XIGtZbA1QUYiw,1064
|
|
375
|
+
truss-0.11.8rc6.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|