3lc-compute-plugin-insights 0.2.0__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 (215) hide show
  1. 3lc_compute_plugin_insights-0.2.0/.github/workflows/ci.yml +79 -0
  2. 3lc_compute_plugin_insights-0.2.0/.github/workflows/release.yml +63 -0
  3. 3lc_compute_plugin_insights-0.2.0/.gitignore +13 -0
  4. 3lc_compute_plugin_insights-0.2.0/CHANGELOG.md +27 -0
  5. 3lc_compute_plugin_insights-0.2.0/CLAUDE.md +97 -0
  6. 3lc_compute_plugin_insights-0.2.0/LICENSE +10 -0
  7. 3lc_compute_plugin_insights-0.2.0/PKG-INFO +23 -0
  8. 3lc_compute_plugin_insights-0.2.0/README.md +53 -0
  9. 3lc_compute_plugin_insights-0.2.0/pyproject.toml +132 -0
  10. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/__init__.py +235 -0
  11. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/Enums.py +55 -0
  12. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/MyWorkflow.json +131 -0
  13. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/MyWorkflow.py +89 -0
  14. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/ReadMe.md +182 -0
  15. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/TweakPropertySetup.py +52 -0
  16. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/TweakPropertySetups.py +228 -0
  17. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/UnitTests.py +459 -0
  18. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/WeakObjectReference.py +26 -0
  19. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/WorkflowAnnotation.py +66 -0
  20. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/WorkflowStep.py +110 -0
  21. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/WorkflowSteps.py +898 -0
  22. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/WorkflowTransition.py +54 -0
  23. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/WorkflowTransitions.py +312 -0
  24. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/__init__.py +67 -0
  25. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/_common.py +85 -0
  26. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/box_matching.py +640 -0
  27. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/lineage.py +337 -0
  28. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/mask_matching.py +438 -0
  29. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/plugin.toml +23 -0
  30. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/routes.py +2763 -0
  31. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/run_comparison.py +4830 -0
  32. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/run_comparison_pose.py +468 -0
  33. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/run_comparison_semseg.py +1417 -0
  34. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/run_stats.py +875 -0
  35. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/__init__.py +9 -0
  36. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/base.py +353 -0
  37. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/context.py +124 -0
  38. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/handlers/__init__.py +9 -0
  39. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/handlers/classification.py +84 -0
  40. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/handlers/detection.py +104 -0
  41. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/handlers/keypoints.py +172 -0
  42. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/handlers/segmentation.py +110 -0
  43. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/handlers/semantic_segmentation.py +107 -0
  44. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/health_score.py +109 -0
  45. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/__init__.py +98 -0
  46. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/classification/__init__.py +31 -0
  47. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/classification/calibration.py +197 -0
  48. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/classification/class_balance.py +128 -0
  49. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/classification/class_disparity.py +238 -0
  50. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/classification/confident_mistakes.py +173 -0
  51. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/classification/loss_outliers.py +245 -0
  52. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/classification/systematic_confusions.py +208 -0
  53. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/__init__.py +41 -0
  54. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/avg_iou.py +181 -0
  55. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/bb_aspect_ratio_outliers.py +214 -0
  56. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/bb_size_outliers.py +204 -0
  57. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/class_balance.py +132 -0
  58. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/class_disparity.py +164 -0
  59. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/duplicate_boxes.py +125 -0
  60. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/edge_boxes.py +155 -0
  61. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/fn_rate.py +261 -0
  62. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/fp_rate.py +238 -0
  63. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/incorrect_class.py +262 -0
  64. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/iou_vs_confidence.py +232 -0
  65. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/missing_annotations.py +236 -0
  66. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/keypoints/__init__.py +72 -0
  67. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/keypoints/duplicate_instances.py +131 -0
  68. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/keypoints/fn_rate.py +193 -0
  69. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/keypoints/fp_rate.py +229 -0
  70. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/keypoints/mean_oks.py +265 -0
  71. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/keypoints/missing_annotations.py +227 -0
  72. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/keypoints/oks_confidence.py +242 -0
  73. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/keypoints/per_joint.py +190 -0
  74. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/keypoints/size_performance.py +181 -0
  75. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/keypoints/skeleton_plausibility.py +215 -0
  76. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/__init__.py +47 -0
  77. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/avg_iou.py +178 -0
  78. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/class_balance.py +111 -0
  79. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/class_disparity.py +162 -0
  80. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/duplicate_masks.py +113 -0
  81. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/edge_masks.py +158 -0
  82. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/fn_rate.py +248 -0
  83. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/fp_rate.py +247 -0
  84. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/incorrect_class.py +270 -0
  85. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/iou_vs_confidence.py +227 -0
  86. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/mask_shape_review.py +258 -0
  87. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/mask_size_outliers.py +198 -0
  88. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/missing_annotations.py +232 -0
  89. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/semantic_segmentation/__init__.py +57 -0
  90. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/semantic_segmentation/annotation_speckle.py +114 -0
  91. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/semantic_segmentation/boundary_quality.py +121 -0
  92. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/semantic_segmentation/class_balance.py +129 -0
  93. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/semantic_segmentation/class_disparity.py +153 -0
  94. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/semantic_segmentation/mean_iou.py +130 -0
  95. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/semantic_segmentation/systematic_confusions.py +203 -0
  96. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/semantic_segmentation/unlabeled_regions.py +181 -0
  97. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/semantic_segmentation/void_coverage.py +111 -0
  98. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/semantic_segmentation/worst_images.py +152 -0
  99. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/__init__.py +9 -0
  100. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/classification/__init__.py +9 -0
  101. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/classification/confusion_matrix.py +50 -0
  102. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/classification/per_class_metrics.py +254 -0
  103. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/detection/__init__.py +9 -0
  104. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/detection/annotation_quality.py +242 -0
  105. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/detection/bb_analysis.py +193 -0
  106. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/detection/confidence_curve.py +201 -0
  107. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/detection/confusion_matrix.py +156 -0
  108. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/detection/iou_confidence.py +145 -0
  109. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/detection/iou_matching.py +420 -0
  110. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/detection/per_class_metrics.py +235 -0
  111. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/keypoints/__init__.py +54 -0
  112. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/keypoints/annotation_quality.py +217 -0
  113. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/keypoints/extraction.py +229 -0
  114. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/keypoints/oks_confidence.py +139 -0
  115. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/keypoints/oks_metrics.py +281 -0
  116. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/keypoints/per_joint.py +95 -0
  117. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/keypoints/size_analysis.py +133 -0
  118. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/keypoints/skeleton.py +280 -0
  119. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/segmentation/__init__.py +10 -0
  120. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/segmentation/annotation_quality.py +248 -0
  121. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/segmentation/confidence_curve.py +172 -0
  122. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/segmentation/confusion_matrix.py +154 -0
  123. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/segmentation/iou_confidence.py +143 -0
  124. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/segmentation/iou_matching.py +452 -0
  125. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/segmentation/mask_analysis.py +263 -0
  126. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/segmentation/per_class_metrics.py +248 -0
  127. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/semantic_segmentation/__init__.py +47 -0
  128. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/semantic_segmentation/boundary.py +126 -0
  129. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/semantic_segmentation/calibration.py +134 -0
  130. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/semantic_segmentation/components.py +154 -0
  131. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/semantic_segmentation/confusion_matrix.py +72 -0
  132. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/semantic_segmentation/extraction.py +381 -0
  133. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/semantic_segmentation/per_class_metrics.py +148 -0
  134. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/registry.py +52 -0
  135. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/utils.py +229 -0
  136. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/utils_keypoints.py +803 -0
  137. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/utils_segmentation.py +254 -0
  138. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/utils_semantic.py +314 -0
  139. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/table_selection.py +100 -0
  140. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/ui.html +5841 -0
  141. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/__init__.py +717 -0
  142. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/aspect_ratio_outliers.json +497 -0
  143. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/aspect_ratio_outliers.py +510 -0
  144. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/avg_iou.json +771 -0
  145. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/avg_iou.py +605 -0
  146. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/cls_calibration.json +583 -0
  147. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/cls_calibration.py +442 -0
  148. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/cls_class_disparity.json +323 -0
  149. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/cls_class_disparity.py +292 -0
  150. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/cls_confident_mistakes.json +517 -0
  151. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/cls_confident_mistakes.py +383 -0
  152. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/cls_loss_outliers.json +378 -0
  153. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/cls_loss_outliers.py +318 -0
  154. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/cls_systematic_confusions.json +499 -0
  155. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/cls_systematic_confusions.py +381 -0
  156. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/edge_boxes.json +483 -0
  157. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/edge_boxes.py +415 -0
  158. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/edge_masks.json +526 -0
  159. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/edge_masks.py +444 -0
  160. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/fn_rate.json +579 -0
  161. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/fn_rate.py +440 -0
  162. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/fp_rate.json +579 -0
  163. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/fp_rate.py +513 -0
  164. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/fp_rate_nms.json +618 -0
  165. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/incorrect_class.json +578 -0
  166. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/incorrect_class.py +447 -0
  167. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/iou_confidence.json +597 -0
  168. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/iou_confidence.py +449 -0
  169. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/kp_fn_rate.py +361 -0
  170. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/kp_fp_rate.py +404 -0
  171. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/kp_mean_oks.py +437 -0
  172. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/kp_missing_annotations.py +400 -0
  173. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/kp_oks_confidence.py +366 -0
  174. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/kp_per_joint.py +489 -0
  175. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/kp_skeleton.py +336 -0
  176. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/mask_shape_review.json +655 -0
  177. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/mask_shape_review.py +613 -0
  178. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/mask_size_outliers.json +738 -0
  179. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/mask_size_outliers.py +609 -0
  180. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/missing_annotations.json +540 -0
  181. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/missing_annotations.py +467 -0
  182. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/seg_avg_iou.py +605 -0
  183. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/seg_fn_rate.py +441 -0
  184. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/seg_fp_rate.py +514 -0
  185. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/seg_incorrect_class.py +448 -0
  186. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/seg_iou_confidence.py +450 -0
  187. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/seg_missing_annotations.py +466 -0
  188. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/semseg_systematic_confusions.py +423 -0
  189. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/semseg_unlabeled_regions.py +473 -0
  190. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/semseg_worst_images.py +468 -0
  191. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/size_outliers.json +552 -0
  192. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/size_outliers.py +518 -0
  193. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_table_insights/__init__.py +328 -0
  194. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_table_insights/plugin.toml +26 -0
  195. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_table_insights/routes.py +88 -0
  196. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_table_insights/table_stats.py +753 -0
  197. 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_table_insights/ui.html +787 -0
  198. 3lc_compute_plugin_insights-0.2.0/tests/__init__.py +10 -0
  199. 3lc_compute_plugin_insights-0.2.0/tests/conftest.py +82 -0
  200. 3lc_compute_plugin_insights-0.2.0/tests/test_keypoints_annotation_quality.py +463 -0
  201. 3lc_compute_plugin_insights-0.2.0/tests/test_keypoints_confidence.py +243 -0
  202. 3lc_compute_plugin_insights-0.2.0/tests/test_keypoints_oks.py +297 -0
  203. 3lc_compute_plugin_insights-0.2.0/tests/test_keypoints_routing.py +310 -0
  204. 3lc_compute_plugin_insights-0.2.0/tests/test_keypoints_skeleton.py +237 -0
  205. 3lc_compute_plugin_insights-0.2.0/tests/test_metrics_delta_grading.py +210 -0
  206. 3lc_compute_plugin_insights-0.2.0/tests/test_pose_comparison_outcomes.py +508 -0
  207. 3lc_compute_plugin_insights-0.2.0/tests/test_pose_revision_diff.py +200 -0
  208. 3lc_compute_plugin_insights-0.2.0/tests/test_run_comparison_dispatch.py +218 -0
  209. 3lc_compute_plugin_insights-0.2.0/tests/test_semantic_seg_comparison.py +760 -0
  210. 3lc_compute_plugin_insights-0.2.0/tests/test_semantic_seg_insights.py +483 -0
  211. 3lc_compute_plugin_insights-0.2.0/tests/test_semantic_seg_operations.py +593 -0
  212. 3lc_compute_plugin_insights-0.2.0/tests/test_semantic_seg_routing.py +198 -0
  213. 3lc_compute_plugin_insights-0.2.0/tests/test_table_insights_semseg_routing.py +224 -0
  214. 3lc_compute_plugin_insights-0.2.0/tests/test_workflow_install_urls.py +127 -0
  215. 3lc_compute_plugin_insights-0.2.0/uv.lock +1968 -0
@@ -0,0 +1,79 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [main]
6
+ push:
7
+ branches: [main]
8
+ workflow_call: # reused as the gate by release.yml
9
+
10
+ concurrency:
11
+ group: ci-${{ github.ref }}
12
+ cancel-in-progress: true
13
+
14
+ jobs:
15
+ ruff:
16
+ name: ruff (lint + format)
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+
21
+ - name: Install uv
22
+ uses: astral-sh/setup-uv@v5
23
+ with:
24
+ version: "0.8.15"
25
+
26
+ # Ruff runs STANDALONE (uvx): linting must not require resolving the per-plugin
27
+ # dependency stacks — that would be slow and need extra indexes. Config lives in
28
+ # pyproject [tool.ruff]; pin matches 3lc-compute-plugin-sdk.
29
+ - name: Ruff lint
30
+ run: uvx --from 'ruff>=0.15,<0.16' ruff check .
31
+
32
+ - name: Ruff format check
33
+ run: uvx --from 'ruff>=0.15,<0.16' ruff format --check .
34
+
35
+ lockfile:
36
+ name: lockfile check
37
+ runs-on: ubuntu-latest
38
+ steps:
39
+ - uses: actions/checkout@v4
40
+
41
+ - name: Install uv
42
+ uses: astral-sh/setup-uv@v5
43
+ with:
44
+ version: "0.8.15"
45
+
46
+ - name: Verify lockfile is up to date
47
+ run: uv lock --check
48
+
49
+ test:
50
+ name: pytest
51
+ runs-on: ubuntu-latest
52
+ steps:
53
+ - uses: actions/checkout@v4
54
+
55
+ - name: Install uv
56
+ uses: astral-sh/setup-uv@v5
57
+ with:
58
+ version: "0.8.15"
59
+
60
+ - name: Set up Python
61
+ uses: actions/setup-python@v5
62
+ with:
63
+ python-version: "3.12"
64
+
65
+ - name: Install base deps + dev group
66
+ run: uv sync --group dev
67
+
68
+ - name: Run tests
69
+ run: uv run pytest -v
70
+ env:
71
+ # The suite imports the released `3lc` wheel, which validates an API key against
72
+ # the account service at import time — there is no offline bypass in released
73
+ # wheels. CI authenticates the same way the 3lc-ultralytics suite does: the
74
+ # org-level testing key plus the environment-redirection pairs (secret-named env
75
+ # vars that point the wheel at the environment the key belongs to). The tests
76
+ # touch only local data.
77
+ TLC_API_KEY: ${{ secrets.TLC_API_KEY }}
78
+ ${{ secrets.DEFAULT_TESTING_RUNTIME_NAME }}: ${{ secrets.DEFAULT_TESTING_RUNTIME_VALUE }}
79
+ ${{ secrets.DEFAULT_TESTING_S_ENV_NAME }}: ${{ secrets.DEFAULT_TESTING_S_ENV_VALUE }}
@@ -0,0 +1,63 @@
1
+ name: Release
2
+
3
+ # Tag (`v*`) pushes publish to public PyPI via Trusted Publishing (GitHub OIDC, no secrets —
4
+ # works from this private repo). To cut a release: bump `version` in pyproject.toml AND every
5
+ # plugin's plugin.toml (they move together), regenerate uv.lock, update CHANGELOG.md, commit,
6
+ # then push a tag `vX.Y.Z` that matches the version.
7
+ #
8
+ # NOTE: `uv build --no-sources` builds the WHEEL only — it does not resolve or install the
9
+ # per-plugin dependency stacks. The wheel's metadata carries the SDK pin, resolved from PyPI
10
+ # at install time.
11
+
12
+ on:
13
+ push:
14
+ tags: ["v*"]
15
+
16
+ jobs:
17
+ # Gate the release on the full CI suite (ruff · lockfile · pytest).
18
+ test:
19
+ uses: ./.github/workflows/ci.yml
20
+ secrets: inherit
21
+
22
+ publish-pypi:
23
+ needs: test
24
+ runs-on: ubuntu-latest
25
+ environment: release
26
+ permissions:
27
+ contents: read
28
+ id-token: write # OIDC token for PyPI Trusted Publishing
29
+ steps:
30
+ - uses: actions/checkout@v4
31
+
32
+ - name: Install uv
33
+ uses: astral-sh/setup-uv@v5
34
+ with:
35
+ version: "0.8.15"
36
+
37
+ - name: Verify tag matches pyproject version
38
+ run: |
39
+ PKG=$(uv version --output-format json | jq -r '.version')
40
+ TAG="${GITHUB_REF_NAME#v}"
41
+ echo "pyproject=$PKG tag=$TAG"
42
+ [ "$PKG" = "$TAG" ] || { echo "::error::tag $GITHUB_REF_NAME ($TAG) != pyproject version $PKG"; exit 1; }
43
+
44
+ # The version a plugin card reports comes from its manifest; a tag with drifting
45
+ # manifests would ship plugins that misreport their own release.
46
+ - name: Verify plugin manifests match pyproject version
47
+ run: |
48
+ PKG=$(uv version --output-format json | jq -r '.version')
49
+ FAIL=0
50
+ for MANIFEST in src/*/plugin.toml; do
51
+ V=$(grep -Po '^version\s*=\s*"\K[^"]+' "$MANIFEST")
52
+ echo "$MANIFEST: $V"
53
+ [ "$V" = "$PKG" ] || { echo "::error::$MANIFEST version $V != pyproject version $PKG"; FAIL=1; }
54
+ done
55
+ exit $FAIL
56
+
57
+ # --no-sources strips [tool.uv.sources] so the released wheel never bakes in a dev
58
+ # index/path override (the published artifact resolves deps from PyPI).
59
+ - name: Build
60
+ run: uv build --no-sources
61
+
62
+ - name: Publish to PyPI
63
+ run: uv publish --trusted-publishing always
@@ -0,0 +1,13 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
+ build/
5
+ dist/
6
+ .venv/
7
+ venv/
8
+ .mypy_cache/
9
+ .ruff_cache/
10
+ .pytest_cache/
11
+ .vscode/
12
+ .idea/
13
+ .DS_Store
@@ -0,0 +1,27 @@
1
+ # Changelog
2
+
3
+ All notable changes to `3lc-compute-plugin-insights` (the distribution of 3LC's insights plugins
4
+ for the 3LC compute service) are documented in this file.
5
+
6
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
7
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
8
+
9
+ ## [Unreleased]
10
+
11
+ Nothing yet.
12
+
13
+ ## [0.2.0] - 2026-08-21
14
+
15
+ ### Added
16
+ - Initial release: `run-insights` and `table-insights` extracted from the compute service host
17
+ (`3lc-compute`), where they were the last two in-tree `host`-isolation plugins. Both now ship
18
+ as `venv`-isolated plugins of this standalone distribution, provisioned from the
19
+ `[run_insights]` / `[table_insights]` extras. Plugin ids, UI metadata, and behavior are
20
+ unchanged; the import packages are `tlc_plugin_run_insights` / `tlc_plugin_table_insights`
21
+ (fleet naming), and the `python_workflow_builder` helper is vendored inside
22
+ `tlc_plugin_run_insights/_vendor/`.
23
+ - The insights-domain test suite moved along with the code (keypoints/OKS, pose and
24
+ semantic-segmentation comparisons, metrics-delta grading, routing, and workflow-install URL
25
+ tests).
26
+ - CI (ruff lint/format, `uv lock --check`, pytest) and a tag-driven PyPI Trusted Publishing
27
+ release workflow, following the plugin-fleet shape. Version 0.2.0 matches the fleet cadence.
@@ -0,0 +1,97 @@
1
+ # 3lc-compute-plugin-insights — agent & contributor orientation
2
+
3
+ This repo is 3LC's **proprietary** insights-plugin collection for the 3LC compute service,
4
+ packaged as a single distribution `3lc-compute-plugin-insights`, built against the public
5
+ [`3lc-compute-plugin-sdk`](https://github.com/3lc-ai/3lc-compute-plugin-sdk). It follows the
6
+ umbrella shape of `3lc-compute-plugins` (multi-plugin, one dist) but is NOT part of the open
7
+ fleet: the repo is private, the license is proprietary (see `LICENSE`), and source files carry
8
+ the 3LC all-rights-reserved header — never the fleet's Apache SPDX header.
9
+
10
+ ## Layout
11
+
12
+ ```
13
+ pyproject.toml # the one distribution: 3lc-compute-plugin-insights
14
+ src/
15
+ tlc_plugin_run_insights/ # run statistics, health scores, run comparisons
16
+ __init__.py # the plugin class — behavior only
17
+ plugin.toml # manifest — host reads it WITHOUT importing (id, ui, runtime.*)
18
+ statistics/ # modality handlers, operations, insight cards
19
+ workflows/ # dashboard-workflow generators + runtime install helpers
20
+ _vendor/ # vendored python_workflow_builder (mirrored from tlc-ui)
21
+ ui.html, ...
22
+ tlc_plugin_table_insights/ # dataset-quality analysis; imports run_insights internals (same dist)
23
+ tests/ # insights-domain suite (moved from 3lc-compute with the code)
24
+ ```
25
+
26
+ One `pyproject.toml` declares both plugins:
27
+ - **base `dependencies`** = the SDK floor ONLY (`3lc-compute-plugin-sdk[shared]`). Both plugins are
28
+ `venv`-isolated, so NO plugin deps live in the base — this distribution is never installed into
29
+ the host venv.
30
+ - **per-plugin extras** (`[run_insights]` / `[table_insights]`) = each plugin's deps, installed
31
+ ONLY into that plugin's provisioned venv (named by the manifest's `runtime.provision_extra`).
32
+ - **`[project.entry-points."tlc_compute.plugins"]`** = one entry per plugin, supporting the
33
+ optional installed-package discovery path. The primary path is a **folder Source** pointed at
34
+ `src/`.
35
+
36
+ ## The rules — do not break these
37
+
38
+ 1. **Touch the host only through the SDK.** A plugin imports `tlc_plugin_sdk` and nothing from
39
+ `tlc_compute` (the host). The mental test: *could this build against just the SDK wheel, with
40
+ the host source deleted?* It must.
41
+ 2. **Every plugin's deps are its own venv, never the host venv.**
42
+ 3. **Metadata lives in `plugin.toml`, not on the class.** No `register()` at import; the class is
43
+ behavior-only.
44
+ 4. **Custom events / routes are plugin-private.** Use the generic job channel for anything the
45
+ shell renders; `ctx.emit` + your own `ui.html` for plugin-specific UI.
46
+ 5. **Proprietary headers stay.** Every source file keeps the 3LC "All rights reserved" copyright
47
+ block; new files get the same block with the current year. Do not add SPDX/Apache headers.
48
+
49
+ ## Cross-package note
50
+
51
+ `tlc_plugin_table_insights` imports `tlc_plugin_run_insights` internals (comparison and
52
+ statistics modules). That's fine within this one distribution — both packages install together —
53
+ but it means the `table_insights` extra mirrors `run_insights`' deps.
54
+
55
+ ## The vendored workflow builder
56
+
57
+ `tlc_plugin_run_insights/_vendor/python_workflow_builder/` is a vendored copy of the tlc-ui
58
+ repo's helper for building dashboard `UserDefinedWorkflow` JSONs.
59
+ `workflows/__init__.py` injects it onto `sys.path` at import. It is excluded from ruff; don't
60
+ edit it here — re-mirror from tlc-ui if it needs updating.
61
+
62
+ ## Versioning
63
+
64
+ The **distribution** versions as a whole (`[project] version`), and every `plugin.toml` `version`
65
+ must match it — release.yml enforces this at tag time. SemVer; version cadence follows the
66
+ plugin fleet. To cut a release: bump `pyproject.toml` + both manifests, `uv lock`, update
67
+ CHANGELOG.md, commit, tag `vX.Y.Z` — CI publishes to PyPI via Trusted Publishing (the PyPI
68
+ project is reserved; publishing works from this private repo).
69
+
70
+ ## Dev setup
71
+
72
+ ```bash
73
+ uv sync --group dev # SDK floor + test deps (normal uv usage is fine here — no overlays)
74
+ uv run pytest
75
+ uvx --from 'ruff>=0.15,<0.16' ruff check .
76
+ uv lock --check
77
+ ```
78
+
79
+ All deps resolve from public PyPI. For local SDK development, override (uncommitted) with an
80
+ editable path source:
81
+
82
+ ```toml
83
+ [tool.uv.sources]
84
+ 3lc-compute-plugin-sdk = { path = "../3lc-compute-plugin-sdk", editable = true }
85
+ ```
86
+
87
+ ## Where the rest of the context lives
88
+
89
+ The plugin contract and the author guide live in `3lc-compute-plugin-sdk`
90
+ (`docs/plugin-guide.md`, published at <https://3lc-ai.github.io/3lc-compute-plugin-sdk/>). Host
91
+ internals and the *why* of the plugin architecture live in the private `3lc-compute` repo's
92
+ `docs/`.
93
+
94
+ ## Conventions
95
+
96
+ Python 3.10+, uv, Hatchling, Litestar route handlers (`get_route_handlers()`), Ruff (line-length
97
+ 120). Google-style docstrings. Proprietary 3LC copyright block on new files (current year).
@@ -0,0 +1,10 @@
1
+ Copyright (c) 2026 3LC Inc. All rights reserved.
2
+
3
+ All rights are reserved. Reproduction or transmission in whole or in part, in
4
+ any form or by any means, electronic, mechanical or otherwise, is prohibited
5
+ without the prior written permission of the copyright owner.
6
+
7
+ This is proprietary software of 3LC Inc. It is NOT open-source software and is
8
+ not licensed under any open-source license. Source code readability in the
9
+ distributed artifacts does not grant any rights to use, copy, modify, or
10
+ redistribute it.
@@ -0,0 +1,23 @@
1
+ Metadata-Version: 2.5
2
+ Name: 3lc-compute-plugin-insights
3
+ Version: 0.2.0
4
+ Summary: 3LC insights plugins for the 3LC compute service (run-insights, table-insights).
5
+ Author-email: 3LC <pypi-admins@3lc.ai>
6
+ License: Proprietary
7
+ License-File: LICENSE
8
+ Classifier: Intended Audience :: Developers
9
+ Classifier: License :: Other/Proprietary License
10
+ Classifier: Natural Language :: English
11
+ Classifier: Programming Language :: Python :: 3
12
+ Requires-Python: >=3.10
13
+ Requires-Dist: 3lc-compute-plugin-sdk[shared]<0.3.0,>=0.2.2
14
+ Provides-Extra: run-insights
15
+ Requires-Dist: 3lc<4.0.0,>=3.2.0; extra == 'run-insights'
16
+ Requires-Dist: numpy; extra == 'run-insights'
17
+ Requires-Dist: pandas; extra == 'run-insights'
18
+ Requires-Dist: scipy>=1.10; extra == 'run-insights'
19
+ Provides-Extra: table-insights
20
+ Requires-Dist: 3lc<4.0.0,>=3.2.0; extra == 'table-insights'
21
+ Requires-Dist: numpy; extra == 'table-insights'
22
+ Requires-Dist: pandas; extra == 'table-insights'
23
+ Requires-Dist: scipy>=1.10; extra == 'table-insights'
@@ -0,0 +1,53 @@
1
+ # 3lc-compute-plugin-insights
2
+
3
+ The [3LC](https://3lc.ai) insights plugins for the 3LC compute service, packaged as a single
4
+ distribution `3lc-compute-plugin-insights` built against the public
5
+ [`3lc-compute-plugin-sdk`](https://github.com/3lc-ai/3lc-compute-plugin-sdk).
6
+
7
+ ```
8
+ pyproject.toml # the one distribution (SDK floor + per-plugin extras + entry-points)
9
+ src/
10
+ tlc_plugin_run_insights/ # run statistics, health scores, comparisons ([run_insights] extra)
11
+ tlc_plugin_table_insights/ # dataset-quality analysis for tables ([table_insights] extra)
12
+ ```
13
+
14
+ Each `src/tlc_plugin_<name>/` bundles its own `plugin.toml` manifest (the host reads it **without
15
+ importing**) and advertises a `tlc_compute.plugins` entry point. One `pyproject.toml` declares
16
+ them both; the host discovers by entry point (or by scanning a folder Source), not by repo shape.
17
+
18
+ Unlike the open first-party fleet
19
+ ([`3lc-compute-plugins`](https://github.com/3lc-ai/3lc-compute-plugins) and the standalone
20
+ timm/sam3/yolo repos), this distribution is **proprietary** — the insights plugins are 3LC's own
21
+ analysis engine. See `LICENSE`.
22
+
23
+ ## Isolation
24
+
25
+ Both plugins are **`venv`-isolated** (`runtime.isolation = "venv"` in their manifests): the host
26
+ provisions a dedicated venv, installs the plugin's extra (e.g.
27
+ `3lc-compute-plugin-insights[run_insights]`), and runs the plugin out-of-process. Its deps never
28
+ touch the host venv.
29
+
30
+ That's why the base `dependencies` is the **SDK floor only** (`3lc-compute-plugin-sdk[shared]`) —
31
+ this distribution is never installed into the host venv. Each plugin's real deps ride its own
32
+ extra and land only in that plugin's provisioned venv.
33
+
34
+ ## Develop
35
+
36
+ ```bash
37
+ uv sync # SDK floor only
38
+ uv sync --extra run_insights # one plugin's deps (exactly what the host provisions into its venv)
39
+ uv sync --group dev # test deps
40
+ uv run pytest
41
+ uvx --from 'ruff>=0.15,<0.16' ruff check .
42
+ ```
43
+
44
+ All dependencies resolve from public PyPI. For local SDK development, override with an
45
+ uncommitted editable path source — see `CLAUDE.md`.
46
+
47
+ ## Workflow generators
48
+
49
+ `tlc_plugin_run_insights/workflows/` holds both the runtime install helpers and the generator
50
+ modules that produce the committed dashboard-workflow `.json` files, built via the vendored
51
+ `python_workflow_builder` package (`tlc_plugin_run_insights/_vendor/`, mirrored from the tlc-ui
52
+ repo). Regenerate a JSON by running its module, e.g.
53
+ `python -m tlc_plugin_run_insights.workflows.missing_annotations`.
@@ -0,0 +1,132 @@
1
+ # 3lc-compute-plugin-insights — 3LC's own insights plugins for the 3LC compute service, as one
2
+ # distribution. The host discovers each plugin from its bundled `plugin.toml` (read WITHOUT
3
+ # importing) and provisions it into its own venv: every plugin is `venv`-isolated, its deps live in
4
+ # a per-plugin extra below and are installed only into that plugin's venv — never the host venv.
5
+ # The base `dependencies` is the SDK floor only. (The `tlc_compute.plugins` entry points support an
6
+ # optional pip-installed-discovery path; folder-Source discovery is the primary one.)
7
+ #
8
+ # Unlike the open fleet repos (3lc-compute-plugins, -timm, -sam3, -yolo), this distribution is
9
+ # PROPRIETARY: the insights plugins are 3LC's own analysis engine. It ships like the `3lc`
10
+ # package itself does on PyPI — proprietary metadata, all rights reserved, readable source in
11
+ # the wheel. The GitHub repo stays private.
12
+ [build-system]
13
+ requires = ["hatchling"]
14
+ build-backend = "hatchling.build"
15
+
16
+ [project]
17
+ name = "3lc-compute-plugin-insights"
18
+ version = "0.2.0"
19
+ description = "3LC insights plugins for the 3LC compute service (run-insights, table-insights)."
20
+ requires-python = ">=3.10"
21
+ authors = [
22
+ {name = "3LC", email = "pypi-admins@3lc.ai"},
23
+ ]
24
+ # Proprietary, matching the `3lc` package's metadata — NOT the fleet's Apache-2.0.
25
+ license = {text = "Proprietary"}
26
+ classifiers = [
27
+ "Intended Audience :: Developers",
28
+ "License :: Other/Proprietary License",
29
+ "Natural Language :: English",
30
+ "Programming Language :: Python :: 3",
31
+ ]
32
+ # Base = the SDK floor ONLY — no plugin deps live here; each plugin's deps ride its own extra
33
+ # below and are installed only into that plugin's venv. `[shared]` adds the SDK's optional `tlc`
34
+ # data plane (`tlc_plugin_sdk.shared.*`), which both plugins use.
35
+ dependencies = [
36
+ "3lc-compute-plugin-sdk[shared]>=0.2.2,<0.3.0",
37
+ ]
38
+
39
+ # Per-plugin extras — installed ONLY into that plugin's provisioned venv. Provisioning opts into
40
+ # the extra named by the plugin manifest's runtime.provision_extra (`uv sync --extra <id>`).
41
+ #
42
+ # `3lc>=3.2.0`: the semantic-segmentation modality needs `tlc.metrics.semantic_segmentation`
43
+ # (first shipped in 3.1), and 3.2 is the first release on public PyPI. `pycocotools` (RLE mask
44
+ # IoU) and `python-dateutil` (route-side date parsing) both arrive transitively via `3lc` /
45
+ # `pandas`, same as they do for the compute-service host.
46
+ [project.optional-dependencies]
47
+ run_insights = [
48
+ "3lc>=3.2.0,<4.0.0",
49
+ "numpy",
50
+ "pandas",
51
+ # Segmentation insights (scipy.ndimage — mask island-count / iou matching) and the
52
+ # semantic-seg calibration operation (scipy.stats).
53
+ "scipy>=1.10",
54
+ ]
55
+ # table-insights imports run_insights internals (run_comparison, statistics.*) — same dist,
56
+ # so the code is present; the extra mirrors run_insights' deps so those imports resolve.
57
+ table_insights = [
58
+ "3lc>=3.2.0,<4.0.0",
59
+ "numpy",
60
+ "pandas",
61
+ "scipy>=1.10",
62
+ ]
63
+
64
+ # Every plugin advertises itself here; the host iterates this group to discover them all.
65
+ # Value = the import package; its bundled plugin.toml drives id/ui/runtime (and, for venv
66
+ # plugins, the provision extra).
67
+ [project.entry-points."tlc_compute.plugins"]
68
+ run_insights = "tlc_plugin_run_insights"
69
+ table_insights = "tlc_plugin_table_insights"
70
+
71
+ [tool.hatch.build.targets.wheel]
72
+ packages = [
73
+ "src/tlc_plugin_run_insights",
74
+ "src/tlc_plugin_table_insights",
75
+ ]
76
+
77
+ # Both `3lc` and `3lc-compute-plugin-sdk` resolve from public PyPI (the SDK's home since
78
+ # 0.2.2) — no custom indexes. For local dev against an in-progress SDK/3lc checkout, add an
79
+ # UNCOMMITTED [tool.uv.sources] override with editable path sources (a committed relative
80
+ # `path = ...` source breaks remote consumers: uv reads it as a subdirectory of this repo).
81
+
82
+ [dependency-groups]
83
+ # The test suite exercises the plugin code directly, so it needs the per-plugin runtime deps
84
+ # on top of the base sync (tlc/pandas/pycocotools already arrive via the SDK's [shared] extra).
85
+ dev = [
86
+ "pytest>=8",
87
+ "numpy",
88
+ "pandas",
89
+ "scipy>=1.10",
90
+ ]
91
+
92
+ [tool.pytest.ini_options]
93
+ testpaths = ["tests"]
94
+
95
+ # Ruff config mirrors the fleet repos for a consistent house style. CI runs ruff standalone
96
+ # (uvx) — linting must not require resolving the per-plugin dependency stacks.
97
+ [tool.ruff]
98
+ line-length = 120
99
+ target-version = "py310"
100
+ exclude = [
101
+ ".git",
102
+ ".mypy_cache",
103
+ ".ruff_cache",
104
+ ".venv",
105
+ "build",
106
+ "dist",
107
+ "**/_vendor/**", # vendored code (python_workflow_builder, from tlc-ui) — not linted here
108
+ ]
109
+
110
+ [tool.ruff.lint]
111
+ select = ["A", "C4", "E", "EM", "F", "I", "N", "PIE", "RUF", "SIM", "UP", "W"]
112
+ # The extra SIM ignores match 3lc-compute, where this code was written and linted.
113
+ ignore = ["N806", "N818", "SIM102", "SIM103", "SIM105", "SIM108", "SIM114", "SIM118", "RUF001", "RUF002", "RUF003"]
114
+
115
+ [tool.ruff.lint.per-file-ignores]
116
+ "test_*.py" = [
117
+ "E402",
118
+ "SIM117",
119
+ ]
120
+
121
+ [tool.ruff.lint.isort]
122
+ # Pin first-party explicitly so import ordering does not depend on what's installed
123
+ # (see 3lc-compute's pyproject for the full rationale).
124
+ known-first-party = ["tlc_plugin_run_insights", "tlc_plugin_table_insights"]
125
+ known-third-party = ["tlc_plugin_sdk", "python_workflow_builder"]
126
+
127
+ [tool.ruff.lint.pydocstyle]
128
+ convention = "google"
129
+
130
+ [tool.ruff.format]
131
+ preview = true
132
+ docstring-code-format = true