truss 0.11.8rc6__py3-none-any.whl → 0.11.8rc7__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.

@@ -17,54 +17,45 @@ 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
20
21
 
21
22
  SANITIZED_EXCEPTION_FRAMES = 2
22
23
 
23
24
 
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}"
25
+ class SanitizedExceptionMiddleware(BaseHTTPMiddleware):
26
+ def __init__(self, app, num_frames: int = SANITIZED_EXCEPTION_FRAMES):
27
+ super().__init__(app)
28
+ self.num_frames = num_frames
31
29
 
32
-
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)
30
+ async def dispatch(
31
+ self, request: Request, call_next: Callable[[Request], Awaitable[Response]]
32
+ ) -> Response:
33
+ try:
34
+ return await call_next(request)
35
+ except Exception as exc:
36
+ sanitized_traceback = self._create_sanitized_traceback(exc)
39
37
  if hasattr(request.app.state, "logger"):
40
- request.app.state.logger.error(sanitized_traceback)
41
-
42
- return await handler_func(request, exc)
43
-
44
- return wrapper
45
-
46
- return decorator
47
-
48
-
49
- @sanitize_exception()
50
- async def handle_patch_error(request, exc):
51
- error_type = _camel_to_snake_case(type(exc).__name__)
52
- return JSONResponse(content={"error": {"type": error_type, "msg": str(exc)}})
53
-
54
-
55
- @sanitize_exception()
56
- async def generic_error_handler(request, exc):
57
- print("CALLED GENERIC ========== ")
58
- return JSONResponse(
59
- content={"error": {"type": "unknown", "msg": f"{type(exc)}: {exc}"}}
60
- )
61
-
62
-
63
- @sanitize_exception()
64
- async def handle_model_load_failed(request, error):
65
- # Model load failures should result in 503 status
66
- print("CALLED MODEL LOAD ========== ")
67
- return JSONResponse({"error": str(error)}, 503)
38
+ request.app.state.logger.error(f"Error:\n{sanitized_traceback}")
39
+
40
+ if isinstance(exc, ModelLoadFailed):
41
+ return JSONResponse({"error": str(exc)}, status_code=503)
42
+ elif isinstance(exc, PatchApplicatonError):
43
+ error_type = _camel_to_snake_case(type(exc).__name__)
44
+ return JSONResponse(
45
+ {"error": {"type": error_type, "msg": str(exc)}}, status_code=400
46
+ )
47
+ else:
48
+ return JSONResponse(
49
+ {"error": {"type": "unknown", "msg": str(exc)}}, status_code=500
50
+ )
51
+
52
+ def _create_sanitized_traceback(self, error: Exception) -> str:
53
+ tb_lines = traceback.format_tb(error.__traceback__)
54
+ if tb_lines and self.num_frames > 0:
55
+ selected_frames = tb_lines[-self.num_frames :]
56
+ return "".join(selected_frames).rstrip()
57
+ else:
58
+ return f"{type(error).__name__}: {error}"
68
59
 
69
60
 
70
61
  def create_app(base_config: Dict):
@@ -115,14 +106,10 @@ def create_app(base_config: Dict):
115
106
  app = FastAPI(
116
107
  title="Truss Live Reload Server",
117
108
  on_startup=[start_background_inference_startup],
118
- exception_handlers={
119
- PatchApplicatonError: handle_patch_error,
120
- ModelLoadFailed: handle_model_load_failed,
121
- Exception: generic_error_handler,
122
- },
123
109
  )
124
110
  app.state = app_state
125
111
  app.include_router(control_app)
112
+ app.add_middleware(SanitizedExceptionMiddleware)
126
113
 
127
114
  @app.on_event("shutdown")
128
115
  def on_shutdown():
@@ -5,6 +5,7 @@ from typing import Any, Callable, Dict, Optional, Protocol
5
5
  import httpx
6
6
  from fastapi import APIRouter, WebSocket
7
7
  from fastapi.responses import JSONResponse, StreamingResponse
8
+ from helpers.errors import ModelLoadFailed, ModelNotReady
8
9
  from httpx_ws import AsyncWebSocketSession, WebSocketDisconnect, aconnect_ws
9
10
  from httpx_ws import _exceptions as httpx_ws_exceptions
10
11
  from starlette.requests import ClientDisconnect, Request
@@ -13,11 +14,6 @@ from starlette.websockets import WebSocketDisconnect as StartletteWebSocketDisco
13
14
  from tenacity import RetryCallState, Retrying, retry_if_exception_type, wait_fixed
14
15
  from wsproto.events import BytesMessage, TextMessage
15
16
 
16
- from truss.templates.control.control.helpers.errors import (
17
- ModelLoadFailed,
18
- ModelNotReady,
19
- )
20
-
21
17
  INFERENCE_SERVER_START_WAIT_SECS = 60
22
18
  BASE_RETRY_EXCEPTIONS = (
23
19
  retry_if_exception_type(httpx.ConnectError)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: truss
3
- Version: 0.11.8rc6
3
+ Version: 0.11.8rc7
4
4
  Summary: A seamless bridge from model development to model delivery
5
5
  Project-URL: Repository, https://github.com/basetenlabs/truss
6
6
  Project-URL: Homepage, https://truss.baseten.co
@@ -73,8 +73,8 @@ 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=FuL4DibeWy9ux81B5JhUnXuyu0Ro1t4UnmE-_W89gg4,4967
77
- truss/templates/control/control/endpoints.py,sha256=VQ1lvZjFvR091yRkiFdvXw1Q7PiNGXT9rJwY7_sX6yg,11828
76
+ truss/templates/control/control/application.py,sha256=XfA5udraulB0z6s4J_S05w0y1TJGcoMuC3jJOjbPVu4,4839
77
+ truss/templates/control/control/endpoints.py,sha256=KzqsLVNJE6r6TCPW8D5FMCtsfHadTwR15A3z_viGxmM,11782
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
80
80
  truss/templates/control/control/helpers/custom_types.py,sha256=n_lTudtLTpy4oPV3aDdJ4X2rh3KCV5btYO9UnTeUouQ,5471
@@ -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.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,,
371
+ truss-0.11.8rc7.dist-info/METADATA,sha256=37bkH41Vl6H2ftd6R4aJZWnxqanKAupqM4uOgFNmYlA,6680
372
+ truss-0.11.8rc7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
373
+ truss-0.11.8rc7.dist-info/entry_points.txt,sha256=-MwKfHHQHQ6j0HqIgvxrz3CehCmczDLTD-OsRHnjjuU,130
374
+ truss-0.11.8rc7.dist-info/licenses/LICENSE,sha256=FTqGzu85i-uw1Gi8E_o0oD60bH9yQ_XIGtZbA1QUYiw,1064
375
+ truss-0.11.8rc7.dist-info/RECORD,,