sciveo 0.2.76__tar.gz → 0.2.78__tar.gz

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.
Files changed (372) hide show
  1. {sciveo-0.2.76/sciveo.egg-info → sciveo-0.2.78}/PKG-INFO +70 -19
  2. {sciveo-0.2.76 → sciveo-0.2.78}/README.md +69 -18
  3. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/iam/access.py +10 -1
  4. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/__init__.py +2 -0
  5. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/artifact.py +75 -8
  6. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/model.py +547 -48
  7. sciveo-0.2.78/sciveo/ml/images/sciveyolo/runtime_stats.py +168 -0
  8. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/iam.py +14 -13
  9. sciveo-0.2.78/sciveo/version.py +2 -0
  10. {sciveo-0.2.76 → sciveo-0.2.78/sciveo.egg-info}/PKG-INFO +70 -19
  11. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo.egg-info/SOURCES.txt +1 -0
  12. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_iam.py +12 -0
  13. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_ml_sciveyolo.py +361 -9
  14. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_storage_iam.py +177 -0
  15. sciveo-0.2.76/sciveo/version.py +0 -2
  16. {sciveo-0.2.76 → sciveo-0.2.78}/MANIFEST.in +0 -0
  17. {sciveo-0.2.76 → sciveo-0.2.78}/pyproject.toml +0 -0
  18. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/__init__.py +0 -0
  19. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/admin/__init__.py +0 -0
  20. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/admin/cli.py +0 -0
  21. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/admin/config.py +0 -0
  22. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/admin/device.py +0 -0
  23. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/admin/network.py +0 -0
  24. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/admin/server.py +0 -0
  25. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/__init__.py +0 -0
  26. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/base.py +0 -0
  27. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/cli.py +0 -0
  28. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/clients/__init__.py +0 -0
  29. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/clients/anthropic.py +0 -0
  30. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/clients/gemini.py +0 -0
  31. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/clients/groq.py +0 -0
  32. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/clients/hf.py +0 -0
  33. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/clients/ollama.py +0 -0
  34. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/clients/openai.py +0 -0
  35. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/configurations/coder.md +0 -0
  36. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/configurations/ops.md +0 -0
  37. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/configurations/researcher.md +0 -0
  38. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/configurations/reviewer.md +0 -0
  39. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/configurations/tester.md +0 -0
  40. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/console.py +0 -0
  41. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/media.py +0 -0
  42. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/orchestration.py +0 -0
  43. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/render.py +0 -0
  44. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/runtime.py +0 -0
  45. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/specialization.py +0 -0
  46. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/tools/__init__.py +0 -0
  47. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/tools/images.py +0 -0
  48. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/tools/os.py +0 -0
  49. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/tools/web.py +0 -0
  50. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/api/__init__.py +0 -0
  51. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/api/base.py +0 -0
  52. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/api/cli.py +0 -0
  53. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/api/predictors.py +0 -0
  54. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/api/server.py +0 -0
  55. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/api/upload.py +0 -0
  56. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/certification/__init__.py +0 -0
  57. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/certification/cli.py +0 -0
  58. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/certification/evaluator.py +0 -0
  59. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/certification/profiles.py +0 -0
  60. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/certification/renderer.py +0 -0
  61. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/certification/scenarios.py +0 -0
  62. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/chat/__init__.py +0 -0
  63. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/chat/cli.py +0 -0
  64. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/chat/client.py +0 -0
  65. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/chat/crypto.py +0 -0
  66. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/chat/protocol.py +0 -0
  67. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/chat/server.py +0 -0
  68. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/chat/store.py +0 -0
  69. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/chat/ui.py +0 -0
  70. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/cli.py +0 -0
  71. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/common/__init__.py +0 -0
  72. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/common/configuration.py +0 -0
  73. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/common/model.py +0 -0
  74. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/common/optimizers.py +0 -0
  75. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/common/sampling.py +0 -0
  76. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/content/__init__.py +0 -0
  77. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/content/dataset.py +0 -0
  78. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/content/experiment.py +0 -0
  79. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/content/project.py +0 -0
  80. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/content/runner.py +0 -0
  81. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/db/__init__.py +0 -0
  82. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/db/read_table.py +0 -0
  83. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/extensions/__init__.py +0 -0
  84. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/extensions/assets/__init__.py +0 -0
  85. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/extensions/assets/vscode-sciveo-0.1.0.vsix +0 -0
  86. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/extensions/catalog.py +0 -0
  87. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/extensions/cli.py +0 -0
  88. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/help.py +0 -0
  89. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/iam/__init__.py +0 -0
  90. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/iam/identity.py +0 -0
  91. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/iam/policy.py +0 -0
  92. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/log.py +0 -0
  93. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/logger.py +0 -0
  94. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/__init__.py +0 -0
  95. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/__init__.py +0 -0
  96. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/cam.py +0 -0
  97. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/draw.py +0 -0
  98. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/__init__.py +0 -0
  99. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/__init__.py +0 -0
  100. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/asteroid.py +0 -0
  101. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/base_move.py +0 -0
  102. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/circle.py +0 -0
  103. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/game.py +0 -0
  104. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/geometrics.py +0 -0
  105. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/gravity_ball.py +0 -0
  106. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/laser.py +0 -0
  107. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/rocket.py +0 -0
  108. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/space_asteroids.py +0 -0
  109. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/volume_bar.py +0 -0
  110. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/gst_server.py +0 -0
  111. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/motion_detection.py +0 -0
  112. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/nvr.py +0 -0
  113. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/readers.py +0 -0
  114. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/rpi.py +0 -0
  115. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/rtsp.py +0 -0
  116. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/cli.py +0 -0
  117. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/__init__.py +0 -0
  118. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/base.py +0 -0
  119. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/encoders/__init__.py +0 -0
  120. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/encoders/base.py +0 -0
  121. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/encoders/normalizer.py +0 -0
  122. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/nlp/__init__.py +0 -0
  123. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/nlp/search.py +0 -0
  124. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/time_series/__init__.py +0 -0
  125. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/time_series/dataset.py +0 -0
  126. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/time_series/predictor.py +0 -0
  127. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/time_series/trainer.py +0 -0
  128. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/time_series/window_generator.py +0 -0
  129. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/__init__.py +0 -0
  130. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/base.py +0 -0
  131. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/job_daemon.py +0 -0
  132. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/layouts/__init__.py +0 -0
  133. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/layouts/base.py +0 -0
  134. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/local.py +0 -0
  135. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/pipeline.py +0 -0
  136. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/postprocessors/__init__.py +0 -0
  137. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/postprocessors/base.py +0 -0
  138. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/postprocessors/default.py +0 -0
  139. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/__init__.py +0 -0
  140. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/audio/__init__.py +0 -0
  141. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/audio/audio.py +0 -0
  142. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/audio/audio_extractor_process.py +0 -0
  143. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/aws.py +0 -0
  144. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/base.py +0 -0
  145. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/file/__init__.py +0 -0
  146. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/file/archive.py +0 -0
  147. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/__init__.py +0 -0
  148. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/album.py +0 -0
  149. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/album_in_image.py +0 -0
  150. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/depth_esimation.py +0 -0
  151. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/embeddings.py +0 -0
  152. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/filters.py +0 -0
  153. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/generators.py +0 -0
  154. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/histogram.py +0 -0
  155. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/mask.py +0 -0
  156. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/object_detection.py +0 -0
  157. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/resize.py +0 -0
  158. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/segmentation.py +0 -0
  159. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/watermark.py +0 -0
  160. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/media_info.py +0 -0
  161. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/nlp/__init__.py +0 -0
  162. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/nlp/address.py +0 -0
  163. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/qr.py +0 -0
  164. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/sci/__init__.py +0 -0
  165. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/sci/base.py +0 -0
  166. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/sci/dataset.py +0 -0
  167. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/sci/time_series/__init__.py +0 -0
  168. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/sci/time_series/predictor.py +0 -0
  169. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/sci/time_series/trainer.py +0 -0
  170. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/tpu_base.py +0 -0
  171. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/video/__init__.py +0 -0
  172. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/video/generators.py +0 -0
  173. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/video/motion_detection.py +0 -0
  174. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/video/resize.py +0 -0
  175. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/video/video_album.py +0 -0
  176. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/video/video_frames.py +0 -0
  177. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/video/video_resample.py +0 -0
  178. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/queues.py +0 -0
  179. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/server.py +0 -0
  180. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/web/__init__.py +0 -0
  181. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/web/server.py +0 -0
  182. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/tools/__init__.py +0 -0
  183. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/tools/video_interactive.py +0 -0
  184. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/__init__.py +0 -0
  185. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/base.py +0 -0
  186. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/dataset/__init__.py +0 -0
  187. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/dataset/object_detection.py +0 -0
  188. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/energy/__init__.py +0 -0
  189. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/energy/optimization.py +0 -0
  190. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/energy/solar.py +0 -0
  191. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/evaluation/__init__.py +0 -0
  192. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/evaluation/markdown.py +0 -0
  193. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/evaluation/object_detection.py +0 -0
  194. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/__init__.py +0 -0
  195. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/base.py +0 -0
  196. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/description.py +0 -0
  197. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/embeddings.py +0 -0
  198. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/object_detection.py +0 -0
  199. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/engines.py +0 -0
  200. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/evaluate.py +0 -0
  201. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/results.py +0 -0
  202. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/runtime.py +0 -0
  203. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/torch_net.py +0 -0
  204. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/train.py +0 -0
  205. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/train_checkpoint.py +0 -0
  206. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/train_data.py +0 -0
  207. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/train_loss.py +0 -0
  208. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/train_validate.py +0 -0
  209. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/tools.py +0 -0
  210. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/transformers.py +0 -0
  211. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/nlp/__init__.py +0 -0
  212. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/nlp/embeddings.py +0 -0
  213. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/nlp/tokenizers/__init__.py +0 -0
  214. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/nlp/tokenizers/bpe.py +0 -0
  215. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/video/__init__.py +0 -0
  216. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/video/description.py +0 -0
  217. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/__init__.py +0 -0
  218. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/cli.py +0 -0
  219. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/monitor.py +0 -0
  220. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/plant/__init__.py +0 -0
  221. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/plant/ems300.py +0 -0
  222. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/plant/sim.py +0 -0
  223. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/plant/tools.py +0 -0
  224. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/power.py +0 -0
  225. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/start.py +0 -0
  226. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/watchdog/__init__.py +0 -0
  227. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/watchdog/base.py +0 -0
  228. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/watchdog/gateway.py +0 -0
  229. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/watchdog/network.py +0 -0
  230. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/watchdog/privileged.py +0 -0
  231. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/watchdog/process.py +0 -0
  232. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/watchdog/repair.py +0 -0
  233. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/__init__.py +0 -0
  234. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/camera.py +0 -0
  235. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/cli.py +0 -0
  236. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/health.py +0 -0
  237. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/http_server.py +0 -0
  238. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/http_tools.py +0 -0
  239. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/interfaces.py +0 -0
  240. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/l2.py +0 -0
  241. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/modbus/__init__.py +0 -0
  242. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/modbus/discovery.py +0 -0
  243. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/modbus/server.py +0 -0
  244. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/modbus/tools.py +0 -0
  245. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/mqtt.py +0 -0
  246. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/mqtt_server.py +0 -0
  247. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/sniffer.py +0 -0
  248. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/snmp/__init__.py +0 -0
  249. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/snmp/oids.py +0 -0
  250. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/snmp/server.py +0 -0
  251. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/snmp/snapshot.py +0 -0
  252. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/snmp/tools.py +0 -0
  253. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/ssh.py +0 -0
  254. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/tools.py +0 -0
  255. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/notifications/__init__.py +0 -0
  256. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/notifications/base.py +0 -0
  257. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/notifications/slack.py +0 -0
  258. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/notifications/telegram.py +0 -0
  259. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/notifications/viber.py +0 -0
  260. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ops/__init__.py +0 -0
  261. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ops/cli.py +0 -0
  262. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ops/doctor.py +0 -0
  263. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ops/fleet.py +0 -0
  264. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/__init__.py +0 -0
  265. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/auth.py +0 -0
  266. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cli.py +0 -0
  267. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/__init__.py +0 -0
  268. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/client.py +0 -0
  269. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/config.py +0 -0
  270. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/controller.py +0 -0
  271. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/gateway.py +0 -0
  272. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/metadata.py +0 -0
  273. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/node.py +0 -0
  274. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/placement.py +0 -0
  275. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/protocol.py +0 -0
  276. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/repair.py +0 -0
  277. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/server.py +0 -0
  278. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/config.py +0 -0
  279. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cors.py +0 -0
  280. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/filesystem.py +0 -0
  281. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/local.py +0 -0
  282. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/metadata.py +0 -0
  283. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/mutation.py +0 -0
  284. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/policy.py +0 -0
  285. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/process.py +0 -0
  286. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/runtime.py +0 -0
  287. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/s3.py +0 -0
  288. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/server.py +0 -0
  289. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/sync.py +0 -0
  290. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/__init__.py +0 -0
  291. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/array.py +0 -0
  292. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/aws/__init__.py +0 -0
  293. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/aws/priority_queue.py +0 -0
  294. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/aws/s3.py +0 -0
  295. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/cli.py +0 -0
  296. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/common.py +0 -0
  297. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/complexity.py +0 -0
  298. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/compress.py +0 -0
  299. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/configuration.py +0 -0
  300. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/crypto.py +0 -0
  301. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/daemon.py +0 -0
  302. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/draw/__init__.py +0 -0
  303. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/draw/contours.py +0 -0
  304. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/formating.py +0 -0
  305. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/hardware.py +0 -0
  306. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/http.py +0 -0
  307. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/logger.py +0 -0
  308. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/logggin.py +0 -0
  309. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/os.py +0 -0
  310. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/queue.py +0 -0
  311. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/random.py +0 -0
  312. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/remote.py +0 -0
  313. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/simple_counter.py +0 -0
  314. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/sorting.py +0 -0
  315. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/synchronized.py +0 -0
  316. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/timers.py +0 -0
  317. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/totp.py +0 -0
  318. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/web/__init__.py +0 -0
  319. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/web/common.py +0 -0
  320. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo.egg-info/dependency_links.txt +0 -0
  321. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo.egg-info/entry_points.txt +0 -0
  322. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo.egg-info/requires.txt +0 -0
  323. {sciveo-0.2.76 → sciveo-0.2.78}/sciveo.egg-info/top_level.txt +0 -0
  324. {sciveo-0.2.76 → sciveo-0.2.78}/setup.cfg +0 -0
  325. {sciveo-0.2.76 → sciveo-0.2.78}/setup.py +0 -0
  326. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_admin.py +0 -0
  327. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_agents.py +0 -0
  328. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_agents_image_integration.py +0 -0
  329. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_agents_orchestration.py +0 -0
  330. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_api_client.py +0 -0
  331. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_certification.py +0 -0
  332. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_chat.py +0 -0
  333. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_cli_delegation.py +0 -0
  334. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_cli_modules.py +0 -0
  335. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_complexity.py +0 -0
  336. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_compress.py +0 -0
  337. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_configuration.py +0 -0
  338. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_crypto.py +0 -0
  339. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_eval_markdown.py +0 -0
  340. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_extensions_catalog.py +0 -0
  341. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_help.py +0 -0
  342. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_l2.py +0 -0
  343. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_log.py +0 -0
  344. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_media_cli.py +0 -0
  345. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_ml_datasets.py +0 -0
  346. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_ml_energy.py +0 -0
  347. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_modbus.py +0 -0
  348. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_monitor_http.py +0 -0
  349. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_monitoring.py +0 -0
  350. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_network_health.py +0 -0
  351. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_network_interfaces.py +0 -0
  352. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_notifications.py +0 -0
  353. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_ops_doctor_fleet.py +0 -0
  354. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_protocol_emulators_integration.py +0 -0
  355. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_protocol_io.py +0 -0
  356. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_runner.py +0 -0
  357. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_sampling.py +0 -0
  358. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_snmp.py +0 -0
  359. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_sorting.py +0 -0
  360. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_ssh.py +0 -0
  361. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_storage.py +0 -0
  362. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_storage_auth_hardening.py +0 -0
  363. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_storage_cluster.py +0 -0
  364. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_storage_cors.py +0 -0
  365. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_storage_metadata_hardening.py +0 -0
  366. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_tokenizers.py +0 -0
  367. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_totp.py +0 -0
  368. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_watchdog_gateway.py +0 -0
  369. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_watchdog_network.py +0 -0
  370. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_watchdog_privileged.py +0 -0
  371. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_watchdog_repair.py +0 -0
  372. {sciveo-0.2.76 → sciveo-0.2.78}/test/test_watchdog_service.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sciveo
3
- Version: 0.2.76
3
+ Version: 0.2.78
4
4
  Description-Content-Type: text/markdown
5
5
  Provides-Extra: mon
6
6
  Provides-Extra: agent
@@ -933,32 +933,80 @@ SCIVEYOLO.build("detector.pt", "detector-trt.sciveyolo", engine="trt")
933
933
  ```
934
934
 
935
935
  This creates an ONNX payload marked for TensorRT; it does not contain a
936
- compiled TensorRT engine. Loading it never starts a TensorRT build by default.
937
- Sciveo uses a compatible cached TensorRT runtime when one is available for the
938
- incoming tensor shape. If no cached runtime exists, or the cached runtime does
939
- not accept that shape, inference falls back to the artifact's normal ONNX
940
- backend.
936
+ compiled TensorRT engine. New TRT artifacts also embed a native PT fallback,
937
+ including its verified state and architecture metadata. Loading an artifact
938
+ never starts a TensorRT build by default. Sciveo tries every compatible cached
939
+ TensorRT profile for the incoming tensor shape, then uses the configured
940
+ fallback. The default is `pt`; `onnx` and `error` are explicit alternatives:
941
941
 
942
- TensorRT compilation must be explicitly allowed. The incoming batches and
943
- frame sizes determine which runtimes ONNX Runtime builds and caches; no fixed
944
- batch or image dimensions are required by Sciveo:
942
+ ```python
943
+ model = SCIVEYOLO("detector-trt.sciveyolo", device="cuda:0", trt_fallback="pt")
944
+ model = SCIVEYOLO("detector-trt.sciveyolo", device="cuda:0", trt_fallback="onnx")
945
+ model = SCIVEYOLO("detector-trt.sciveyolo", device="cuda:0", trt_fallback="error")
946
+ ```
947
+
948
+ For an older TRT artifact without an embedded PT state, point to a prebuilt PT
949
+ artifact. A raw checkpoint is intentionally rejected because fallback setup
950
+ must not trigger conversion:
945
951
 
946
952
  ```python
947
953
  model = SCIVEYOLO(
954
+ "detector-trt.sciveyolo",
955
+ device="cuda:0",
956
+ trt_fallback="pt",
957
+ trt_fallback_model="detector-pt.sciveyolo",
958
+ )
959
+ ```
960
+
961
+ The equivalent environment options are `SCIVEO_SCIVEYOLO_TRT_FALLBACK` and
962
+ `SCIVEO_SCIVEYOLO_TRT_FALLBACK_PATH`.
963
+
964
+ TensorRT compilation must be explicitly allowed and should run outside the
965
+ production workers. Build the observed batch/image profiles in a one-off
966
+ process:
967
+
968
+ ```python
969
+ builder = SCIVEYOLO(
948
970
  "detector-trt.sciveyolo",
949
971
  device="cuda:0",
950
972
  engine="trt",
951
973
  allow_trt_build=True,
952
974
  )
975
+ builder.compile_trt_profiles([
976
+ {"batch": 16, "imgsz": [320, 640]},
977
+ {"batch": 32, "imgsz": [320, 640]},
978
+ ])
979
+ ```
980
+
981
+ Each shape gets an independent context under `profiles/`, with a verified
982
+ manifest recording the exact NCHW profile. A cross-process lock prevents
983
+ concurrent builders from writing the same cache. Production processes omit
984
+ `allow_trt_build`; `engine="trt"` by itself is always cache-only. They can load
985
+ multiple validated contexts, choose one per batch, and apply the fallback for
986
+ missing or rejected profiles. Partial, legacy engine-only, and invalid contexts
987
+ are never rebuilt implicitly.
988
+
989
+ `allow_trt_build=True` grants permission to `compile_trt_profiles()` but does
990
+ not make `predict()` compile. Ad-hoc build-on-prediction behavior requires the
991
+ additional explicit `trt_build_on_predict=True` option (or
992
+ `SCIVEO_SCIVEYOLO_TRT_BUILD_ON_PREDICT=1`) and is not intended for production
993
+ workers.
994
+
995
+ Inspect runtime coverage and rank profiles worth compiling:
996
+
997
+ ```python
998
+ statistics = model.runtime_statistics()
999
+ print(statistics["trt"]["profile_hits"])
1000
+ print(statistics["fallback"]["profile_candidates"])
1001
+
1002
+ suggested_shapes = [item["shape"] for item in statistics["fallback"]["profile_candidates"][:3]]
1003
+ # Run this only in the separate builder process created above.
1004
+ builder.compile_trt_profiles(suggested_shapes)
953
1005
  ```
954
1006
 
955
- The first run of each new tensor shape may build or update its cached runtime
956
- only in this explicit mode. A cross-process lock prevents concurrent workers
957
- from building the same cache at once. Later processes can reuse a validated,
958
- whole-model TensorRT context without build permission; partial or invalid
959
- contexts use the ONNX fallback. `engine="trt"` by itself remains cache-only,
960
- and automatic engine selection may benchmark a TRT artifact without compiling
961
- it because the same fallback policy applies.
1007
+ Statistics include TRT hit batches/images, runtime rejections, fallback
1008
+ batches/images and rates, reasons, per-shape counts, and loaded profile paths.
1009
+ Pass `reset=True` to return the current snapshot and reset the counters.
962
1010
 
963
1011
  Build-time conversion may use a separate environment with export tooling. The
964
1012
  production runtime only needs the dependencies required by the artifact engine,
@@ -1197,9 +1245,12 @@ Policy evaluation is deliberately small and predictable:
1197
1245
  string, boolean, and null conditions follow AWS identity-policy form.
1198
1246
  - `s3:ListBucket` applies to the bucket ARN and can restrict `s3:prefix` and
1199
1247
  `s3:delimiter`. It is separate from object read and write permission.
1200
- - `s3:GetObject` authorizes both GET and HEAD. `s3:PutObject` authorizes regular,
1201
- presigned, POST, copy-destination, and multipart writes. Copy also requires
1202
- `s3:GetObject` on its source. Tagging, multipart listing/abort, bucket
1248
+ - AWS-compatible `s3:GetObject` authorizes both GET and HEAD. Sciveo additionally
1249
+ accepts `s3:HeadObject` as a policy extension that authorizes HEAD without
1250
+ authorizing GET; boto3 still sends the ordinary S3 `HeadObject` request and
1251
+ requires no client changes. An explicit deny matching either action denies
1252
+ HEAD. `s3:PutObject` authorizes regular, presigned, POST, copy-destination,
1253
+ and multipart writes. Copy also requires `s3:GetObject` on its source. Tagging, multipart listing/abort, bucket
1203
1254
  lifecycle, and bulk deletion retain their distinct S3 actions.
1204
1255
  - Bucket CORS configuration uses the distinct `s3:GetBucketCORS`,
1205
1256
  `s3:PutBucketCORS`, and `s3:DeleteBucketCORS` actions on the bucket ARN.
@@ -909,32 +909,80 @@ SCIVEYOLO.build("detector.pt", "detector-trt.sciveyolo", engine="trt")
909
909
  ```
910
910
 
911
911
  This creates an ONNX payload marked for TensorRT; it does not contain a
912
- compiled TensorRT engine. Loading it never starts a TensorRT build by default.
913
- Sciveo uses a compatible cached TensorRT runtime when one is available for the
914
- incoming tensor shape. If no cached runtime exists, or the cached runtime does
915
- not accept that shape, inference falls back to the artifact's normal ONNX
916
- backend.
912
+ compiled TensorRT engine. New TRT artifacts also embed a native PT fallback,
913
+ including its verified state and architecture metadata. Loading an artifact
914
+ never starts a TensorRT build by default. Sciveo tries every compatible cached
915
+ TensorRT profile for the incoming tensor shape, then uses the configured
916
+ fallback. The default is `pt`; `onnx` and `error` are explicit alternatives:
917
917
 
918
- TensorRT compilation must be explicitly allowed. The incoming batches and
919
- frame sizes determine which runtimes ONNX Runtime builds and caches; no fixed
920
- batch or image dimensions are required by Sciveo:
918
+ ```python
919
+ model = SCIVEYOLO("detector-trt.sciveyolo", device="cuda:0", trt_fallback="pt")
920
+ model = SCIVEYOLO("detector-trt.sciveyolo", device="cuda:0", trt_fallback="onnx")
921
+ model = SCIVEYOLO("detector-trt.sciveyolo", device="cuda:0", trt_fallback="error")
922
+ ```
923
+
924
+ For an older TRT artifact without an embedded PT state, point to a prebuilt PT
925
+ artifact. A raw checkpoint is intentionally rejected because fallback setup
926
+ must not trigger conversion:
921
927
 
922
928
  ```python
923
929
  model = SCIVEYOLO(
930
+ "detector-trt.sciveyolo",
931
+ device="cuda:0",
932
+ trt_fallback="pt",
933
+ trt_fallback_model="detector-pt.sciveyolo",
934
+ )
935
+ ```
936
+
937
+ The equivalent environment options are `SCIVEO_SCIVEYOLO_TRT_FALLBACK` and
938
+ `SCIVEO_SCIVEYOLO_TRT_FALLBACK_PATH`.
939
+
940
+ TensorRT compilation must be explicitly allowed and should run outside the
941
+ production workers. Build the observed batch/image profiles in a one-off
942
+ process:
943
+
944
+ ```python
945
+ builder = SCIVEYOLO(
924
946
  "detector-trt.sciveyolo",
925
947
  device="cuda:0",
926
948
  engine="trt",
927
949
  allow_trt_build=True,
928
950
  )
951
+ builder.compile_trt_profiles([
952
+ {"batch": 16, "imgsz": [320, 640]},
953
+ {"batch": 32, "imgsz": [320, 640]},
954
+ ])
955
+ ```
956
+
957
+ Each shape gets an independent context under `profiles/`, with a verified
958
+ manifest recording the exact NCHW profile. A cross-process lock prevents
959
+ concurrent builders from writing the same cache. Production processes omit
960
+ `allow_trt_build`; `engine="trt"` by itself is always cache-only. They can load
961
+ multiple validated contexts, choose one per batch, and apply the fallback for
962
+ missing or rejected profiles. Partial, legacy engine-only, and invalid contexts
963
+ are never rebuilt implicitly.
964
+
965
+ `allow_trt_build=True` grants permission to `compile_trt_profiles()` but does
966
+ not make `predict()` compile. Ad-hoc build-on-prediction behavior requires the
967
+ additional explicit `trt_build_on_predict=True` option (or
968
+ `SCIVEO_SCIVEYOLO_TRT_BUILD_ON_PREDICT=1`) and is not intended for production
969
+ workers.
970
+
971
+ Inspect runtime coverage and rank profiles worth compiling:
972
+
973
+ ```python
974
+ statistics = model.runtime_statistics()
975
+ print(statistics["trt"]["profile_hits"])
976
+ print(statistics["fallback"]["profile_candidates"])
977
+
978
+ suggested_shapes = [item["shape"] for item in statistics["fallback"]["profile_candidates"][:3]]
979
+ # Run this only in the separate builder process created above.
980
+ builder.compile_trt_profiles(suggested_shapes)
929
981
  ```
930
982
 
931
- The first run of each new tensor shape may build or update its cached runtime
932
- only in this explicit mode. A cross-process lock prevents concurrent workers
933
- from building the same cache at once. Later processes can reuse a validated,
934
- whole-model TensorRT context without build permission; partial or invalid
935
- contexts use the ONNX fallback. `engine="trt"` by itself remains cache-only,
936
- and automatic engine selection may benchmark a TRT artifact without compiling
937
- it because the same fallback policy applies.
983
+ Statistics include TRT hit batches/images, runtime rejections, fallback
984
+ batches/images and rates, reasons, per-shape counts, and loaded profile paths.
985
+ Pass `reset=True` to return the current snapshot and reset the counters.
938
986
 
939
987
  Build-time conversion may use a separate environment with export tooling. The
940
988
  production runtime only needs the dependencies required by the artifact engine,
@@ -1173,9 +1221,12 @@ Policy evaluation is deliberately small and predictable:
1173
1221
  string, boolean, and null conditions follow AWS identity-policy form.
1174
1222
  - `s3:ListBucket` applies to the bucket ARN and can restrict `s3:prefix` and
1175
1223
  `s3:delimiter`. It is separate from object read and write permission.
1176
- - `s3:GetObject` authorizes both GET and HEAD. `s3:PutObject` authorizes regular,
1177
- presigned, POST, copy-destination, and multipart writes. Copy also requires
1178
- `s3:GetObject` on its source. Tagging, multipart listing/abort, bucket
1224
+ - AWS-compatible `s3:GetObject` authorizes both GET and HEAD. Sciveo additionally
1225
+ accepts `s3:HeadObject` as a policy extension that authorizes HEAD without
1226
+ authorizing GET; boto3 still sends the ordinary S3 `HeadObject` request and
1227
+ requires no client changes. An explicit deny matching either action denies
1228
+ HEAD. `s3:PutObject` authorizes regular, presigned, POST, copy-destination,
1229
+ and multipart writes. Copy also requires `s3:GetObject` on its source. Tagging, multipart listing/abort, bucket
1179
1230
  lifecycle, and bulk deletion retain their distinct S3 actions.
1180
1231
  - Bucket CORS configuration uses the distinct `s3:GetBucketCORS`,
1181
1232
  `s3:PutBucketCORS`, and `s3:DeleteBucketCORS` actions on the bucket ARN.
@@ -10,7 +10,7 @@
10
10
  #
11
11
 
12
12
  from sciveo.iam.identity import IAMIdentityStore
13
- from sciveo.iam.policy import IAMAccessRequest, IAMPolicyDecision, IAMPolicyEvaluator
13
+ from sciveo.iam.policy import IAMAccessDenied, IAMAccessRequest, IAMPolicyDecision, IAMPolicyEvaluator
14
14
 
15
15
 
16
16
  class IAMAccessControl:
@@ -37,6 +37,15 @@ class IAMAccessControl:
37
37
  return self.evaluator.require(identity, IAMAccessRequest(action, resource, context))
38
38
  return self.evaluator.require(identity, IAMAccessRequest(action, resource, self.identity_context(identity, context)))
39
39
 
40
+ def require_any(self, identity, actions, resource, context=None):
41
+ decisions = [self.evaluate(identity, action, resource, context=context) for action in actions]
42
+ if any(decision.explicit_deny for decision in decisions):
43
+ raise IAMAccessDenied("Access denied")
44
+ for decision in decisions:
45
+ if decision.allowed:
46
+ return decision
47
+ raise IAMAccessDenied("Access denied")
48
+
40
49
  @staticmethod
41
50
  def identity_context(identity, context=None):
42
51
  result = dict(context or {})
@@ -12,6 +12,7 @@
12
12
  from sciveo.ml.images.sciveyolo.artifact import SCIVEYOLOArtifact
13
13
  from sciveo.ml.images.sciveyolo.model import SCIVEYOLO
14
14
  from sciveo.ml.images.sciveyolo.results import SCIVEYOLOBoxes, SCIVEYOLOResults, SCIVEYOLOTensor
15
+ from sciveo.ml.images.sciveyolo.runtime_stats import SCIVEYOLORuntimeStats
15
16
  from sciveo.ml.images.sciveyolo.train import SCIVEYOLOTrainResult, SCIVEYOLOTrainer
16
17
 
17
18
  __all__ = [
@@ -19,6 +20,7 @@ __all__ = [
19
20
  "SCIVEYOLOArtifact",
20
21
  "SCIVEYOLOBoxes",
21
22
  "SCIVEYOLOResults",
23
+ "SCIVEYOLORuntimeStats",
22
24
  "SCIVEYOLOTensor",
23
25
  "SCIVEYOLOTrainResult",
24
26
  "SCIVEYOLOTrainer",
@@ -141,6 +141,7 @@ class SCIVEYOLOArtifact:
141
141
  def __init__(self, path):
142
142
  self.path = Path(path)
143
143
  self.model_path = self.path
144
+ self.fallback_model_path = None
144
145
  self.metadata = {}
145
146
  if self.path.suffix == self.extension:
146
147
  try:
@@ -161,7 +162,7 @@ class SCIVEYOLOArtifact:
161
162
  package_data = self._prepare_package(extracted_path)
162
163
  if package_data is None:
163
164
  raise ValueError(f"Could not prepare SCIVEYOLO artifact {self.path}")
164
- self.metadata, self.model_path = package_data
165
+ self.metadata, self.model_path, self.fallback_model_path = package_data
165
166
 
166
167
  @contextmanager
167
168
  def locked_package(self):
@@ -171,7 +172,7 @@ class SCIVEYOLOArtifact:
171
172
  extracted_path = self.path.with_name(f"{self.path.name}.unpacked")
172
173
  with _SCIVEYOLOArtifactLock(self._lock_path()):
173
174
  package_data = self._prepare_package(extracted_path)
174
- self.metadata, self.model_path = package_data
175
+ self.metadata, self.model_path, self.fallback_model_path = package_data
175
176
  yield self
176
177
 
177
178
  def _prepare_package(self, extracted_path):
@@ -206,14 +207,26 @@ class SCIVEYOLOArtifact:
206
207
  return None
207
208
  if not self._cached_file_matches(extracted_path, marker.get("model")):
208
209
  return None
209
- metadata, model_path = self._read_extracted_package(extracted_path, verify_model_hash=False)
210
+ metadata, model_path, fallback_model_path = self._read_extracted_package(extracted_path, verify_model_hash=False)
210
211
  model_filename = model_path.relative_to(Path(extracted_path).resolve()).as_posix()
211
212
  if model_filename != marker["model"]["filename"]:
212
213
  return None
213
214
  expected_hash = metadata.get("model", {}).get("sha256")
214
215
  if expected_hash and expected_hash != marker["model"]["sha256"]:
215
216
  return None
216
- return metadata, model_path
217
+ fallback_metadata = metadata.get("fallback")
218
+ marker_fallback = marker.get("fallback")
219
+ if fallback_model_path is None:
220
+ if fallback_metadata is not None or marker_fallback is not None:
221
+ return None
222
+ else:
223
+ fallback_filename = fallback_model_path.relative_to(Path(extracted_path).resolve()).as_posix()
224
+ if not self._cached_file_matches(extracted_path, marker_fallback, expected_filename=fallback_filename):
225
+ return None
226
+ expected_fallback_hash = fallback_metadata.get("sha256")
227
+ if expected_fallback_hash and expected_fallback_hash != marker_fallback["sha256"]:
228
+ return None
229
+ return metadata, model_path, fallback_model_path
217
230
  except (AttributeError, KeyError, OSError, TypeError, UnicodeError, ValueError, zipfile.BadZipFile):
218
231
  return None
219
232
 
@@ -225,7 +238,7 @@ class SCIVEYOLOArtifact:
225
238
  try:
226
239
  self._create_cache_owner(partial_path)
227
240
  self._safe_extract_package(package, partial_path)
228
- metadata, model_path = self._read_extracted_package(partial_path)
241
+ metadata, model_path, fallback_model_path = self._read_extracted_package(partial_path)
229
242
  metadata_path = partial_path / "metadata.json"
230
243
  model_hash = metadata.get("model", {}).get("sha256") or self._sha256(model_path)
231
244
  marker = {
@@ -236,6 +249,7 @@ class SCIVEYOLOArtifact:
236
249
  "filename": model_path.relative_to(partial_path.resolve()).as_posix(),
237
250
  "sha256": model_hash,
238
251
  },
252
+ "fallback": self._cache_file_data(partial_path, fallback_model_path) if fallback_model_path is not None else None,
239
253
  }
240
254
  self._write_private_text(
241
255
  partial_path / self.cache_marker_filename,
@@ -271,7 +285,20 @@ class SCIVEYOLOArtifact:
271
285
  raise FileNotFoundError(f"SCIVEYOLO artifact does not contain a supported model file: {self.path}")
272
286
  if verify_model_hash:
273
287
  self._verify_model_hash(model_path=model_path, metadata=metadata)
274
- return metadata, model_path
288
+ fallback_model_path = None
289
+ fallback_metadata = metadata.get("fallback")
290
+ if fallback_metadata is not None:
291
+ if not isinstance(fallback_metadata, dict):
292
+ raise ValueError(f"SCIVEYOLO artifact fallback metadata is not an object: {self.path}")
293
+ fallback_filename = fallback_metadata.get("filename")
294
+ if not fallback_filename:
295
+ raise ValueError(f"SCIVEYOLO artifact fallback metadata has no filename: {self.path}")
296
+ fallback_model_path = self._safe_package_path(base_path, fallback_filename)
297
+ if not fallback_model_path.is_file() or fallback_model_path.is_symlink():
298
+ raise FileNotFoundError(f"SCIVEYOLO artifact fallback model is missing: {fallback_model_path}")
299
+ if verify_model_hash:
300
+ self._verify_fallback_hash(fallback_model_path, fallback_metadata)
301
+ return metadata, model_path, fallback_model_path
275
302
 
276
303
  @staticmethod
277
304
  def _package_signature(package):
@@ -420,6 +447,14 @@ class SCIVEYOLOArtifact:
420
447
  if actual != expected:
421
448
  raise ValueError(f"SCIVEYOLO artifact model hash mismatch for {self.path}")
422
449
 
450
+ def _verify_fallback_hash(self, fallback_model_path, fallback_metadata):
451
+ expected = fallback_metadata.get("sha256")
452
+ if not expected:
453
+ return
454
+ actual = self._sha256(fallback_model_path)
455
+ if actual != expected:
456
+ raise ValueError(f"SCIVEYOLO artifact fallback model hash mismatch for {self.path}")
457
+
423
458
  @classmethod
424
459
  def build(cls, source, output, imgsz=640, export_command=None, env=None, extra_args=None, format=None, dynamic=True, engine="pt", device=None, verbose=False):
425
460
  engine = cls._normalize_engine(engine if format is None else format)
@@ -486,6 +521,31 @@ class SCIVEYOLOArtifact:
486
521
  raise FileNotFoundError(f"SCIVEYOLO export did not create {model_path}")
487
522
 
488
523
  metadata = cls._export_metadata(model_path)
524
+ fallback_model_path = None
525
+ fallback_metadata = None
526
+ if format == "trt":
527
+ fallback_model_path = build_path / "fallback_model_state.pt"
528
+ checkpoint = cls._load_pt_checkpoint(copied_source)
529
+ checkpoint_model = cls._checkpoint_model(checkpoint)
530
+ state_dict = cls._checkpoint_state_dict(checkpoint_model)
531
+ names = cls._checkpoint_names(checkpoint, checkpoint_model)
532
+ nc = len(names) if names else cls._state_dict_nc(state_dict)
533
+ scale = cls._checkpoint_scale(checkpoint_model)
534
+ cls._save_state_dict(fallback_model_path, state_dict)
535
+ metadata.update({
536
+ "scale": scale,
537
+ "model_size": scale,
538
+ "variant": f"sciveyolo{scale}",
539
+ "names": names,
540
+ "nc": nc,
541
+ "stride": cls._checkpoint_stride(checkpoint_model),
542
+ })
543
+ fallback_metadata = {
544
+ "engine": "pt",
545
+ "runtime": "torch-native",
546
+ "filename": "fallback_model_state.pt",
547
+ "sha256": cls._sha256(fallback_model_path),
548
+ }
489
549
  runtime = {
490
550
  "onnx": "onnxruntime",
491
551
  "trt": "onnxruntime-tensorrt",
@@ -511,7 +571,9 @@ class SCIVEYOLOArtifact:
511
571
  "sha256": cls._sha256(model_path),
512
572
  },
513
573
  })
514
- return cls._write_package(output, model_path, metadata)
574
+ if fallback_metadata is not None:
575
+ metadata["fallback"] = fallback_metadata
576
+ return cls._write_package(output, model_path, metadata, fallback_model_path=fallback_model_path)
515
577
 
516
578
  @classmethod
517
579
  def _build_pt(cls, source, output, imgsz=640):
@@ -555,11 +617,16 @@ class SCIVEYOLOArtifact:
555
617
  return cls._write_package(output, state_path, metadata)
556
618
 
557
619
  @classmethod
558
- def _write_package(cls, output, model_path, metadata):
620
+ def _write_package(cls, output, model_path, metadata, fallback_model_path=None):
559
621
  output = Path(output)
560
622
  output.parent.mkdir(parents=True, exist_ok=True)
561
623
  with zipfile.ZipFile(output, "w", compression=zipfile.ZIP_DEFLATED) as package:
562
624
  package.write(model_path, metadata["model"]["filename"])
625
+ if fallback_model_path is not None:
626
+ fallback_filename = metadata.get("fallback", {}).get("filename")
627
+ if not fallback_filename:
628
+ raise ValueError("SCIVEYOLO fallback model requires metadata with a filename")
629
+ package.write(fallback_model_path, fallback_filename)
563
630
  package.writestr("metadata.json", json.dumps(metadata, indent=2, sort_keys=True))
564
631
  return str(output)
565
632