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.
- _qwak_proto/qwak/administration/account/v1/account_pb2.py +20 -18
- _qwak_proto/qwak/administration/account/v1/account_pb2.pyi +21 -2
- _qwak_proto/qwak/administration/runtime_configuration/v0/external/databricks/auth_pb2.py +6 -4
- _qwak_proto/qwak/administration/runtime_configuration/v0/external/databricks/auth_pb2.pyi +27 -4
- _qwak_proto/qwak/administration/runtime_configuration/v0/hosting/azure/auth_pb2.py +5 -3
- _qwak_proto/qwak/administration/runtime_configuration/v0/hosting/azure/auth_pb2.pyi +21 -1
- _qwak_proto/qwak/admiral/secret/v0/secret_pb2.py +16 -14
- _qwak_proto/qwak/admiral/secret/v0/secret_pb2.pyi +21 -2
- _qwak_proto/qwak/batch_job/v1/batch_job_service_pb2.py +100 -100
- _qwak_proto/qwak/batch_job/v1/batch_job_service_pb2.pyi +5 -1
- _qwak_proto/qwak/builds/build_pb2.py +42 -41
- _qwak_proto/qwak/builds/build_pb2.pyi +32 -1
- _qwak_proto/qwak/builds/build_values_pb2.py +82 -0
- _qwak_proto/qwak/builds/build_values_pb2.pyi +553 -0
- _qwak_proto/qwak/builds/build_values_pb2_grpc.py +4 -0
- _qwak_proto/qwak/execution/v1/streaming_aggregation_pb2.py +18 -11
- _qwak_proto/qwak/execution/v1/streaming_aggregation_pb2.pyi +71 -1
- _qwak_proto/qwak/feature_store/features/feature_set_pb2.py +4 -4
- _qwak_proto/qwak/feature_store/features/feature_set_pb2.pyi +4 -0
- _qwak_proto/qwak/feature_store/features/feature_set_types_pb2.py +60 -58
- _qwak_proto/qwak/feature_store/features/feature_set_types_pb2.pyi +7 -2
- _qwak_proto/qwak/fitness_service/constructs_pb2.py +2 -2
- _qwak_proto/qwak/fitness_service/constructs_pb2.pyi +24 -0
- _qwak_proto/qwak/kube_deployment_captain/batch_job_pb2.py +40 -40
- _qwak_proto/qwak/kube_deployment_captain/batch_job_pb2.pyi +12 -2
- _qwak_proto/qwak/projects/projects_pb2.py +17 -15
- _qwak_proto/qwak/secret_service/secret_service_pb2.pyi +1 -1
- qwak/__init__.py +1 -1
- qwak/clients/model_management/client.py +0 -5
- qwak/clients/project/client.py +0 -7
- qwak/exceptions/__init__.py +1 -0
- qwak/exceptions/qwak_grpc_address_exception.py +9 -0
- qwak/feature_store/_common/packaging.py +11 -5
- qwak/inner/const.py +2 -8
- qwak/inner/di_configuration/__init__.py +1 -67
- qwak/inner/di_configuration/account.py +6 -66
- qwak/inner/di_configuration/dependency_wiring.py +98 -0
- qwak/inner/tool/auth.py +0 -86
- qwak/inner/tool/grpc/grpc_auth.py +0 -32
- qwak/inner/tool/grpc/grpc_tools.py +125 -11
- qwak/inner/tool/grpc/grpc_try_wrapping.py +3 -1
- qwak/llmops/generation/chat/openai/types/chat/chat_completion.py +24 -6
- qwak/llmops/generation/chat/openai/types/chat/chat_completion_chunk.py +44 -8
- qwak/llmops/generation/chat/openai/types/chat/chat_completion_message.py +6 -3
- qwak/qwak_client/client.py +2 -8
- qwak/vector_store/rest_helpers.py +4 -16
- qwak_core-0.5.4.dist-info/METADATA +48 -0
- {qwak_core-0.4.362.dist-info → qwak_core-0.5.4.dist-info}/RECORD +49 -82
- frogml_storage/__init__.py +0 -1
- frogml_storage/artifactory/__init__.py +0 -1
- frogml_storage/artifactory/_artifactory_api.py +0 -315
- frogml_storage/authentication/login/__init__.py +0 -1
- frogml_storage/authentication/login/_login_cli.py +0 -239
- frogml_storage/authentication/login/_login_command.py +0 -74
- frogml_storage/authentication/models/__init__.py +0 -3
- frogml_storage/authentication/models/_auth.py +0 -24
- frogml_storage/authentication/models/_auth_config.py +0 -70
- frogml_storage/authentication/models/_login.py +0 -22
- frogml_storage/authentication/utils/__init__.py +0 -17
- frogml_storage/authentication/utils/_authentication_utils.py +0 -281
- frogml_storage/authentication/utils/_login_checks_utils.py +0 -114
- frogml_storage/base_storage.py +0 -140
- frogml_storage/constants.py +0 -56
- frogml_storage/exceptions/checksum_verification_error.py +0 -3
- frogml_storage/exceptions/validation_error.py +0 -4
- frogml_storage/frog_ml.py +0 -668
- frogml_storage/http/__init__.py +0 -1
- frogml_storage/http/http_client.py +0 -83
- frogml_storage/logging/__init__.py +0 -1
- frogml_storage/logging/_log_config.py +0 -45
- frogml_storage/logging/log_utils.py +0 -21
- frogml_storage/models/__init__.py +0 -1
- frogml_storage/models/_download_context.py +0 -54
- frogml_storage/models/dataset_manifest.py +0 -13
- frogml_storage/models/entity_manifest.py +0 -93
- frogml_storage/models/frogml_dataset_version.py +0 -21
- frogml_storage/models/frogml_entity_type_info.py +0 -50
- frogml_storage/models/frogml_entity_version.py +0 -34
- frogml_storage/models/frogml_model_version.py +0 -21
- frogml_storage/models/model_manifest.py +0 -60
- frogml_storage/models/serialization_metadata.py +0 -15
- frogml_storage/utils/__init__.py +0 -12
- frogml_storage/utils/_environment.py +0 -21
- frogml_storage/utils/_input_checks_utility.py +0 -104
- frogml_storage/utils/_storage_utils.py +0 -15
- frogml_storage/utils/_url_utils.py +0 -27
- qwak_core-0.4.362.dist-info/METADATA +0 -414
- {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\
|
|
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=
|
|
60
|
-
_globals['_MODELREPOSITORYJFROGSETTINGS']._serialized_start=
|
|
61
|
-
_globals['_MODELREPOSITORYJFROGSETTINGS']._serialized_end=
|
|
62
|
-
_globals['_MODELREPOSITORYPULLIMAGESECRET']._serialized_start=
|
|
63
|
-
_globals['_MODELREPOSITORYPULLIMAGESECRET']._serialized_end=
|
|
64
|
-
_globals['_MODELREPOSITORYJFROGPROJECTDETAILS']._serialized_start=
|
|
65
|
-
_globals['_MODELREPOSITORYJFROGPROJECTDETAILS']._serialized_end=
|
|
66
|
-
_globals['_MODELREPOSITORYARTIFACTORYDETAILS']._serialized_start=
|
|
67
|
-
_globals['_MODELREPOSITORYARTIFACTORYDETAILS']._serialized_end=
|
|
68
|
-
_globals['_ARTIFACTORYREPOSITORYDETAILS']._serialized_start=
|
|
69
|
-
_globals['_ARTIFACTORYREPOSITORYDETAILS']._serialized_end=
|
|
70
|
-
_globals['_PROJECTSMANAGEMENTSERVICE']._serialized_start=
|
|
71
|
-
_globals['_PROJECTSMANAGEMENTSERVICE']._serialized_end=
|
|
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)
|
qwak/__init__.py
CHANGED
|
@@ -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
|
|
qwak/clients/project/client.py
CHANGED
|
@@ -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
|
|
qwak/exceptions/__init__.py
CHANGED
|
@@ -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
|
-
|
|
231
|
-
|
|
232
|
-
|
|
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
|
|
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
|
|
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:
|
|
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
|
-
|
|
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
|
+
)
|