supervisely 6.73.411__py3-none-any.whl → 6.73.413__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.
- supervisely/api/module_api.py +2 -0
- supervisely/api/project_api.py +1 -0
- supervisely/app/fastapi/subapp.py +66 -0
- supervisely/nn/training/gui/training_artifacts.py +8 -1
- supervisely/nn/training/train_app.py +1 -2
- {supervisely-6.73.411.dist-info → supervisely-6.73.413.dist-info}/METADATA +1 -1
- {supervisely-6.73.411.dist-info → supervisely-6.73.413.dist-info}/RECORD +11 -11
- {supervisely-6.73.411.dist-info → supervisely-6.73.413.dist-info}/LICENSE +0 -0
- {supervisely-6.73.411.dist-info → supervisely-6.73.413.dist-info}/WHEEL +0 -0
- {supervisely-6.73.411.dist-info → supervisely-6.73.413.dist-info}/entry_points.txt +0 -0
- {supervisely-6.73.411.dist-info → supervisely-6.73.413.dist-info}/top_level.txt +0 -0
supervisely/api/module_api.py
CHANGED
supervisely/api/project_api.py
CHANGED
|
@@ -2455,6 +2455,7 @@ class ProjectApi(CloneableModuleApi, UpdateableModule, RemoveableModuleApi):
|
|
|
2455
2455
|
request_body = {
|
|
2456
2456
|
ApiField.PROJECT_ID: project_id,
|
|
2457
2457
|
ApiField.LIMIT: limit,
|
|
2458
|
+
ApiField.UNIQUE_ITEMS: limit, # the same as limit, but for diverse search
|
|
2458
2459
|
}
|
|
2459
2460
|
|
|
2460
2461
|
if dataset_id is not None:
|
|
@@ -61,6 +61,7 @@ SUPERVISELY_SERVER_PATH_PREFIX = sly_env.supervisely_server_path_prefix()
|
|
|
61
61
|
if SUPERVISELY_SERVER_PATH_PREFIX and not SUPERVISELY_SERVER_PATH_PREFIX.startswith("/"):
|
|
62
62
|
SUPERVISELY_SERVER_PATH_PREFIX = f"/{SUPERVISELY_SERVER_PATH_PREFIX}"
|
|
63
63
|
|
|
64
|
+
HEALTH_ENDPOINTS = ["/health", "/is_ready"]
|
|
64
65
|
|
|
65
66
|
class ReadyzFilter(logging.Filter):
|
|
66
67
|
def filter(self, record):
|
|
@@ -905,7 +906,33 @@ class Application(metaclass=Singleton):
|
|
|
905
906
|
Callable
|
|
906
907
|
] = None, # function to check if the app is ready for requests (e.g serving app: model is served and ready)
|
|
907
908
|
show_header: bool = True,
|
|
909
|
+
hide_health_check_logs: bool = True, # whether to hide health check logs in info level
|
|
910
|
+
health_check_endpoints: Optional[List[str]] = None, # endpoints to check health of the app
|
|
908
911
|
):
|
|
912
|
+
"""Initialize the Supervisely Application.
|
|
913
|
+
|
|
914
|
+
:param layout: Main layout of the application.
|
|
915
|
+
:type layout: Widget
|
|
916
|
+
:param templates_dir: Directory with Jinja2 templates. It is preferred to use `layout` instead of `templates_dir`.
|
|
917
|
+
:type templates_dir: str, optional
|
|
918
|
+
:param static_dir: Directory with static files (e.g. CSS, JS), used for serving static content.
|
|
919
|
+
:type static_dir: str, optional
|
|
920
|
+
:param hot_reload: Whether to enable hot reload during development (default is False).
|
|
921
|
+
:type hot_reload: bool, optional
|
|
922
|
+
:param session_info_extra_content: Additional content to be displayed in the session info area.
|
|
923
|
+
:type session_info_extra_content: Widget, optional
|
|
924
|
+
:param session_info_solid: Whether to use solid background for the session info area.
|
|
925
|
+
:type session_info_solid: bool, optional
|
|
926
|
+
:param ready_check_function: Function to check if the app is ready for requests.
|
|
927
|
+
:type ready_check_function: Callable, optional
|
|
928
|
+
:param show_header: Whether to show the header in the application.
|
|
929
|
+
:type show_header: bool, optional
|
|
930
|
+
:param hide_health_check_logs: Whether to hide health check logs in info level.
|
|
931
|
+
:type hide_health_check_logs: bool, optional
|
|
932
|
+
:param health_check_endpoints: List of additional endpoints to check health of the app.
|
|
933
|
+
Add your custom endpoints here to be able to manage logging of health check requests on info level with `hide_health_check_logs`.
|
|
934
|
+
:type health_check_endpoints: List[str], optional
|
|
935
|
+
"""
|
|
909
936
|
self._favicon = os.environ.get("icon", "https://cdn.supervisely.com/favicon.ico")
|
|
910
937
|
JinjaWidgets().context["__favicon__"] = self._favicon
|
|
911
938
|
JinjaWidgets().context["__no_html_mode__"] = True
|
|
@@ -980,6 +1007,17 @@ class Application(metaclass=Singleton):
|
|
|
980
1007
|
hot_reload=hot_reload,
|
|
981
1008
|
before_shutdown_callbacks=self._before_shutdown_callbacks,
|
|
982
1009
|
)
|
|
1010
|
+
|
|
1011
|
+
# add filter to hide health check logs for info level
|
|
1012
|
+
if health_check_endpoints is None or len(health_check_endpoints) == 0:
|
|
1013
|
+
self._health_check_endpoints = HEALTH_ENDPOINTS
|
|
1014
|
+
else:
|
|
1015
|
+
health_check_endpoints = [endpoint.strip() for endpoint in health_check_endpoints]
|
|
1016
|
+
self._health_check_endpoints = HEALTH_ENDPOINTS + health_check_endpoints
|
|
1017
|
+
|
|
1018
|
+
if hide_health_check_logs:
|
|
1019
|
+
self._setup_health_check_filter()
|
|
1020
|
+
|
|
983
1021
|
self.test_client = TestClient(self._fastapi)
|
|
984
1022
|
|
|
985
1023
|
if not headless:
|
|
@@ -1126,6 +1164,34 @@ class Application(metaclass=Singleton):
|
|
|
1126
1164
|
def set_ready_check_function(self, func: Callable):
|
|
1127
1165
|
self._ready_check_function = func
|
|
1128
1166
|
|
|
1167
|
+
def _setup_health_check_filter(self):
|
|
1168
|
+
"""Setup filter to hide health check logs for info level."""
|
|
1169
|
+
|
|
1170
|
+
class HealthCheckFilter(logging.Filter):
|
|
1171
|
+
def __init__(self, app_instance):
|
|
1172
|
+
super().__init__()
|
|
1173
|
+
self.app: Application = app_instance
|
|
1174
|
+
|
|
1175
|
+
def filter(self, record):
|
|
1176
|
+
# Hide health check requests if NOT in debug mode
|
|
1177
|
+
if not self.app._fastapi.debug and hasattr(record, "getMessage"):
|
|
1178
|
+
message = record.getMessage()
|
|
1179
|
+
# Check if the message contains health check paths
|
|
1180
|
+
if any(path in message for path in self.app._health_check_endpoints):
|
|
1181
|
+
return False
|
|
1182
|
+
return True
|
|
1183
|
+
|
|
1184
|
+
# Apply filter to uvicorn access logger
|
|
1185
|
+
health_filter = HealthCheckFilter(self)
|
|
1186
|
+
uvicorn_logger = logging.getLogger("uvicorn.access")
|
|
1187
|
+
|
|
1188
|
+
# Remove old filters of this type, if any (for safety)
|
|
1189
|
+
uvicorn_logger.filters = [
|
|
1190
|
+
f for f in uvicorn_logger.filters if not isinstance(f, HealthCheckFilter)
|
|
1191
|
+
]
|
|
1192
|
+
|
|
1193
|
+
uvicorn_logger.addFilter(health_filter)
|
|
1194
|
+
|
|
1129
1195
|
|
|
1130
1196
|
def set_autostart_flag_from_state(default: Optional[str] = None):
|
|
1131
1197
|
"""Set `autostart` flag recieved from task state. Env name: `modal.state.autostart`.
|
|
@@ -64,7 +64,14 @@ class TrainingArtifacts:
|
|
|
64
64
|
self.display_widgets.extend([self.validator_text])
|
|
65
65
|
|
|
66
66
|
# Outputs
|
|
67
|
-
need_generate_report = self.app_options.get("generate_report",
|
|
67
|
+
need_generate_report = self.app_options.get("generate_report", False)
|
|
68
|
+
|
|
69
|
+
# @TODO: temporary code to generate report for dev only
|
|
70
|
+
is_dev = "dev.internal" in api.server_address
|
|
71
|
+
if not is_dev:
|
|
72
|
+
need_generate_report = False
|
|
73
|
+
# ------------------------------------------------------------ #
|
|
74
|
+
|
|
68
75
|
if need_generate_report:
|
|
69
76
|
self.artifacts_thumbnail = ReportThumbnail(
|
|
70
77
|
title="Experiment Report",
|
|
@@ -701,7 +701,6 @@ class TrainApp:
|
|
|
701
701
|
self._generate_model_meta(remote_dir, model_meta)
|
|
702
702
|
self._upload_demo_files(remote_dir)
|
|
703
703
|
|
|
704
|
-
|
|
705
704
|
# Step 10. Generate training output
|
|
706
705
|
output_file_info, experiment_info = self._generate_experiment_output(experiment_info, model_meta, session_link_file_info)
|
|
707
706
|
|
|
@@ -1997,7 +1996,7 @@ class TrainApp:
|
|
|
1997
1996
|
:return: Output file info and experiment info.
|
|
1998
1997
|
:rtype: tuple
|
|
1999
1998
|
"""
|
|
2000
|
-
need_generate_report = self._app_options.get("generate_report",
|
|
1999
|
+
need_generate_report = self._app_options.get("generate_report", False)
|
|
2001
2000
|
# @TODO: temporary code to generate report for dev only
|
|
2002
2001
|
is_dev = "dev.internal" in self._api.server_address
|
|
2003
2002
|
if not is_dev:
|
|
@@ -36,10 +36,10 @@ supervisely/api/import_storage_api.py,sha256=BDCgmR0Hv6OoiRHLCVPKt3iDxSVlQp1WrnK
|
|
|
36
36
|
supervisely/api/issues_api.py,sha256=BqDJXmNoTzwc3xe6_-mA7FDFC5QQ-ahGbXk_HmpkSeQ,17925
|
|
37
37
|
supervisely/api/labeling_job_api.py,sha256=G2_BV_WtA2lAhfw_nAQmWmv1P-pwimD0ba9GVKoGjiA,55537
|
|
38
38
|
supervisely/api/labeling_queue_api.py,sha256=ilNjAL1d9NSa9yabQn6E-W26YdtooT3ZGXIFZtGnAvY,30158
|
|
39
|
-
supervisely/api/module_api.py,sha256
|
|
39
|
+
supervisely/api/module_api.py,sha256=-PVLcsicG47hVj_4vN8cuc0X-gqadsBJTj0ZxQOcO9g,46384
|
|
40
40
|
supervisely/api/object_class_api.py,sha256=7-npNFMYjWNtSXYZg6syc6bX56_oCzDU2kFRPGQWCwA,10399
|
|
41
41
|
supervisely/api/plugin_api.py,sha256=SFm0IlTTOjuHBLUMgG4d4k6U3cWJocE-SVb-f08fwMQ,5286
|
|
42
|
-
supervisely/api/project_api.py,sha256=
|
|
42
|
+
supervisely/api/project_api.py,sha256=5WR4bNIq3eUlAkJga8DP_rYFIXKIU-myDlKNv911ssA,96449
|
|
43
43
|
supervisely/api/project_class_api.py,sha256=5cyjdGPPb2tpttu5WmYoOxUNiDxqiojschkhZumF0KM,1426
|
|
44
44
|
supervisely/api/remote_storage_api.py,sha256=1O4rTIwW8s9gxC00yvFuKbEMGNsa7YSRlZ8j494ARwY,17793
|
|
45
45
|
supervisely/api/report_api.py,sha256=Om7CGulUbQ4BuJ16eDtz7luLe0JQNqab-LoLpUXu7YE,7123
|
|
@@ -99,7 +99,7 @@ supervisely/app/fastapi/index.html,sha256=dz_e-0RE5ZbOU0ToUaEHe1ROI6Tc3SPL-mHt1C
|
|
|
99
99
|
supervisely/app/fastapi/no_html_main.html,sha256=NhQP7noyORBx72lFh1CQKgBRupkWjiq6Gaw-9Hkvg7c,37
|
|
100
100
|
supervisely/app/fastapi/offline.py,sha256=CwMMkJ1frD6wiZS-SEoNDtQ1UJcJe1Ob6ohE3r4CQL8,7414
|
|
101
101
|
supervisely/app/fastapi/request.py,sha256=NU7rKmxJ1pfkDZ7_yHckRcRAueJRQIqCor11UO2OHr8,766
|
|
102
|
-
supervisely/app/fastapi/subapp.py,sha256=
|
|
102
|
+
supervisely/app/fastapi/subapp.py,sha256=JHJOlh6JJ43xA0WEFiH-AQlNf-XLqZmQ0qh0t24Y07w,49260
|
|
103
103
|
supervisely/app/fastapi/templating.py,sha256=pcghBW2OWVrNtplZuYa-mx04ektLiSvnBg-mhmyCoJc,2929
|
|
104
104
|
supervisely/app/fastapi/utils.py,sha256=t_UquzlFrdkKtAJmH6eJ279pE8Aa3BaIu4XjX-SEaIE,946
|
|
105
105
|
supervisely/app/fastapi/websocket.py,sha256=TlRSPOAhRItTv1HGvdukK1ZvhRjMUxRa-lJlsRR9rJw,1308
|
|
@@ -1000,7 +1000,7 @@ supervisely/nn/tracking/__init__.py,sha256=Ld1ed7ZZQZPkhX-5Xr-UbHZx5zLCm2-tInHnP
|
|
|
1000
1000
|
supervisely/nn/tracking/boxmot.py,sha256=H9cQjYGL9nX_TLrfKDChhljTIiE9lffcgbwWCf_4PJU,4277
|
|
1001
1001
|
supervisely/nn/tracking/tracking.py,sha256=WNrNm02B1pspA3d_AmzSJ-54RZTqWV2NZiC7FHe88bo,857
|
|
1002
1002
|
supervisely/nn/training/__init__.py,sha256=gY4PCykJ-42MWKsqb9kl-skemKa8yB6t_fb5kzqR66U,111
|
|
1003
|
-
supervisely/nn/training/train_app.py,sha256=
|
|
1003
|
+
supervisely/nn/training/train_app.py,sha256=c71Y9rV-0qnZ0VsE156HS9Q5Fowg8RoGsItyYFjdyPA,125210
|
|
1004
1004
|
supervisely/nn/training/gui/__init__.py,sha256=Nqnn8clbgv-5l0PgxcTOldg8mkMKrFn4TvPL-rYUUGg,1
|
|
1005
1005
|
supervisely/nn/training/gui/classes_selector.py,sha256=tqmVwUfC2u5K53mZmvDvNOhu9Mw5mddjpB2kxRXXUO8,12453
|
|
1006
1006
|
supervisely/nn/training/gui/gui.py,sha256=RLCVtKefWYPHlPN-U8iyAdPHH6Qvx6HE3fFCqyq3rZ4,49210
|
|
@@ -1009,7 +1009,7 @@ supervisely/nn/training/gui/input_selector.py,sha256=rmirJzpdxuYONI6y5_cvMdGWBJ-
|
|
|
1009
1009
|
supervisely/nn/training/gui/model_selector.py,sha256=Fvsja7n75PzqxDkDhPEkCltYsbAPPRpUxgWgIZCseks,7439
|
|
1010
1010
|
supervisely/nn/training/gui/tags_selector.py,sha256=0yg2OGPqiHUBp3iML2vrzTOVeSKtRtR9JoMy4Snx41U,3755
|
|
1011
1011
|
supervisely/nn/training/gui/train_val_splits_selector.py,sha256=5-Ra-qFG7ki2yFBUa7mST_BbbE_RzPgA3ubP9wTC8oY,16498
|
|
1012
|
-
supervisely/nn/training/gui/training_artifacts.py,sha256=
|
|
1012
|
+
supervisely/nn/training/gui/training_artifacts.py,sha256=u-vuO03YLErBSSkCMxYeijcH4c821ufORz7_5aM2b-0,11129
|
|
1013
1013
|
supervisely/nn/training/gui/training_logs.py,sha256=GgEQMj9p98Z3p2b_-3BkHOhY7WQYELxctsRKmkbg3JY,4966
|
|
1014
1014
|
supervisely/nn/training/gui/training_process.py,sha256=XJ3ELyys_rBFmLQnI9qe3QhmfZ6U0CrK1FbI6d-Fbns,3664
|
|
1015
1015
|
supervisely/nn/training/gui/utils.py,sha256=cEOsYItxgGTGKxFAvn7zQcTpwHgcGRO_UNGBn8idMUI,4983
|
|
@@ -1115,9 +1115,9 @@ supervisely/worker_proto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
|
|
|
1115
1115
|
supervisely/worker_proto/worker_api_pb2.py,sha256=VQfi5JRBHs2pFCK1snec3JECgGnua3Xjqw_-b3aFxuM,59142
|
|
1116
1116
|
supervisely/worker_proto/worker_api_pb2_grpc.py,sha256=3BwQXOaP9qpdi0Dt9EKG--Lm8KGN0C5AgmUfRv77_Jk,28940
|
|
1117
1117
|
supervisely_lib/__init__.py,sha256=7-3QnN8Zf0wj8NCr2oJmqoQWMKKPKTECvjH9pd2S5vY,159
|
|
1118
|
-
supervisely-6.73.
|
|
1119
|
-
supervisely-6.73.
|
|
1120
|
-
supervisely-6.73.
|
|
1121
|
-
supervisely-6.73.
|
|
1122
|
-
supervisely-6.73.
|
|
1123
|
-
supervisely-6.73.
|
|
1118
|
+
supervisely-6.73.413.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
1119
|
+
supervisely-6.73.413.dist-info/METADATA,sha256=9qduIf9cJam5Kfz-s5QNls-wk1xPPVs0N28TOrDRluc,35254
|
|
1120
|
+
supervisely-6.73.413.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
|
|
1121
|
+
supervisely-6.73.413.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
|
|
1122
|
+
supervisely-6.73.413.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
|
|
1123
|
+
supervisely-6.73.413.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|