qwak-core 0.4.362__py3-none-any.whl → 0.5.4__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.
Files changed (88) hide show
  1. _qwak_proto/qwak/administration/account/v1/account_pb2.py +20 -18
  2. _qwak_proto/qwak/administration/account/v1/account_pb2.pyi +21 -2
  3. _qwak_proto/qwak/administration/runtime_configuration/v0/external/databricks/auth_pb2.py +6 -4
  4. _qwak_proto/qwak/administration/runtime_configuration/v0/external/databricks/auth_pb2.pyi +27 -4
  5. _qwak_proto/qwak/administration/runtime_configuration/v0/hosting/azure/auth_pb2.py +5 -3
  6. _qwak_proto/qwak/administration/runtime_configuration/v0/hosting/azure/auth_pb2.pyi +21 -1
  7. _qwak_proto/qwak/admiral/secret/v0/secret_pb2.py +16 -14
  8. _qwak_proto/qwak/admiral/secret/v0/secret_pb2.pyi +21 -2
  9. _qwak_proto/qwak/batch_job/v1/batch_job_service_pb2.py +100 -100
  10. _qwak_proto/qwak/batch_job/v1/batch_job_service_pb2.pyi +5 -1
  11. _qwak_proto/qwak/builds/build_pb2.py +42 -41
  12. _qwak_proto/qwak/builds/build_pb2.pyi +32 -1
  13. _qwak_proto/qwak/builds/build_values_pb2.py +82 -0
  14. _qwak_proto/qwak/builds/build_values_pb2.pyi +553 -0
  15. _qwak_proto/qwak/builds/build_values_pb2_grpc.py +4 -0
  16. _qwak_proto/qwak/execution/v1/streaming_aggregation_pb2.py +18 -11
  17. _qwak_proto/qwak/execution/v1/streaming_aggregation_pb2.pyi +71 -1
  18. _qwak_proto/qwak/feature_store/features/feature_set_pb2.py +4 -4
  19. _qwak_proto/qwak/feature_store/features/feature_set_pb2.pyi +4 -0
  20. _qwak_proto/qwak/feature_store/features/feature_set_types_pb2.py +60 -58
  21. _qwak_proto/qwak/feature_store/features/feature_set_types_pb2.pyi +7 -2
  22. _qwak_proto/qwak/fitness_service/constructs_pb2.py +2 -2
  23. _qwak_proto/qwak/fitness_service/constructs_pb2.pyi +24 -0
  24. _qwak_proto/qwak/kube_deployment_captain/batch_job_pb2.py +40 -40
  25. _qwak_proto/qwak/kube_deployment_captain/batch_job_pb2.pyi +12 -2
  26. _qwak_proto/qwak/projects/projects_pb2.py +17 -15
  27. _qwak_proto/qwak/secret_service/secret_service_pb2.pyi +1 -1
  28. qwak/__init__.py +1 -1
  29. qwak/clients/model_management/client.py +0 -5
  30. qwak/clients/project/client.py +0 -7
  31. qwak/exceptions/__init__.py +1 -0
  32. qwak/exceptions/qwak_grpc_address_exception.py +9 -0
  33. qwak/feature_store/_common/packaging.py +11 -5
  34. qwak/inner/const.py +2 -8
  35. qwak/inner/di_configuration/__init__.py +1 -67
  36. qwak/inner/di_configuration/account.py +6 -66
  37. qwak/inner/di_configuration/dependency_wiring.py +98 -0
  38. qwak/inner/tool/auth.py +0 -86
  39. qwak/inner/tool/grpc/grpc_auth.py +0 -32
  40. qwak/inner/tool/grpc/grpc_tools.py +125 -11
  41. qwak/inner/tool/grpc/grpc_try_wrapping.py +3 -1
  42. qwak/llmops/generation/chat/openai/types/chat/chat_completion.py +24 -6
  43. qwak/llmops/generation/chat/openai/types/chat/chat_completion_chunk.py +44 -8
  44. qwak/llmops/generation/chat/openai/types/chat/chat_completion_message.py +6 -3
  45. qwak/qwak_client/client.py +2 -8
  46. qwak/vector_store/rest_helpers.py +4 -16
  47. qwak_core-0.5.4.dist-info/METADATA +48 -0
  48. {qwak_core-0.4.362.dist-info → qwak_core-0.5.4.dist-info}/RECORD +49 -82
  49. frogml_storage/__init__.py +0 -1
  50. frogml_storage/artifactory/__init__.py +0 -1
  51. frogml_storage/artifactory/_artifactory_api.py +0 -315
  52. frogml_storage/authentication/login/__init__.py +0 -1
  53. frogml_storage/authentication/login/_login_cli.py +0 -239
  54. frogml_storage/authentication/login/_login_command.py +0 -74
  55. frogml_storage/authentication/models/__init__.py +0 -3
  56. frogml_storage/authentication/models/_auth.py +0 -24
  57. frogml_storage/authentication/models/_auth_config.py +0 -70
  58. frogml_storage/authentication/models/_login.py +0 -22
  59. frogml_storage/authentication/utils/__init__.py +0 -17
  60. frogml_storage/authentication/utils/_authentication_utils.py +0 -281
  61. frogml_storage/authentication/utils/_login_checks_utils.py +0 -114
  62. frogml_storage/base_storage.py +0 -140
  63. frogml_storage/constants.py +0 -56
  64. frogml_storage/exceptions/checksum_verification_error.py +0 -3
  65. frogml_storage/exceptions/validation_error.py +0 -4
  66. frogml_storage/frog_ml.py +0 -668
  67. frogml_storage/http/__init__.py +0 -1
  68. frogml_storage/http/http_client.py +0 -83
  69. frogml_storage/logging/__init__.py +0 -1
  70. frogml_storage/logging/_log_config.py +0 -45
  71. frogml_storage/logging/log_utils.py +0 -21
  72. frogml_storage/models/__init__.py +0 -1
  73. frogml_storage/models/_download_context.py +0 -54
  74. frogml_storage/models/dataset_manifest.py +0 -13
  75. frogml_storage/models/entity_manifest.py +0 -93
  76. frogml_storage/models/frogml_dataset_version.py +0 -21
  77. frogml_storage/models/frogml_entity_type_info.py +0 -50
  78. frogml_storage/models/frogml_entity_version.py +0 -34
  79. frogml_storage/models/frogml_model_version.py +0 -21
  80. frogml_storage/models/model_manifest.py +0 -60
  81. frogml_storage/models/serialization_metadata.py +0 -15
  82. frogml_storage/utils/__init__.py +0 -12
  83. frogml_storage/utils/_environment.py +0 -21
  84. frogml_storage/utils/_input_checks_utility.py +0 -104
  85. frogml_storage/utils/_storage_utils.py +0 -15
  86. frogml_storage/utils/_url_utils.py +0 -27
  87. qwak_core-0.4.362.dist-info/METADATA +0 -414
  88. {qwak_core-0.4.362.dist-info → qwak_core-0.5.4.dist-info}/WHEEL +0 -0
@@ -509,10 +509,15 @@ class ModelIdentifier(google.protobuf.message.Message):
509
509
  BUILD_ID_FIELD_NUMBER: builtins.int
510
510
  BRANCH_ID_FIELD_NUMBER: builtins.int
511
511
  MODEL_UUID_FIELD_NUMBER: builtins.int
512
+ MODEL_GROUP_NAME_FIELD_NUMBER: builtins.int
512
513
  model_id: builtins.str
513
514
  build_id: builtins.str
514
515
  branch_id: builtins.str
515
516
  model_uuid: builtins.str
517
+ model_group_name: builtins.str
518
+ """the model group this model belongs to. Currently model group name is identical to the project name for jfrog flows.
519
+ in case this changes, the project name should not be assigned to the model group name anymore.
520
+ """
516
521
  def __init__(
517
522
  self,
518
523
  *,
@@ -520,8 +525,9 @@ class ModelIdentifier(google.protobuf.message.Message):
520
525
  build_id: builtins.str = ...,
521
526
  branch_id: builtins.str = ...,
522
527
  model_uuid: builtins.str = ...,
528
+ model_group_name: builtins.str = ...,
523
529
  ) -> None: ...
524
- def ClearField(self, field_name: typing_extensions.Literal["branch_id", b"branch_id", "build_id", b"build_id", "model_id", b"model_id", "model_uuid", b"model_uuid"]) -> None: ...
530
+ def ClearField(self, field_name: typing_extensions.Literal["branch_id", b"branch_id", "build_id", b"build_id", "model_group_name", b"model_group_name", "model_id", b"model_id", "model_uuid", b"model_uuid"]) -> None: ...
525
531
 
526
532
  global___ModelIdentifier = ModelIdentifier
527
533
 
@@ -572,6 +578,7 @@ class InferenceTaskConfigurationMessage(google.protobuf.message.Message):
572
578
  SERVICE_ACCOUNT_JSON_KEY_SECRET_FIELD_NUMBER: builtins.int
573
579
  IS_POINT_FILE_PATH_FIELD_NUMBER: builtins.int
574
580
  LIST_FILES_PRE_STEP_CONFIGURATION_FIELD_NUMBER: builtins.int
581
+ SESSION_TOKEN_FIELD_NUMBER: builtins.int
575
582
  source_bucket: builtins.str
576
583
  """The source bucket in cloud storage"""
577
584
  destination_bucket: builtins.str
@@ -600,6 +607,8 @@ class InferenceTaskConfigurationMessage(google.protobuf.message.Message):
600
607
  @property
601
608
  def list_files_pre_step_configuration(self) -> global___ListFilesPreStepConfiguration:
602
609
  """Optional pre step configuration, used to list files in the source directory and run inference on subset of files"""
610
+ session_token: builtins.str
611
+ """the session token required to use the bucket for batch inference"""
603
612
  def __init__(
604
613
  self,
605
614
  *,
@@ -616,9 +625,10 @@ class InferenceTaskConfigurationMessage(google.protobuf.message.Message):
616
625
  service_account_json_key_secret: builtins.str = ...,
617
626
  is_point_file_path: builtins.bool = ...,
618
627
  list_files_pre_step_configuration: global___ListFilesPreStepConfiguration | None = ...,
628
+ session_token: builtins.str = ...,
619
629
  ) -> None: ...
620
630
  def HasField(self, field_name: typing_extensions.Literal["list_files_pre_step_configuration", b"list_files_pre_step_configuration"]) -> builtins.bool: ...
621
- def ClearField(self, field_name: typing_extensions.Literal["cloud_provider", b"cloud_provider", "destination_bucket", b"destination_bucket", "destination_path", b"destination_path", "filepath", b"filepath", "input_file_type", b"input_file_type", "is_point_file_path", b"is_point_file_path", "list_files_pre_step_configuration", b"list_files_pre_step_configuration", "output_file_type", b"output_file_type", "parameters", b"parameters", "secret_secret", b"secret_secret", "service_account_json_key_secret", b"service_account_json_key_secret", "source_bucket", b"source_bucket", "token_secret", b"token_secret"]) -> None: ...
631
+ def ClearField(self, field_name: typing_extensions.Literal["cloud_provider", b"cloud_provider", "destination_bucket", b"destination_bucket", "destination_path", b"destination_path", "filepath", b"filepath", "input_file_type", b"input_file_type", "is_point_file_path", b"is_point_file_path", "list_files_pre_step_configuration", b"list_files_pre_step_configuration", "output_file_type", b"output_file_type", "parameters", b"parameters", "secret_secret", b"secret_secret", "service_account_json_key_secret", b"service_account_json_key_secret", "session_token", b"session_token", "source_bucket", b"source_bucket", "token_secret", b"token_secret"]) -> None: ...
622
632
 
623
633
  global___InferenceTaskConfigurationMessage = InferenceTaskConfigurationMessage
624
634
 
@@ -11,12 +11,12 @@ from google.protobuf.internal import builder as _builder
11
11
  _sym_db = _symbol_database.Default()
12
12
 
13
13
 
14
+ from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
14
15
  from _qwak_proto.qwak.models import models_pb2 as qwak_dot_models_dot_models__pb2
15
16
  from _qwak_proto.qwak.projects import jfrog_project_spec_pb2 as qwak_dot_projects_dot_jfrog__project__spec__pb2
16
- from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
17
17
 
18
18
 
19
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1cqwak/projects/projects.proto\x12\x18qwak.projects.management\x1a\x18qwak/models/models.proto\x1a&qwak/projects/jfrog_project_spec.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xad\x03\n\x0eProjectRequest\x12P\n\x16\x63reate_project_request\x18\x01 \x01(\x0b\x32..qwak.projects.management.CreateProjectRequestH\x00\x12P\n\x16\x64\x65lete_project_request\x18\x02 \x01(\x0b\x32..qwak.projects.management.DeleteProjectRequestH\x00\x12P\n\x16update_project_request\x18\x03 \x01(\x0b\x32..qwak.projects.management.UpdateProjectRequestH\x00\x12J\n\x13get_project_request\x18\x04 \x01(\x0b\x32+.qwak.projects.management.GetProjectRequestH\x00\x12N\n\x15list_projects_request\x18\x05 \x01(\x0b\x32-.qwak.projects.management.ListProjectsRequestH\x00\x42\t\n\x07request\"\x91\x01\n\x14\x43reateProjectRequest\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x1b\n\x13project_description\x18\x02 \x01(\t\x12\x46\n\njfrog_spec\x18\x03 \x01(\x0b\x32\x32.qwak.projects.management.ModelRepositoryJFrogSpec\"O\n\x15\x43reateProjectResponse\x12\x36\n\x07project\x18\x01 \x01(\x0b\x32%.qwak.projects.management.ProjectSpec\"\x15\n\x13ListProjectsRequest\"O\n\x14ListProjectsResponse\x12\x37\n\x08projects\x18\x01 \x03(\x0b\x32%.qwak.projects.management.ProjectSpec\"=\n\x11GetProjectRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x14\n\x0cproject_name\x18\x02 \x01(\t\"H\n\x12GetProjectResponse\x12\x32\n\x07project\x18\x01 \x01(\x0b\x32!.qwak.projects.management.Project\"*\n\x14\x44\x65leteProjectRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\"%\n\x15\x44\x65leteProjectResponse\x12\x0c\n\x04info\x18\x01 \x01(\t\"{\n\x14UpdateProjectRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12O\n\x13project_spec_config\x18\x02 \x01(\x0b\x32\x32.qwak.projects.management.ProjectSpecConfiguration\"T\n\x15UpdateProjectResponse\x12;\n\x0cproject_spec\x18\x01 \x01(\x0b\x32%.qwak.projects.management.ProjectSpec\"\xac\x01\n\x07Project\x12\x33\n\x04spec\x18\x01 \x01(\x0b\x32%.qwak.projects.management.ProjectSpec\x12\x31\n\x06models\x18\x02 \x03(\x0b\x32\x1d.qwak.models.management.ModelB\x02\x18\x01\x12\x39\n\rmodels_briefs\x18\x03 \x03(\x0b\x32\".qwak.models.management.ModelBrief\"\xeb\x03\n\x0bProjectSpec\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x14\n\x0cproject_name\x18\x02 \x01(\t\x12\x1b\n\x13project_description\x18\x03 \x01(\t\x12\x44\n\x0eproject_status\x18\x04 \x01(\x0e\x32,.qwak.projects.management.ProjectSpec.Status\x12.\n\ncreated_at\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\ncreated_by\x18\x06 \x01(\t\x12\x34\n\x10last_modified_at\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10last_modified_by\x18\x08 \x01(\t\x12\x14\n\x0cmodels_count\x18\t \x01(\x05\x12\x15\n\rmodels_active\x18\n \x01(\x05\x12N\n\x0ejfrog_settings\x18\x0b \x01(\x0b\x32\x36.qwak.projects.management.ModelRepositoryJFrogSettings\">\n\x06Status\x12\x0b\n\x07INVALID\x10\x00\x12\x0c\n\x08\x44ISABLED\x10\x01\x12\r\n\tSUSPENDED\x10\x02\x12\n\n\x06\x41\x43TIVE\x10\x03\"M\n\x18ProjectSpecConfiguration\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x1b\n\x13project_description\x18\x02 \x01(\t\"\xb1\x02\n\x1cModelRepositoryJFrogSettings\x12S\n\x11pull_image_secret\x18\x01 \x01(\x0b\x32\x38.qwak.projects.management.ModelRepositoryPullImageSecret\x12[\n\x15jfrog_project_details\x18\x02 \x01(\x0b\x32<.qwak.projects.management.ModelRepositoryJFrogProjectDetails\x12_\n\x1ajfrog_repositories_details\x18\x03 \x01(\x0b\x32;.qwak.projects.management.ModelRepositoryArtifactoryDetails\"@\n\x1eModelRepositoryPullImageSecret\x12\x1e\n\x16pull_image_secret_name\x18\x01 \x01(\t\"?\n\"ModelRepositoryJFrogProjectDetails\x12\x19\n\x11jfrog_project_key\x18\x01 \x01(\t\"\xb7\x02\n!ModelRepositoryArtifactoryDetails\x12[\n\x1b\x61rtifact_repository_details\x18\x01 \x01(\x0b\x32\x36.qwak.projects.management.ArtifactoryRepositoryDetails\x12Z\n\x1a\x64\x61taset_repository_details\x18\x02 \x01(\x0b\x32\x36.qwak.projects.management.ArtifactoryRepositoryDetails\x12Y\n\x19\x64ocker_repository_details\x18\x03 \x01(\x0b\x32\x36.qwak.projects.management.ArtifactoryRepositoryDetails\"6\n\x1c\x41rtifactoryRepositoryDetails\x12\x16\n\x0erepository_key\x18\x01 \x01(\t2\xc9\x04\n\x19ProjectsManagementService\x12p\n\rCreateProject\x12..qwak.projects.management.CreateProjectRequest\x1a/.qwak.projects.management.CreateProjectResponse\x12m\n\x0cListProjects\x12-.qwak.projects.management.ListProjectsRequest\x1a..qwak.projects.management.ListProjectsResponse\x12g\n\nGetProject\x12+.qwak.projects.management.GetProjectRequest\x1a,.qwak.projects.management.GetProjectResponse\x12p\n\rDeleteProject\x12..qwak.projects.management.DeleteProjectRequest\x1a/.qwak.projects.management.DeleteProjectResponse\x12p\n\rUpdateProject\x12..qwak.projects.management.UpdateProjectRequest\x1a/.qwak.projects.management.UpdateProjectResponseB\'\n#com.qwak.ai.management.projects.apiP\x01\x62\x06proto3')
19
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1cqwak/projects/projects.proto\x12\x18qwak.projects.management\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x18qwak/models/models.proto\x1a&qwak/projects/jfrog_project_spec.proto\"\xad\x03\n\x0eProjectRequest\x12P\n\x16\x63reate_project_request\x18\x01 \x01(\x0b\x32..qwak.projects.management.CreateProjectRequestH\x00\x12P\n\x16\x64\x65lete_project_request\x18\x02 \x01(\x0b\x32..qwak.projects.management.DeleteProjectRequestH\x00\x12P\n\x16update_project_request\x18\x03 \x01(\x0b\x32..qwak.projects.management.UpdateProjectRequestH\x00\x12J\n\x13get_project_request\x18\x04 \x01(\x0b\x32+.qwak.projects.management.GetProjectRequestH\x00\x12N\n\x15list_projects_request\x18\x05 \x01(\x0b\x32-.qwak.projects.management.ListProjectsRequestH\x00\x42\t\n\x07request\"\x91\x01\n\x14\x43reateProjectRequest\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x1b\n\x13project_description\x18\x02 \x01(\t\x12\x46\n\njfrog_spec\x18\x03 \x01(\x0b\x32\x32.qwak.projects.management.ModelRepositoryJFrogSpec\"O\n\x15\x43reateProjectResponse\x12\x36\n\x07project\x18\x01 \x01(\x0b\x32%.qwak.projects.management.ProjectSpec\"\x15\n\x13ListProjectsRequest\"O\n\x14ListProjectsResponse\x12\x37\n\x08projects\x18\x01 \x03(\x0b\x32%.qwak.projects.management.ProjectSpec\"=\n\x11GetProjectRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x14\n\x0cproject_name\x18\x02 \x01(\t\"H\n\x12GetProjectResponse\x12\x32\n\x07project\x18\x01 \x01(\x0b\x32!.qwak.projects.management.Project\"*\n\x14\x44\x65leteProjectRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\"%\n\x15\x44\x65leteProjectResponse\x12\x0c\n\x04info\x18\x01 \x01(\t\"{\n\x14UpdateProjectRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12O\n\x13project_spec_config\x18\x02 \x01(\x0b\x32\x32.qwak.projects.management.ProjectSpecConfiguration\"T\n\x15UpdateProjectResponse\x12;\n\x0cproject_spec\x18\x01 \x01(\x0b\x32%.qwak.projects.management.ProjectSpec\"\xac\x01\n\x07Project\x12\x33\n\x04spec\x18\x01 \x01(\x0b\x32%.qwak.projects.management.ProjectSpec\x12\x31\n\x06models\x18\x02 \x03(\x0b\x32\x1d.qwak.models.management.ModelB\x02\x18\x01\x12\x39\n\rmodels_briefs\x18\x03 \x03(\x0b\x32\".qwak.models.management.ModelBrief\"\xeb\x03\n\x0bProjectSpec\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x14\n\x0cproject_name\x18\x02 \x01(\t\x12\x1b\n\x13project_description\x18\x03 \x01(\t\x12\x44\n\x0eproject_status\x18\x04 \x01(\x0e\x32,.qwak.projects.management.ProjectSpec.Status\x12.\n\ncreated_at\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\ncreated_by\x18\x06 \x01(\t\x12\x34\n\x10last_modified_at\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10last_modified_by\x18\x08 \x01(\t\x12\x14\n\x0cmodels_count\x18\t \x01(\x05\x12\x15\n\rmodels_active\x18\n \x01(\x05\x12N\n\x0ejfrog_settings\x18\x0b \x01(\x0b\x32\x36.qwak.projects.management.ModelRepositoryJFrogSettings\">\n\x06Status\x12\x0b\n\x07INVALID\x10\x00\x12\x0c\n\x08\x44ISABLED\x10\x01\x12\r\n\tSUSPENDED\x10\x02\x12\n\n\x06\x41\x43TIVE\x10\x03\"Q\n\x18ProjectSpecConfiguration\x12\x18\n\x0cproject_name\x18\x01 \x01(\tB\x02\x18\x01\x12\x1b\n\x13project_description\x18\x02 \x01(\t\"\xb1\x02\n\x1cModelRepositoryJFrogSettings\x12S\n\x11pull_image_secret\x18\x01 \x01(\x0b\x32\x38.qwak.projects.management.ModelRepositoryPullImageSecret\x12[\n\x15jfrog_project_details\x18\x02 \x01(\x0b\x32<.qwak.projects.management.ModelRepositoryJFrogProjectDetails\x12_\n\x1ajfrog_repositories_details\x18\x03 \x01(\x0b\x32;.qwak.projects.management.ModelRepositoryArtifactoryDetails\"@\n\x1eModelRepositoryPullImageSecret\x12\x1e\n\x16pull_image_secret_name\x18\x01 \x01(\t\"?\n\"ModelRepositoryJFrogProjectDetails\x12\x19\n\x11jfrog_project_key\x18\x01 \x01(\t\"\xb7\x02\n!ModelRepositoryArtifactoryDetails\x12[\n\x1b\x61rtifact_repository_details\x18\x01 \x01(\x0b\x32\x36.qwak.projects.management.ArtifactoryRepositoryDetails\x12Z\n\x1a\x64\x61taset_repository_details\x18\x02 \x01(\x0b\x32\x36.qwak.projects.management.ArtifactoryRepositoryDetails\x12Y\n\x19\x64ocker_repository_details\x18\x03 \x01(\x0b\x32\x36.qwak.projects.management.ArtifactoryRepositoryDetails\"6\n\x1c\x41rtifactoryRepositoryDetails\x12\x16\n\x0erepository_key\x18\x01 \x01(\t2\xc9\x04\n\x19ProjectsManagementService\x12p\n\rCreateProject\x12..qwak.projects.management.CreateProjectRequest\x1a/.qwak.projects.management.CreateProjectResponse\x12m\n\x0cListProjects\x12-.qwak.projects.management.ListProjectsRequest\x1a..qwak.projects.management.ListProjectsResponse\x12g\n\nGetProject\x12+.qwak.projects.management.GetProjectRequest\x1a,.qwak.projects.management.GetProjectResponse\x12p\n\rDeleteProject\x12..qwak.projects.management.DeleteProjectRequest\x1a/.qwak.projects.management.DeleteProjectResponse\x12p\n\rUpdateProject\x12..qwak.projects.management.UpdateProjectRequest\x1a/.qwak.projects.management.UpdateProjectResponseB\'\n#com.qwak.ai.management.projects.apiP\x01\x62\x06proto3')
20
20
 
21
21
  _globals = globals()
22
22
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -27,6 +27,8 @@ if _descriptor._USE_C_DESCRIPTORS == False:
27
27
  DESCRIPTOR._serialized_options = b'\n#com.qwak.ai.management.projects.apiP\001'
28
28
  _PROJECT.fields_by_name['models']._options = None
29
29
  _PROJECT.fields_by_name['models']._serialized_options = b'\030\001'
30
+ _PROJECTSPECCONFIGURATION.fields_by_name['project_name']._options = None
31
+ _PROJECTSPECCONFIGURATION.fields_by_name['project_name']._serialized_options = b'\030\001'
30
32
  _globals['_PROJECTREQUEST']._serialized_start=158
31
33
  _globals['_PROJECTREQUEST']._serialized_end=587
32
34
  _globals['_CREATEPROJECTREQUEST']._serialized_start=590
@@ -56,17 +58,17 @@ if _descriptor._USE_C_DESCRIPTORS == False:
56
58
  _globals['_PROJECTSPEC_STATUS']._serialized_start=1958
57
59
  _globals['_PROJECTSPEC_STATUS']._serialized_end=2020
58
60
  _globals['_PROJECTSPECCONFIGURATION']._serialized_start=2022
59
- _globals['_PROJECTSPECCONFIGURATION']._serialized_end=2099
60
- _globals['_MODELREPOSITORYJFROGSETTINGS']._serialized_start=2102
61
- _globals['_MODELREPOSITORYJFROGSETTINGS']._serialized_end=2407
62
- _globals['_MODELREPOSITORYPULLIMAGESECRET']._serialized_start=2409
63
- _globals['_MODELREPOSITORYPULLIMAGESECRET']._serialized_end=2473
64
- _globals['_MODELREPOSITORYJFROGPROJECTDETAILS']._serialized_start=2475
65
- _globals['_MODELREPOSITORYJFROGPROJECTDETAILS']._serialized_end=2538
66
- _globals['_MODELREPOSITORYARTIFACTORYDETAILS']._serialized_start=2541
67
- _globals['_MODELREPOSITORYARTIFACTORYDETAILS']._serialized_end=2852
68
- _globals['_ARTIFACTORYREPOSITORYDETAILS']._serialized_start=2854
69
- _globals['_ARTIFACTORYREPOSITORYDETAILS']._serialized_end=2908
70
- _globals['_PROJECTSMANAGEMENTSERVICE']._serialized_start=2911
71
- _globals['_PROJECTSMANAGEMENTSERVICE']._serialized_end=3496
61
+ _globals['_PROJECTSPECCONFIGURATION']._serialized_end=2103
62
+ _globals['_MODELREPOSITORYJFROGSETTINGS']._serialized_start=2106
63
+ _globals['_MODELREPOSITORYJFROGSETTINGS']._serialized_end=2411
64
+ _globals['_MODELREPOSITORYPULLIMAGESECRET']._serialized_start=2413
65
+ _globals['_MODELREPOSITORYPULLIMAGESECRET']._serialized_end=2477
66
+ _globals['_MODELREPOSITORYJFROGPROJECTDETAILS']._serialized_start=2479
67
+ _globals['_MODELREPOSITORYJFROGPROJECTDETAILS']._serialized_end=2542
68
+ _globals['_MODELREPOSITORYARTIFACTORYDETAILS']._serialized_start=2545
69
+ _globals['_MODELREPOSITORYARTIFACTORYDETAILS']._serialized_end=2856
70
+ _globals['_ARTIFACTORYREPOSITORYDETAILS']._serialized_start=2858
71
+ _globals['_ARTIFACTORYREPOSITORYDETAILS']._serialized_end=2912
72
+ _globals['_PROJECTSMANAGEMENTSERVICE']._serialized_start=2915
73
+ _globals['_PROJECTSMANAGEMENTSERVICE']._serialized_end=3500
72
74
  # @@protoc_insertion_point(module_scope)
@@ -81,7 +81,7 @@ class DeleteSecretRequest(google.protobuf.message.Message):
81
81
 
82
82
  NAME_FIELD_NUMBER: builtins.int
83
83
  name: builtins.str
84
- """The name of the secret"""
84
+ """Name of the secret"""
85
85
  def __init__(
86
86
  self,
87
87
  *,
qwak/__init__.py CHANGED
@@ -1,7 +1,7 @@
1
1
  """Top-level package for qwak-core."""
2
2
 
3
3
  __author__ = "Qwak.ai"
4
- __version__ = "0.4.362"
4
+ __version__ = "0.5.4"
5
5
 
6
6
  from qwak.inner.di_configuration import wire_dependencies
7
7
  from qwak.model.experiment_tracking import log_metric, log_param
@@ -12,7 +12,6 @@ from _qwak_proto.qwak.models.models_pb2 import (
12
12
  ModelSpec,
13
13
  )
14
14
  from _qwak_proto.qwak.models.models_pb2_grpc import ModelsManagementServiceStub
15
- from _qwak_proto.qwak.projects.jfrog_project_spec_pb2 import ModelRepositoryJFrogSpec
16
15
  from dependency_injector.wiring import Provide
17
16
  from qwak.exceptions import QwakException
18
17
  from qwak.inner.di_configuration import QwakContainer
@@ -59,7 +58,6 @@ class ModelsManagementClient:
59
58
  project_id,
60
59
  model_name,
61
60
  model_description,
62
- jfrog_project_key: Optional[str] = None,
63
61
  ):
64
62
  try:
65
63
  return self._models_management_service.CreateModel(
@@ -70,9 +68,6 @@ class ModelsManagementClient:
70
68
  project_id=project_id,
71
69
  model_description=model_description,
72
70
  ),
73
- jfrog_project_spec=ModelRepositoryJFrogSpec(
74
- jfrog_project_key=jfrog_project_key,
75
- ),
76
71
  )
77
72
  )
78
73
 
@@ -1,5 +1,3 @@
1
- from typing import Optional
2
-
3
1
  import grpc
4
2
  from _qwak_proto.qwak.projects.projects_pb2 import (
5
3
  CreateProjectRequest,
@@ -8,7 +6,6 @@ from _qwak_proto.qwak.projects.projects_pb2 import (
8
6
  ListProjectsRequest,
9
7
  )
10
8
  from _qwak_proto.qwak.projects.projects_pb2_grpc import ProjectsManagementServiceStub
11
- from _qwak_proto.qwak.projects.jfrog_project_spec_pb2 import ModelRepositoryJFrogSpec
12
9
  from dependency_injector.wiring import Provide, inject
13
10
  from qwak.exceptions import QwakException
14
11
  from qwak.inner.di_configuration import QwakContainer
@@ -34,16 +31,12 @@ class ProjectsManagementClient:
34
31
  self,
35
32
  project_name,
36
33
  project_description,
37
- jfrog_project_key: Optional[str] = None,
38
34
  ):
39
35
  try:
40
36
  return self._projects_management_service.CreateProject(
41
37
  CreateProjectRequest(
42
38
  project_name=project_name,
43
39
  project_description=project_description,
44
- jfrog_spec=ModelRepositoryJFrogSpec(
45
- jfrog_project_key=jfrog_project_key
46
- ),
47
40
  )
48
41
  )
49
42
 
@@ -1,6 +1,7 @@
1
1
  from .quiet_error import QuietError
2
2
  from .qwak_exception import QwakException
3
3
  from .qwak_general_build_exception import QwakGeneralBuildException
4
+ from .qwak_grpc_address_exception import QwakGrpcAddressException
4
5
  from .qwak_http_exception import QwakHTTPException
5
6
  from .qwak_inference_exception import QwakInferenceException
6
7
  from .qwak_load_configuration_exception import LoadConfigurationException
@@ -0,0 +1,9 @@
1
+ from typing import Union
2
+ from urllib.parse import ParseResult
3
+
4
+ from qwak.exceptions import QwakException
5
+
6
+
7
+ class QwakGrpcAddressException(QwakException):
8
+ def __init__(self, details: str, grpc_address: Union[str, ParseResult]):
9
+ self.message = f"Not a valid gRPC address: '{grpc_address}'. Details: {details}"
@@ -16,6 +16,7 @@ from qwak.feature_store._common.value import (
16
16
  UPDATE_QWAK_SDK_WITH_FEATURE_STORE_EXTRA_MSG,
17
17
  )
18
18
  from requests import HTTPError, Response
19
+ from urllib.parse import urlparse, ParseResult
19
20
 
20
21
  ZIP_FUNCTION_CONTENT_TYPE = "text/plain"
21
22
 
@@ -220,17 +221,22 @@ def put_files_content(
220
221
 
221
222
 
222
223
  def upload_to_s3(presign_url: str, in_memory_zip: bytes, content_type: str) -> str:
224
+ parsed_url: ParseResult = urlparse(presign_url)
225
+ extra_headers: Dict[str, str] = (
226
+ {"x-ms-blob-type": "BlockBlob"}
227
+ if parsed_url.hostname.endswith(".blob.core.windows.net")
228
+ else None
229
+ )
223
230
  put_files_content(
224
231
  url=presign_url,
225
232
  content=in_memory_zip,
226
233
  content_type=content_type,
234
+ extra_headers=extra_headers,
227
235
  )
228
- from urllib.parse import urlparse
229
236
 
230
- parsed_url = urlparse(presign_url)
231
- postfix = parsed_url.path
232
- bucket = parsed_url.hostname.split(".s3.")[0]
233
- s3_path = f"s3://{bucket}{postfix}" # noqa: E231
237
+ postfix: str = parsed_url.path
238
+ bucket: str = parsed_url.hostname.split(".s3.")[0]
239
+ s3_path: str = f"s3://{bucket}{postfix}" # noqa: E231
234
240
  return s3_path
235
241
 
236
242
 
qwak/inner/const.py CHANGED
@@ -33,12 +33,6 @@ class QwakConstants:
33
33
 
34
34
  TOKEN_AUDIENCE: str = "https://auth-token.qwak.ai/" # nosec B105
35
35
 
36
- QWAK_AUTHENTICATION_URL = "https://grpc.qwak.ai/api/v1/authentication/qwak-api-key"
37
-
38
- QWAK_AUTHENTICATED_USER_ENDPOINT: str = (
39
- "https://grpc.qwak.ai/api/v0/runtime/get-authenticated-user-context"
40
- )
41
-
42
- JFROG_TENANT_HEADER_KEY = "X-JFrog-Tenant-Id"
43
-
44
36
  QWAK_APP_URL: str = "https://app.qwak.ai"
37
+
38
+ CONTROL_PLANE_GRPC_ADDRESS_ENVAR_NAME: str = "CONTROL_PLANE_GRPC_ADDRESS"
@@ -1,69 +1,3 @@
1
- import os
2
-
3
1
  from .account import UserAccountConfiguration
4
2
  from .containers import QwakContainer
5
-
6
-
7
- def wire_dependencies():
8
- container = QwakContainer()
9
-
10
- default_config_file = os.path.join(os.path.dirname(__file__), "config.yml")
11
- container.config.from_yaml(default_config_file)
12
-
13
- from qwak.clients import (
14
- administration,
15
- alert_management,
16
- alerts_registry,
17
- analytics,
18
- audience,
19
- automation_management,
20
- autoscaling,
21
- batch_job_management,
22
- build_orchestrator,
23
- data_versioning,
24
- deployment,
25
- feature_store,
26
- file_versioning,
27
- instance_template,
28
- integration_management,
29
- kube_deployment_captain,
30
- logging_client,
31
- model_management,
32
- project,
33
- prompt_manager,
34
- system_secret,
35
- user_application_instance,
36
- vector_store,
37
- workspace_manager,
38
- )
39
-
40
- container.wire(
41
- packages=[
42
- administration,
43
- alert_management,
44
- audience,
45
- automation_management,
46
- autoscaling,
47
- analytics,
48
- batch_job_management,
49
- build_orchestrator,
50
- data_versioning,
51
- deployment,
52
- file_versioning,
53
- instance_template,
54
- kube_deployment_captain,
55
- logging_client,
56
- model_management,
57
- project,
58
- feature_store,
59
- user_application_instance,
60
- alerts_registry,
61
- workspace_manager,
62
- vector_store,
63
- integration_management,
64
- system_secret,
65
- prompt_manager,
66
- ]
67
- )
68
-
69
- return container
3
+ from .dependency_wiring import wire_dependencies
@@ -2,13 +2,12 @@ import configparser
2
2
  import errno
3
3
  import os
4
4
  from dataclasses import dataclass
5
- from typing import Optional, Type, Union
5
+ from typing import Optional, Type
6
6
 
7
7
  from qwak.exceptions import QwakLoginException
8
8
  from qwak.inner.const import QwakConstants
9
9
  from qwak.inner.di_configuration.session import Session
10
- from qwak.inner.tool.auth import Auth0ClientBase, FrogMLAuthClient
11
- from frogml_storage.authentication.login import frogml_login
10
+ from qwak.inner.tool.auth import Auth0ClientBase
12
11
 
13
12
 
14
13
  @dataclass
@@ -23,18 +22,6 @@ class UserAccount:
23
22
  # Assigned username
24
23
  username: Optional[str] = None
25
24
 
26
- # Assigned password
27
- password: Optional[str] = None
28
-
29
- # Assigned URL
30
- url: Optional[str] = None
31
-
32
- # Anonymous login
33
- anonymous: bool = False
34
-
35
- # Interactive login
36
- is_interactive: bool = False
37
-
38
25
 
39
26
  class UserAccountConfiguration:
40
27
  USER_FIELD = "user"
@@ -43,9 +30,9 @@ class UserAccountConfiguration:
43
30
 
44
31
  def __init__(
45
32
  self,
46
- config_file=QwakConstants.QWAK_CONFIG_FILE,
47
- auth_file=QwakConstants.QWAK_AUTHORIZATION_FILE,
48
- auth_client: Union[Type[Auth0ClientBase], Type[FrogMLAuthClient]] = None,
33
+ config_file: str = QwakConstants.QWAK_CONFIG_FILE,
34
+ auth_file: str = QwakConstants.QWAK_AUTHORIZATION_FILE,
35
+ auth_client: Type[Auth0ClientBase] = Auth0ClientBase,
49
36
  ):
50
37
  self._config_file = config_file
51
38
  self._auth_file = auth_file
@@ -53,52 +40,12 @@ class UserAccountConfiguration:
53
40
  self._auth = configparser.ConfigParser()
54
41
  self._environment = Session().get_environment()
55
42
  self._auth_client = auth_client
56
- self._force_qwak_auth = os.getenv("FORCE_QWAK_AUTH", "False") == "True"
57
-
58
- if not self._auth_client:
59
- # Determine auth client based on FrogML configuration
60
- try:
61
- from frogml_storage.authentication.utils import (
62
- get_frogml_configuration,
63
- )
64
-
65
- if (
66
- get_frogml_configuration() or os.getenv("JF_URL")
67
- ) and not self._force_qwak_auth:
68
- self._auth_client = FrogMLAuthClient
69
- else:
70
- self._auth_client = Auth0ClientBase
71
- except (ImportError, Exception):
72
- self._auth_client = Auth0ClientBase
73
43
 
74
44
  def configure_user(self, user_account: UserAccount):
75
45
  """
76
46
  Configure user authentication based on the authentication client type
77
47
  """
78
- if issubclass(self._auth_client, Auth0ClientBase):
79
- # Existing Qwak authentication flow
80
- self.__qwak_login(user_account)
81
-
82
- elif issubclass(self._auth_client, FrogMLAuthClient):
83
- # Use FrogML's login flow
84
- success = frogml_login(
85
- url=user_account.url,
86
- username=user_account.username,
87
- password=user_account.password,
88
- token=user_account.api_key,
89
- anonymous=user_account.anonymous,
90
- is_interactive=user_account.is_interactive,
91
- )
92
-
93
- if not success:
94
- raise QwakLoginException("Failed to authenticate with JFrog")
95
- # Validate access token
96
- # TODO: Remove once we support reference token
97
- token = self._auth_client().get_token()
98
- if not token or len(token) <= 64:
99
- raise QwakLoginException(
100
- "Authentication with JFrog failed: Only Access Tokens are supported. Please ensure you are using a valid Access Token."
101
- )
48
+ self.__qwak_login(user_account)
102
49
 
103
50
  def __qwak_login(self, user_account: UserAccount):
104
51
  self._auth.read(self._auth_file)
@@ -139,8 +86,6 @@ class UserAccountConfiguration:
139
86
  :return:
140
87
  """
141
88
  try:
142
- if issubclass(self._auth_client, FrogMLAuthClient):
143
- return UserAccount()
144
89
  username = os.environ.get("QWAK_USERNAME")
145
90
  api_key = os.environ.get("QWAK_API_KEY")
146
91
  if not api_key and (
@@ -179,8 +124,6 @@ class UserAccountConfiguration:
179
124
  :return:
180
125
  """
181
126
  try:
182
- if issubclass(self._auth_client, FrogMLAuthClient):
183
- return ""
184
127
  api_key = os.environ.get("QWAK_API_KEY")
185
128
  if api_key:
186
129
  Session().set_environment(api_key)
@@ -213,7 +156,4 @@ class UserAccountConfiguration:
213
156
  auth_client_instance = self._auth_client()
214
157
  base_url = auth_client_instance.get_base_url()
215
158
 
216
- if issubclass(self._auth_client, FrogMLAuthClient):
217
- return f"{base_url}/ui/ml"
218
-
219
159
  return base_url
@@ -0,0 +1,98 @@
1
+ import os
2
+ from pathlib import Path
3
+ from typing import Optional
4
+
5
+ from qwak.inner.const import QwakConstants
6
+ from qwak.inner.di_configuration import QwakContainer
7
+ from qwak.inner.tool.grpc.grpc_tools import validate_grpc_address
8
+ from qwak.tools.logger import get_qwak_logger
9
+
10
+
11
+ logger = get_qwak_logger()
12
+
13
+ __DEFAULT_CONFIG_FILE_PATH: Path = Path(__file__).parent / "config.yml"
14
+
15
+
16
+ def wire_dependencies():
17
+ container = QwakContainer()
18
+
19
+ container.config.from_yaml(__DEFAULT_CONFIG_FILE_PATH)
20
+ control_plane_grpc_address_override: Optional[str] = os.getenv(
21
+ QwakConstants.CONTROL_PLANE_GRPC_ADDRESS_ENVAR_NAME
22
+ )
23
+
24
+ if control_plane_grpc_address_override:
25
+ validate_grpc_address(control_plane_grpc_address_override)
26
+ __override_control_plane_grpc_address(
27
+ container, control_plane_grpc_address_override
28
+ )
29
+
30
+ from qwak.clients import (
31
+ administration,
32
+ alert_management,
33
+ alerts_registry,
34
+ analytics,
35
+ audience,
36
+ automation_management,
37
+ autoscaling,
38
+ batch_job_management,
39
+ build_orchestrator,
40
+ data_versioning,
41
+ deployment,
42
+ feature_store,
43
+ file_versioning,
44
+ instance_template,
45
+ integration_management,
46
+ kube_deployment_captain,
47
+ logging_client,
48
+ model_management,
49
+ project,
50
+ prompt_manager,
51
+ system_secret,
52
+ user_application_instance,
53
+ vector_store,
54
+ workspace_manager,
55
+ )
56
+
57
+ container.wire(
58
+ packages=[
59
+ administration,
60
+ alert_management,
61
+ audience,
62
+ automation_management,
63
+ autoscaling,
64
+ analytics,
65
+ batch_job_management,
66
+ build_orchestrator,
67
+ data_versioning,
68
+ deployment,
69
+ file_versioning,
70
+ instance_template,
71
+ kube_deployment_captain,
72
+ logging_client,
73
+ model_management,
74
+ project,
75
+ feature_store,
76
+ user_application_instance,
77
+ alerts_registry,
78
+ workspace_manager,
79
+ vector_store,
80
+ integration_management,
81
+ system_secret,
82
+ prompt_manager,
83
+ ]
84
+ )
85
+
86
+ return container
87
+
88
+
89
+ def __override_control_plane_grpc_address(
90
+ container: "QwakContainer", control_plane_grpc_address_override: str
91
+ ):
92
+ logger.debug(
93
+ "Overriding control plane gRPC address from environment variable to %s.",
94
+ control_plane_grpc_address_override,
95
+ )
96
+ container.config.grpc.core.address.from_value(
97
+ control_plane_grpc_address_override.strip()
98
+ )