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.
- 3lc_compute_plugin_insights-0.2.0/.github/workflows/ci.yml +79 -0
- 3lc_compute_plugin_insights-0.2.0/.github/workflows/release.yml +63 -0
- 3lc_compute_plugin_insights-0.2.0/.gitignore +13 -0
- 3lc_compute_plugin_insights-0.2.0/CHANGELOG.md +27 -0
- 3lc_compute_plugin_insights-0.2.0/CLAUDE.md +97 -0
- 3lc_compute_plugin_insights-0.2.0/LICENSE +10 -0
- 3lc_compute_plugin_insights-0.2.0/PKG-INFO +23 -0
- 3lc_compute_plugin_insights-0.2.0/README.md +53 -0
- 3lc_compute_plugin_insights-0.2.0/pyproject.toml +132 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/__init__.py +235 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/Enums.py +55 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/MyWorkflow.json +131 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/MyWorkflow.py +89 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/ReadMe.md +182 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/TweakPropertySetup.py +52 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/TweakPropertySetups.py +228 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/UnitTests.py +459 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/WeakObjectReference.py +26 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/WorkflowAnnotation.py +66 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/WorkflowStep.py +110 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/WorkflowSteps.py +898 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/WorkflowTransition.py +54 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/WorkflowTransitions.py +312 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/__init__.py +67 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/_vendor/python_workflow_builder/_common.py +85 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/box_matching.py +640 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/lineage.py +337 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/mask_matching.py +438 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/plugin.toml +23 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/routes.py +2763 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/run_comparison.py +4830 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/run_comparison_pose.py +468 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/run_comparison_semseg.py +1417 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/run_stats.py +875 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/__init__.py +9 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/base.py +353 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/context.py +124 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/handlers/__init__.py +9 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/handlers/classification.py +84 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/handlers/detection.py +104 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/handlers/keypoints.py +172 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/handlers/segmentation.py +110 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/handlers/semantic_segmentation.py +107 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/health_score.py +109 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/__init__.py +98 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/classification/__init__.py +31 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/classification/calibration.py +197 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/classification/class_balance.py +128 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/classification/class_disparity.py +238 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/classification/confident_mistakes.py +173 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/classification/loss_outliers.py +245 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/classification/systematic_confusions.py +208 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/__init__.py +41 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/avg_iou.py +181 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/bb_aspect_ratio_outliers.py +214 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/bb_size_outliers.py +204 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/class_balance.py +132 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/class_disparity.py +164 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/duplicate_boxes.py +125 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/edge_boxes.py +155 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/fn_rate.py +261 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/fp_rate.py +238 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/incorrect_class.py +262 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/iou_vs_confidence.py +232 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/detection/missing_annotations.py +236 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/keypoints/__init__.py +72 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/keypoints/duplicate_instances.py +131 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/keypoints/fn_rate.py +193 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/keypoints/fp_rate.py +229 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/keypoints/mean_oks.py +265 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/keypoints/missing_annotations.py +227 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/keypoints/oks_confidence.py +242 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/keypoints/per_joint.py +190 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/keypoints/size_performance.py +181 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/keypoints/skeleton_plausibility.py +215 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/__init__.py +47 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/avg_iou.py +178 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/class_balance.py +111 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/class_disparity.py +162 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/duplicate_masks.py +113 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/edge_masks.py +158 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/fn_rate.py +248 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/fp_rate.py +247 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/incorrect_class.py +270 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/iou_vs_confidence.py +227 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/mask_shape_review.py +258 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/mask_size_outliers.py +198 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/segmentation/missing_annotations.py +232 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/semantic_segmentation/__init__.py +57 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/semantic_segmentation/annotation_speckle.py +114 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/semantic_segmentation/boundary_quality.py +121 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/semantic_segmentation/class_balance.py +129 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/semantic_segmentation/class_disparity.py +153 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/semantic_segmentation/mean_iou.py +130 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/semantic_segmentation/systematic_confusions.py +203 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/semantic_segmentation/unlabeled_regions.py +181 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/semantic_segmentation/void_coverage.py +111 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/insights/semantic_segmentation/worst_images.py +152 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/__init__.py +9 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/classification/__init__.py +9 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/classification/confusion_matrix.py +50 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/classification/per_class_metrics.py +254 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/detection/__init__.py +9 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/detection/annotation_quality.py +242 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/detection/bb_analysis.py +193 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/detection/confidence_curve.py +201 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/detection/confusion_matrix.py +156 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/detection/iou_confidence.py +145 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/detection/iou_matching.py +420 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/detection/per_class_metrics.py +235 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/keypoints/__init__.py +54 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/keypoints/annotation_quality.py +217 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/keypoints/extraction.py +229 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/keypoints/oks_confidence.py +139 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/keypoints/oks_metrics.py +281 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/keypoints/per_joint.py +95 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/keypoints/size_analysis.py +133 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/keypoints/skeleton.py +280 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/segmentation/__init__.py +10 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/segmentation/annotation_quality.py +248 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/segmentation/confidence_curve.py +172 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/segmentation/confusion_matrix.py +154 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/segmentation/iou_confidence.py +143 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/segmentation/iou_matching.py +452 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/segmentation/mask_analysis.py +263 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/segmentation/per_class_metrics.py +248 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/semantic_segmentation/__init__.py +47 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/semantic_segmentation/boundary.py +126 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/semantic_segmentation/calibration.py +134 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/semantic_segmentation/components.py +154 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/semantic_segmentation/confusion_matrix.py +72 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/semantic_segmentation/extraction.py +381 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/operations/semantic_segmentation/per_class_metrics.py +148 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/registry.py +52 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/utils.py +229 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/utils_keypoints.py +803 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/utils_segmentation.py +254 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/statistics/utils_semantic.py +314 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/table_selection.py +100 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/ui.html +5841 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/__init__.py +717 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/aspect_ratio_outliers.json +497 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/aspect_ratio_outliers.py +510 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/avg_iou.json +771 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/avg_iou.py +605 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/cls_calibration.json +583 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/cls_calibration.py +442 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/cls_class_disparity.json +323 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/cls_class_disparity.py +292 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/cls_confident_mistakes.json +517 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/cls_confident_mistakes.py +383 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/cls_loss_outliers.json +378 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/cls_loss_outliers.py +318 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/cls_systematic_confusions.json +499 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/cls_systematic_confusions.py +381 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/edge_boxes.json +483 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/edge_boxes.py +415 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/edge_masks.json +526 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/edge_masks.py +444 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/fn_rate.json +579 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/fn_rate.py +440 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/fp_rate.json +579 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/fp_rate.py +513 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/fp_rate_nms.json +618 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/incorrect_class.json +578 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/incorrect_class.py +447 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/iou_confidence.json +597 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/iou_confidence.py +449 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/kp_fn_rate.py +361 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/kp_fp_rate.py +404 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/kp_mean_oks.py +437 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/kp_missing_annotations.py +400 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/kp_oks_confidence.py +366 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/kp_per_joint.py +489 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/kp_skeleton.py +336 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/mask_shape_review.json +655 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/mask_shape_review.py +613 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/mask_size_outliers.json +738 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/mask_size_outliers.py +609 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/missing_annotations.json +540 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/missing_annotations.py +467 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/seg_avg_iou.py +605 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/seg_fn_rate.py +441 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/seg_fp_rate.py +514 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/seg_incorrect_class.py +448 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/seg_iou_confidence.py +450 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/seg_missing_annotations.py +466 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/semseg_systematic_confusions.py +423 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/semseg_unlabeled_regions.py +473 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/semseg_worst_images.py +468 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/size_outliers.json +552 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_run_insights/workflows/size_outliers.py +518 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_table_insights/__init__.py +328 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_table_insights/plugin.toml +26 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_table_insights/routes.py +88 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_table_insights/table_stats.py +753 -0
- 3lc_compute_plugin_insights-0.2.0/src/tlc_plugin_table_insights/ui.html +787 -0
- 3lc_compute_plugin_insights-0.2.0/tests/__init__.py +10 -0
- 3lc_compute_plugin_insights-0.2.0/tests/conftest.py +82 -0
- 3lc_compute_plugin_insights-0.2.0/tests/test_keypoints_annotation_quality.py +463 -0
- 3lc_compute_plugin_insights-0.2.0/tests/test_keypoints_confidence.py +243 -0
- 3lc_compute_plugin_insights-0.2.0/tests/test_keypoints_oks.py +297 -0
- 3lc_compute_plugin_insights-0.2.0/tests/test_keypoints_routing.py +310 -0
- 3lc_compute_plugin_insights-0.2.0/tests/test_keypoints_skeleton.py +237 -0
- 3lc_compute_plugin_insights-0.2.0/tests/test_metrics_delta_grading.py +210 -0
- 3lc_compute_plugin_insights-0.2.0/tests/test_pose_comparison_outcomes.py +508 -0
- 3lc_compute_plugin_insights-0.2.0/tests/test_pose_revision_diff.py +200 -0
- 3lc_compute_plugin_insights-0.2.0/tests/test_run_comparison_dispatch.py +218 -0
- 3lc_compute_plugin_insights-0.2.0/tests/test_semantic_seg_comparison.py +760 -0
- 3lc_compute_plugin_insights-0.2.0/tests/test_semantic_seg_insights.py +483 -0
- 3lc_compute_plugin_insights-0.2.0/tests/test_semantic_seg_operations.py +593 -0
- 3lc_compute_plugin_insights-0.2.0/tests/test_semantic_seg_routing.py +198 -0
- 3lc_compute_plugin_insights-0.2.0/tests/test_table_insights_semseg_routing.py +224 -0
- 3lc_compute_plugin_insights-0.2.0/tests/test_workflow_install_urls.py +127 -0
- 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,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
|