supervisely 6.73.453__py3-none-any.whl → 6.73.455__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.
@@ -1,7 +1,7 @@
1
1
  from fastapi import FastAPI
2
2
  from supervisely.app.content import StateJson, DataJson
3
3
  from supervisely.app.content import get_data_dir, get_synced_data_dir
4
- from supervisely.app.fastapi.subapp import call_on_autostart
4
+ from supervisely.app.fastapi.subapp import call_on_autostart, session_user_api
5
5
  import supervisely.app.fastapi as fastapi
6
6
  import supervisely.app.widgets as widgets
7
7
  import supervisely.app.development as development
@@ -5,6 +5,7 @@ from supervisely.app.fastapi.subapp import (
5
5
  Application,
6
6
  get_name_from_env,
7
7
  _MainServer,
8
+ session_user_api,
8
9
  )
9
10
  from supervisely.app.fastapi.templating import Jinja2Templates
10
11
  from supervisely.app.fastapi.websocket import WebsocketManager
@@ -19,6 +19,7 @@ import jinja2
19
19
  import numpy as np
20
20
  import psutil
21
21
  from async_asgi_testclient import TestClient
22
+ from cachetools import TTLCache
22
23
  from fastapi import (
23
24
  Depends,
24
25
  FastAPI,
@@ -70,6 +71,9 @@ HEALTH_ENDPOINTS = ["/health", "/is_ready"]
70
71
  # Context variable for response time
71
72
  response_time_ctx: ContextVar[float] = ContextVar("response_time", default=None)
72
73
 
74
+ # Mapping from user_id to Api instance
75
+ _USER_API_CACHE = TTLCache(maxsize=500, ttl=60 * 15) # Cache up to 15 minutes
76
+
73
77
 
74
78
  class ReadyzFilter(logging.Filter):
75
79
  def filter(self, record):
@@ -852,6 +856,10 @@ def _init(
852
856
  request.state.api = Api(
853
857
  request.state.server_address, request.state.api_token
854
858
  )
859
+ if sly_env.is_multiuser_mode_enabled():
860
+ user_id = sly_env.user_from_multiuser_app()
861
+ if user_id is not None:
862
+ _USER_API_CACHE[user_id] = request.state.api
855
863
  else:
856
864
  request.state.api = None
857
865
 
@@ -1306,3 +1314,12 @@ def call_on_autostart(
1306
1314
 
1307
1315
  def get_name_from_env(default="Supervisely App"):
1308
1316
  return os.environ.get("APP_NAME", default)
1317
+
1318
+ def session_user_api() -> Optional[Api]:
1319
+ """Returns the API instance for the current session user."""
1320
+ if not sly_env.is_multiuser_mode_enabled():
1321
+ return Api.from_env()
1322
+ user_id = sly_env.user_from_multiuser_app()
1323
+ if user_id is None:
1324
+ return None
1325
+ return _USER_API_CACHE.get(user_id, None)
@@ -771,7 +771,7 @@ class InferenceImageCache:
771
771
  def _download_many(
772
772
  self,
773
773
  indexes: List[Union[int, str]],
774
- name_cunstructor: Callable[[int], str],
774
+ name_constructor: Callable[[int], str],
775
775
  load_generator: Callable[
776
776
  [List[int]],
777
777
  Generator[Tuple[Union[int, str], np.ndarray], None, None],
@@ -785,23 +785,35 @@ class InferenceImageCache:
785
785
  all_frames = [None for _ in range(len(indexes))]
786
786
 
787
787
  def get_one_image(item):
788
- pos, index = item
788
+ pos, hash_or_id = item
789
789
  if video_id in self._cache:
790
- return pos, self.get_frame_from_cache(video_id, index)
791
- return pos, self._cache.get_image(name_cunstructor(index))
790
+ try:
791
+ frame = self.get_frame_from_cache(video_id, hash_or_id)
792
+ except Exception as e:
793
+ logger.error(f"Error retrieving frame from cache: {e}", exc_info=True)
794
+ ids_to_load.append(hash_or_id)
795
+ return pos, None
796
+ return pos, frame
797
+ try:
798
+ image = self._cache.get_image(name_constructor(hash_or_id))
799
+ except Exception as e:
800
+ logger.error(f"Error retrieving image from cache: {e}", exc_info=True)
801
+ ids_to_load.append(hash_or_id)
802
+ return pos, None
803
+ return pos, image
792
804
 
793
805
  position = 0
794
806
  batch_size = 4
795
807
  for batch in batched(indexes, batch_size):
796
- indexes_to_load = []
808
+ ids_to_load = []
797
809
  items = []
798
810
  for hash_or_id in batch:
799
- name = name_cunstructor(hash_or_id)
811
+ name = name_constructor(hash_or_id)
800
812
  self._wait_if_in_queue(name, logger)
801
813
 
802
814
  if name not in self._cache and video_id not in self._cache:
803
815
  self._load_queue.set(name, hash_or_id)
804
- indexes_to_load.append(hash_or_id)
816
+ ids_to_load.append(hash_or_id)
805
817
  pos_by_name[name] = position
806
818
  elif return_images is True:
807
819
  items.append((position, hash_or_id))
@@ -810,14 +822,16 @@ class InferenceImageCache:
810
822
  if len(items) > 0:
811
823
  with ThreadPoolExecutor(min(64, len(items))) as executor:
812
824
  for pos, image in executor.map(get_one_image, items):
825
+ if image is None:
826
+ continue
813
827
  all_frames[pos] = image
814
828
  if progress_cb is not None:
815
829
  progress_cb()
816
830
 
817
831
  download_time = time.monotonic()
818
- if len(indexes_to_load) > 0:
819
- for id_or_hash, image in load_generator(indexes_to_load):
820
- name = name_cunstructor(id_or_hash)
832
+ if len(ids_to_load) > 0:
833
+ for id_or_hash, image in load_generator(ids_to_load):
834
+ name = name_constructor(id_or_hash)
821
835
  self._add_to_cache(name, image)
822
836
 
823
837
  if return_images:
@@ -828,13 +842,13 @@ class InferenceImageCache:
828
842
  download_time = time.monotonic() - download_time
829
843
 
830
844
  # logger.debug(f"All stored files: {sorted(os.listdir(self.tmp_path))}")
831
- if indexes_to_load:
832
- indexes_to_load = list(indexes_to_load)
845
+ if ids_to_load:
846
+ ids_to_load = list(ids_to_load)
833
847
  logger.debug(
834
- f"Images/Frames added to cache: {indexes_to_load} in {download_time:.2f} sec",
835
- extra={"indexes": indexes_to_load, "download_time": download_time},
848
+ f"Images/Frames added to cache: {ids_to_load} in {download_time:.2f} sec",
849
+ extra={"indexes": ids_to_load, "download_time": download_time},
836
850
  )
837
- found = set(batch).difference(indexes_to_load)
851
+ found = set(batch).difference(ids_to_load)
838
852
  if found:
839
853
  logger.debug(f"Images/Frames found in cache: {list(found)}")
840
854
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: supervisely
3
- Version: 6.73.453
3
+ Version: 6.73.455
4
4
  Summary: Supervisely Python SDK.
5
5
  Home-page: https://github.com/supervisely/supervisely
6
6
  Author: Supervisely
@@ -82,7 +82,7 @@ supervisely/api/volume/volume_api.py,sha256=7mMfKY4HdzrbBvGZFE1SJiRi4OsgDyk3azz4
82
82
  supervisely/api/volume/volume_figure_api.py,sha256=Fs7j3h76kw7EI-o3vJHjpvL4Vxn3Fu-DzhArgK_qrPk,26523
83
83
  supervisely/api/volume/volume_object_api.py,sha256=F7pLV2MTlBlyN6fEKdxBSUatIMGWSuu8bWj3Hvcageo,2139
84
84
  supervisely/api/volume/volume_tag_api.py,sha256=yNGgXz44QBSW2VGlNDOVLqLXnH8Q2fFrxDFb_girYXA,3639
85
- supervisely/app/__init__.py,sha256=4yW79U_xvo7vjg6-vRhjtt0bO8MxMSx2PD8dMamS9Q8,633
85
+ supervisely/app/__init__.py,sha256=Z3RrMZBsaDuvSOqinD5K2rgQsQ-PuydQ1LaXbB4bXc8,651
86
86
  supervisely/app/content.py,sha256=x4EZ3BbqU_nAaoXqbRspebOXDv_b-Smt0TLC6Tk0Yq0,8484
87
87
  supervisely/app/exceptions.py,sha256=w01IUAq7SUu4FJDahTdR9tCoDnbobFQ6huL0uHCWxZs,1370
88
88
  supervisely/app/export_template.py,sha256=_fI8B2Up0luRbRC6NxaJt-c5Z9MeJYh-RzFv0GARKSw,2801
@@ -93,7 +93,7 @@ supervisely/app/widgets_context.py,sha256=JkAd4o87eqhkGJbai-Yq6YHULiPsbp1VwGOSBR
93
93
  supervisely/app/development/__init__.py,sha256=f2SpWBcCFPbSEBsJijH25eCAK8NcY2An5NU9vPgCBVo,135
94
94
  supervisely/app/development/development.py,sha256=Ij3tn7HmkHr2RRoYxlpK9xkTGnpFjZwy2kArn6ZxVnA,12505
95
95
  supervisely/app/development/sly-net.sh,sha256=M-RWQ7kygrJm88WGsOW0tEccO0fDgj_xGLI8Ifm-Ie4,1111
96
- supervisely/app/fastapi/__init__.py,sha256=kNhkaGuBKn9-GNnPOmikIHqhjL-j66xmZaBbjCmXfAo,460
96
+ supervisely/app/fastapi/__init__.py,sha256=ZT7hgv34YNg0CBWHcdvksqXHCcN23f1YdXp-JZd87Ek,482
97
97
  supervisely/app/fastapi/custom_static_files.py,sha256=5todaVIvUG9sAt6vu1IujJn8N7zTmFhVUfeCVbuXbvc,3391
98
98
  supervisely/app/fastapi/dialog_window.html,sha256=ffaAxjK0TQRa7RrY5oA4uE6RzFuS0VnRG1pfoIzTqVM,1183
99
99
  supervisely/app/fastapi/index.html,sha256=dz_e-0RE5ZbOU0ToUaEHe1ROI6Tc3SPL-mHt1CpZTxQ,8793
@@ -101,7 +101,7 @@ supervisely/app/fastapi/multi_user.py,sha256=m8Iy0ibTy85C7JkkovcRbDOirmIaz8BOOmA
101
101
  supervisely/app/fastapi/no_html_main.html,sha256=NhQP7noyORBx72lFh1CQKgBRupkWjiq6Gaw-9Hkvg7c,37
102
102
  supervisely/app/fastapi/offline.py,sha256=CwMMkJ1frD6wiZS-SEoNDtQ1UJcJe1Ob6ohE3r4CQL8,7414
103
103
  supervisely/app/fastapi/request.py,sha256=NU7rKmxJ1pfkDZ7_yHckRcRAueJRQIqCor11UO2OHr8,766
104
- supervisely/app/fastapi/subapp.py,sha256=drAFAlFUOTehDW3Qw1ubRLsLXY1azXBwc9afu3V6ado,51131
104
+ supervisely/app/fastapi/subapp.py,sha256=N5ly1SmAslUlzA2b8NRscaTTYkoubak3xmYkp5er8t4,51854
105
105
  supervisely/app/fastapi/templating.py,sha256=etFkNJKvoWsHrHpmgDUuybZXcLuzS1IBRxvPnZlT9K8,2928
106
106
  supervisely/app/fastapi/utils.py,sha256=t_UquzlFrdkKtAJmH6eJ279pE8Aa3BaIu4XjX-SEaIE,946
107
107
  supervisely/app/fastapi/websocket.py,sha256=2RqHoN7a_qPz8WMDSxCih69yyi11AaMiVtBhsyg4gxg,3953
@@ -905,7 +905,7 @@ supervisely/nn/benchmark/visualization/widgets/sidebar/sidebar.py,sha256=tKPURRS
905
905
  supervisely/nn/benchmark/visualization/widgets/table/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
906
906
  supervisely/nn/benchmark/visualization/widgets/table/table.py,sha256=atmDnF1Af6qLQBUjLhK18RMDKAYlxnsuVHMSEa5a-e8,4319
907
907
  supervisely/nn/inference/__init__.py,sha256=QFukX2ip-U7263aEPCF_UCFwj6EujbMnsgrXp5Bbt8I,1623
908
- supervisely/nn/inference/cache.py,sha256=rfmb1teJ9lNDfisUSh6bwDCVkPZocn8GMvDgLQktnbo,35023
908
+ supervisely/nn/inference/cache.py,sha256=Gdpdfo61j5lxhMVR6YyqXjazJxQxihtKwLPqwVwzFRM,35599
909
909
  supervisely/nn/inference/inference.py,sha256=71E5_DG5He2y9TWu2YN8P9MWz0EwldGJa_7pK6pVp7E,207512
910
910
  supervisely/nn/inference/inference_request.py,sha256=1Tq-OV7bYtr0bKDqvBXh72wpR5Misgk-iQn5waCxtqo,14830
911
911
  supervisely/nn/inference/session.py,sha256=f2Tyvj21oO9AKxqr6_yHZ81Ol-wXC-h5cweTHEoljkg,35796
@@ -1129,9 +1129,9 @@ supervisely/worker_proto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
1129
1129
  supervisely/worker_proto/worker_api_pb2.py,sha256=VQfi5JRBHs2pFCK1snec3JECgGnua3Xjqw_-b3aFxuM,59142
1130
1130
  supervisely/worker_proto/worker_api_pb2_grpc.py,sha256=3BwQXOaP9qpdi0Dt9EKG--Lm8KGN0C5AgmUfRv77_Jk,28940
1131
1131
  supervisely_lib/__init__.py,sha256=yRwzEQmVwSd6lUQoAUdBngKEOlnoQ6hA9ZcoZGJRNC4,331
1132
- supervisely-6.73.453.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
1133
- supervisely-6.73.453.dist-info/METADATA,sha256=Uh7wicYjtwccj5vCA90sExPqWVYzTdf61S2flSm5M9g,35480
1134
- supervisely-6.73.453.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
1135
- supervisely-6.73.453.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
1136
- supervisely-6.73.453.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
1137
- supervisely-6.73.453.dist-info/RECORD,,
1132
+ supervisely-6.73.455.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
1133
+ supervisely-6.73.455.dist-info/METADATA,sha256=K-GHALSmc3eZrjE6ekVhuaMf8cRf-2Zj7ebGcFP3nsE,35480
1134
+ supervisely-6.73.455.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
1135
+ supervisely-6.73.455.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
1136
+ supervisely-6.73.455.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
1137
+ supervisely-6.73.455.dist-info/RECORD,,