featrixsphere 0.2.1439__tar.gz → 0.2.1461__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 (172) hide show
  1. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/PKG-INFO +1 -1
  2. featrixsphere-0.2.1461/VERSION +1 -0
  3. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere/__init__.py +1 -1
  4. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere/client.py +20 -3
  5. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere.egg-info/PKG-INFO +1 -1
  6. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/api.py +151 -5
  7. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/auto_upgrade_monitor.py +1 -1
  8. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/celery_app.py +434 -0
  9. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/cli.py +6 -6
  10. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/featrix_queue.py +130 -36
  11. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/convergence_monitor.py +8 -4
  12. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/es_projections.py +2 -2
  13. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/embedded_space.py +88 -41
  14. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/encoders.py +19 -1
  15. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/movie_frame_task.py +31 -8
  16. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/scalar_codec.py +52 -0
  17. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/set_codec.py +39 -6
  18. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/setlist_codec.py +27 -1
  19. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/single_predictor.py +38 -4
  20. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/string_codec.py +154 -88
  21. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/vector_codec.py +29 -2
  22. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/single_predictor_training.py +10 -31
  23. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/structureddata.py +22 -4
  24. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/manage_churro.sh +1 -1
  25. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/node-install.sh +183 -30
  26. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/recreate_session.py +3 -3
  27. featrixsphere-0.2.1461/src/run_api_server.sh +103 -0
  28. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/start_churro_server.sh +2 -2
  29. featrixsphere-0.2.1439/VERSION +0 -1
  30. featrixsphere-0.2.1439/src/run_api_server.sh +0 -37
  31. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/MANIFEST.in +0 -0
  32. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/README.md +0 -0
  33. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrix-update.py +0 -0
  34. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere/cli.py +0 -0
  35. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere/test_client.py +0 -0
  36. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere.egg-info/SOURCES.txt +0 -0
  37. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere.egg-info/dependency_links.txt +0 -0
  38. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere.egg-info/entry_points.txt +0 -0
  39. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere.egg-info/not-zip-safe +0 -0
  40. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere.egg-info/requires.txt +0 -0
  41. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere.egg-info/top_level.txt +0 -0
  42. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/nv-install.sh +0 -0
  43. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/requirements.txt +0 -0
  44. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/setup.cfg +0 -0
  45. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/setup.py +0 -0
  46. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/build_version.py +0 -0
  47. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/config.py +0 -0
  48. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/demo_existing_model.py +0 -0
  49. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/demo_label_updates.py +0 -0
  50. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/deploy.py +0 -0
  51. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/deploy_cache_debug.sh +0 -0
  52. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/ensure_watchdog_running.sh +0 -0
  53. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/error_tracker.py +0 -0
  54. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/event_log.py +0 -0
  55. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/example_api_usage.py +0 -0
  56. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/example_prediction_feedback.py +0 -0
  57. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/example_train_predictor.py +0 -0
  58. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/featrix_watchdog.py +0 -0
  59. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/gc_cleanup.py +0 -0
  60. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/epoch_projections.py +0 -0
  61. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/es_training.py +0 -0
  62. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/__init__.py +0 -0
  63. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/MetaDataCache.py +0 -0
  64. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/__init__.py +0 -0
  65. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/calibration_utils.py +0 -0
  66. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/classification_metrics.py +0 -0
  67. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/config.py +0 -0
  68. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/data_frame_data_set.py +0 -0
  69. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/dataloader_utils.py +0 -0
  70. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/detect.py +0 -0
  71. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/device.py +0 -0
  72. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/domain_codec.py +0 -0
  73. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/dropout_scheduler.py +0 -0
  74. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/embedding_lr_scheduler.py +0 -0
  75. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/embedding_space_utils.py +0 -0
  76. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/embedding_utils.py +0 -0
  77. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/enrich.py +0 -0
  78. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/es_projection.py +0 -0
  79. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/exceptions.py +0 -0
  80. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/featrix_csv.py +0 -0
  81. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/featrix_json.py +0 -0
  82. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/featrix_module_dict.py +0 -0
  83. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/featrix_token.py +0 -0
  84. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/guardrails.py +0 -0
  85. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/hubspot_free_domains_list_may_2025.py +0 -0
  86. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/input_data_file.py +0 -0
  87. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/input_data_set.py +0 -0
  88. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/integrity.py +0 -0
  89. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/json_cache.py +0 -0
  90. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/json_codec.py +0 -0
  91. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/logging_config.py +0 -0
  92. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/mask_tracker.py +0 -0
  93. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/model_config.py +0 -0
  94. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/model_hash.py +0 -0
  95. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/network_viz.py +0 -0
  96. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/prng_control.py +0 -0
  97. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/demo_advisor_decisions.py +0 -0
  98. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/example_complete_workflow.py +0 -0
  99. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/generate_focal_report.py +0 -0
  100. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/model_advisor.py +0 -0
  101. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/show_results.py +0 -0
  102. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_adaptive_training.py +0 -0
  103. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_confusion_matrix_metadata.py +0 -0
  104. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_embedding_quality.py +0 -0
  105. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_embedding_space.py +0 -0
  106. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_extend_embedding_space.py +0 -0
  107. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_focal_comparison.py +0 -0
  108. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_focal_comparison_enhanced.py +0 -0
  109. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_focal_loss_single_predictor.py +0 -0
  110. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_label_smoothing.py +0 -0
  111. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_monitor_integration.py +0 -0
  112. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_piecewise_epochs.py +0 -0
  113. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_predict_during_training.py +0 -0
  114. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_timeline_quick.py +0 -0
  115. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_training_monitor.py +0 -0
  116. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_warning_tracking.py +0 -0
  117. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/visualize_training_timeline.py +0 -0
  118. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/simple_mlp.py +0 -0
  119. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/single_predictor_mlp.py +0 -0
  120. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/sphere_config.py +0 -0
  121. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/sqlite_utils.py +0 -0
  122. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/stopwatch.py +0 -0
  123. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/string_analysis.py +0 -0
  124. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/string_cache.py +0 -0
  125. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/string_list_codec.py +0 -0
  126. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/timestamp_codec.py +0 -0
  127. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/training_context_manager.py +0 -0
  128. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/training_event.py +0 -0
  129. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/training_exceptions.py +0 -0
  130. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/training_history_db.py +0 -0
  131. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/transformer_encoder.py +0 -0
  132. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/url_codec.py +0 -0
  133. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/url_parser.py +0 -0
  134. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/utils.py +0 -0
  135. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/world_data.py +0 -0
  136. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix_debug.py +0 -0
  137. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/json_encoder_cache.py +0 -0
  138. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/knn_training.py +0 -0
  139. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/single_predictor_cv.py +0 -0
  140. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/sphere_config.py +0 -0
  141. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/training_monitor.py +0 -0
  142. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/utils.py +0 -0
  143. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/vector_db.py +0 -0
  144. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/webhook_helpers.py +0 -0
  145. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/weightwatcher_tracking.py +0 -0
  146. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/llm_client.py +0 -0
  147. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/neural.py +0 -0
  148. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/prediction_drift_monitor.py +0 -0
  149. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/prediction_persistence_worker.py +0 -0
  150. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/quick_test_deployment.sh +0 -0
  151. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/redis_prediction_cli.py +0 -0
  152. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/redis_prediction_store.py +0 -0
  153. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/regenerate_training_movie.py +0 -0
  154. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/render_sphere.py +0 -0
  155. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/restart_celery_worker.sh +0 -0
  156. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/send_email.py +0 -0
  157. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/slack.py +0 -0
  158. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/standalone_prediction.py +0 -0
  159. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/start_celery_worker.sh +0 -0
  160. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/tail-watch.py +0 -0
  161. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/test_api_client.py +0 -0
  162. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/test_complete_workflow.py +0 -0
  163. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/test_json_tables_prediction.py +0 -0
  164. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/test_redis_predictions.py +0 -0
  165. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/test_server_connection.py +0 -0
  166. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/test_session_models.py +0 -0
  167. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/test_single_predictor_api.py +0 -0
  168. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/test_upload_endpoint.py +0 -0
  169. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/tree.py +0 -0
  170. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/utils.py +0 -0
  171. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/version.py +0 -0
  172. {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/system_monitor.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: featrixsphere
3
- Version: 0.2.1439
3
+ Version: 0.2.1461
4
4
  Summary: Transform any CSV into a production-ready ML model in minutes, not months.
5
5
  Home-page: https://github.com/Featrix/sphere
6
6
  Author: Featrix
@@ -0,0 +1 @@
1
+ 0.2.1461
@@ -38,7 +38,7 @@ Example:
38
38
  ... labels=['Experiment A', 'Experiment B'])
39
39
  """
40
40
 
41
- __version__ = "0.2.1439"
41
+ __version__ = "0.2.1461"
42
42
  __author__ = "Featrix"
43
43
  __email__ = "support@featrix.com"
44
44
  __license__ = "MIT"
@@ -1635,7 +1635,7 @@ class FeatrixSphereClient:
1635
1635
  ax.text(0.5, 0.5, f'Error plotting embedding: {e}',
1636
1636
  transform=ax.transAxes, ha='center', va='center')
1637
1637
 
1638
- def create_embedding_space(self, name: str, s3_training_dataset: str, s3_validation_dataset: str, webhooks: Dict[str, str] = None) -> SessionInfo:
1638
+ def create_embedding_space(self, name: str, s3_training_dataset: str, s3_validation_dataset: str, webhooks: Dict[str, str] = None, user_metadata: Dict[str, Any] = None) -> SessionInfo:
1639
1639
  """
1640
1640
  Create a new embedding space from S3 training and validation datasets.
1641
1641
 
@@ -1644,6 +1644,7 @@ class FeatrixSphereClient:
1644
1644
  s3_training_dataset: S3 URL for training dataset (must start with 's3://')
1645
1645
  s3_validation_dataset: S3 URL for validation dataset (must start with 's3://')
1646
1646
  webhooks: Optional dict with webhook configuration keys (webhook_callback_secret, s3_backup_url, model_id_update_url)
1647
+ user_metadata: Optional user metadata for ES/SP identification (max 32KB)
1647
1648
 
1648
1649
  Returns:
1649
1650
  SessionInfo for the newly created embedding space session
@@ -1668,6 +1669,10 @@ class FeatrixSphereClient:
1668
1669
  }
1669
1670
  if webhooks:
1670
1671
  data['webhooks'] = webhooks
1672
+ if user_metadata:
1673
+ import json
1674
+ data['user_metadata'] = json.dumps(user_metadata)
1675
+ print(f"User metadata: {user_metadata}")
1671
1676
 
1672
1677
  response_data = self._post_json("/compute/create-embedding-space", data)
1673
1678
 
@@ -1689,7 +1694,8 @@ class FeatrixSphereClient:
1689
1694
  parent_embedding_space_path: str = None,
1690
1695
  s3_training_dataset: str = None,
1691
1696
  s3_validation_dataset: str = None,
1692
- webhooks: Dict[str, str] = None
1697
+ webhooks: Dict[str, str] = None,
1698
+ user_metadata: Dict[str, Any] = None
1693
1699
  ) -> SessionInfo:
1694
1700
  """
1695
1701
  Fine-tune an existing embedding space on new data.
@@ -1785,6 +1791,10 @@ class FeatrixSphereClient:
1785
1791
 
1786
1792
  if webhooks:
1787
1793
  data['webhooks'] = webhooks
1794
+ if user_metadata:
1795
+ import json
1796
+ data['user_metadata'] = json.dumps(user_metadata)
1797
+ print(f"User metadata: {user_metadata}")
1788
1798
 
1789
1799
  response_data = self._post_json("/compute/fine-tune-embedding-space", data)
1790
1800
 
@@ -4203,7 +4213,8 @@ class FeatrixSphereClient:
4203
4213
  class_imbalance: dict = None,
4204
4214
  poll_interval: int = 30, max_poll_time: int = 3600,
4205
4215
  verbose: bool = True,
4206
- webhooks: Dict[str, str] = None) -> SessionInfo:
4216
+ webhooks: Dict[str, str] = None,
4217
+ user_metadata: Dict[str, Any] = None) -> SessionInfo:
4207
4218
  """
4208
4219
  Train a single predictor on a foundation model (existing embedding space).
4209
4220
 
@@ -4227,6 +4238,7 @@ class FeatrixSphereClient:
4227
4238
  max_poll_time: Maximum time to poll in seconds (default: 3600 = 1 hour)
4228
4239
  verbose: Whether to print status updates during polling (default: True)
4229
4240
  webhooks: Optional dict with webhook configuration keys (webhook_callback_secret, s3_backup_url, model_id_update_url)
4241
+ user_metadata: Optional user metadata for ES/SP identification (max 32KB)
4230
4242
 
4231
4243
  Returns:
4232
4244
  SessionInfo for the newly created predictor training session
@@ -4318,6 +4330,11 @@ class FeatrixSphereClient:
4318
4330
  if webhooks:
4319
4331
  import json
4320
4332
  data["webhooks"] = json.dumps(webhooks)
4333
+ if user_metadata:
4334
+ import json
4335
+ data["user_metadata"] = json.dumps(user_metadata)
4336
+ if verbose:
4337
+ print(f"User metadata: {user_metadata}")
4321
4338
 
4322
4339
  # Send request with file if provided
4323
4340
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: featrixsphere
3
- Version: 0.2.1439
3
+ Version: 0.2.1461
4
4
  Summary: Transform any CSV into a production-ready ML model in minutes, not months.
5
5
  Home-page: https://github.com/Featrix/sphere
6
6
  Author: Featrix
@@ -1031,7 +1031,49 @@ def create_app() -> FastAPI:
1031
1031
 
1032
1032
  processes.append(process_info)
1033
1033
 
1034
- # Calculate cumulative stats for multiprocess workers of train_es
1034
+ # Calculate cumulative GPU stats for ALL supervisorctl processes (main + children)
1035
+ # This ensures every daemon process shows total GPU usage including all child processes
1036
+ for process in processes:
1037
+ process_pid = process.get('pid')
1038
+ if not process_pid:
1039
+ continue
1040
+
1041
+ try:
1042
+ main_proc = psutil.Process(process_pid)
1043
+ # Get all child processes recursively
1044
+ children = main_proc.children(recursive=True)
1045
+
1046
+ # Start with main process GPU stats from the pre-built map
1047
+ main_gpu_percent, main_gpu_vram_percent = gpu_stats_map.get(process_pid, (0.0, 0.0))
1048
+
1049
+ # Sum GPU stats from all children using the pre-built map
1050
+ children_gpu_total = 0.0
1051
+ children_vram_total = 0.0
1052
+
1053
+ for child in children:
1054
+ try:
1055
+ child_gpu_percent, child_gpu_vram_percent = gpu_stats_map.get(child.pid, (0.0, 0.0))
1056
+ children_gpu_total += child_gpu_percent
1057
+ children_vram_total += child_gpu_vram_percent
1058
+ except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
1059
+ continue
1060
+
1061
+ # Add children totals to main process stats
1062
+ total_gpu_percent = main_gpu_percent + children_gpu_total
1063
+ total_gpu_vram_percent = main_gpu_vram_percent + children_vram_total
1064
+
1065
+ # Update the process with total GPU stats (main + all children)
1066
+ process['gpu_percent'] = round(total_gpu_percent, 1)
1067
+ process['gpu_vram_percent'] = round(total_gpu_vram_percent, 1)
1068
+
1069
+ except (psutil.NoSuchProcess, psutil.AccessDenied) as e:
1070
+ logger.debug(f"Could not get children for {process.get('name')} (PID {process_pid}): {e}")
1071
+ # Keep existing GPU stats (main process only)
1072
+ except Exception as e:
1073
+ logger.debug(f"Error calculating GPU stats for {process.get('name')} (PID {process_pid}): {e}")
1074
+ # Keep existing GPU stats (main process only)
1075
+
1076
+ # Legacy: Calculate cumulative stats for multiprocess workers of train_es (for backward compatibility)
1035
1077
  for process in processes:
1036
1078
  if process.get('name') == 'worker-train_es':
1037
1079
  train_es_pid = process.get('pid')
@@ -1411,7 +1453,49 @@ def create_app() -> FastAPI:
1411
1453
 
1412
1454
  processes.append(process_info)
1413
1455
 
1414
- # Calculate cumulative stats for multiprocess workers of train_es
1456
+ # Calculate cumulative GPU stats for ALL supervisorctl processes (main + children)
1457
+ # This ensures every daemon process shows total GPU usage including all child processes
1458
+ for process in processes:
1459
+ process_pid = process.get('pid')
1460
+ if not process_pid:
1461
+ continue
1462
+
1463
+ try:
1464
+ main_proc = psutil.Process(process_pid)
1465
+ # Get all child processes recursively
1466
+ children = main_proc.children(recursive=True)
1467
+
1468
+ # Start with main process GPU stats from the pre-built map
1469
+ main_gpu_percent, main_gpu_vram_percent = gpu_stats_map.get(process_pid, (0.0, 0.0))
1470
+
1471
+ # Sum GPU stats from all children using the pre-built map
1472
+ children_gpu_total = 0.0
1473
+ children_vram_total = 0.0
1474
+
1475
+ for child in children:
1476
+ try:
1477
+ child_gpu_percent, child_gpu_vram_percent = gpu_stats_map.get(child.pid, (0.0, 0.0))
1478
+ children_gpu_total += child_gpu_percent
1479
+ children_vram_total += child_gpu_vram_percent
1480
+ except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
1481
+ continue
1482
+
1483
+ # Add children totals to main process stats
1484
+ total_gpu_percent = main_gpu_percent + children_gpu_total
1485
+ total_gpu_vram_percent = main_gpu_vram_percent + children_vram_total
1486
+
1487
+ # Update the process with total GPU stats (main + all children)
1488
+ process['gpu_percent'] = round(total_gpu_percent, 1)
1489
+ process['gpu_vram_percent'] = round(total_gpu_vram_percent, 1)
1490
+
1491
+ except (psutil.NoSuchProcess, psutil.AccessDenied) as e:
1492
+ logger.debug(f"Could not get children for {process.get('name')} (PID {process_pid}): {e}")
1493
+ # Keep existing GPU stats (main process only)
1494
+ except Exception as e:
1495
+ logger.debug(f"Error calculating GPU stats for {process.get('name')} (PID {process_pid}): {e}")
1496
+ # Keep existing GPU stats (main process only)
1497
+
1498
+ # Legacy: Calculate cumulative stats for multiprocess workers of train_es (for backward compatibility)
1415
1499
  for process in processes:
1416
1500
  if process.get('name') == 'worker-train_es':
1417
1501
  train_es_pid = process.get('pid')
@@ -6177,7 +6261,8 @@ def create_app() -> FastAPI:
6177
6261
  class_imbalance: Optional[str] = Form(None), # JSON string
6178
6262
  use_class_weights: bool = Form(False),
6179
6263
  optimize_for: Optional[str] = Form(None), # DEPRECATED: Ignored, kept for backward compatibility
6180
- webhooks: Optional[str] = Form(None) # JSON string
6264
+ webhooks: Optional[str] = Form(None), # JSON string
6265
+ user_metadata: Optional[str] = Form(None) # JSON string
6181
6266
  ) -> JSONResponse:
6182
6267
  """
6183
6268
  Train a single predictor on a foundation model (existing embedding space).
@@ -6213,6 +6298,15 @@ def create_app() -> FastAPI:
6213
6298
  except json.JSONDecodeError:
6214
6299
  raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="webhooks must be valid JSON")
6215
6300
 
6301
+ user_metadata_dict = None
6302
+ if user_metadata:
6303
+ try:
6304
+ user_metadata_dict = json.loads(user_metadata)
6305
+ logger.info(f"User metadata received: {len(str(user_metadata_dict))} chars")
6306
+ except json.JSONDecodeError:
6307
+ logger.warning(f"Invalid user_metadata JSON: {user_metadata}")
6308
+ user_metadata_dict = None
6309
+
6216
6310
  try:
6217
6311
  # Handle file upload if provided
6218
6312
  final_input_filename = input_filename
@@ -6310,7 +6404,8 @@ def create_app() -> FastAPI:
6310
6404
  foundation_model_id=foundation_model_id,
6311
6405
  target_spec=target_spec,
6312
6406
  input_filename=final_input_filename,
6313
- name=name
6407
+ name=name,
6408
+ user_metadata=user_metadata_dict
6314
6409
  )
6315
6410
 
6316
6411
  # Save the session
@@ -6354,6 +6449,57 @@ def create_app() -> FastAPI:
6354
6449
  post_slack_alert(f"foundation_model={foundation_model_id}; error starting predictor training on foundation model: {error_msg}")
6355
6450
  raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=f"Error starting predictor training on foundation model: {error_msg}")
6356
6451
 
6452
+ @app.post("/session/{id}/dump-to-backplane")
6453
+ async def dump_session_to_backplane(id: str) -> JSONResponse:
6454
+ """
6455
+ Dispatch a Celery task to copy a session's workspace to /backplane/backplane1.
6456
+
6457
+ This task:
6458
+ 1. Verifies /backplane/backplane1 is mounted and different from /backplane
6459
+ 2. Rsyncs the session workspace to the backplane
6460
+ 3. Creates a LAST_HOST_DUMP.json marker file with metadata
6461
+
6462
+ Args:
6463
+ id: Session ID to dump
6464
+
6465
+ Returns:
6466
+ dict with task_id for polling
6467
+ """
6468
+ try:
6469
+ from celery_app import dump_to_backplane
6470
+
6471
+ # Verify session exists
6472
+ session = load_session(id)
6473
+
6474
+ # Dispatch Celery task
6475
+ task = dump_to_backplane.delay(id)
6476
+
6477
+ logger.info(f"✅ Dispatched dump_to_backplane task for session {id} (task_id: {task.id})")
6478
+
6479
+ return JSONResponse({
6480
+ "task_id": task.id,
6481
+ "status": "submitted",
6482
+ "session_id": id,
6483
+ "message": f"Dump task submitted for session {id}"
6484
+ })
6485
+
6486
+ except FileNotFoundError:
6487
+ raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail=f"Session not found: {id}")
6488
+ except ImportError as e:
6489
+ logger.error(f"❌ Celery not available: {e}")
6490
+ raise HTTPException(
6491
+ status_code=HTTPStatus.SERVICE_UNAVAILABLE,
6492
+ detail="Celery service not available - dump_to_backplane requires Celery"
6493
+ )
6494
+ except Exception as e:
6495
+ error_msg = str(e) if str(e) else repr(e)
6496
+ logger.error(f"❌ DUMP_TO_BACKPLANE - Exception: {error_msg}")
6497
+ logger.exception(e)
6498
+ raise HTTPException(
6499
+ status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
6500
+ detail=f"Error dispatching dump task: {error_msg}"
6501
+ )
6502
+
6357
6503
  @app.post("/compute/session/{id}/mark_for_deletion")
6358
6504
  async def mark_session_for_deletion(id: str) -> JSONResponse:
6359
6505
  """
@@ -8701,7 +8847,7 @@ def create_app() -> FastAPI:
8701
8847
  'create_structured_data': '📊 Data Processing',
8702
8848
  'train_es': '🧠 Embedding Space',
8703
8849
  'train_knn': '🔍 Vector Database',
8704
- 'build_es_projections': '📈 2D Projections',
8850
+ 'run_clustering': '📈 2D Projections',
8705
8851
  'train_single_predictor': '🎯 Single Predictor'
8706
8852
  }
8707
8853
  return display_names.get(job_type, f'⚙️ {job_type}')
@@ -119,7 +119,7 @@ CHECK_INTERVAL = 3600 # Check every 60 minutes (3600 seconds)
119
119
  TRAINING_QUEUES = [
120
120
  "train_es",
121
121
  "train_knn",
122
- "build_es_projections",
122
+ "run_clustering",
123
123
  "train_single_predictor",
124
124
  "cpu_data_tasks" # create_structured_data runs here
125
125
  ]