qwak-core 0.4.278__py3-none-any.whl → 0.5.19__py3-none-any.whl

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 qwak-core might be problematic. Click here for more details.

Files changed (361) hide show
  1. _qwak_proto/jfml/hosting_gateway/v1/build_upload_url_pb2.py +8 -23
  2. _qwak_proto/jfml/hosting_gateway/v1/hosting_gateway_service_pb2.py +10 -27
  3. _qwak_proto/qwak/administration/account/v1/account_pb2.py +25 -88
  4. _qwak_proto/qwak/administration/account/v1/account_pb2.pyi +21 -2
  5. _qwak_proto/qwak/administration/account/v1/account_service_pb2.py +42 -187
  6. _qwak_proto/qwak/administration/account/v1/jfrog_tenant_details_pb2.py +26 -114
  7. _qwak_proto/qwak/administration/account/v1/personalization_pb2.py +8 -24
  8. _qwak_proto/qwak/administration/account/v1/preferences_pb2.py +6 -14
  9. _qwak_proto/qwak/administration/account/v1/terms_pb2.py +14 -54
  10. _qwak_proto/qwak/administration/authenticated_user/v1/authenticated_user_service_pb2.py +18 -67
  11. _qwak_proto/qwak/administration/authenticated_user/v1/credentials_pb2.py +8 -24
  12. _qwak_proto/qwak/administration/authenticated_user/v1/credentials_pb2.pyi +1 -1
  13. _qwak_proto/qwak/administration/authenticated_user/v1/details_pb2.py +14 -54
  14. _qwak_proto/qwak/administration/cluster/v2/cluster_pb2.py +38 -173
  15. _qwak_proto/qwak/administration/runtime_configuration/v0/container_registry_config_pb2.py +32 -0
  16. _qwak_proto/qwak/administration/runtime_configuration/v0/container_registry_config_pb2.pyi +65 -0
  17. _qwak_proto/qwak/administration/runtime_configuration/v0/container_registry_config_pb2_grpc.py +4 -0
  18. _qwak_proto/qwak/administration/runtime_configuration/v0/creds/auth_pb2.py +6 -14
  19. _qwak_proto/qwak/administration/runtime_configuration/v0/creds/secret_pb2.py +8 -24
  20. _qwak_proto/qwak/administration/runtime_configuration/v0/data_catalog_config_pb2.py +13 -35
  21. _qwak_proto/qwak/administration/runtime_configuration/v0/data_catalog_config_pb2.pyi +24 -3
  22. _qwak_proto/qwak/administration/runtime_configuration/v0/external/databricks/auth_pb2.py +34 -0
  23. _qwak_proto/qwak/administration/runtime_configuration/v0/external/databricks/auth_pb2.pyi +97 -0
  24. _qwak_proto/qwak/administration/runtime_configuration/v0/external/databricks/auth_pb2_grpc.py +4 -0
  25. _qwak_proto/qwak/administration/runtime_configuration/v0/external/elasticsearch_config_pb2.py +6 -14
  26. _qwak_proto/qwak/administration/runtime_configuration/v0/external/kafka_config_pb2.py +12 -44
  27. _qwak_proto/qwak/administration/runtime_configuration/v0/external/prometheus_config_pb2.py +9 -15
  28. _qwak_proto/qwak/administration/runtime_configuration/v0/external/prometheus_config_pb2.pyi +29 -0
  29. _qwak_proto/qwak/administration/runtime_configuration/v0/external/redis_config_pb2.py +6 -14
  30. _qwak_proto/qwak/administration/runtime_configuration/v0/external/victoriametrics_config_pb2.py +8 -15
  31. _qwak_proto/qwak/administration/runtime_configuration/v0/external/victoriametrics_config_pb2.pyi +16 -0
  32. _qwak_proto/qwak/administration/runtime_configuration/v0/feature_store_config_pb2.py +10 -34
  33. _qwak_proto/qwak/administration/runtime_configuration/v0/hosting/aws/auth_pb2.py +42 -0
  34. _qwak_proto/qwak/administration/runtime_configuration/v0/hosting/aws/auth_pb2.pyi +159 -0
  35. _qwak_proto/qwak/administration/runtime_configuration/v0/hosting/aws/auth_pb2_grpc.py +4 -0
  36. _qwak_proto/qwak/administration/runtime_configuration/v0/hosting/azure/auth_pb2.py +39 -0
  37. _qwak_proto/qwak/administration/runtime_configuration/v0/hosting/azure/auth_pb2.pyi +126 -0
  38. _qwak_proto/qwak/administration/runtime_configuration/v0/hosting/azure/auth_pb2_grpc.py +4 -0
  39. _qwak_proto/qwak/administration/runtime_configuration/v0/hosting_config_pb2.py +19 -55
  40. _qwak_proto/qwak/administration/runtime_configuration/v0/hosting_config_pb2.pyi +38 -6
  41. _qwak_proto/qwak/administration/runtime_configuration/v0/logs_storage_config_pb2.py +6 -14
  42. _qwak_proto/qwak/administration/runtime_configuration/v0/model_analytics_storage_config_pb2.py +6 -14
  43. _qwak_proto/qwak/administration/runtime_configuration/v0/network_config_pb2.py +14 -54
  44. _qwak_proto/qwak/administration/runtime_configuration/v0/object_storage_config_pb2.py +13 -35
  45. _qwak_proto/qwak/administration/runtime_configuration/v0/object_storage_config_pb2.pyi +26 -3
  46. _qwak_proto/qwak/administration/runtime_configuration/v0/observability_config_pb2.py +10 -34
  47. _qwak_proto/qwak/administration/runtime_configuration/v0/runtime_config_pb2.py +8 -15
  48. _qwak_proto/qwak/administration/runtime_configuration/v0/runtime_config_pb2.pyi +7 -2
  49. _qwak_proto/qwak/administration/runtime_configuration/v0/sql_engine_config_pb2.py +13 -35
  50. _qwak_proto/qwak/administration/runtime_configuration/v0/sql_engine_config_pb2.pyi +24 -3
  51. _qwak_proto/qwak/administration/v0/authentication/authentication_service_pb2.py +14 -47
  52. _qwak_proto/qwak/administration/v0/environments/configuration_pb2.py +20 -82
  53. _qwak_proto/qwak/administration/v0/environments/environment_pb2.py +12 -40
  54. _qwak_proto/qwak/administration/v0/environments/environment_service_pb2.py +36 -158
  55. _qwak_proto/qwak/administration/v0/environments/personalization_pb2.py +8 -24
  56. _qwak_proto/qwak/administration/v0/users/user_pb2.py +18 -71
  57. _qwak_proto/qwak/admiral/secret/v0/secret_pb2.py +29 -116
  58. _qwak_proto/qwak/admiral/secret/v0/secret_pb2.pyi +21 -2
  59. _qwak_proto/qwak/admiral/secret/v0/secret_service_pb2.py +18 -67
  60. _qwak_proto/qwak/admiral/secret/v0/system_secret_service_pb2.py +18 -67
  61. _qwak_proto/qwak/admiral/user_application_instance/v0/user_application_instance_pb2.py +38 -174
  62. _qwak_proto/qwak/admiral/user_application_instance/v0/user_application_instance_service_pb2.py +22 -87
  63. _qwak_proto/qwak/analytics/analytics_pb2.py +26 -121
  64. _qwak_proto/qwak/analytics/analytics_service_pb2.py +46 -207
  65. _qwak_proto/qwak/artifactory_settings/artifactory_settings_pb2.py +8 -24
  66. _qwak_proto/qwak/audience/v1/audience_api_pb2.py +30 -127
  67. _qwak_proto/qwak/audience/v1/audience_pb2.py +26 -113
  68. _qwak_proto/qwak/auto_scaling/v1/auto_scaling_pb2.py +18 -79
  69. _qwak_proto/qwak/auto_scaling/v1/auto_scaling_service_pb2.py +10 -27
  70. _qwak_proto/qwak/automation/v1/action_pb2.py +40 -180
  71. _qwak_proto/qwak/automation/v1/auto_scaling_pb2.py +18 -79
  72. _qwak_proto/qwak/automation/v1/automation_execution_pb2.py +12 -43
  73. _qwak_proto/qwak/automation/v1/automation_management_service_pb2.py +56 -258
  74. _qwak_proto/qwak/automation/v1/automation_pb2.py +11 -35
  75. _qwak_proto/qwak/automation/v1/automation_pb2.pyi +5 -1
  76. _qwak_proto/qwak/automation/v1/common_pb2.py +10 -35
  77. _qwak_proto/qwak/automation/v1/notification_pb2.py +16 -68
  78. _qwak_proto/qwak/automation/v1/trigger_pb2.py +14 -54
  79. _qwak_proto/qwak/batch_job/v1/batch_job_events_pb2.py +26 -116
  80. _qwak_proto/qwak/batch_job/v1/batch_job_resources_pb2.py +8 -26
  81. _qwak_proto/qwak/batch_job/v1/batch_job_service_pb2.py +119 -562
  82. _qwak_proto/qwak/batch_job/v1/batch_job_service_pb2.pyi +5 -1
  83. _qwak_proto/qwak/build/v1/build_api_pb2.py +86 -407
  84. _qwak_proto/qwak/build/v1/build_pb2.py +114 -549
  85. _qwak_proto/qwak/build_settings/build_settings_api_pb2.py +18 -67
  86. _qwak_proto/qwak/build_settings/build_settings_pb2.py +18 -74
  87. _qwak_proto/qwak/builds/build_pb2.py +46 -207
  88. _qwak_proto/qwak/builds/build_pb2.pyi +48 -3
  89. _qwak_proto/qwak/builds/build_url_pb2.py +26 -113
  90. _qwak_proto/qwak/builds/build_values_pb2.py +82 -0
  91. _qwak_proto/qwak/builds/build_values_pb2.pyi +559 -0
  92. _qwak_proto/qwak/builds/build_values_pb2_grpc.py +4 -0
  93. _qwak_proto/qwak/builds/builds_orchestrator_service_pb2.py +87 -270
  94. _qwak_proto/qwak/builds/builds_orchestrator_service_pb2.pyi +173 -0
  95. _qwak_proto/qwak/builds/builds_orchestrator_service_pb2_grpc.py +66 -0
  96. _qwak_proto/qwak/builds/builds_pb2.py +87 -528
  97. _qwak_proto/qwak/builds/builds_pb2.pyi +0 -191
  98. _qwak_proto/qwak/builds/builds_pb2_grpc.py +0 -233
  99. _qwak_proto/qwak/builds/internal_builds_orchestrator_service_pb2.py +12 -37
  100. _qwak_proto/qwak/data_versioning/data_versioning_pb2.py +8 -24
  101. _qwak_proto/qwak/data_versioning/data_versioning_service_pb2.py +14 -47
  102. _qwak_proto/qwak/deployment/alert_pb2.py +24 -108
  103. _qwak_proto/qwak/deployment/alert_service_pb2.py +30 -127
  104. _qwak_proto/qwak/deployment/deployment_messages_pb2.py +6 -14
  105. _qwak_proto/qwak/deployment/deployment_pb2.py +124 -588
  106. _qwak_proto/qwak/deployment/deployment_service_pb2.py +86 -419
  107. _qwak_proto/qwak/ecosystem/jfrog/v0/token_pb2.py +47 -165
  108. _qwak_proto/qwak/ecosystem/jfrog/v0/token_pb2.pyi +102 -3
  109. _qwak_proto/qwak/ecosystem/jfrog/v0/token_service_pb2.py +22 -87
  110. _qwak_proto/qwak/ecosystem/v0/auth_pb2.py +28 -0
  111. _qwak_proto/qwak/ecosystem/v0/auth_pb2.pyi +37 -0
  112. _qwak_proto/qwak/ecosystem/v0/auth_pb2_grpc.py +4 -0
  113. _qwak_proto/qwak/ecosystem/v0/azure_credentials_pb2.py +37 -0
  114. _qwak_proto/qwak/ecosystem/v0/azure_credentials_pb2.pyi +117 -0
  115. _qwak_proto/qwak/ecosystem/v0/azure_credentials_pb2_grpc.py +4 -0
  116. _qwak_proto/qwak/ecosystem/v0/credentials_pb2.py +12 -35
  117. _qwak_proto/qwak/ecosystem/v0/credentials_pb2.pyi +8 -3
  118. _qwak_proto/qwak/ecosystem/v0/ecosystem_pb2.py +30 -138
  119. _qwak_proto/qwak/ecosystem/v0/ecosystem_runtime_service_pb2.py +52 -237
  120. _qwak_proto/qwak/execution/v1/backfill_pb2.py +18 -74
  121. _qwak_proto/qwak/execution/v1/batch_pb2.py +10 -34
  122. _qwak_proto/qwak/execution/v1/deletion_pb2.py +12 -44
  123. _qwak_proto/qwak/execution/v1/execution_pb2.py +16 -69
  124. _qwak_proto/qwak/execution/v1/execution_service_pb2.py +64 -298
  125. _qwak_proto/qwak/execution/v1/internal/deployment/platform_details_pb2.py +6 -14
  126. _qwak_proto/qwak/execution/v1/jobs/job_pb2.py +18 -76
  127. _qwak_proto/qwak/execution/v1/jobs/job_service_pb2.py +54 -247
  128. _qwak_proto/qwak/execution/v1/jobs/reports/report_pb2.py +20 -84
  129. _qwak_proto/qwak/execution/v1/state/execution_state_pb2.py +6 -14
  130. _qwak_proto/qwak/execution/v1/state/execution_state_service_pb2.py +30 -127
  131. _qwak_proto/qwak/execution/v1/state/featureset_state_pb2.py +6 -14
  132. _qwak_proto/qwak/execution/v1/state/spark_execution_state_pb2.py +14 -68
  133. _qwak_proto/qwak/execution/v1/streaming_aggregation_pb2.py +22 -55
  134. _qwak_proto/qwak/execution/v1/streaming_aggregation_pb2.pyi +71 -1
  135. _qwak_proto/qwak/execution/v1/streaming_pb2.py +12 -44
  136. _qwak_proto/qwak/feature_store/entities/entity_pb2.py +16 -57
  137. _qwak_proto/qwak/feature_store/entities/entity_service_pb2.py +30 -127
  138. _qwak_proto/qwak/feature_store/features/aggregation_pb2.py +38 -175
  139. _qwak_proto/qwak/feature_store/features/deployment_pb2.py +36 -167
  140. _qwak_proto/qwak/feature_store/features/deployment_service_pb2.py +10 -27
  141. _qwak_proto/qwak/feature_store/features/execution_pb2.py +14 -56
  142. _qwak_proto/qwak/feature_store/features/feature_set_attribute_pb2.py +6 -14
  143. _qwak_proto/qwak/feature_store/features/feature_set_pb2.py +35 -156
  144. _qwak_proto/qwak/feature_store/features/feature_set_pb2.pyi +9 -1
  145. _qwak_proto/qwak/feature_store/features/feature_set_service_pb2.py +97 -440
  146. _qwak_proto/qwak/feature_store/features/feature_set_service_pb2.pyi +25 -0
  147. _qwak_proto/qwak/feature_store/features/feature_set_service_pb2_grpc.py +34 -0
  148. _qwak_proto/qwak/feature_store/features/feature_set_state_pb2.py +38 -181
  149. _qwak_proto/qwak/feature_store/features/feature_set_state_service_pb2.py +26 -107
  150. _qwak_proto/qwak/feature_store/features/feature_set_types_pb2.py +77 -347
  151. _qwak_proto/qwak/feature_store/features/feature_set_types_pb2.pyi +7 -2
  152. _qwak_proto/qwak/feature_store/features/monitoring_pb2.py +10 -34
  153. _qwak_proto/qwak/feature_store/features/real_time_feature_extractor_pb2.py +32 -143
  154. _qwak_proto/qwak/feature_store/jobs/job_pb2.py +12 -46
  155. _qwak_proto/qwak/feature_store/jobs/job_service_pb2.py +30 -127
  156. _qwak_proto/qwak/feature_store/jobs/v1/job_pb2.py +12 -45
  157. _qwak_proto/qwak/feature_store/jobs/v1/job_service_pb2.py +42 -187
  158. _qwak_proto/qwak/feature_store/platform/platform_details_pb2.py +8 -24
  159. _qwak_proto/qwak/feature_store/reports/report_pb2.py +14 -53
  160. _qwak_proto/qwak/feature_store/repository/common/platform_pb2.py +10 -34
  161. _qwak_proto/qwak/feature_store/serving/management_pb2.py +14 -47
  162. _qwak_proto/qwak/feature_store/serving/metadata_pb2.py +12 -44
  163. _qwak_proto/qwak/feature_store/serving/serving_pb2.py +50 -222
  164. _qwak_proto/qwak/feature_store/serving/v1/value_pb2.py +8 -24
  165. _qwak_proto/qwak/feature_store/sinks/sink_pb2.py +14 -54
  166. _qwak_proto/qwak/feature_store/sources/batch_pb2.py +79 -335
  167. _qwak_proto/qwak/feature_store/sources/batch_pb2.pyi +99 -7
  168. _qwak_proto/qwak/feature_store/sources/data_source_attribute_pb2.py +6 -14
  169. _qwak_proto/qwak/feature_store/sources/data_source_pb2.py +15 -55
  170. _qwak_proto/qwak/feature_store/sources/data_source_pb2.pyi +5 -1
  171. _qwak_proto/qwak/feature_store/sources/data_source_service_pb2.py +39 -148
  172. _qwak_proto/qwak/feature_store/sources/data_source_service_pb2.pyi +25 -0
  173. _qwak_proto/qwak/feature_store/sources/data_source_service_pb2_grpc.py +34 -0
  174. _qwak_proto/qwak/feature_store/sources/streaming_pb2.py +34 -146
  175. _qwak_proto/qwak/feature_store/v1/common/jfrog_artifact/jfrog_artifact_pb2.py +6 -14
  176. _qwak_proto/qwak/feature_store/v1/common/source_code/source_code_pb2.py +10 -34
  177. _qwak_proto/qwak/feature_store/v1/internal/data_source/data_source_service_pb2.py +16 -58
  178. _qwak_proto/qwak/feature_store/v1/internal/featureset/featureset_token_service_pb2.py +10 -27
  179. _qwak_proto/qwak/features_operator/v1/features_operator_pb2.py +14 -54
  180. _qwak_proto/qwak/features_operator/v1/features_operator_service_pb2.py +14 -47
  181. _qwak_proto/qwak/features_operator/v2/features_operator_pb2.py +16 -64
  182. _qwak_proto/qwak/features_operator/v2/features_operator_service_pb2.py +12 -37
  183. _qwak_proto/qwak/features_operator/v3/features_operator_async_service_pb2.py +26 -107
  184. _qwak_proto/qwak/features_operator/v3/features_operator_pb2.py +16 -64
  185. _qwak_proto/qwak/file_versioning/file_versioning_pb2.py +10 -33
  186. _qwak_proto/qwak/file_versioning/file_versioning_service_pb2.py +14 -47
  187. _qwak_proto/qwak/fitness_service/constructs_pb2.py +23 -100
  188. _qwak_proto/qwak/fitness_service/constructs_pb2.pyi +24 -0
  189. _qwak_proto/qwak/fitness_service/fitness_pb2.py +7 -34
  190. _qwak_proto/qwak/fitness_service/fitness_pb2.pyi +0 -93
  191. _qwak_proto/qwak/fitness_service/status_pb2.py +17 -108
  192. _qwak_proto/qwak/fitness_service/status_pb2.pyi +1 -121
  193. _qwak_proto/qwak/inference/feedback/feedback_pb2.py +28 -96
  194. _qwak_proto/qwak/instance_template/instance_template_pb2.py +13 -41
  195. _qwak_proto/qwak/instance_template/instance_template_pb2.pyi +4 -1
  196. _qwak_proto/qwak/instance_template/instance_template_service_pb2.py +14 -47
  197. _qwak_proto/qwak/integration/hugging_face_integration_pb2.py +16 -64
  198. _qwak_proto/qwak/integration/integration_pb2.py +28 -126
  199. _qwak_proto/qwak/integration/integration_service_pb2.py +34 -147
  200. _qwak_proto/qwak/integration/open_a_i_integration_pb2.py +16 -64
  201. _qwak_proto/qwak/integration/opsgenie_integration_pb2.py +20 -82
  202. _qwak_proto/qwak/integration/pagerduty_integration_pb2.py +24 -104
  203. _qwak_proto/qwak/integration/slack_app_integration_pb2.py +24 -104
  204. _qwak_proto/qwak/kube_deployment_captain/alert_pb2.py +22 -97
  205. _qwak_proto/qwak/kube_deployment_captain/alerting_pb2.py +12 -44
  206. _qwak_proto/qwak/kube_deployment_captain/batch_job_pb2.py +70 -323
  207. _qwak_proto/qwak/kube_deployment_captain/batch_job_pb2.pyi +20 -5
  208. _qwak_proto/qwak/kube_deployment_captain/deployment_pb2.py +44 -167
  209. _qwak_proto/qwak/kube_deployment_captain/feature_set_deployment_pb2.py +32 -144
  210. _qwak_proto/qwak/kube_deployment_captain/kube_deployment_captain_service_pb2.py +108 -519
  211. _qwak_proto/qwak/kube_deployment_captain/traffic_mapping_pb2.py +8 -24
  212. _qwak_proto/qwak/logging/log_filter_pb2.py +12 -44
  213. _qwak_proto/qwak/logging/log_line_pb2.py +8 -25
  214. _qwak_proto/qwak/logging/log_reader_service_pb2.py +10 -27
  215. _qwak_proto/qwak/logging/log_source_pb2.py +30 -134
  216. _qwak_proto/qwak/model_descriptor/open_ai_descriptor_pb2.py +18 -74
  217. _qwak_proto/qwak/model_group/model_group_pb2.py +25 -48
  218. _qwak_proto/qwak/model_group/model_group_pb2.pyi +88 -0
  219. _qwak_proto/qwak/model_group/model_group_pb2_grpc.py +70 -0
  220. _qwak_proto/qwak/model_group/model_group_repository_details_pb2.py +23 -75
  221. _qwak_proto/qwak/model_group/model_group_repository_details_pb2.pyi +44 -6
  222. _qwak_proto/qwak/models/models_pb2.py +99 -406
  223. _qwak_proto/qwak/models/models_pb2.pyi +86 -0
  224. _qwak_proto/qwak/models/models_pb2_grpc.py +34 -0
  225. _qwak_proto/qwak/models/models_query_pb2.py +16 -56
  226. _qwak_proto/qwak/models/models_query_pb2.pyi +4 -4
  227. _qwak_proto/qwak/monitoring/v0/alerting_channel_management_service_pb2.py +30 -127
  228. _qwak_proto/qwak/monitoring/v0/alerting_channel_pb2.py +34 -152
  229. _qwak_proto/qwak/monitoring/v0/alerting_channel_sync_service_pb2.py +14 -47
  230. _qwak_proto/qwak/offline/serving/v1/feature_values_pb2.py +6 -14
  231. _qwak_proto/qwak/offline/serving/v1/offline_serving_async_service_pb2.py +30 -123
  232. _qwak_proto/qwak/offline/serving/v1/options_pb2.py +6 -14
  233. _qwak_proto/qwak/offline/serving/v1/population_pb2.py +14 -54
  234. _qwak_proto/qwak/projects/jfrog_project_spec_pb2.py +6 -14
  235. _qwak_proto/qwak/projects/projects_pb2.py +50 -192
  236. _qwak_proto/qwak/projects/projects_pb2.pyi +35 -0
  237. _qwak_proto/qwak/prompt/v1/prompt/prompt_manager_service_pb2.py +54 -247
  238. _qwak_proto/qwak/prompt/v1/prompt/prompt_pb2.py +46 -214
  239. _qwak_proto/qwak/secret_service/secret_service_pb2.py +18 -67
  240. _qwak_proto/qwak/secret_service/secret_service_pb2.pyi +1 -1
  241. _qwak_proto/qwak/self_service/account/v0/account_membership_pb2.py +24 -106
  242. _qwak_proto/qwak/self_service/account/v0/account_membership_service_pb2.py +50 -227
  243. _qwak_proto/qwak/self_service/account/v0/account_status_pb2.py +16 -65
  244. _qwak_proto/qwak/self_service/account/v0/managing_account_pb2.py +37 -132
  245. _qwak_proto/qwak/self_service/account/v0/managing_account_pb2.pyi +40 -2
  246. _qwak_proto/qwak/self_service/account/v0/managing_account_service_pb2.py +22 -87
  247. _qwak_proto/qwak/self_service/user/v1/api_key_pb2.py +6 -14
  248. _qwak_proto/qwak/self_service/user/v1/user_pb2.py +6 -14
  249. _qwak_proto/qwak/self_service/user/v1/user_service_pb2.py +30 -121
  250. _qwak_proto/qwak/service_discovery/service_discovery_location_pb2.py +12 -44
  251. _qwak_proto/qwak/service_discovery/service_discovery_location_service_pb2.py +10 -27
  252. _qwak_proto/qwak/traffic/v1/traffic_api_pb2.py +22 -87
  253. _qwak_proto/qwak/traffic/v1/traffic_pb2.py +26 -113
  254. _qwak_proto/qwak/user_application/common/v0/resources_pb2.py +31 -139
  255. _qwak_proto/qwak/user_application/common/v0/resources_pb2.pyi +24 -0
  256. _qwak_proto/qwak/user_application/v0/user_application_pb2.py +11 -44
  257. _qwak_proto/qwak/user_application/v0/user_application_pb2.pyi +6 -0
  258. _qwak_proto/qwak/vectors/v1/collection/collection_pb2.py +24 -106
  259. _qwak_proto/qwak/vectors/v1/collection/collection_service_pb2.py +38 -167
  260. _qwak_proto/qwak/vectors/v1/collection/event/collection_event_pb2.py +6 -14
  261. _qwak_proto/qwak/vectors/v1/filters_pb2.py +30 -134
  262. _qwak_proto/qwak/vectors/v1/vector_pb2.py +14 -54
  263. _qwak_proto/qwak/vectors/v1/vector_service_pb2.py +26 -107
  264. _qwak_proto/qwak/workspace/workspace_pb2.py +22 -107
  265. _qwak_proto/qwak/workspace/workspace_service_pb2.py +62 -287
  266. qwak/__init__.py +1 -1
  267. qwak/automations/automations.py +3 -0
  268. qwak/clients/feature_store/execution_management_client.py +28 -0
  269. qwak/clients/feature_store/management_client.py +156 -206
  270. qwak/clients/feature_store/operator_client.py +19 -1
  271. qwak/clients/logging_client/client.py +13 -18
  272. qwak/clients/model_management/client.py +0 -5
  273. qwak/clients/project/client.py +0 -7
  274. qwak/exceptions/__init__.py +1 -0
  275. qwak/exceptions/qwak_grpc_address_exception.py +9 -0
  276. qwak/feature_store/_common/artifact_utils.py +10 -8
  277. qwak/feature_store/_common/packaging.py +39 -21
  278. qwak/feature_store/_common/source_code_spec.py +61 -11
  279. qwak/feature_store/_common/source_code_spec_factory.py +63 -10
  280. qwak/feature_store/data_sources/__init__.py +2 -0
  281. qwak/feature_store/data_sources/base.py +11 -7
  282. qwak/feature_store/data_sources/batch/snowflake.py +34 -8
  283. qwak/feature_store/data_sources/batch/unity_catalog.py +107 -0
  284. qwak/feature_store/execution/streaming_backfill.py +48 -0
  285. qwak/feature_store/feature_sets/base_feature_set.py +1 -0
  286. qwak/feature_store/feature_sets/streaming.py +84 -63
  287. qwak/feature_store/feature_sets/streaming_backfill.py +88 -124
  288. qwak/feature_store/online/client.py +20 -4
  289. qwak/feature_store/validations/validation_decorators.py +70 -0
  290. qwak/feature_store/validations/validation_response.py +3 -1
  291. qwak/feature_store/validations/validator.py +11 -3
  292. qwak/inner/build_logic/interface/context_interface.py +4 -0
  293. qwak/inner/build_logic/phases/phase_010_fetch_model/post_fetch_validation_step.py +1 -1
  294. qwak/inner/const.py +2 -6
  295. qwak/inner/di_configuration/__init__.py +1 -69
  296. qwak/inner/di_configuration/account.py +18 -63
  297. qwak/inner/di_configuration/containers.py +5 -1
  298. qwak/inner/di_configuration/dependency_wiring.py +98 -0
  299. qwak/inner/tool/auth.py +10 -80
  300. qwak/inner/tool/grpc/grpc_auth.py +0 -32
  301. qwak/inner/tool/grpc/grpc_tools.py +125 -11
  302. qwak/inner/tool/grpc/grpc_try_wrapping.py +140 -3
  303. qwak/llmops/generation/chat/openai/types/chat/chat_completion.py +24 -6
  304. qwak/llmops/generation/chat/openai/types/chat/chat_completion_chunk.py +44 -8
  305. qwak/llmops/generation/chat/openai/types/chat/chat_completion_message.py +6 -3
  306. qwak/qwak_client/client.py +2 -13
  307. qwak/vector_store/rest_helpers.py +4 -16
  308. qwak_core-0.5.19.dist-info/METADATA +48 -0
  309. {qwak_core-0.4.278.dist-info → qwak_core-0.5.19.dist-info}/RECORD +316 -334
  310. qwak_services_mock/mocks/execution_management_service.py +9 -1
  311. qwak_services_mock/mocks/feature_store_data_sources_manager_api.py +55 -13
  312. qwak_services_mock/mocks/feature_store_entities_manager_api.py +31 -29
  313. qwak_services_mock/mocks/features_operator_v3_service.py +20 -0
  314. qwak_services_mock/mocks/qwak_mocks.py +0 -2
  315. qwak_services_mock/services_mock.py +1 -11
  316. _qwak_proto/qwak/fitness_service/fitness_service_pb2.py +0 -110
  317. _qwak_proto/qwak/fitness_service/fitness_service_pb2.pyi +0 -121
  318. _qwak_proto/qwak/fitness_service/fitness_service_pb2_grpc.py +0 -169
  319. frogml_storage/__init__.py +0 -1
  320. frogml_storage/artifactory/__init__.py +0 -1
  321. frogml_storage/artifactory/_artifactory_api.py +0 -315
  322. frogml_storage/authentication/login/__init__.py +0 -1
  323. frogml_storage/authentication/login/_login_cli.py +0 -239
  324. frogml_storage/authentication/login/_login_command.py +0 -74
  325. frogml_storage/authentication/models/__init__.py +0 -3
  326. frogml_storage/authentication/models/_auth.py +0 -24
  327. frogml_storage/authentication/models/_auth_config.py +0 -70
  328. frogml_storage/authentication/models/_login.py +0 -22
  329. frogml_storage/authentication/utils/__init__.py +0 -17
  330. frogml_storage/authentication/utils/_authentication_utils.py +0 -281
  331. frogml_storage/authentication/utils/_login_checks_utils.py +0 -114
  332. frogml_storage/base_storage.py +0 -140
  333. frogml_storage/constants.py +0 -56
  334. frogml_storage/exceptions/checksum_verification_error.py +0 -3
  335. frogml_storage/exceptions/validation_error.py +0 -4
  336. frogml_storage/frog_ml.py +0 -668
  337. frogml_storage/http/__init__.py +0 -1
  338. frogml_storage/http/http_client.py +0 -83
  339. frogml_storage/logging/__init__.py +0 -1
  340. frogml_storage/logging/_log_config.py +0 -45
  341. frogml_storage/logging/log_utils.py +0 -21
  342. frogml_storage/models/__init__.py +0 -1
  343. frogml_storage/models/_download_context.py +0 -54
  344. frogml_storage/models/dataset_manifest.py +0 -13
  345. frogml_storage/models/entity_manifest.py +0 -93
  346. frogml_storage/models/frogml_dataset_version.py +0 -21
  347. frogml_storage/models/frogml_entity_type_info.py +0 -50
  348. frogml_storage/models/frogml_entity_version.py +0 -34
  349. frogml_storage/models/frogml_model_version.py +0 -21
  350. frogml_storage/models/model_manifest.py +0 -60
  351. frogml_storage/models/serialization_metadata.py +0 -15
  352. frogml_storage/utils/__init__.py +0 -12
  353. frogml_storage/utils/_environment.py +0 -21
  354. frogml_storage/utils/_input_checks_utility.py +0 -104
  355. frogml_storage/utils/_storage_utils.py +0 -15
  356. frogml_storage/utils/_url_utils.py +0 -27
  357. qwak/clients/build_management/__init__.py +0 -1
  358. qwak/clients/build_management/client.py +0 -114
  359. qwak_core-0.4.278.dist-info/METADATA +0 -415
  360. qwak_services_mock/mocks/build_management.py +0 -100
  361. {qwak_core-0.4.278.dist-info → qwak_core-0.5.19.dist-info}/WHEEL +0 -0
@@ -1,27 +0,0 @@
1
- from typing import Optional, List
2
- from urllib.parse import urlparse
3
-
4
-
5
- def join_url(base_uri: str, *parts: str) -> str:
6
- base_uri = base_uri.rstrip("/")
7
-
8
- cleaned_parts: List[str] = [
9
- part.strip("/") for part in parts if part is not None and part.strip("/")
10
- ]
11
- uri_parts: List[str] = [base_uri, *cleaned_parts]
12
-
13
- return "/".join(uri_parts)
14
-
15
-
16
- def assemble_artifact_url(uri: Optional[str]) -> str:
17
- if uri is None:
18
- raise Exception("Artifactory URI is required")
19
-
20
- parsed_url = urlparse(uri)
21
- if parsed_url.scheme not in ["http", "https"]:
22
- raise Exception(
23
- f"Not a valid Artifactory URI: {uri}. "
24
- f"Artifactory URI example: `https://frogger.jfrog.io/artifactory/ml-local`"
25
- )
26
-
27
- return f"{parsed_url.scheme}://{parsed_url.netloc}/artifactory"
@@ -1 +0,0 @@
1
- from .client import BuildsManagementClient
@@ -1,114 +0,0 @@
1
- import grpc
2
- from dependency_injector.wiring import Provide
3
-
4
- from _qwak_proto.qwak.builds.builds_pb2 import (
5
- BuildStatus,
6
- ExperimentTrackingValues,
7
- GetBuildRequest,
8
- GetBuildResponse,
9
- ListBuildsRequest,
10
- ListBuildsResponse,
11
- Metric,
12
- Param,
13
- RegisterExperimentTrackingValuesRequest,
14
- RegisterModelSchemaRequest,
15
- UpdateBuildStatusRequest,
16
- )
17
- from _qwak_proto.qwak.builds.builds_pb2_grpc import BuildsManagementServiceStub
18
- from qwak.exceptions import QwakException
19
- from qwak.inner.di_configuration import QwakContainer
20
-
21
-
22
- class BuildsManagementClient:
23
- """
24
- Used for interacting with Feature Registry endpoints
25
- """
26
-
27
- def __init__(self, grpc_channel=Provide[QwakContainer.core_grpc_channel]):
28
- self._builds_management_service = BuildsManagementServiceStub(grpc_channel)
29
-
30
- def update_build_status(self, build_id, build_status, qwak_user_id=""):
31
- try:
32
- self._builds_management_service.UpdateBuildStatus(
33
- UpdateBuildStatusRequest(
34
- build_id=build_id,
35
- build_status=BuildStatus.Value(build_status),
36
- qwak_calling_user_id=qwak_user_id,
37
- )
38
- )
39
-
40
- except grpc.RpcError as e:
41
- raise QwakException(
42
- f"Failed to update build status, error is {e.details()}"
43
- )
44
-
45
- def get_build(self, build_id) -> GetBuildResponse:
46
- try:
47
- return self._builds_management_service.GetBuild(
48
- GetBuildRequest(build_id=build_id)
49
- )
50
- except grpc.RpcError as e:
51
- raise QwakException(f"Failed to get build, error is {e.details()}")
52
-
53
- def is_build_exists(self, build_id: str) -> bool:
54
- try:
55
- self._builds_management_service.GetBuild(GetBuildRequest(build_id=build_id))
56
- return True
57
- except grpc.RpcError as e:
58
- if e.code() == grpc.StatusCode.NOT_FOUND:
59
- return False
60
- raise QwakException(
61
- f"Failed to check if build {build_id} is exists, error is {e.details()}"
62
- )
63
-
64
- def register_schema(self, build_id, model_schema):
65
- try:
66
- return self._builds_management_service.RegisterModelSchema(
67
- RegisterModelSchemaRequest(build_id=build_id, model_schema=model_schema)
68
- )
69
-
70
- except grpc.RpcError as e:
71
- raise QwakException(f"Failed to register schema, error is {e.details()}")
72
-
73
- def register_experiment_tracking_values(
74
- self, build_id, qwak_params=None, cli_params=None, qwak_metrics=None
75
- ):
76
- qwak_params = qwak_params if qwak_params else {}
77
- cli_params = cli_params if cli_params else {}
78
- qwak_metrics = qwak_metrics if qwak_metrics else {}
79
-
80
- try:
81
- params = cli_params.copy()
82
- params.update(qwak_params)
83
-
84
- experiment_tracking_values = ExperimentTrackingValues(
85
- metrics=[
86
- Metric(key=key, value=value) for key, value in qwak_metrics.items()
87
- ],
88
- params=[
89
- Param(key=key, value=str(value)) for key, value in params.items()
90
- ],
91
- )
92
-
93
- return self._builds_management_service.RegisterExperimentTrackingValues(
94
- RegisterExperimentTrackingValuesRequest(
95
- build_id=build_id,
96
- experiment_tracking_values=experiment_tracking_values,
97
- )
98
- )
99
-
100
- except grpc.RpcError as e:
101
- raise QwakException(
102
- f"Failed to register experiment tracking values, error is {e.details()}"
103
- )
104
-
105
- def list_builds(self, model_uuid="", **kwargs) -> ListBuildsResponse:
106
- try:
107
- _model_uuid = model_uuid if model_uuid else kwargs.get("branch_id")
108
- if not _model_uuid:
109
- raise QwakException("missing argument model uuid or branch id.")
110
- return self._builds_management_service.ListBuilds(
111
- ListBuildsRequest(model_uuid=_model_uuid)
112
- )
113
- except grpc.RpcError as e:
114
- raise QwakException(f"Failed to list builds, error is {e.details()}")
@@ -1,415 +0,0 @@
1
- Metadata-Version: 2.3
2
- Name: qwak-core
3
- Version: 0.4.278
4
- Summary: Qwak Core contains the necessary objects and communication tools for using the Qwak Platform
5
- License: Apache-2.0
6
- Keywords: mlops,ml,deployment,serving,model
7
- Author: Qwak
8
- Author-email: info@qwak.com
9
- Requires-Python: >=3.9,<3.12
10
- Classifier: License :: OSI Approved :: Apache Software License
11
- Classifier: Operating System :: OS Independent
12
- Classifier: Programming Language :: Python :: 3
13
- Classifier: Programming Language :: Python :: 3.9
14
- Classifier: Programming Language :: Python :: 3.10
15
- Classifier: Programming Language :: Python :: 3.11
16
- Classifier: Programming Language :: Python :: 3.7
17
- Classifier: Programming Language :: Python :: 3.8
18
- Classifier: Programming Language :: Python :: Implementation :: CPython
19
- Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
20
- Provides-Extra: feature-store
21
- Requires-Dist: PyYAML
22
- Requires-Dist: cachetools
23
- Requires-Dist: chevron (==0.14.0)
24
- Requires-Dist: cloudpickle (==2.2.1) ; extra == "feature-store"
25
- Requires-Dist: dacite (==1.8.1)
26
- Requires-Dist: dependency-injector (>=4.0)
27
- Requires-Dist: filelock
28
- Requires-Dist: grpcio (>=1.57.0)
29
- Requires-Dist: joblib (>=1.3.2,<2.0.0)
30
- Requires-Dist: marshmallow-dataclass (>=8.5.8,<9.0.0)
31
- Requires-Dist: protobuf (>=3.10,<4) ; python_full_version >= "3.7.1" and python_version < "3.10"
32
- Requires-Dist: protobuf (>=4.21.6) ; python_version >= "3.10"
33
- Requires-Dist: pyarrow (>=6.0.0) ; extra == "feature-store"
34
- Requires-Dist: pyathena (>=2.2.0,!=2.18.0) ; extra == "feature-store"
35
- Requires-Dist: pydantic
36
- Requires-Dist: pyspark (==3.4.2) ; extra == "feature-store"
37
- Requires-Dist: python-jose[cryptography] (>=3.4.0)
38
- Requires-Dist: python-json-logger (>=2.0.2)
39
- Requires-Dist: requests
40
- Requires-Dist: retrying (==1.3.4)
41
- Requires-Dist: tqdm
42
- Requires-Dist: typeguard (>=2,<3)
43
- Requires-Dist: typer
44
- Project-URL: Home page, https://www.qwak.com/
45
- Description-Content-Type: text/markdown
46
-
47
- # Qwak Core
48
-
49
- Qwak is an end-to-end production ML platform designed to allow data scientists to build, deploy, and monitor their models in production with minimal engineering friction.
50
- Qwak Core contains all the objects and tools necessary to use the Qwak Platform
51
-
52
- # Frog ML Storage
53
-
54
- ## Table of contents:
55
-
56
- - [Overview](#overview)
57
- - [Working with Artifactory](#Working-with-Artifactory)
58
- - [Login by adding authentication details to your python code](#Login-by-adding-authentication-details-to-your-python-code)
59
- - [Login via environment variables](#Login-via-environment-variables)
60
- - [Login via cli](#Login-via-cli)
61
- - [Login by a single command line with options](#Login-by-a-single-command-line-with-options)
62
- - [Login by interactive flow in Cli](#Login-by-interactive-flow-in-Cli)
63
- - [Upload ML model to Artifactory](#Upload-ML-model-to-Artifactory)
64
- - [Download ML model from Artifactory](#Download-ML-model-from-Artifactory)
65
- - [Upload ML dataset to Artifactory](#Upload-ML-dataset-to-Artifactory)
66
- - [Download ML dataset from Artifactory](#Download-ML-dataset-from-Artifactory)
67
- - [Testing](#Testing)
68
- - [Locally run integration tests using local artifactory](#Locally-run-integration-tests-using-artifactory)
69
- - [Locally run tests using existing Artifactory](#Locally-run-tests-using-existing-Artifactory)
70
- - [Packaging](#Packaging)
71
- - [Linters](#Linters)
72
-
73
- ## Overview
74
-
75
- JFrog ML Storage is a smart python client library providing a simple and efficient method of storing and downloading models, model data and datasets from the JFrog platform, utilizing the advanced capabilities of the JFrog platform.
76
-
77
- ## Working with Artifactory
78
-
79
- FrogML Storage Library support is available from Artifactory version 7.84.x.
80
-
81
- To be able to use FrogML Storage with Artifactory, you should authenticate the frogml storage client against Artifactory.
82
- JFrog implements a credentials provider chain. It sequentially checks each place where you can set the credentials to authenticate with FrogML, and then selects the first one you set.
83
-
84
- The credentials retrieval order is as follows:
85
-
86
- 1. [Login by adding authentication details to your python code](#Login-by-adding-authentication-details-to-your-python-code)
87
- 2. [Login via environment variables](#Login-via-environment-variables)
88
- 3. [Login via cli](#login-via-cli)
89
-
90
-
91
- #### Login by adding authentication details to your python code
92
-
93
- ---
94
- **NOTE**
95
-
96
- It is strongly discouraged to use credentials in clear text. Use this method for testing purposes only.
97
-
98
- ---
99
-
100
- You can authenticate the FrogML client directly via your Python code, using any of the following credentials (overriding env vars and the credentials in the configuration file):
101
- - Username and Password
102
- - Access Token
103
-
104
- To log in as an anonymous user, log in first via CLI, and then you will be able to log in via Python using only your JFrog Platform domain.
105
-
106
- Authentication by username and password:
107
-
108
- ```
109
- from frogml_storage.frog_ml import FrogMLStorage
110
- from frogml_storage.authentication.models._auth_config import AuthConfig
111
-
112
- arti = FrogMLStorage(AuthConfig.by_basic_auth("http://myorg.jfrog.io", <username>, <password>))
113
- ```
114
-
115
- Authentication by access token:
116
-
117
- ```
118
- from frogml_storage.frog_ml import FrogMLStorage
119
- from frogml_storage.authentication.models._auth_config import AuthConfig
120
-
121
- arti = FrogMLStorage(AuthConfig.by_access_token("http://myorg.jfrog.io", <token>))
122
- ```
123
-
124
- #### Login via environment variables
125
-
126
- You can also authenticate the frogml client using the following environment variables:
127
-
128
- - JF_URL - your JFrog platform domain, for example 'http://myorg.jfrog.io'
129
- - JF_ACCESS_TOKEN - your artifactory token for this domain. To generate a token, log in to your artifactory, navigate to your FrogML repository and click on "Set Me Up".
130
-
131
- After setting the environment variables, you can log in to the frogml client without specifying credentials.
132
-
133
-
134
- ```
135
- from frogml_storage.frog_ml import FrogMLStorage
136
- from frogml_storage.authentication.models._auth_config import AuthConfig
137
-
138
- arti = FrogMLStorage()
139
- ```
140
-
141
-
142
- ### Login via cli
143
-
144
- It is possible to authenticate the frogml client using any of the following methods:
145
-
146
- 1. Login by a single CLI command
147
- 2. Interactive flow
148
-
149
- After each login attempt, the authentication result (success or failure) is printed on the screen.
150
- If the login attempt succeeded, the authentication details will be saved as frogml configuration file under the path: ~/.frogml/config.json and from that point you can login again without specifying credentials.
151
-
152
- In both interactive flow and the single command flow, it is possible to authenticate the frogml client by:
153
-
154
- 1. Username and password
155
- 2. Access token
156
- 3. Anonymous authentication
157
-
158
-
159
-
160
- #### Login by a single command line with options
161
-
162
- The below examples show the frogml login options using the cli:
163
-
164
- Login using existing jfrog-cli of frogml configuration files (~/.jfrog/jfrog-cli.conf.v6 or ~/.frogml/config.json, respectively):
165
-
166
- ```
167
- frogml login
168
- ```
169
- If no configuration file is found, interactive mode will be triggered.
170
-
171
- Login by username and password:
172
-
173
- ```
174
- frogml login --url <artifactory_url> --username <username> --password <password>
175
- ```
176
-
177
- Where:
178
- - artifactory_url is your JFrog platform domain, for example 'http://myorg.jfrog.io'
179
- - username and password are your artifactory credentials for this domain
180
-
181
- Login by access token:
182
-
183
- ```
184
- frogml login --url <artifactory_url> --token <access_token>
185
- ```
186
-
187
- Where:
188
- - artifactory_url is your JFrog platform domain, for example 'http://myorg.jfrog.io'
189
- - token - your artifactory token for this domain. To generate a token, log in to your artifactory and navigate to Administration -> User Management -> Access Tokens.
190
-
191
- Login by anonymous access:
192
-
193
- ```
194
- frogml login --url <artifactory_url> --anonymous
195
- ```
196
-
197
- #### Login by interactive flow in cli:
198
-
199
- To start an interactive flow in the cli, run the command:
200
-
201
- ```
202
- frogml login --interactive
203
- ```
204
-
205
- After executing the command above, the cli prompts two options as follows:
206
-
207
- ```
208
- frogml login --interactive
209
- Please select from the following options:
210
- 1.Login by jfrog-cli configuration file: ~/.jfrog/jfrog-cli.conf.v6
211
- 2.Connecting to a new server
212
- ```
213
-
214
- On choosing the first option, the cli attempts to retrieve your authentication credentials from your JFrog CLI configuration file and sends them to Artifactory.
215
-
216
- On choosing the second option, the cli prompts you to input your JFrog platform domain URL. Afterwards, you can select the method you wish to use for authenticating the FrogML library.
217
-
218
- ```
219
- Enter artifactory base url: http://myorg.jfrog.io
220
- Choose your preferred authentication option:
221
- 0: Username and Password
222
- 1: Access Token
223
- 2: Anonymous Access
224
- ```
225
-
226
-
227
- ### Upload ML model to Artifactory
228
-
229
- You can upload a model to a FrogML repository using the upload_model_version() function.
230
- You can upload a single file or an entire folder.
231
- This function uses checksum upload, assigning a SHA2 value to each model for retrieval from storage. If the binary content cannot be reused, the smart upload mechanism performs regular upload instead.
232
- After uploading the model, FrogML generates a file named model-info.json which contains the model name and its related files and dependencies.
233
-
234
- The version parameter is optional. If not specified, Artifactory will set the version as the timestamp of the time you uploaded the model in your time zone, in UTC format: yyyy-MM-dd-HH-mm-ss.
235
- Additionally, you can add properties to the model in Artifactory to categorize and label it.
236
- The function upload_model_version returns an instance of FrogMlModelVersion, which includes the model's name, version, and namespace.
237
-
238
- The below examples show how to upload a model to Artifactory:
239
-
240
- ---
241
- **NOTE**
242
-
243
- namespace, version, properties, dependencies_files_paths and code_archive_file_path are optional.
244
- model_path can point to a single file or a directory, in which case the whole directory is uploaded.
245
- model_type can be written as JSON or as SerializationMetadata object imported from jfrog_ml.serialization_metadata.
246
- All of SerializationMetadata fields must be populated.
247
-
248
- ---
249
-
250
-
251
- Upload an entire folder as model:
252
-
253
- ```
254
- from frogml_storage.frog_ml import FrogMLStorage
255
-
256
- arti = FrogMLStorage()
257
- arti.upload_model_version(repository=<repository_key>,
258
- namespace=<namespce>,
259
- model_name=<model_name>,
260
- model_path="~/model_to_upload/",
261
- model_type={"framework": "tensorflow", "framework_version": "2.3.0", "serialization_format": "H5", "runtime": "python", "runtime_version": "3.7"},
262
- properties={"model_type": "keras", "experiment": "my-exp"},
263
- dependencies_files_paths=["path/to/req/file1", "path/to/req/file2"],
264
- code_archive_file_path="path/to/code/archieve/file"
265
- )
266
- ```
267
-
268
- Upload a model with a specified version, and no dependencies and code archive:
269
-
270
- ```
271
- from frogml_storage.frog_ml import FrogMLStorage
272
-
273
- arti = FrogMLStorage()
274
- arti.upload_model_version(repository=<repository_key>,
275
- namespace=<namespce>,
276
- model_name=<model_name>,
277
- version=<version>,
278
- model_path="~/model_to_upload/",
279
- model_type={"framework": "tensorflow", "framework_version": "2.3.0", "serialization_format": "H5", "runtime": "python", "runtime_version": "3.7"}
280
- )
281
- ```
282
-
283
- ---
284
-
285
- #### Download ML model from Artifactory
286
-
287
- The below example shows how to download a model from Artifactory:
288
-
289
- ```
290
- from frogml_storage.frog_ml import FrogMLStorage
291
-
292
- arti = FrogMLStorage()
293
-
294
- arti.download_model_version(repository=<repository_key>,
295
- namespace=<namespace>,
296
- model_name=<model_name>,
297
- target_path="~/models",
298
- version=<version>)
299
- ```
300
-
301
- ---
302
- **NOTE**
303
-
304
- The dependencies and code archive cannot be downloaded.
305
-
306
- ---
307
-
308
- ### Upload ML dataset to Artifactory
309
-
310
- Upload an entire folder as dataset:
311
-
312
-
313
- ```
314
- from frogml_storage.frog_ml import FrogMLStorage
315
-
316
- arti = FrogMLStorage()
317
- arti.upload_dataset_version(repository=<repository_key>,
318
- namespace=<namespce>,
319
- dataset_name=<dataset_name>,
320
- source_path="~/dataset_to_upload/",
321
- properties={"dataset_type": "kerras", "experiment": "my-exp"})
322
- ```
323
-
324
- Upload a dataset with specified version:
325
-
326
- ```
327
- from frogml_storage.frog_ml import FrogMLStorage
328
-
329
- arti = FrogMLStorage()
330
- arti.upload_dataset_version(repository=<repository_key>,
331
- namespace=<namespce>,
332
- dataset_name=<dataset_name>,
333
- version=<version>,
334
- source_path="~/dataset_to_upload/")
335
- ```
336
-
337
- Upload a single file as a dataset:
338
-
339
- ```
340
- from frogml_storage.frog_ml import FrogMLStorage
341
-
342
- arti = FrogMLStorage()
343
- arti.upload_dataset_version(repository=<repository_key>,
344
- namespace=<namespce>,
345
- dataset_name=<dataset_name>,
346
- version=<version>,
347
- source_path="~/dataset_to_upload/config.json")
348
- ```
349
-
350
- #### Download ML dataset from Artifactory
351
-
352
- The below example shows how to download a dataset from Artifactory:
353
-
354
- ```
355
- from frogml_storage.frog_ml import FrogMLStorage
356
-
357
- arti = FrogMLStorage()
358
-
359
- arti.download_dataset_version(repository=<repository_key>,
360
- namespace=<namespace>,
361
- dataset_name=<dataset_name>,
362
- target_path="~/datasets",
363
- version=<version>)
364
- ```
365
-
366
- ## Testing
367
-
368
- ### Locally run integration tests using artifactory
369
-
370
- Prerequisites:
371
- - A user credentials (username, password)
372
-
373
- To run the integration tests, use the ```poetry run pytest tests/integrations/test_artifactory_integration.py``` command.
374
- In addition, you will need to supply your
375
- ARTIFACTORY_URL in a `http(s)://` format (if not supplied, default will be as defined [here](tests/integrations/conftest.py)), ARTIFACTORY_USERNAME, ARTIFACTORY_PASSWORD.
376
- the test will create a local repository in RT, will upload and download model and datasets using the provided details,
377
- and will delete the repository after the test.
378
-
379
- example:
380
- ```
381
- export ARTIFACTORY_URL=<artifactory_url>
382
- export ARTIFACTORY_USERNAME=<username>
383
- export ARTIFACTORY_PASSWORD=<password>
384
-
385
- poetry run pytest tests/integrations/test_artifactory_integration.py
386
- ```
387
-
388
- ### Locally run tests using existing Artifactory
389
-
390
- To run the tests, use the ```pytest``` command pointing it to an existing Artifactory host.
391
- Prerequisites:
392
- - A generic local repository in the Artifactory instance
393
- - A user token or user credentials (username, password)
394
-
395
- To run the test:
396
-
397
- ```
398
- python3 -m pytest tests/integrations/test_artifactory_integration.py --rt_url "<artifactory_url>" --rt_access_token <token> --repo_name <generic-repo-name> -s
399
- ```
400
-
401
- ## Packaging
402
-
403
- ```
404
- poetry build
405
- ```
406
-
407
- ## Linters
408
- Fix spaces and linebreaks with:
409
- ```
410
- make format
411
- ```
412
- Run linter check:
413
- ```
414
- make format
415
- ```
@@ -1,100 +0,0 @@
1
- from collections import defaultdict
2
-
3
- import grpc
4
- from _qwak_proto.qwak.builds.builds_pb2 import (
5
- SUCCESSFUL,
6
- Build,
7
- BuildSpec,
8
- GetBuildResponse,
9
- ListBuildsResponse,
10
- RegisterExperimentTrackingValuesResponse,
11
- RegisterModelSchemaResponse,
12
- UpdateBuildStatusResponse,
13
- )
14
- from _qwak_proto.qwak.builds.builds_pb2_grpc import BuildsManagementServiceServicer
15
-
16
-
17
- class BuildsManagementServiceMock(BuildsManagementServiceServicer):
18
- def __init__(self):
19
- self.builds = defaultdict(lambda: {})
20
- self.builds_to_models = defaultdict()
21
- self.init_status = SUCCESSFUL
22
-
23
- def UpdateBuildStatus(self, request, context):
24
- model_uuid = self.builds_to_models[request.build_id]
25
- if model_uuid in self.builds:
26
- self.builds[model_uuid][request.build_id]["status"] = str(
27
- request.build_status
28
- )
29
- else:
30
- context.set_code(grpc.StatusCode.NOT_FOUND)
31
- context.set_details("Received a non existing build id")
32
-
33
- return UpdateBuildStatusResponse()
34
-
35
- def RegisterModelSchema(self, request, context):
36
- model_uuid = self.builds_to_models[request.build_id]
37
- if model_uuid in self.builds:
38
- self.builds[model_uuid][request.build_id]["schema"] = request.model_schema
39
- return RegisterModelSchemaResponse()
40
-
41
- def RegisterExperimentTrackingValues(self, request, context):
42
- model_uuid = self.builds_to_models[request.build_id]
43
- if model_uuid in self.builds:
44
- spec = BuildSpec(
45
- build_id=request.build_id,
46
- experiment_tracking_values=request.experiment_tracking_values,
47
- )
48
- self.builds[model_uuid][request.build_id] = {
49
- "spec": spec,
50
- "status": 1,
51
- }
52
- else:
53
- context.set_code(grpc.StatusCode.NOT_FOUND)
54
- context.set_details("Received a non existing build id")
55
- return RegisterExperimentTrackingValuesResponse()
56
-
57
- def GetBuild(self, request, context):
58
- model_uuid = self.builds_to_models[request.build_id]
59
- if model_uuid in self.builds:
60
- persistent_build = self.builds[model_uuid][request.build_id]
61
-
62
- build = self._persistent_build_to_build_proto(persistent_build)
63
-
64
- return GetBuildResponse(build=build)
65
- else:
66
- context.set_code(grpc.StatusCode.NOT_FOUND)
67
- context.set_details("Received a non existing build id")
68
- return GetBuildResponse()
69
-
70
- def ListBuilds(self, request, context):
71
- return ListBuildsResponse(
72
- builds=[
73
- self._persistent_build_to_build_proto(persistent_build)
74
- for persistent_build in self.builds[request.model_uuid].values()
75
- ]
76
- )
77
-
78
- @staticmethod
79
- def _persistent_build_to_build_proto(persistent_build):
80
- spec = persistent_build["spec"]
81
- return Build(
82
- build_spec=BuildSpec(
83
- build_id=spec.build_id,
84
- commit_id=spec.commit_id,
85
- model_id=spec.model_id,
86
- branch_name=spec.branch_name,
87
- tags=spec.tags,
88
- experiment_tracking_values=spec.experiment_tracking_values,
89
- ),
90
- build_status=SUCCESSFUL,
91
- model_schema=persistent_build["schema"]
92
- if "schema" in persistent_build
93
- else None,
94
- )
95
-
96
- def given_build(self, build_id: str, model_uuid: str, build_spec: BuildSpec):
97
- self.builds[model_uuid] = {
98
- build_id: {"spec": build_spec, "status": self.init_status}
99
- }
100
- self.builds_to_models[build_id] = model_uuid