workbench 0.8.167__tar.gz → 0.8.168__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.

Potentially problematic release.


This version of workbench might be problematic. Click here for more details.

Files changed (773) hide show
  1. {workbench-0.8.167 → workbench-0.8.168}/PKG-INFO +1 -1
  2. workbench-0.8.168/aws_setup/workbench_core/app.py +70 -0
  3. workbench-0.8.168/aws_setup/workbench_core/requirements.txt +3 -0
  4. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_core/workbench_core/workbench_core_stack.py +25 -3
  5. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/ml_pipelines/Dockerfile +11 -1
  6. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/ml_pipelines/ml_pipeline_runner.py +14 -24
  7. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/scripts/ml_pipeline_launcher.py +44 -14
  8. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/scripts/monitor_cloud_watch.py +20 -100
  9. workbench-0.8.168/src/workbench/utils/cloudwatch_utils.py +137 -0
  10. {workbench-0.8.167 → workbench-0.8.168}/src/workbench.egg-info/PKG-INFO +1 -1
  11. {workbench-0.8.167 → workbench-0.8.168}/src/workbench.egg-info/SOURCES.txt +1 -0
  12. workbench-0.8.167/aws_setup/workbench_core/app.py +0 -47
  13. workbench-0.8.167/aws_setup/workbench_core/requirements.txt +0 -3
  14. {workbench-0.8.167 → workbench-0.8.168}/.flake8 +0 -0
  15. {workbench-0.8.167 → workbench-0.8.168}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  16. {workbench-0.8.167 → workbench-0.8.168}/.github/dependabot.yml +0 -0
  17. {workbench-0.8.167 → workbench-0.8.168}/.github/workflows/deploy-docs.yml +0 -0
  18. {workbench-0.8.167 → workbench-0.8.168}/.github/workflows/python-lint.yml +0 -0
  19. {workbench-0.8.167 → workbench-0.8.168}/.gitignore +0 -0
  20. {workbench-0.8.167 → workbench-0.8.168}/CONTRIBUTING.md +0 -0
  21. {workbench-0.8.167 → workbench-0.8.168}/Dockerfile +0 -0
  22. {workbench-0.8.167 → workbench-0.8.168}/LICENSE +0 -0
  23. {workbench-0.8.167 → workbench-0.8.168}/Makefile +0 -0
  24. {workbench-0.8.167 → workbench-0.8.168}/README.md +0 -0
  25. {workbench-0.8.167 → workbench-0.8.168}/SECURITY.md +0 -0
  26. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/Dockerfile +0 -0
  27. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/README.md +0 -0
  28. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/app.py +0 -0
  29. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/assets/favicon.ico +0 -0
  30. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/dashboard +0 -0
  31. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/deploy.sh +0 -0
  32. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/nginx.conf +0 -0
  33. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/open_source_config.json +0 -0
  34. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/pages/data_sources/callbacks.py +0 -0
  35. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/pages/data_sources/layout.py +0 -0
  36. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/pages/data_sources/page.py +0 -0
  37. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/pages/endpoints/callbacks.py +0 -0
  38. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/pages/endpoints/layout.py +0 -0
  39. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/pages/endpoints/page.py +0 -0
  40. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/pages/feature_sets/callbacks.py +0 -0
  41. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/pages/feature_sets/layout.py +0 -0
  42. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/pages/feature_sets/page.py +0 -0
  43. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/pages/license/page.py +0 -0
  44. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/pages/main/callbacks.py +0 -0
  45. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/pages/main/layout.py +0 -0
  46. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/pages/main/page.py +0 -0
  47. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/pages/models/callbacks.py +0 -0
  48. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/pages/models/layout.py +0 -0
  49. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/pages/models/page.py +0 -0
  50. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/pages/pipelines/callbacks.py +0 -0
  51. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/pages/pipelines/layout.py +0 -0
  52. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/pages/pipelines/page.py +0 -0
  53. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/pages/status/page.py +0 -0
  54. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/static/dark.css +0 -0
  55. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/static/light.css +0 -0
  56. {workbench-0.8.167 → workbench-0.8.168}/applications/aws_dashboard/supervisord.conf +0 -0
  57. {workbench-0.8.167 → workbench-0.8.168}/applications/compound_explorer/Dockerfile +0 -0
  58. {workbench-0.8.167 → workbench-0.8.168}/applications/compound_explorer/README.md +0 -0
  59. {workbench-0.8.167 → workbench-0.8.168}/applications/compound_explorer/app.py +0 -0
  60. {workbench-0.8.167 → workbench-0.8.168}/applications/compound_explorer/assets/favicon.ico +0 -0
  61. {workbench-0.8.167 → workbench-0.8.168}/applications/compound_explorer/callbacks.py +0 -0
  62. {workbench-0.8.167 → workbench-0.8.168}/applications/compound_explorer/explorer +0 -0
  63. {workbench-0.8.167 → workbench-0.8.168}/applications/compound_explorer/layout.py +0 -0
  64. {workbench-0.8.167 → workbench-0.8.168}/applications/compound_explorer/nginx.conf +0 -0
  65. {workbench-0.8.167 → workbench-0.8.168}/applications/compound_explorer/open_source_config.json +0 -0
  66. {workbench-0.8.167 → workbench-0.8.168}/applications/compound_explorer/requirements.txt +0 -0
  67. {workbench-0.8.167 → workbench-0.8.168}/applications/compound_explorer/storage/callbacks.py +0 -0
  68. {workbench-0.8.167 → workbench-0.8.168}/applications/compound_explorer/storage/callbacks_new.py +0 -0
  69. {workbench-0.8.167 → workbench-0.8.168}/applications/compound_explorer/storage/layout_new.py +0 -0
  70. {workbench-0.8.167 → workbench-0.8.168}/applications/compound_explorer/supervisord.conf +0 -0
  71. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/aws_account_check.py +0 -0
  72. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/aws_identity_check.py +0 -0
  73. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/build_ml_pipeline.py +0 -0
  74. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/compound_explorer/.gitignore +0 -0
  75. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/compound_explorer/README.md +0 -0
  76. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/compound_explorer/app.py +0 -0
  77. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/compound_explorer/cdk.json +0 -0
  78. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/compound_explorer/compound_explorer/__init__.py +0 -0
  79. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/compound_explorer/compound_explorer/compound_explorer_stack.py +0 -0
  80. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/compound_explorer/requirements.txt +0 -0
  81. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/event_bridge/Readme.md +0 -0
  82. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/event_bridge/dynamic_docker/Readme.md +0 -0
  83. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/event_bridge/dynamic_docker/app.py +0 -0
  84. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/event_bridge/dynamic_docker/cdk.json +0 -0
  85. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/event_bridge/dynamic_docker/lambda/lambda_replace_task.py +0 -0
  86. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/event_bridge/dynamic_docker/workbench_image_update_stack.py +0 -0
  87. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_core/.gitignore +0 -0
  88. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_core/README.md +0 -0
  89. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_core/cdk.json +0 -0
  90. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_core/requirements-dev.txt +0 -0
  91. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_core/source.bat +0 -0
  92. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_core/workbench_core/__init__.py +0 -0
  93. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_dashboard_full/.gitignore +0 -0
  94. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_dashboard_full/README.md +0 -0
  95. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_dashboard_full/app.py +0 -0
  96. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_dashboard_full/cdk.json +0 -0
  97. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_dashboard_full/requirements-dev.txt +0 -0
  98. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_dashboard_full/requirements.txt +0 -0
  99. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_dashboard_full/source.bat +0 -0
  100. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_dashboard_full/workbench_dashboard_full/__init__.py +0 -0
  101. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_dashboard_full/workbench_dashboard_full/workbench_dashboard_stack.py +0 -0
  102. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_dashboard_lite/.gitignore +0 -0
  103. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_dashboard_lite/README.md +0 -0
  104. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_dashboard_lite/app.py +0 -0
  105. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_dashboard_lite/cdk.json +0 -0
  106. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_dashboard_lite/requirements.txt +0 -0
  107. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_dashboard_lite/workbench_dashboard_lite/__init__.py +0 -0
  108. {workbench-0.8.167 → workbench-0.8.168}/aws_setup/workbench_dashboard_lite/workbench_dashboard_lite/workbench_dashboard_stack.py +0 -0
  109. {workbench-0.8.167 → workbench-0.8.168}/data/abalone.csv +0 -0
  110. {workbench-0.8.167 → workbench-0.8.168}/data/karate_graph.json +0 -0
  111. {workbench-0.8.167 → workbench-0.8.168}/data/test_data.csv +0 -0
  112. {workbench-0.8.167 → workbench-0.8.168}/data/test_data.json +0 -0
  113. {workbench-0.8.167 → workbench-0.8.168}/data/wine_dataset.csv +0 -0
  114. {workbench-0.8.167 → workbench-0.8.168}/deploy_docker.sh +0 -0
  115. {workbench-0.8.167 → workbench-0.8.168}/docs/admin/aws_service_limits.md +0 -0
  116. {workbench-0.8.167 → workbench-0.8.168}/docs/admin/base_docker_push.md +0 -0
  117. {workbench-0.8.167 → workbench-0.8.168}/docs/admin/dashboard_docker_push.md +0 -0
  118. {workbench-0.8.167 → workbench-0.8.168}/docs/admin/dashboard_s3_plugins.md +0 -0
  119. {workbench-0.8.167 → workbench-0.8.168}/docs/admin/explorer_docker_push.md +0 -0
  120. {workbench-0.8.167 → workbench-0.8.168}/docs/admin/images/dashboard_secret_click.png +0 -0
  121. {workbench-0.8.167 → workbench-0.8.168}/docs/admin/images/serverless_quotas.png +0 -0
  122. {workbench-0.8.167 → workbench-0.8.168}/docs/admin/images/status_showing_S3_path.png +0 -0
  123. {workbench-0.8.167 → workbench-0.8.168}/docs/admin/pypi_release.md +0 -0
  124. {workbench-0.8.167 → workbench-0.8.168}/docs/admin/workbench_docker_for_lambdas.md +0 -0
  125. {workbench-0.8.167 → workbench-0.8.168}/docs/api_classes/data_source.md +0 -0
  126. {workbench-0.8.167 → workbench-0.8.168}/docs/api_classes/df_store.md +0 -0
  127. {workbench-0.8.167 → workbench-0.8.168}/docs/api_classes/endpoint.md +0 -0
  128. {workbench-0.8.167 → workbench-0.8.168}/docs/api_classes/feature_set.md +0 -0
  129. {workbench-0.8.167 → workbench-0.8.168}/docs/api_classes/meta.md +0 -0
  130. {workbench-0.8.167 → workbench-0.8.168}/docs/api_classes/model.md +0 -0
  131. {workbench-0.8.167 → workbench-0.8.168}/docs/api_classes/monitor.md +0 -0
  132. {workbench-0.8.167 → workbench-0.8.168}/docs/api_classes/overview.md +0 -0
  133. {workbench-0.8.167 → workbench-0.8.168}/docs/api_classes/parameter_store.md +0 -0
  134. {workbench-0.8.167 → workbench-0.8.168}/docs/api_classes/pipelines.md +0 -0
  135. {workbench-0.8.167 → workbench-0.8.168}/docs/api_classes/views.md +0 -0
  136. {workbench-0.8.167 → workbench-0.8.168}/docs/aws_setup/aws_access_management.md +0 -0
  137. {workbench-0.8.167 → workbench-0.8.168}/docs/aws_setup/aws_client_vpn.md +0 -0
  138. {workbench-0.8.167 → workbench-0.8.168}/docs/aws_setup/aws_setup.md +0 -0
  139. {workbench-0.8.167 → workbench-0.8.168}/docs/aws_setup/aws_tips_and_tricks.md +0 -0
  140. {workbench-0.8.167 → workbench-0.8.168}/docs/aws_setup/core_stack.md +0 -0
  141. {workbench-0.8.167 → workbench-0.8.168}/docs/aws_setup/dashboard_stack.md +0 -0
  142. {workbench-0.8.167 → workbench-0.8.168}/docs/aws_setup/domain_cert_setup.md +0 -0
  143. {workbench-0.8.167 → workbench-0.8.168}/docs/aws_setup/full_pipeline.md +0 -0
  144. {workbench-0.8.167 → workbench-0.8.168}/docs/aws_setup/iam_assume_role.md +0 -0
  145. {workbench-0.8.167 → workbench-0.8.168}/docs/aws_setup/sso_assume_role.md +0 -0
  146. {workbench-0.8.167 → workbench-0.8.168}/docs/blogs/aws_credentials_lock.md +0 -0
  147. {workbench-0.8.167 → workbench-0.8.168}/docs/blogs/canonicalization_and_tautomerization.md +0 -0
  148. {workbench-0.8.167 → workbench-0.8.168}/docs/blogs/compound_etl.md +0 -0
  149. {workbench-0.8.167 → workbench-0.8.168}/docs/blogs/compound_explorer.md +0 -0
  150. {workbench-0.8.167 → workbench-0.8.168}/docs/blogs/descriptor_drilldown.md +0 -0
  151. {workbench-0.8.167 → workbench-0.8.168}/docs/blogs/eda.md +0 -0
  152. {workbench-0.8.167 → workbench-0.8.168}/docs/blogs/feature_importances.md +0 -0
  153. {workbench-0.8.167 → workbench-0.8.168}/docs/blogs/fun_with_workbench/fun_with_endpoints.md +0 -0
  154. {workbench-0.8.167 → workbench-0.8.168}/docs/blogs/htg.md +0 -0
  155. {workbench-0.8.167 → workbench-0.8.168}/docs/blogs/index.md +0 -0
  156. {workbench-0.8.167 → workbench-0.8.168}/docs/blogs/model_monitoring.md +0 -0
  157. {workbench-0.8.167 → workbench-0.8.168}/docs/blogs/residual_analysis.md +0 -0
  158. {workbench-0.8.167 → workbench-0.8.168}/docs/cached/cached_data_source.md +0 -0
  159. {workbench-0.8.167 → workbench-0.8.168}/docs/cached/cached_endpoint.md +0 -0
  160. {workbench-0.8.167 → workbench-0.8.168}/docs/cached/cached_feature_set.md +0 -0
  161. {workbench-0.8.167 → workbench-0.8.168}/docs/cached/cached_meta.md +0 -0
  162. {workbench-0.8.167 → workbench-0.8.168}/docs/cached/cached_model.md +0 -0
  163. {workbench-0.8.167 → workbench-0.8.168}/docs/cached/overview.md +0 -0
  164. {workbench-0.8.167 → workbench-0.8.168}/docs/chem_utils/index.md +0 -0
  165. {workbench-0.8.167 → workbench-0.8.168}/docs/cloudwatch/index.md +0 -0
  166. {workbench-0.8.167 → workbench-0.8.168}/docs/comparisons/workbench_vs_databricks.md +0 -0
  167. {workbench-0.8.167 → workbench-0.8.168}/docs/compound_explorer/tox21.md +0 -0
  168. {workbench-0.8.167 → workbench-0.8.168}/docs/compound_explorer/toxicity_modeling.md +0 -0
  169. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/artifacts/artifact.md +0 -0
  170. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/artifacts/athena_source.md +0 -0
  171. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/artifacts/data_source_abstract.md +0 -0
  172. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/artifacts/endpoint_core.md +0 -0
  173. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/artifacts/feature_set_core.md +0 -0
  174. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/artifacts/model_core.md +0 -0
  175. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/artifacts/monitor_core.md +0 -0
  176. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/artifacts/overview.md +0 -0
  177. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/overview.md +0 -0
  178. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/transforms/data_loaders_heavy.md +0 -0
  179. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/transforms/data_loaders_light.md +0 -0
  180. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/transforms/data_to_features.md +0 -0
  181. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/transforms/features_to_model.md +0 -0
  182. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/transforms/model_to_endpoint.md +0 -0
  183. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/transforms/overview.md +0 -0
  184. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/transforms/pandas_transforms.md +0 -0
  185. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/transforms/transform.md +0 -0
  186. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/views/computation_view.md +0 -0
  187. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/views/display_view.md +0 -0
  188. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/views/inference_view.md +0 -0
  189. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/views/overview.md +0 -0
  190. {workbench-0.8.167 → workbench-0.8.168}/docs/core_classes/views/training_view.md +0 -0
  191. {workbench-0.8.167 → workbench-0.8.168}/docs/data_algorithms/dataframes/overview.md +0 -0
  192. {workbench-0.8.167 → workbench-0.8.168}/docs/data_algorithms/graphs/overview.md +0 -0
  193. {workbench-0.8.167 → workbench-0.8.168}/docs/data_algorithms/overview.md +0 -0
  194. {workbench-0.8.167 → workbench-0.8.168}/docs/data_algorithms/spark/overview.md +0 -0
  195. {workbench-0.8.167 → workbench-0.8.168}/docs/data_algorithms/sql/overview.md +0 -0
  196. {workbench-0.8.167 → workbench-0.8.168}/docs/enterprise/index.md +0 -0
  197. {workbench-0.8.167 → workbench-0.8.168}/docs/enterprise/private_saas.md +0 -0
  198. {workbench-0.8.167 → workbench-0.8.168}/docs/enterprise/project_branding.md +0 -0
  199. {workbench-0.8.167 → workbench-0.8.168}/docs/enterprise/themes.md +0 -0
  200. {workbench-0.8.167 → workbench-0.8.168}/docs/getting_started/index.md +0 -0
  201. {workbench-0.8.167 → workbench-0.8.168}/docs/glue/index.md +0 -0
  202. {workbench-0.8.167 → workbench-0.8.168}/docs/images/big_spider.png +0 -0
  203. {workbench-0.8.167 → workbench-0.8.168}/docs/images/graph_representation.png +0 -0
  204. {workbench-0.8.167 → workbench-0.8.168}/docs/images/powered_aws_dark_blue.png +0 -0
  205. {workbench-0.8.167 → workbench-0.8.168}/docs/images/powered_aws_transparent.png +0 -0
  206. {workbench-0.8.167 → workbench-0.8.168}/docs/images/powered_aws_white.png +0 -0
  207. {workbench-0.8.167 → workbench-0.8.168}/docs/images/powered_aws_with_tm_grey.png +0 -0
  208. {workbench-0.8.167 → workbench-0.8.168}/docs/images/scp.png +0 -0
  209. {workbench-0.8.167 → workbench-0.8.168}/docs/images/scp_labs.png +0 -0
  210. {workbench-0.8.167 → workbench-0.8.168}/docs/images/small_spider.png +0 -0
  211. {workbench-0.8.167 → workbench-0.8.168}/docs/images/workbench_concepts.png +0 -0
  212. {workbench-0.8.167 → workbench-0.8.168}/docs/index.md +0 -0
  213. {workbench-0.8.167 → workbench-0.8.168}/docs/lambda_layer/index.md +0 -0
  214. {workbench-0.8.167 → workbench-0.8.168}/docs/misc/faq.md +0 -0
  215. {workbench-0.8.167 → workbench-0.8.168}/docs/misc/general_info.md +0 -0
  216. {workbench-0.8.167 → workbench-0.8.168}/docs/misc/scp_consulting.md +0 -0
  217. {workbench-0.8.167 → workbench-0.8.168}/docs/misc/workbench_classes_concepts.md +0 -0
  218. {workbench-0.8.167 → workbench-0.8.168}/docs/model_utils/index.md +0 -0
  219. {workbench-0.8.167 → workbench-0.8.168}/docs/plugins/index.md +0 -0
  220. {workbench-0.8.167 → workbench-0.8.168}/docs/presentations/index.md +0 -0
  221. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/0_8_106.md +0 -0
  222. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/0_8_158.md +0 -0
  223. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/0_8_50.md +0 -0
  224. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/0_8_55.md +0 -0
  225. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/0_8_58.md +0 -0
  226. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/0_8_60.md +0 -0
  227. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/0_8_71.md +0 -0
  228. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/0_8_74.md +0 -0
  229. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/0_8_78.md +0 -0
  230. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/archived/0_7_8.md +0 -0
  231. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/archived/0_8_11.md +0 -0
  232. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/archived/0_8_20.md +0 -0
  233. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/archived/0_8_22.md +0 -0
  234. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/archived/0_8_23.md +0 -0
  235. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/archived/0_8_27.md +0 -0
  236. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/archived/0_8_29.md +0 -0
  237. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/archived/0_8_33.md +0 -0
  238. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/archived/0_8_35.md +0 -0
  239. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/archived/0_8_36.md +0 -0
  240. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/archived/0_8_39.md +0 -0
  241. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/archived/0_8_42.md +0 -0
  242. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/archived/0_8_46.md +0 -0
  243. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/archived/0_8_6.md +0 -0
  244. {workbench-0.8.167 → workbench-0.8.168}/docs/release_notes/archived/0_8_8.md +0 -0
  245. {workbench-0.8.167 → workbench-0.8.168}/docs/repl/index.md +0 -0
  246. {workbench-0.8.167 → workbench-0.8.168}/docs/road_maps/0_9_0.md +0 -0
  247. {workbench-0.8.167 → workbench-0.8.168}/docs/road_maps/0_9_5.md +0 -0
  248. {workbench-0.8.167 → workbench-0.8.168}/docs/themes/details.md +0 -0
  249. {workbench-0.8.167 → workbench-0.8.168}/docs/themes/index.md +0 -0
  250. {workbench-0.8.167 → workbench-0.8.168}/examples/ag-grid/hello_world.py +0 -0
  251. {workbench-0.8.167 → workbench-0.8.168}/examples/chem_utils/canonicalize_smiles.py +0 -0
  252. {workbench-0.8.167 → workbench-0.8.168}/examples/chem_utils/tautomerize_smiles.py +0 -0
  253. {workbench-0.8.167 → workbench-0.8.168}/examples/datasource/datasource_from_df.py +0 -0
  254. {workbench-0.8.167 → workbench-0.8.168}/examples/datasource/datasource_from_s3.py +0 -0
  255. {workbench-0.8.167 → workbench-0.8.168}/examples/datasource/datasource_query.py +0 -0
  256. {workbench-0.8.167 → workbench-0.8.168}/examples/datasource/datasource_stats.py +0 -0
  257. {workbench-0.8.167 → workbench-0.8.168}/examples/datasource/datasource_to_featureset.py +0 -0
  258. {workbench-0.8.167 → workbench-0.8.168}/examples/endpoint/endpoint_details.py +0 -0
  259. {workbench-0.8.167 → workbench-0.8.168}/examples/endpoint/endpoint_inference.py +0 -0
  260. {workbench-0.8.167 → workbench-0.8.168}/examples/endpoint/endpoint_metrics.py +0 -0
  261. {workbench-0.8.167 → workbench-0.8.168}/examples/featureset/featureset_eda.py +0 -0
  262. {workbench-0.8.167 → workbench-0.8.168}/examples/featureset/featureset_query.py +0 -0
  263. {workbench-0.8.167 → workbench-0.8.168}/examples/full_ml_pipeline.py +0 -0
  264. {workbench-0.8.167 → workbench-0.8.168}/examples/glue_jobs/glue_example_1.py +0 -0
  265. {workbench-0.8.167 → workbench-0.8.168}/examples/glue_jobs/glue_example_2.py +0 -0
  266. {workbench-0.8.167 → workbench-0.8.168}/examples/glue_jobs/glue_example_3.py +0 -0
  267. {workbench-0.8.167 → workbench-0.8.168}/examples/glue_jobs/glue_launcher_examples/example_1.py +0 -0
  268. {workbench-0.8.167 → workbench-0.8.168}/examples/glue_jobs/glue_launcher_examples/example_2.py +0 -0
  269. {workbench-0.8.167 → workbench-0.8.168}/examples/meta/meta_list_endpoints.py +0 -0
  270. {workbench-0.8.167 → workbench-0.8.168}/examples/meta/meta_list_models.py +0 -0
  271. {workbench-0.8.167 → workbench-0.8.168}/examples/meta/meta_model_metrics.py +0 -0
  272. {workbench-0.8.167 → workbench-0.8.168}/examples/model_utils/model_metrics.py +0 -0
  273. {workbench-0.8.167 → workbench-0.8.168}/examples/model_utils/model_to_endpoint.py +0 -0
  274. {workbench-0.8.167 → workbench-0.8.168}/examples/model_utils/onboard_model.py +0 -0
  275. {workbench-0.8.167 → workbench-0.8.168}/examples/models/custom_model.py +0 -0
  276. {workbench-0.8.167 → workbench-0.8.168}/examples/models/dbscan.py +0 -0
  277. {workbench-0.8.167 → workbench-0.8.168}/examples/models/knn.py +0 -0
  278. {workbench-0.8.167 → workbench-0.8.168}/examples/models/pytorch.py +0 -0
  279. {workbench-0.8.167 → workbench-0.8.168}/examples/models/random_forest.py +0 -0
  280. {workbench-0.8.167 → workbench-0.8.168}/examples/models/uq/bayesian_ridge.py +0 -0
  281. {workbench-0.8.167 → workbench-0.8.168}/examples/models/uq/ensemble_xgb.py +0 -0
  282. {workbench-0.8.167 → workbench-0.8.168}/examples/models/uq/gaussian_process.py +0 -0
  283. {workbench-0.8.167 → workbench-0.8.168}/examples/models/uq/mapie_xgb.py +0 -0
  284. {workbench-0.8.167 → workbench-0.8.168}/examples/models/uq/meta_uq.py +0 -0
  285. {workbench-0.8.167 → workbench-0.8.168}/examples/models/uq/ngboost.py +0 -0
  286. {workbench-0.8.167 → workbench-0.8.168}/examples/models/uq/quant_xgb.py +0 -0
  287. {workbench-0.8.167 → workbench-0.8.168}/examples/monitor/monitor_setup.py +0 -0
  288. {workbench-0.8.167 → workbench-0.8.168}/examples/monitor/monitor_usage.py +0 -0
  289. {workbench-0.8.167 → workbench-0.8.168}/examples/plugins/branding/Readme.md +0 -0
  290. {workbench-0.8.167 → workbench-0.8.168}/examples/plugins/branding/scp.json +0 -0
  291. {workbench-0.8.167 → workbench-0.8.168}/examples/plugins/components/custom_plugin.py +0 -0
  292. {workbench-0.8.167 → workbench-0.8.168}/examples/plugins/components/endpoint_plugin.py +0 -0
  293. {workbench-0.8.167 → workbench-0.8.168}/examples/plugins/components/endpoint_turbo.py +0 -0
  294. {workbench-0.8.167 → workbench-0.8.168}/examples/plugins/components/model_markdown.py +0 -0
  295. {workbench-0.8.167 → workbench-0.8.168}/examples/plugins/components/model_plugin.py +0 -0
  296. {workbench-0.8.167 → workbench-0.8.168}/examples/plugins/packages/my_plugin_utils/__init__.py +0 -0
  297. {workbench-0.8.167 → workbench-0.8.168}/examples/plugins/packages/my_plugin_utils/assets/foo.json +0 -0
  298. {workbench-0.8.167 → workbench-0.8.168}/examples/plugins/packages/my_plugin_utils/cool_stuff.py +0 -0
  299. {workbench-0.8.167 → workbench-0.8.168}/examples/plugins/pages/plugin_page_1.py +0 -0
  300. {workbench-0.8.167 → workbench-0.8.168}/examples/plugins/pages/plugin_page_2.py +0 -0
  301. {workbench-0.8.167 → workbench-0.8.168}/examples/plugins/pages/plugin_page_3.py +0 -0
  302. {workbench-0.8.167 → workbench-0.8.168}/examples/plugins/templates/Readme.md +0 -0
  303. {workbench-0.8.167 → workbench-0.8.168}/examples/plugins/views/model_plugin_view.py +0 -0
  304. {workbench-0.8.167 → workbench-0.8.168}/examples/plugins/views/my_view_plugin.py +0 -0
  305. {workbench-0.8.167 → workbench-0.8.168}/examples/storage/data_to_data.py +0 -0
  306. {workbench-0.8.167 → workbench-0.8.168}/examples/storage/data_to_features.py +0 -0
  307. {workbench-0.8.167 → workbench-0.8.168}/examples/storage/endpoint_inference.py +0 -0
  308. {workbench-0.8.167 → workbench-0.8.168}/examples/storage/hello_world_pipeline.py +0 -0
  309. {workbench-0.8.167 → workbench-0.8.168}/examples/storage/plugin_page_example.py +0 -0
  310. {workbench-0.8.167 → workbench-0.8.168}/examples/storage/sagemaker_pipelines/all_steps.py +0 -0
  311. {workbench-0.8.167 → workbench-0.8.168}/examples/storage/sagemaker_pipelines/hello.py +0 -0
  312. {workbench-0.8.167 → workbench-0.8.168}/examples/storage/sagemaker_pipelines/ml_pipeline.py +0 -0
  313. {workbench-0.8.167 → workbench-0.8.168}/examples/storage/sagemaker_pipelines/storage/full_pipeline_experiment/data_source.py +0 -0
  314. {workbench-0.8.167 → workbench-0.8.168}/examples/storage/sagemaker_pipelines/storage/full_pipeline_experiment/endpoint.py +0 -0
  315. {workbench-0.8.167 → workbench-0.8.168}/examples/storage/sagemaker_pipelines/storage/full_pipeline_experiment/feature_set.py +0 -0
  316. {workbench-0.8.167 → workbench-0.8.168}/examples/storage/sagemaker_pipelines/storage/full_pipeline_experiment/ml_pipeline.py +0 -0
  317. {workbench-0.8.167 → workbench-0.8.168}/examples/storage/sagemaker_pipelines/storage/full_pipeline_experiment/model.py +0 -0
  318. {workbench-0.8.167 → workbench-0.8.168}/experiments/chem_info/bulk_sims.py +0 -0
  319. {workbench-0.8.167 → workbench-0.8.168}/experiments/chem_info/knn_sims.py +0 -0
  320. {workbench-0.8.167 → workbench-0.8.168}/experiments/confidence_roc_curve.py +0 -0
  321. {workbench-0.8.167 → workbench-0.8.168}/experiments/coverage_probability.py +0 -0
  322. {workbench-0.8.167 → workbench-0.8.168}/experiments/log_testing.py +0 -0
  323. {workbench-0.8.167 → workbench-0.8.168}/experiments/neighbor_outliers.py +0 -0
  324. {workbench-0.8.167 → workbench-0.8.168}/experiments/networkx_id.py +0 -0
  325. {workbench-0.8.167 → workbench-0.8.168}/experiments/prediction_intervals.py +0 -0
  326. {workbench-0.8.167 → workbench-0.8.168}/experiments/pytorch_model.py +0 -0
  327. {workbench-0.8.167 → workbench-0.8.168}/experiments/quantile_regression.py +0 -0
  328. {workbench-0.8.167 → workbench-0.8.168}/experiments/quantile_regression_2.py +0 -0
  329. {workbench-0.8.167 → workbench-0.8.168}/experiments/regression_confidence.py +0 -0
  330. {workbench-0.8.167 → workbench-0.8.168}/experiments/residual_analysis.py +0 -0
  331. {workbench-0.8.167 → workbench-0.8.168}/experiments/rocauc_testing.py +0 -0
  332. {workbench-0.8.167 → workbench-0.8.168}/experiments/scatter_zoom_issue.py +0 -0
  333. {workbench-0.8.167 → workbench-0.8.168}/experiments/sol_pipeline.py +0 -0
  334. {workbench-0.8.167 → workbench-0.8.168}/glue_jobs/create_glue_workflow_with_trigger.py +0 -0
  335. {workbench-0.8.167 → workbench-0.8.168}/glue_jobs/example_glue_job.py +0 -0
  336. {workbench-0.8.167 → workbench-0.8.168}/glue_jobs/glue_job_pipeline.py +0 -0
  337. {workbench-0.8.167 → workbench-0.8.168}/glue_jobs/glue_mixed_case.py +0 -0
  338. {workbench-0.8.167 → workbench-0.8.168}/mkdocs.yml +0 -0
  339. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/Readme.md +0 -0
  340. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/inference/Dockerfile +0 -0
  341. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/inference/main.py +0 -0
  342. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/inference/requirements.txt +0 -0
  343. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/inference/serve +0 -0
  344. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/meta_endpoint/Dockerfile +0 -0
  345. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/meta_endpoint/main.py +0 -0
  346. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/meta_endpoint/requirements.txt +0 -0
  347. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/meta_endpoint/serve +0 -0
  348. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/ml_pipelines/requirements.txt +0 -0
  349. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/pytorch_inference/Dockerfile +0 -0
  350. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/pytorch_inference/main.py +0 -0
  351. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/pytorch_inference/requirements.txt +0 -0
  352. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/pytorch_inference/serve +0 -0
  353. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/pytorch_training/Dockerfile +0 -0
  354. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/pytorch_training/requirements.txt +0 -0
  355. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/pytorch_training/sagemaker_entrypoint.py +0 -0
  356. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/scripts/build_deploy.sh +0 -0
  357. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/tests/data/abalone_sm.csv +0 -0
  358. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/tests/example_model_script.py +0 -0
  359. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/tests/run_tests.sh +0 -0
  360. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/tests/test_inference.py +0 -0
  361. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/tests/test_training.py +0 -0
  362. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/training/Dockerfile +0 -0
  363. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/training/requirements.txt +0 -0
  364. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/training/sagemaker_entrypoint.py +0 -0
  365. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/workbench_inference/Dockerfile +0 -0
  366. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/workbench_inference/main.py +0 -0
  367. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/workbench_inference/requirements.txt +0 -0
  368. {workbench-0.8.167 → workbench-0.8.168}/model_docker_images/workbench_inference/serve +0 -0
  369. {workbench-0.8.167 → workbench-0.8.168}/notebooks/Inference_On_Legacy_Models.ipynb +0 -0
  370. {workbench-0.8.167 → workbench-0.8.168}/notebooks/ML_Pipeline_with_Workbench.ipynb +0 -0
  371. {workbench-0.8.167 → workbench-0.8.168}/notebooks/ML_Pipeline_with_Workbench_2.ipynb +0 -0
  372. {workbench-0.8.167 → workbench-0.8.168}/notebooks/Outliers_in_Workbench.ipynb +0 -0
  373. {workbench-0.8.167 → workbench-0.8.168}/notebooks/Regression_Confidence_Experiments.ipynb +0 -0
  374. {workbench-0.8.167 → workbench-0.8.168}/notebooks/Residual_Analysis.ipynb +0 -0
  375. {workbench-0.8.167 → workbench-0.8.168}/notebooks/images/athena_query_aqsol.png +0 -0
  376. {workbench-0.8.167 → workbench-0.8.168}/notebooks/images/aws_dashboard_aqsol.png +0 -0
  377. {workbench-0.8.167 → workbench-0.8.168}/notebooks/images/dashboard_aqsol_features.png +0 -0
  378. {workbench-0.8.167 → workbench-0.8.168}/notebooks/images/model_screenshot.png +0 -0
  379. {workbench-0.8.167 → workbench-0.8.168}/notebooks/images/scp_labs.png +0 -0
  380. {workbench-0.8.167 → workbench-0.8.168}/presentations/README.md +0 -0
  381. {workbench-0.8.167 → workbench-0.8.168}/pyproject.toml +0 -0
  382. {workbench-0.8.167 → workbench-0.8.168}/scripts/active_logs.sh +0 -0
  383. {workbench-0.8.167 → workbench-0.8.168}/scripts/admin/athena_ddl_mixed_case.py +0 -0
  384. {workbench-0.8.167 → workbench-0.8.168}/scripts/admin/check_all_glue_tables.py +0 -0
  385. {workbench-0.8.167 → workbench-0.8.168}/scripts/admin/db_scan_test.py +0 -0
  386. {workbench-0.8.167 → workbench-0.8.168}/scripts/admin/delete_invalid_views.py +0 -0
  387. {workbench-0.8.167 → workbench-0.8.168}/scripts/admin/delete_redis_keys.py +0 -0
  388. {workbench-0.8.167 → workbench-0.8.168}/scripts/admin/list_datacatalog.py +0 -0
  389. {workbench-0.8.167 → workbench-0.8.168}/scripts/admin/migration/copy_glue_database.py +0 -0
  390. {workbench-0.8.167 → workbench-0.8.168}/scripts/admin/migration/delete_sageworks_glue_database.sh +0 -0
  391. {workbench-0.8.167 → workbench-0.8.168}/scripts/admin/migration/ds_migrate.py +0 -0
  392. {workbench-0.8.167 → workbench-0.8.168}/scripts/admin/migration/endpoint_migrate.py +0 -0
  393. {workbench-0.8.167 → workbench-0.8.168}/scripts/admin/migration/fs_migrate.py +0 -0
  394. {workbench-0.8.167 → workbench-0.8.168}/scripts/admin/migration/model_migrate.py +0 -0
  395. {workbench-0.8.167 → workbench-0.8.168}/scripts/admin/pull_image_digest.py +0 -0
  396. {workbench-0.8.167 → workbench-0.8.168}/scripts/admin/redis_reaper.py +0 -0
  397. {workbench-0.8.167 → workbench-0.8.168}/scripts/admin/spam_list_tags.py +0 -0
  398. {workbench-0.8.167 → workbench-0.8.168}/scripts/admin/storage/convert_training_views.py +0 -0
  399. {workbench-0.8.167 → workbench-0.8.168}/scripts/admin/storage/migrate_data_source_via_df.py +0 -0
  400. {workbench-0.8.167 → workbench-0.8.168}/scripts/admin/storage/migrate_ds_meta.py +0 -0
  401. {workbench-0.8.167 → workbench-0.8.168}/scripts/ag_table_row_selection.py +0 -0
  402. {workbench-0.8.167 → workbench-0.8.168}/scripts/compare_dataframes.py +0 -0
  403. {workbench-0.8.167 → workbench-0.8.168}/scripts/compare_model_packages.py +0 -0
  404. {workbench-0.8.167 → workbench-0.8.168}/scripts/endpoint_inference_launch.py +0 -0
  405. {workbench-0.8.167 → workbench-0.8.168}/scripts/endpoint_timing/endpoint_timing.py +0 -0
  406. {workbench-0.8.167 → workbench-0.8.168}/scripts/endpoint_timing/endpoint_timing_old.py +0 -0
  407. {workbench-0.8.167 → workbench-0.8.168}/scripts/endpoint_timing/timing_plot.py +0 -0
  408. {workbench-0.8.167 → workbench-0.8.168}/scripts/find_smiles_issues.py +0 -0
  409. {workbench-0.8.167 → workbench-0.8.168}/scripts/get_tags.py +0 -0
  410. {workbench-0.8.167 → workbench-0.8.168}/scripts/instantiation_timings.py +0 -0
  411. {workbench-0.8.167 → workbench-0.8.168}/scripts/llm_deploys/deepseek_deploy.py +0 -0
  412. {workbench-0.8.167 → workbench-0.8.168}/scripts/model_cache_refresh.py +0 -0
  413. {workbench-0.8.167 → workbench-0.8.168}/scripts/model_endpoint_sanity_check.py +0 -0
  414. {workbench-0.8.167 → workbench-0.8.168}/scripts/model_to_endpoint_debugging.py +0 -0
  415. {workbench-0.8.167 → workbench-0.8.168}/scripts/monitor_event_bridge.py +0 -0
  416. {workbench-0.8.167 → workbench-0.8.168}/scripts/onboard_endpoints.py +0 -0
  417. {workbench-0.8.167 → workbench-0.8.168}/scripts/onboard_models.py +0 -0
  418. {workbench-0.8.167 → workbench-0.8.168}/scripts/pipeline_model_endpoint.py +0 -0
  419. {workbench-0.8.167 → workbench-0.8.168}/scripts/pubchem/pubchem_example.py +0 -0
  420. {workbench-0.8.167 → workbench-0.8.168}/scripts/pubchem/pubchem_query.py +0 -0
  421. {workbench-0.8.167 → workbench-0.8.168}/scripts/pubchem/pubchem_query_with_cid.py +0 -0
  422. {workbench-0.8.167 → workbench-0.8.168}/scripts/seaborn_to_plotly.py +0 -0
  423. {workbench-0.8.167 → workbench-0.8.168}/scripts/storage/dns_data_to_features.py +0 -0
  424. {workbench-0.8.167 → workbench-0.8.168}/scripts/storage/generate_jsonl_data.py +0 -0
  425. {workbench-0.8.167 → workbench-0.8.168}/scripts/test_feature_resolution.py +0 -0
  426. {workbench-0.8.167 → workbench-0.8.168}/scripts/test_no_workbench_config.py +0 -0
  427. {workbench-0.8.167 → workbench-0.8.168}/scripts/tox21/test_tox_heuristic.py +0 -0
  428. {workbench-0.8.167 → workbench-0.8.168}/scripts/tox21/tox21_to_df_store.py +0 -0
  429. {workbench-0.8.167 → workbench-0.8.168}/setup.cfg +0 -0
  430. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/__init__.py +0 -0
  431. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/__init__.py +0 -0
  432. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/dataframe/Readme.md +0 -0
  433. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/dataframe/__init__.py +0 -0
  434. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/dataframe/data_source_eda.py +0 -0
  435. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/dataframe/feature_space_proximity.py +0 -0
  436. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/dataframe/fingerprint_proximity.py +0 -0
  437. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/dataframe/projection_2d.py +0 -0
  438. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/dataframe/proximity.py +0 -0
  439. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/dataframe/storage/aggregation.py +0 -0
  440. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/dataframe/storage/feature_resolution.py +0 -0
  441. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/dataframe/storage/feature_spider.py +0 -0
  442. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/dataframe/storage/residuals_calculator.py +0 -0
  443. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/dataframe/storage/row_tagger.py +0 -0
  444. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/dataframe/storage/target_gradients.py +0 -0
  445. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/graph/__init__.py +0 -0
  446. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/graph/heavy/Readme.md +0 -0
  447. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/graph/light/Readme.md +0 -0
  448. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/graph/light/__init__.py +0 -0
  449. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/graph/light/proximity_graph.py +0 -0
  450. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/spark/Readme.md +0 -0
  451. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/sql/Readme.md +0 -0
  452. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/sql/__init__.py +0 -0
  453. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/sql/column_stats.py +0 -0
  454. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/sql/correlations.py +0 -0
  455. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/sql/descriptive_stats.py +0 -0
  456. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/sql/outliers.py +0 -0
  457. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/sql/sample_rows.py +0 -0
  458. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/algorithms/sql/value_counts.py +0 -0
  459. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/api/__init__.py +0 -0
  460. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/api/compound.py +0 -0
  461. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/api/data_source.py +0 -0
  462. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/api/df_store.py +0 -0
  463. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/api/endpoint.py +0 -0
  464. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/api/feature_set.py +0 -0
  465. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/api/graph_store.py +0 -0
  466. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/api/meta.py +0 -0
  467. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/api/model.py +0 -0
  468. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/api/monitor.py +0 -0
  469. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/api/parameter_store.py +0 -0
  470. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/api/pipeline.py +0 -0
  471. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/cached/__init__.py +0 -0
  472. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/cached/cached_data_source.py +0 -0
  473. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/cached/cached_endpoint.py +0 -0
  474. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/cached/cached_feature_set.py +0 -0
  475. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/cached/cached_meta.py +0 -0
  476. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/cached/cached_model.py +0 -0
  477. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/cached/cached_pipeline.py +0 -0
  478. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/__init__.py +0 -0
  479. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/artifacts/__init__.py +0 -0
  480. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/artifacts/artifact.py +0 -0
  481. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/artifacts/athena_source.py +0 -0
  482. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/artifacts/cached_artifact_mixin.py +0 -0
  483. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/artifacts/data_source_abstract.py +0 -0
  484. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/artifacts/data_source_factory.py +0 -0
  485. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/artifacts/endpoint_core.py +0 -0
  486. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/artifacts/feature_set_core.py +0 -0
  487. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/artifacts/model_core.py +0 -0
  488. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/artifacts/monitor_core.py +0 -0
  489. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/cloud_platform/aws/README.md +0 -0
  490. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/cloud_platform/aws/aws_account_clamp.py +0 -0
  491. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/cloud_platform/aws/aws_df_store.py +0 -0
  492. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/cloud_platform/aws/aws_graph_store.py +0 -0
  493. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/cloud_platform/aws/aws_meta.py +0 -0
  494. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/cloud_platform/aws/aws_parameter_store.py +0 -0
  495. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/cloud_platform/aws/aws_secrets_manager.py +0 -0
  496. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/cloud_platform/aws/aws_session.py +0 -0
  497. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/cloud_platform/aws/cache_dataframe.py +0 -0
  498. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/cloud_platform/azure/README.md +0 -0
  499. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/cloud_platform/cloud_meta.py +0 -0
  500. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/cloud_platform/gcp/README.md +0 -0
  501. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/pipelines/pipeline_executor.py +0 -0
  502. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/Readme.md +0 -0
  503. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/__init__.py +0 -0
  504. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_loaders/__init__.py +0 -0
  505. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_loaders/heavy/__init__.py +0 -0
  506. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_loaders/heavy/s3_heavy_to_data_source.py +0 -0
  507. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_loaders/light/__init__.py +0 -0
  508. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_loaders/light/csv_to_data_source.py +0 -0
  509. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_loaders/light/json_to_data_source.py +0 -0
  510. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_loaders/light/s3_to_data_source_light.py +0 -0
  511. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_to_data/__init__.py +0 -0
  512. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_to_data/heavy/__init__.py +0 -0
  513. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_to_data/heavy/emr/Readme.md +0 -0
  514. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_to_data/heavy/glue/Readme.md +0 -0
  515. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_to_data/light/__init__.py +0 -0
  516. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_to_data/light/clean_data.py +0 -0
  517. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_to_data/light/data_to_data_light.py +0 -0
  518. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_to_features/__init__.py +0 -0
  519. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_to_features/heavy/__init__.py +0 -0
  520. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_to_features/heavy/chunk/__init__.py +0 -0
  521. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_to_features/heavy/chunk/data_to_features_chunk.py +0 -0
  522. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_to_features/heavy/emr/Readme.md +0 -0
  523. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_to_features/heavy/glue/Readme.md +0 -0
  524. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_to_features/heavy/storage/data_to_features_heavy_old.py +0 -0
  525. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_to_features/light/__init__.py +0 -0
  526. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_to_features/light/data_to_features_light.py +0 -0
  527. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/data_to_features/light/molecular_descriptors.py +0 -0
  528. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/features_to_features/__init__.py +0 -0
  529. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/features_to_features/heavy/emr/Readme.md +0 -0
  530. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/features_to_features/heavy/glue/Readme.md +0 -0
  531. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/features_to_model/__init__.py +0 -0
  532. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/features_to_model/features_to_model.py +0 -0
  533. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/model_to_endpoint/__init__.py +0 -0
  534. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/model_to_endpoint/model_to_endpoint.py +0 -0
  535. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/pandas_transforms/__init__.py +0 -0
  536. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/pandas_transforms/data_to_pandas.py +0 -0
  537. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/pandas_transforms/features_to_pandas.py +0 -0
  538. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/pandas_transforms/pandas_to_data.py +0 -0
  539. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/pandas_transforms/pandas_to_features.py +0 -0
  540. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/pandas_transforms/pandas_to_features_chunked.py +0 -0
  541. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/transforms/transform.py +0 -0
  542. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/views/__init__.py +0 -0
  543. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/views/column_subset_view.py +0 -0
  544. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/views/computation_view.py +0 -0
  545. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/views/create_view.py +0 -0
  546. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/views/display_view.py +0 -0
  547. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/views/inference_view.py +0 -0
  548. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/views/pandas_to_view.py +0 -0
  549. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/views/storage/mdq_view.py +0 -0
  550. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/views/training_view.py +0 -0
  551. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/views/view.py +0 -0
  552. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/core/views/view_utils.py +0 -0
  553. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/chem_info/Readme.md +0 -0
  554. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/chem_info/local_utils.py +0 -0
  555. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/chem_info/molecular_descriptors.py +0 -0
  556. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/chem_info/morgan_fingerprints.py +0 -0
  557. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/chem_info/requirements.txt +0 -0
  558. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/chem_info/tautomerize.py +0 -0
  559. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/meta_endpoints/example.py +0 -0
  560. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/network_security/Readme.md +0 -0
  561. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/proximity/Readme.md +0 -0
  562. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/proximity/feature_space_proximity.template +0 -0
  563. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/proximity/generated_model_script.py +0 -0
  564. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/proximity/proximity.py +0 -0
  565. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/proximity/requirements.txt +0 -0
  566. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/uq_models/Readme.md +0 -0
  567. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/uq_models/bayesian_ridge.template +0 -0
  568. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/uq_models/ensemble_xgb.template +0 -0
  569. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/uq_models/gaussian_process.template +0 -0
  570. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/uq_models/generated_model_script.py +0 -0
  571. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/uq_models/mapie_xgb.template +0 -0
  572. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/uq_models/meta_uq.template +0 -0
  573. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/uq_models/ngboost.template +0 -0
  574. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/uq_models/proximity.py +0 -0
  575. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_models/uq_models/requirements.txt +0 -0
  576. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_script_example/custom_model_script.py +0 -0
  577. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/custom_script_example/requirements.txt +0 -0
  578. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/ensemble_xgb/ensemble_xgb.template +0 -0
  579. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/ensemble_xgb/generated_model_script.py +0 -0
  580. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/ensemble_xgb/requirements.txt +0 -0
  581. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/pytorch_model/generated_model_script.py +0 -0
  582. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/pytorch_model/pytorch.template +0 -0
  583. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/pytorch_model/requirements.txt +0 -0
  584. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/quant_regression/quant_regression.template +0 -0
  585. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/quant_regression/requirements.txt +0 -0
  586. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/scikit_learn/generated_model_script.py +0 -0
  587. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/scikit_learn/requirements.txt +0 -0
  588. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/scikit_learn/scikit_learn.template +0 -0
  589. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/script_generation.py +0 -0
  590. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/xgb_model/generated_model_script.py +0 -0
  591. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/xgb_model/requirements.txt +0 -0
  592. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/model_scripts/xgb_model/xgb_model.template +0 -0
  593. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/repl/__init__.py +0 -0
  594. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/repl/workbench_shell.py +0 -0
  595. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/resources/open_source_api.key +0 -0
  596. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/resources/signature_verify_pub.pem +0 -0
  597. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/scripts/check_double_bond_stereo.py +0 -0
  598. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/scripts/glue_launcher.py +0 -0
  599. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/scripts/redis_expire.py +0 -0
  600. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/scripts/redis_report.py +0 -0
  601. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/scripts/show_config.py +0 -0
  602. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/themes/dark/base_css.url +0 -0
  603. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/themes/dark/custom.css +0 -0
  604. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/themes/dark/plotly.json +0 -0
  605. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/themes/light/base_css.url +0 -0
  606. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/themes/light/branding.json +0 -0
  607. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/themes/light/custom.css +0 -0
  608. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/themes/light/plotly.json +0 -0
  609. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/themes/midnight_blue/base_css.url +0 -0
  610. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/themes/midnight_blue/branding.json +0 -0
  611. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/themes/midnight_blue/custom.css +0 -0
  612. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/themes/midnight_blue/plotly.json +0 -0
  613. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/themes/quartz/base_css.url +0 -0
  614. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/themes/quartz/custom.css +0 -0
  615. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/themes/quartz/plotly.json +0 -0
  616. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/themes/quartz_dark/base_css.url +0 -0
  617. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/themes/quartz_dark/custom.css +0 -0
  618. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/themes/quartz_dark/plotly.json +0 -0
  619. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/__init__.py +0 -0
  620. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/ai_compound_generator.py +0 -0
  621. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/ai_summary.py +0 -0
  622. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/ai_synth.py +0 -0
  623. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/athena_utils.py +0 -0
  624. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/aws_utils.py +0 -0
  625. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/bulk_utils.py +0 -0
  626. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/cache.py +0 -0
  627. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/chem_utils.py +0 -0
  628. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/cloudwatch_handler.py +0 -0
  629. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/color_utils.py +0 -0
  630. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/config_manager.py +0 -0
  631. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/dashboard_metrics.py +0 -0
  632. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/datetime_utils.py +0 -0
  633. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/deprecated_utils.py +0 -0
  634. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/df_to_endpoint.py +0 -0
  635. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/ecs_info.py +0 -0
  636. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/endpoint_metrics.py +0 -0
  637. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/endpoint_utils.py +0 -0
  638. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/extract_model_artifact.py +0 -0
  639. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/fast_inference.py +0 -0
  640. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/glue_utils.py +0 -0
  641. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/graph_utils.py +0 -0
  642. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/ipython_utils.py +0 -0
  643. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/json_utils.py +0 -0
  644. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/lambda_utils.py +0 -0
  645. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/license_manager.py +0 -0
  646. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/log_utils.py +0 -0
  647. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/markdown_utils.py +0 -0
  648. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/model_utils.py +0 -0
  649. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/monitor_utils.py +0 -0
  650. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/pandas_utils.py +0 -0
  651. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/performance_utils.py +0 -0
  652. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/pipeline_utils.py +0 -0
  653. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/plot_utils.py +0 -0
  654. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/plugin_manager.py +0 -0
  655. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/prox_utils.py +0 -0
  656. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/redis_cache.py +0 -0
  657. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/repl_utils.py +0 -0
  658. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/resource_utils.py +0 -0
  659. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/s3_utils.py +0 -0
  660. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/shap_utils.py +0 -0
  661. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/shapley_values.py +0 -0
  662. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/symbols.py +0 -0
  663. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/test_data_generator.py +0 -0
  664. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/theme_manager.py +0 -0
  665. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/trace_calls.py +0 -0
  666. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/type_abbrev.py +0 -0
  667. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/workbench_cache.py +0 -0
  668. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/workbench_event_bridge.py +0 -0
  669. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/workbench_logging.py +0 -0
  670. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/workbench_sqs.py +0 -0
  671. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/utils/xgboost_model_utils.py +0 -0
  672. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/component_interface.py +0 -0
  673. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/correlation_matrix.py +0 -0
  674. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/data_details_markdown.py +0 -0
  675. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/endpoint_metric_plots.py +0 -0
  676. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/experiments/dashboard_metric_plots.py +0 -0
  677. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/experiments/outlier_plot.py +0 -0
  678. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/model_plot.py +0 -0
  679. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/plugin_interface.py +0 -0
  680. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/plugin_unit_test.py +0 -0
  681. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/plugins/ag_table.py +0 -0
  682. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/plugins/confusion_matrix.py +0 -0
  683. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/plugins/dashboard_status.py +0 -0
  684. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/plugins/data_details.py +0 -0
  685. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/plugins/endpoint_details.py +0 -0
  686. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/plugins/generated_compounds.py +0 -0
  687. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/plugins/graph_plot.py +0 -0
  688. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/plugins/license_details.py +0 -0
  689. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/plugins/model_details.py +0 -0
  690. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/plugins/molecule_panel.py +0 -0
  691. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/plugins/molecule_viewer.py +0 -0
  692. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/plugins/pipeline_details.py +0 -0
  693. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/plugins/proximity_mini_graph.py +0 -0
  694. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/plugins/scatter_plot.py +0 -0
  695. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/plugins/shap_summary_plot.py +0 -0
  696. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/regression_plot.py +0 -0
  697. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/components/violin_plots.py +0 -0
  698. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/page_views/data_sources_page_view.py +0 -0
  699. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/page_views/endpoints_page_view.py +0 -0
  700. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/page_views/feature_sets_page_view.py +0 -0
  701. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/page_views/main_page.py +0 -0
  702. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/page_views/models_page_view.py +0 -0
  703. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/page_views/page_view.py +0 -0
  704. {workbench-0.8.167 → workbench-0.8.168}/src/workbench/web_interface/page_views/pipelines_page_view.py +0 -0
  705. {workbench-0.8.167 → workbench-0.8.168}/src/workbench.egg-info/dependency_links.txt +0 -0
  706. {workbench-0.8.167 → workbench-0.8.168}/src/workbench.egg-info/entry_points.txt +0 -0
  707. {workbench-0.8.167 → workbench-0.8.168}/src/workbench.egg-info/requires.txt +0 -0
  708. {workbench-0.8.167 → workbench-0.8.168}/src/workbench.egg-info/top_level.txt +0 -0
  709. {workbench-0.8.167 → workbench-0.8.168}/tests/README.md +0 -0
  710. {workbench-0.8.167 → workbench-0.8.168}/tests/artifacts/data_source_tests.py +0 -0
  711. {workbench-0.8.167 → workbench-0.8.168}/tests/artifacts/empty_model_group.py +0 -0
  712. {workbench-0.8.167 → workbench-0.8.168}/tests/artifacts/endpoint_tests.py +0 -0
  713. {workbench-0.8.167 → workbench-0.8.168}/tests/artifacts/featureset_ingest_boundaries.py +0 -0
  714. {workbench-0.8.167 → workbench-0.8.168}/tests/artifacts/featureset_tests.py +0 -0
  715. {workbench-0.8.167 → workbench-0.8.168}/tests/artifacts/graph_tests.py +0 -0
  716. {workbench-0.8.167 → workbench-0.8.168}/tests/artifacts/model_metrics_tests.py +0 -0
  717. {workbench-0.8.167 → workbench-0.8.168}/tests/artifacts/model_tests.py +0 -0
  718. {workbench-0.8.167 → workbench-0.8.168}/tests/aws_account/aws_account_clamp_tests.py +0 -0
  719. {workbench-0.8.167 → workbench-0.8.168}/tests/cached/cached_artifact_tests.py +0 -0
  720. {workbench-0.8.167 → workbench-0.8.168}/tests/chem_info/test_canonicalize.py +0 -0
  721. {workbench-0.8.167 → workbench-0.8.168}/tests/chem_info/test_tautomerization.py +0 -0
  722. {workbench-0.8.167 → workbench-0.8.168}/tests/corner_cases/end_to_end.py +0 -0
  723. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/100_percent_models.py +0 -0
  724. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/create_aqsol_artifacts.py +0 -0
  725. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/create_aqsol_rt_artifacts.py +0 -0
  726. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/create_aqsol_uq_artifacts.py +0 -0
  727. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/create_basic_test_artifacts.py +0 -0
  728. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/create_copy_artifacts.py +0 -0
  729. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/create_empty_model_group.py +0 -0
  730. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/create_endpoints_for_timing.py +0 -0
  731. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/create_graph_artifacts.py +0 -0
  732. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/create_knn_artifacts.py +0 -0
  733. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/create_meta_endpoints.py +0 -0
  734. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/create_pipeline_model.py +0 -0
  735. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/create_proximity_models.py +0 -0
  736. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/create_quant_regression_artifacts.py +0 -0
  737. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/create_realtime_endpoint.py +0 -0
  738. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/create_training_adjusted_artifacts.py +0 -0
  739. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/create_wine_artifacts.py +0 -0
  740. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/delete_stress_test_artifacts.py +0 -0
  741. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/delete_test_artifacts.py +0 -0
  742. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/regression_ensemble.py +0 -0
  743. {workbench-0.8.167 → workbench-0.8.168}/tests/create_test_artifacts/stress_test_aws.py +0 -0
  744. {workbench-0.8.167 → workbench-0.8.168}/tests/df_store/df_store_tests.py +0 -0
  745. {workbench-0.8.167 → workbench-0.8.168}/tests/lambda/decompress_layers.py +0 -0
  746. {workbench-0.8.167 → workbench-0.8.168}/tests/pandas_tests/test_drift.py +0 -0
  747. {workbench-0.8.167 → workbench-0.8.168}/tests/parameter_store/param_store_tests.py +0 -0
  748. {workbench-0.8.167 → workbench-0.8.168}/tests/plugin_tests/crashing_plugin.py +0 -0
  749. {workbench-0.8.167 → workbench-0.8.168}/tests/pytorch/pytorch_hello.py +0 -0
  750. {workbench-0.8.167 → workbench-0.8.168}/tests/requirements-dev.txt +0 -0
  751. {workbench-0.8.167 → workbench-0.8.168}/tests/specific/capital_tests.py +0 -0
  752. {workbench-0.8.167 → workbench-0.8.168}/tests/specific/column_changes.py +0 -0
  753. {workbench-0.8.167 → workbench-0.8.168}/tests/specific/config_manager.py +0 -0
  754. {workbench-0.8.167 → workbench-0.8.168}/tests/specific/deletion_tests.py +0 -0
  755. {workbench-0.8.167 → workbench-0.8.168}/tests/specific/shap_tests.py +0 -0
  756. {workbench-0.8.167 → workbench-0.8.168}/tests/transforms/data_to_data_tests.py +0 -0
  757. {workbench-0.8.167 → workbench-0.8.168}/tests/transforms/data_to_features_tests.py +0 -0
  758. {workbench-0.8.167 → workbench-0.8.168}/tests/transforms/features_to_model_tests.py +0 -0
  759. {workbench-0.8.167 → workbench-0.8.168}/tests/transforms/model_to_endpoint_tests.py +0 -0
  760. {workbench-0.8.167 → workbench-0.8.168}/tests/transforms/pandas_to_data_tests.py +0 -0
  761. {workbench-0.8.167 → workbench-0.8.168}/tests/transforms/pandas_to_features_test.py +0 -0
  762. {workbench-0.8.167 → workbench-0.8.168}/tests/views/view_tests.py +0 -0
  763. {workbench-0.8.167 → workbench-0.8.168}/tests/views/view_tests_complex.py +0 -0
  764. {workbench-0.8.167 → workbench-0.8.168}/tests/web_components/confusion_matrix_test.py +0 -0
  765. {workbench-0.8.167 → workbench-0.8.168}/tests/web_components/correlation_matrix_test.py +0 -0
  766. {workbench-0.8.167 → workbench-0.8.168}/tests/web_components/graph_plot_test.py +0 -0
  767. {workbench-0.8.167 → workbench-0.8.168}/tests/web_components/plugin_interface_test.py +0 -0
  768. {workbench-0.8.167 → workbench-0.8.168}/tests/web_components/scatter_plot_test.py +0 -0
  769. {workbench-0.8.167 → workbench-0.8.168}/tox.ini +0 -0
  770. {workbench-0.8.167 → workbench-0.8.168}/ui_testing/assets/custom.css +0 -0
  771. {workbench-0.8.167 → workbench-0.8.168}/ui_testing/table_comparison.py +0 -0
  772. {workbench-0.8.167 → workbench-0.8.168}/ui_testing/theme_switching.py +0 -0
  773. {workbench-0.8.167 → workbench-0.8.168}/ui_testing/theme_switching_2.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: workbench
3
- Version: 0.8.167
3
+ Version: 0.8.168
4
4
  Summary: Workbench: A Dashboard and Python API for creating and deploying AWS SageMaker Model Pipelines
5
5
  Author-email: SuperCowPowers LLC <support@supercowpowers.com>
6
6
  License-Expression: MIT
@@ -0,0 +1,70 @@
1
+ import os
2
+ import boto3
3
+ import logging
4
+ import aws_cdk as cdk
5
+ from workbench_core.workbench_core_stack import WorkbenchCoreStack, WorkbenchCoreStackProps
6
+
7
+ # Initialize ConfigManager with error handling
8
+ try:
9
+ # Temporarily disable logging
10
+ # logging.disable(logging.CRITICAL)
11
+ from workbench.utils.config_manager import ConfigManager
12
+
13
+ cm = ConfigManager()
14
+ except Exception as e:
15
+ print(f"Workbench ConfigManager initialization failed: {e}")
16
+ print("Falling back to environment variables only")
17
+ cm = None
18
+ finally:
19
+ # Re-enable logging
20
+ logging.disable(logging.NOTSET)
21
+
22
+ # Grab the account and region using boto3
23
+ session = boto3.session.Session()
24
+ aws_account = session.client("sts").get_caller_identity().get("Account")
25
+ aws_region = session.region_name
26
+ print(f"Account: {aws_account}")
27
+ print(f"Region: {aws_region}")
28
+
29
+ # Get configurations for Workbench Bucket, SSO Group, and Additional Buckets
30
+ workbench_bucket = (cm and cm.get_config("WORKBENCH_BUCKET")) or os.getenv("WORKBENCH_BUCKET")
31
+ if not workbench_bucket:
32
+ print("Error: WORKBENCH_BUCKET is required but not found in config or environment variables.")
33
+ exit(1)
34
+ sso_group = (cm and cm.get_config("WORKBENCH_SSO_GROUP")) or os.getenv("WORKBENCH_SSO_GROUP")
35
+ additional_buckets_str = (cm and cm.get_config("WORKBENCH_ADDITIONAL_BUCKETS")) or os.getenv(
36
+ "WORKBENCH_ADDITIONAL_BUCKETS", ""
37
+ )
38
+ additional_buckets = (
39
+ [bucket.strip() for bucket in additional_buckets_str.split(",") if bucket.strip()] if additional_buckets_str else []
40
+ )
41
+ existing_vpc_id = (cm and cm.get_config("WORKBENCH_VPC_ID")) or os.getenv("WORKBENCH_VPC_ID")
42
+ subnet_ids = (cm and cm.get_config("WORKBENCH_SUBNET_IDS")) or os.getenv("WORKBENCH_SUBNET_IDS", "")
43
+
44
+ # Log the configuration for transparency
45
+ print("Configuration:")
46
+ print(f" WORKBENCH_BUCKET: {workbench_bucket}")
47
+ print(f" WORKBENCH_SSO_GROUP: {sso_group}")
48
+ print(f" WORKBENCH_ADDITIONAL_BUCKETS: {additional_buckets}")
49
+ print(f" WORKBENCH_VPC_ID: {existing_vpc_id}")
50
+ print(f" WORKBENCH_SUBNET_IDS: {subnet_ids}")
51
+
52
+ # Our CDK App and Environment
53
+ app = cdk.App()
54
+ env = cdk.Environment(account=aws_account, region=aws_region)
55
+
56
+ # Create the Workbench Core Stack
57
+ sandbox_stack = WorkbenchCoreStack(
58
+ app,
59
+ "WorkbenchCore",
60
+ env=env,
61
+ props=WorkbenchCoreStackProps(
62
+ workbench_bucket=workbench_bucket,
63
+ sso_group=sso_group,
64
+ additional_buckets=additional_buckets,
65
+ existing_vpc_id=existing_vpc_id,
66
+ subnet_ids=subnet_ids,
67
+ ),
68
+ )
69
+
70
+ app.synth()
@@ -0,0 +1,3 @@
1
+ aws-cdk-lib>=2.211.0
2
+ constructs>=10.4.2,<11.0.0
3
+ boto3>=1.34.0
@@ -17,6 +17,8 @@ class WorkbenchCoreStackProps:
17
17
  workbench_bucket: str
18
18
  sso_group: str
19
19
  additional_buckets: List[str] = field(default_factory=list)
20
+ existing_vpc_id: str = None
21
+ subnet_ids: List[str] = field(default_factory=list) # Optional subnets ids for the Batch compute environment
20
22
 
21
23
 
22
24
  class WorkbenchCoreStack(Stack):
@@ -39,6 +41,8 @@ class WorkbenchCoreStack(Stack):
39
41
  self.workbench_bucket = props.workbench_bucket
40
42
  self.sso_group = props.sso_group
41
43
  self.additional_buckets = props.additional_buckets
44
+ self.existing_vpc_id = props.existing_vpc_id
45
+ self.subnet_ids = props.subnet_ids
42
46
 
43
47
  # Workbench Role Names
44
48
  self.execution_role_name = "Workbench-ExecutionRole" # Main role
@@ -377,12 +381,31 @@ class WorkbenchCoreStack(Stack):
377
381
  # Batch Compute #
378
382
  #####################
379
383
  def create_batch_compute_environment(self) -> batch.FargateComputeEnvironment:
380
- """Create the Batch compute environment - super simple with Fargate."""
384
+ """Create the Batch compute environment with Fargate."""
385
+
386
+ # Do we have an existing VPC we want to use? Otherwise use a default
387
+ if self.existing_vpc_id:
388
+ vpc = ec2.Vpc.from_lookup(self, "ImportedVPC", vpc_id=self.existing_vpc_id)
389
+ else:
390
+ vpc = ec2.Vpc.from_lookup(self, "DefaultVpc", is_default=True)
391
+
392
+ # Use specific subnets if provided, otherwise let CDK choose
393
+ vpc_subnets = None
394
+ if self.subnet_ids:
395
+ vpc_subnets = ec2.SubnetSelection(
396
+ subnets=[
397
+ ec2.Subnet.from_subnet_id(self, f"BatchSubnet{i}", subnet_id)
398
+ for i, subnet_id in enumerate(self.subnet_ids)
399
+ ]
400
+ )
401
+
381
402
  return batch.FargateComputeEnvironment(
382
403
  self,
383
404
  "WorkbenchBatchComputeEnvironment",
384
405
  compute_environment_name="workbench-compute-env",
385
- vpc=ec2.Vpc.from_lookup(self, "DefaultVpc", is_default=True),
406
+ vpc=vpc,
407
+ vpc_subnets=vpc_subnets,
408
+ replace_compute_environment=True,
386
409
  )
387
410
 
388
411
  def create_batch_job_queue(self) -> batch.JobQueue:
@@ -1380,7 +1403,6 @@ class WorkbenchCoreStack(Stack):
1380
1403
 
1381
1404
  # Add policies for the Batch Role
1382
1405
  batch_role.add_to_policy(self.batch_job_logs())
1383
- # batch_role.add_to_policy(self.ecr_policy_statement()) # Not sure we need this
1384
1406
  batch_role.add_to_policy(self.parameter_store_full())
1385
1407
  batch_role.add_to_policy(self.dataframe_store_full())
1386
1408
  batch_role.add_managed_policy(self.datasource_policy)
@@ -14,12 +14,22 @@ RUN pip install --no-cache-dir -r /tmp/requirements.txt
14
14
  # Final runtime image
15
15
  FROM python:3.12-slim
16
16
 
17
+ # Install required X11 libraries for RDKit Draw module
18
+ RUN apt-get update && apt-get install -y \
19
+ libxrender1 \
20
+ libxext6 \
21
+ libsm6 \
22
+ libxinerama1 \
23
+ libfontconfig1 \
24
+ libcairo2 \
25
+ && rm -rf /var/lib/apt/lists/*
26
+
17
27
  # Copy installed packages from builder
18
28
  COPY --from=builder /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages
19
29
  COPY --from=builder /usr/local/bin /usr/local/bin
20
30
 
21
31
  # Install workbench only
22
- RUN pip install --no-cache-dir workbench==0.8.166
32
+ RUN pip install --no-cache-dir workbench==0.8.167
23
33
 
24
34
  # Add the script runner
25
35
  COPY ml_pipeline_runner.py /app/ml_pipeline_runner.py
@@ -15,43 +15,38 @@ def download_ml_pipeline_from_s3(s3_path: str, local_path: str):
15
15
  parsed = urlparse(s3_path)
16
16
  bucket = parsed.netloc
17
17
  key = parsed.path.lstrip("/")
18
-
19
18
  log.info(f"Downloading {s3_path} to {local_path}")
20
-
21
19
  s3_client = boto3.client("s3")
22
20
  s3_client.download_file(bucket, key, local_path)
23
21
 
24
- # Make it executable
25
- os.chmod(local_path, 0o755)
26
- log.info(f"Downloaded and made executable: {local_path}")
27
-
28
22
 
29
23
  def run_ml_pipeline(script_path: str):
30
24
  """Execute the ML pipeline script."""
31
25
  log.info(f"Executing ML pipeline: {script_path}")
32
-
33
26
  try:
34
27
  # Run the script with python
35
- result = subprocess.run([sys.executable, script_path], capture_output=True, text=True, check=True)
36
-
37
- log.info("ML pipeline completed successfully")
38
- log.info(f"STDOUT: {result.stdout}")
39
- return 0
40
-
41
- except subprocess.CalledProcessError as e:
42
- log.error(f"ML pipeline failed with exit code {e.returncode}")
43
- log.error(f"STDOUT: {e.stdout}")
44
- log.error(f"STDERR: {e.stderr}")
45
- return e.returncode
28
+ result = subprocess.run(
29
+ [sys.executable, script_path], check=False, text=True # Don't raise exception on non-zero exit
30
+ )
31
+ if result.returncode == 0:
32
+ log.info("ML pipeline completed successfully")
33
+ else:
34
+ log.error(f"ML pipeline failed with exit code {result.returncode}")
35
+
36
+ return result.returncode
37
+ except Exception as e:
38
+ log.error(f"ML pipeline execution error: {e}")
39
+ return 1
46
40
 
47
41
 
48
42
  def main():
43
+ """Main entry point for the ML pipeline runner."""
44
+
49
45
  # Report the version of the workbench package
50
46
  log.info(f"Workbench version: {workbench.__version__}")
51
47
 
52
48
  # Get the ML Pipeline S3 path from environment variable
53
49
  ml_pipeline_s3_path = os.environ.get("ML_PIPELINE_S3_PATH")
54
-
55
50
  if not ml_pipeline_s3_path:
56
51
  log.error("ML_PIPELINE_S3_PATH environment variable not set")
57
52
  sys.exit(1)
@@ -59,19 +54,14 @@ def main():
59
54
  # Extract script name for local file
60
55
  script_name = os.path.basename(ml_pipeline_s3_path)
61
56
  local_script_path = f"/tmp/{script_name}"
62
-
63
57
  try:
64
58
  # Download the ML pipeline script from S3
65
59
  download_ml_pipeline_from_s3(ml_pipeline_s3_path, local_script_path)
66
-
67
60
  # Execute the ML pipeline
68
61
  exit_code = run_ml_pipeline(local_script_path)
69
-
70
62
  # Clean up
71
63
  os.remove(local_script_path)
72
-
73
64
  sys.exit(exit_code)
74
-
75
65
  except Exception as e:
76
66
  log.error(f"Error in run_script: {e}")
77
67
  sys.exit(1)
@@ -8,6 +8,7 @@ from pathlib import Path
8
8
  from workbench.core.cloud_platform.aws.aws_account_clamp import AWSAccountClamp
9
9
  from workbench.utils.config_manager import ConfigManager
10
10
  from workbench.utils.s3_utils import upload_content_to_s3
11
+ from workbench.utils.cloudwatch_utils import get_cloudwatch_logs_url
11
12
 
12
13
  log = logging.getLogger("workbench")
13
14
  cm = ConfigManager()
@@ -27,10 +28,9 @@ def get_batch_role_arn() -> str:
27
28
 
28
29
 
29
30
  def ensure_job_definition():
30
- """Ensure the job definition exists with network configuration."""
31
+ """Register or update the Batch job definition for ML pipeline runner."""
31
32
  batch = AWSAccountClamp().boto3_session.client("batch")
32
33
  name = "workbench-ml-pipeline-runner"
33
-
34
34
  response = batch.register_job_definition(
35
35
  jobDefinitionName=name,
36
36
  type="container",
@@ -40,27 +40,42 @@ def ensure_job_definition():
40
40
  "resourceRequirements": [{"type": "VCPU", "value": "2"}, {"type": "MEMORY", "value": "4096"}],
41
41
  "jobRoleArn": get_batch_role_arn(),
42
42
  "executionRoleArn": get_batch_role_arn(),
43
- "environment": [{"name": "WORKBENCH_BUCKET", "value": workbench_bucket}],
44
- "networkConfiguration": {"assignPublicIp": "ENABLED"}, # This is required so the ECR image can be pulled
43
+ "environment": [
44
+ {"name": "WORKBENCH_BUCKET", "value": workbench_bucket},
45
+ {"name": "PYTHONUNBUFFERED", "value": "1"},
46
+ ],
47
+ # "networkConfiguration": {"assignPublicIp": "ENABLED"}, # Required for ECR Image Pull (when not in VPC)
45
48
  },
46
49
  timeout={"attemptDurationSeconds": 10800}, # 3 hours
47
50
  )
48
-
49
51
  log.info(f"Job definition ready: {name} (revision {response['revision']})")
50
52
  return name
51
53
 
52
54
 
53
55
  def run_batch_job(script_path: str) -> int:
54
- """Upload script, submit job, and track to completion."""
56
+ """
57
+ Submit and monitor an AWS Batch job for ML pipeline execution.
58
+ This function:
59
+ 1. Uploads the ML pipeline script to S3
60
+ 2. Submits a Batch job to run the script in a container
61
+ 3. Monitors job status until completion
62
+ 4. Returns the job's exit code
63
+
64
+ Args:
65
+ script_path: Local path to the ML pipeline script
66
+
67
+ Returns:
68
+ Exit code from the batch job (0 for success, non-zero for failure)
69
+ """
55
70
  batch = AWSAccountClamp().boto3_session.client("batch")
56
71
  script_name = Path(script_path).stem
57
72
 
58
- # Upload script to S3
73
+ # Upload script to S3 for the container to download
59
74
  s3_path = f"s3://{workbench_bucket}/batch-jobs/{Path(script_path).name}"
60
75
  log.info(f"Uploading script to {s3_path}")
61
76
  upload_content_to_s3(Path(script_path).read_text(), s3_path)
62
77
 
63
- # Submit job
78
+ # Submit the Batch job
64
79
  job_name = f"workbench_{script_name}_{datetime.now():%Y%m%d_%H%M%S}"
65
80
  response = batch.submit_job(
66
81
  jobName=job_name,
@@ -68,35 +83,50 @@ def run_batch_job(script_path: str) -> int:
68
83
  jobDefinition=ensure_job_definition(),
69
84
  containerOverrides={
70
85
  "environment": [
71
- {"name": "SCRIPT_S3_PATH", "value": s3_path},
86
+ {"name": "ML_PIPELINE_S3_PATH", "value": s3_path},
72
87
  {"name": "WORKBENCH_BUCKET", "value": workbench_bucket},
73
88
  ]
74
89
  },
75
90
  )
76
-
77
91
  job_id = response["jobId"]
78
92
  log.info(f"Submitted job: {job_name} ({job_id})")
79
93
 
80
- # Track job to completion
94
+ # Monitor job execution
95
+ last_status = None
81
96
  while True:
97
+ # Check job status
82
98
  job = batch.describe_jobs(jobs=[job_id])["jobs"][0]
83
99
  status = job["status"]
84
- log.info(f"Job status: {status}")
100
+ if status != last_status:
101
+ log.info(f"Job status: {status}")
102
+ last_status = status
85
103
 
104
+ # Check if job completed
86
105
  if status in ["SUCCEEDED", "FAILED"]:
87
106
  exit_code = job.get("attempts", [{}])[-1].get("exitCode", 1)
88
107
  if status == "FAILED":
89
108
  log.error(f"Job failed: {job.get('statusReason', 'Unknown reason')}")
109
+ else:
110
+ log.info("Job completed successfully")
111
+
112
+ # Get CloudWatch logs URL
113
+ log_stream_name = job.get("container", {}).get("logStreamName")
114
+ logs_url = get_cloudwatch_logs_url(log_group="/aws/batch/job", log_stream=log_stream_name)
115
+ if logs_url:
116
+ # OSC 8 hyperlink format for modern terminals
117
+ clickable_url = f"\033]8;;{logs_url}\033\\{logs_url}\033]8;;\033\\"
118
+ log.info(f"View logs: {clickable_url}")
90
119
  return exit_code
91
120
 
92
- time.sleep(30)
121
+ # Sleep a bit before next status check
122
+ time.sleep(10)
93
123
 
94
124
 
95
125
  def main():
126
+ """CLI entry point for running ML pipelines on AWS Batch."""
96
127
  parser = argparse.ArgumentParser(description="Run ML pipeline script on AWS Batch")
97
128
  parser.add_argument("script_file", help="Local path to ML pipeline script")
98
129
  args = parser.parse_args()
99
-
100
130
  try:
101
131
  exit_code = run_batch_job(args.script_file)
102
132
  exit(exit_code)
@@ -4,8 +4,10 @@ import sys
4
4
  import time
5
5
  import argparse
6
6
  from datetime import datetime, timedelta, timezone
7
- from workbench.core.cloud_platform.aws.aws_account_clamp import AWSAccountClamp
7
+
8
+ # Workbench Imports
8
9
  from workbench.utils.repl_utils import cprint, Spinner
10
+ from workbench.utils.cloudwatch_utils import get_cloudwatch_client, get_active_log_streams, stream_log_events
9
11
 
10
12
  # Define the log levels to include all log levels above the specified level
11
13
  log_level_map = {
@@ -33,64 +35,6 @@ def date_display(dt):
33
35
  return dt.strftime("%Y-%m-%d %I:%M%p") + "(UTC)"
34
36
 
35
37
 
36
- def get_cloudwatch_client():
37
- """Get the CloudWatch Logs client using the Workbench assumed role session."""
38
- session = AWSAccountClamp().boto3_session
39
- return session.client("logs")
40
-
41
-
42
- def get_active_log_streams(client, log_group_name, start_time_ms, stream_filter=None):
43
- """Retrieve log streams that have events after the specified start time."""
44
-
45
- # Get all the streams in the log group
46
- active_streams = []
47
- stream_params = {
48
- "logGroupName": log_group_name,
49
- "orderBy": "LastEventTime",
50
- "descending": True,
51
- }
52
-
53
- # Loop to retrieve all log streams (maximum 50 per call)
54
- while True:
55
- response = client.describe_log_streams(**stream_params)
56
- log_streams = response.get("logStreams", [])
57
-
58
- for log_stream in log_streams:
59
- log_stream_name = log_stream["logStreamName"]
60
- last_event_timestamp = log_stream.get("lastEventTimestamp")
61
-
62
- # Include streams with events since the specified start time
63
- # Note: There's some issue where the last event timestamp is 'off'
64
- # so we're going to add 60 minutes from the last event timestamp
65
- last_event_timestamp += 60 * 60 * 1000
66
- if last_event_timestamp >= start_time_ms:
67
- active_streams.append(log_stream_name)
68
- else:
69
- break # Stop if we reach streams older than the start time
70
-
71
- # Check if there are more streams to retrieve
72
- if "nextToken" in response:
73
- stream_params["nextToken"] = response["nextToken"]
74
- else:
75
- break
76
-
77
- # Sort and report the active log streams
78
- active_streams.sort()
79
- if active_streams:
80
- print("Active log streams:", len(active_streams))
81
-
82
- # Filter the active streams by a substring if provided
83
- if stream_filter and active_streams:
84
- print(f"Filtering active log streams by '{stream_filter}'...")
85
- active_streams = [stream for stream in active_streams if stream_filter in stream]
86
-
87
- for stream in active_streams:
88
- print(f"\t - {stream}")
89
-
90
- # Return the active log streams
91
- return active_streams
92
-
93
-
94
38
  def get_latest_log_events(client, log_group_name, start_time, end_time=None, stream_filter=None):
95
39
  """Retrieve the latest log events from the active/filtered log streams in a CloudWatch Logs group."""
96
40
 
@@ -99,11 +43,15 @@ def get_latest_log_events(client, log_group_name, start_time, end_time=None, str
99
43
  get_latest_log_events.first_run = True
100
44
 
101
45
  log_events = []
102
- start_time_ms = int(start_time.timestamp() * 1000) # Convert start_time to milliseconds
46
+ start_time_ms = int(start_time.timestamp() * 1000)
47
+
48
+ # Use the util function to get active streams
49
+ active_streams = get_active_log_streams(log_group_name, start_time_ms, stream_filter, client)
103
50
 
104
- # Get the active log streams with events since start_time
105
- active_streams = get_active_log_streams(client, log_group_name, start_time_ms, stream_filter)
106
51
  if active_streams:
52
+ print(f"Active log streams: {len(active_streams)}")
53
+ for stream in active_streams:
54
+ print(f"\t - {stream}")
107
55
  print(f"Processing log events from {date_display(start_time)} on {len(active_streams)} active log streams...")
108
56
  get_latest_log_events.first_run = False
109
57
  else:
@@ -114,50 +62,22 @@ def get_latest_log_events(client, log_group_name, start_time, end_time=None, str
114
62
  print("Monitoring for new events...")
115
63
  return log_events
116
64
 
117
- # Iterate over the active streams and fetch log events
65
+ # Use the util function to stream events from each log stream
118
66
  for log_stream_name in active_streams:
119
- params = {
120
- "logGroupName": log_group_name,
121
- "logStreamName": log_stream_name,
122
- "startTime": start_time_ms, # Use start_time in milliseconds
123
- "startFromHead": True, # Start from the nearest event to start_time
124
- }
125
- next_event_token = None
126
- if end_time is not None:
127
- params["endTime"] = int(end_time.timestamp() * 1000)
128
-
129
- # Process the log events from this log stream
130
67
  spinner = Spinner("lightpurple", f"Pulling events from {log_stream_name}:")
131
68
  spinner.start()
132
69
  log_stream_events = 0
133
70
 
134
- # Get the log events for the active log stream
135
- while True:
136
- if next_event_token:
137
- params["nextToken"] = next_event_token
138
- params.pop("startTime", None) # Remove startTime when using nextToken
71
+ # Stream events using the util function
72
+ for event in stream_log_events(
73
+ log_group_name, log_stream_name, start_time, end_time, follow=False, client=client
74
+ ):
75
+ log_stream_events += 1
76
+ log_events.append(event)
139
77
 
140
- # Fetch the log events (this call takes a while: optimize if we can)
141
- events_response = client.get_log_events(**params)
78
+ spinner.stop()
79
+ print(f"Processed {log_stream_events} events from {log_stream_name} (Total: {len(log_events)})")
142
80
 
143
- events = events_response.get("events", [])
144
- for event in events:
145
- event["logStreamName"] = log_stream_name
146
-
147
- # Add the log stream events to our list of all log events
148
- log_stream_events += len(events)
149
- log_events.extend(events)
150
-
151
- # Handle pagination for log events
152
- next_event_token = events_response.get("nextForwardToken")
153
-
154
- # Break the loop if there are no more events to fetch
155
- if not next_event_token or next_event_token == params.get("nextToken"):
156
- spinner.stop()
157
- print(f"Processed {log_stream_events} events from {log_stream_name} (Total: {len(log_events)})")
158
- break
159
-
160
- # Return the log events
161
81
  return log_events
162
82
 
163
83
 
@@ -206,6 +126,7 @@ def monitor_log_group(
206
126
  print(f"Monitoring log group: {log_group_name} from {date_display(start_time)}")
207
127
  print(f"Log levels: {log_levels}")
208
128
  print(f"Search terms: {search_terms}")
129
+
209
130
  while True:
210
131
  # Get the latest log events with stream filtering if provided
211
132
  all_log_events = get_latest_log_events(client, log_group_name, start_time, end_time, stream_filter)
@@ -218,7 +139,6 @@ def monitor_log_group(
218
139
 
219
140
  # Check the search terms
220
141
  if not search_terms or any(term in event["message"].lower() for term in search_terms):
221
-
222
142
  # Calculate the start and end index for this match
223
143
  start_index = max(i - before, 0)
224
144
  end_index = min(i + after, len(all_log_events) - 1)
@@ -0,0 +1,137 @@
1
+ """AWS CloudWatch utility functions for Workbench."""
2
+
3
+ import time
4
+ import logging
5
+ from datetime import datetime, timezone
6
+ from typing import List, Optional, Dict, Generator
7
+ from urllib.parse import quote
8
+ from workbench.core.cloud_platform.aws.aws_account_clamp import AWSAccountClamp
9
+
10
+ log = logging.getLogger("workbench")
11
+
12
+
13
+ def get_cloudwatch_client():
14
+ """Get the CloudWatch Logs client using the Workbench assumed role session."""
15
+ session = AWSAccountClamp().boto3_session
16
+ return session.client("logs")
17
+
18
+
19
+ def get_cloudwatch_logs_url(log_group: str, log_stream: str) -> Optional[str]:
20
+ """
21
+ Generate CloudWatch logs URL for the specified log group and stream.
22
+
23
+ Args:
24
+ log_group: Log group name (e.g., '/aws/batch/job')
25
+ log_stream: Log stream name
26
+
27
+ Returns:
28
+ CloudWatch console URL or None if unable to generate
29
+ """
30
+ try:
31
+ region = AWSAccountClamp().region
32
+
33
+ # URL encode the log group and stream
34
+ encoded_group = quote(log_group, safe="")
35
+ encoded_stream = quote(log_stream, safe="")
36
+
37
+ return (
38
+ f"https://{region}.console.aws.amazon.com/cloudwatch/home?"
39
+ f"region={region}#logsV2:log-groups/log-group/{encoded_group}"
40
+ f"/log-events/{encoded_stream}"
41
+ )
42
+ except Exception as e: # noqa: BLE001
43
+ log.warning(f"Failed to generate CloudWatch logs URL: {e}")
44
+ return None
45
+
46
+
47
+ def get_active_log_streams(
48
+ log_group_name: str, start_time_ms: int, stream_filter: Optional[str] = None, client=None
49
+ ) -> List[str]:
50
+ """Retrieve log streams that have events after the specified start time."""
51
+ if not client:
52
+ client = get_cloudwatch_client()
53
+ active_streams = []
54
+ stream_params = {
55
+ "logGroupName": log_group_name,
56
+ "orderBy": "LastEventTime",
57
+ "descending": True,
58
+ }
59
+ while True:
60
+ response = client.describe_log_streams(**stream_params)
61
+ log_streams = response.get("logStreams", [])
62
+ for log_stream in log_streams:
63
+ log_stream_name = log_stream["logStreamName"]
64
+ last_event_timestamp = log_stream.get("lastEventTimestamp", 0)
65
+ if last_event_timestamp >= start_time_ms:
66
+ active_streams.append(log_stream_name)
67
+ else:
68
+ break
69
+ if "nextToken" in response:
70
+ stream_params["nextToken"] = response["nextToken"]
71
+ else:
72
+ break
73
+ # Sort and filter streams
74
+ active_streams.sort()
75
+ if stream_filter and active_streams:
76
+ active_streams = [stream for stream in active_streams if stream_filter in stream]
77
+ return active_streams
78
+
79
+
80
+ def stream_log_events(
81
+ log_group_name: str,
82
+ log_stream_name: str,
83
+ start_time: Optional[datetime] = None,
84
+ end_time: Optional[datetime] = None,
85
+ follow: bool = False,
86
+ client=None,
87
+ ) -> Generator[Dict, None, None]:
88
+ """
89
+ Stream log events from a specific log stream.
90
+ Yields:
91
+ Log events as dictionaries
92
+ """
93
+ if not client:
94
+ client = get_cloudwatch_client()
95
+ params = {"logGroupName": log_group_name, "logStreamName": log_stream_name, "startFromHead": True}
96
+ if start_time:
97
+ params["startTime"] = int(start_time.timestamp() * 1000)
98
+ if end_time:
99
+ params["endTime"] = int(end_time.timestamp() * 1000)
100
+ next_token = None
101
+ while True:
102
+ if next_token:
103
+ params["nextToken"] = next_token
104
+ params.pop("startTime", None)
105
+ try:
106
+ response = client.get_log_events(**params)
107
+ events = response.get("events", [])
108
+ for event in events:
109
+ event["logStreamName"] = log_stream_name
110
+ yield event
111
+ next_token = response.get("nextForwardToken")
112
+ # Break if no more events or same token
113
+ if not next_token or next_token == params.get("nextToken"):
114
+ if not follow:
115
+ break
116
+ time.sleep(2)
117
+ except client.exceptions.ResourceNotFoundException:
118
+ if not follow:
119
+ break
120
+ time.sleep(2)
121
+
122
+
123
+ def print_log_event(
124
+ event: dict, show_stream: bool = True, local_time: bool = True, custom_format: Optional[str] = None
125
+ ):
126
+ """Print a formatted log event."""
127
+ timestamp = datetime.fromtimestamp(event["timestamp"] / 1000, tz=timezone.utc)
128
+ if local_time:
129
+ timestamp = timestamp.astimezone()
130
+ message = event["message"].rstrip()
131
+ if custom_format:
132
+ # Allow custom formatting
133
+ print(custom_format.format(stream=event.get("logStreamName", ""), time=timestamp, message=message))
134
+ elif show_stream and "logStreamName" in event:
135
+ print(f"[{event['logStreamName']}] [{timestamp:%Y-%m-%d %I:%M%p}] {message}")
136
+ else:
137
+ print(f"[{timestamp:%H:%M:%S}] {message}")