oracle-ads 2.13.9rc0__py3-none-any.whl → 2.13.10__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.
- ads/aqua/__init__.py +40 -0
- ads/aqua/app.py +507 -0
- ads/aqua/cli.py +96 -0
- ads/aqua/client/__init__.py +3 -0
- ads/aqua/client/client.py +836 -0
- ads/aqua/client/openai_client.py +305 -0
- ads/aqua/common/__init__.py +5 -0
- ads/aqua/common/decorator.py +125 -0
- ads/aqua/common/entities.py +274 -0
- ads/aqua/common/enums.py +134 -0
- ads/aqua/common/errors.py +109 -0
- ads/aqua/common/utils.py +1295 -0
- ads/aqua/config/__init__.py +4 -0
- ads/aqua/config/container_config.py +246 -0
- ads/aqua/config/evaluation/__init__.py +4 -0
- ads/aqua/config/evaluation/evaluation_service_config.py +147 -0
- ads/aqua/config/utils/__init__.py +4 -0
- ads/aqua/config/utils/serializer.py +339 -0
- ads/aqua/constants.py +116 -0
- ads/aqua/data.py +14 -0
- ads/aqua/dummy_data/icon.txt +1 -0
- ads/aqua/dummy_data/oci_model_deployments.json +56 -0
- ads/aqua/dummy_data/oci_models.json +1 -0
- ads/aqua/dummy_data/readme.md +26 -0
- ads/aqua/evaluation/__init__.py +8 -0
- ads/aqua/evaluation/constants.py +53 -0
- ads/aqua/evaluation/entities.py +186 -0
- ads/aqua/evaluation/errors.py +70 -0
- ads/aqua/evaluation/evaluation.py +1814 -0
- ads/aqua/extension/__init__.py +42 -0
- ads/aqua/extension/aqua_ws_msg_handler.py +76 -0
- ads/aqua/extension/base_handler.py +90 -0
- ads/aqua/extension/common_handler.py +121 -0
- ads/aqua/extension/common_ws_msg_handler.py +36 -0
- ads/aqua/extension/deployment_handler.py +381 -0
- ads/aqua/extension/deployment_ws_msg_handler.py +54 -0
- ads/aqua/extension/errors.py +30 -0
- ads/aqua/extension/evaluation_handler.py +129 -0
- ads/aqua/extension/evaluation_ws_msg_handler.py +61 -0
- ads/aqua/extension/finetune_handler.py +96 -0
- ads/aqua/extension/model_handler.py +390 -0
- ads/aqua/extension/models/__init__.py +0 -0
- ads/aqua/extension/models/ws_models.py +145 -0
- ads/aqua/extension/models_ws_msg_handler.py +50 -0
- ads/aqua/extension/ui_handler.py +300 -0
- ads/aqua/extension/ui_websocket_handler.py +130 -0
- ads/aqua/extension/utils.py +133 -0
- ads/aqua/finetuning/__init__.py +7 -0
- ads/aqua/finetuning/constants.py +23 -0
- ads/aqua/finetuning/entities.py +181 -0
- ads/aqua/finetuning/finetuning.py +749 -0
- ads/aqua/model/__init__.py +8 -0
- ads/aqua/model/constants.py +60 -0
- ads/aqua/model/entities.py +385 -0
- ads/aqua/model/enums.py +32 -0
- ads/aqua/model/model.py +2134 -0
- ads/aqua/model/utils.py +52 -0
- ads/aqua/modeldeployment/__init__.py +6 -0
- ads/aqua/modeldeployment/constants.py +10 -0
- ads/aqua/modeldeployment/deployment.py +1315 -0
- ads/aqua/modeldeployment/entities.py +653 -0
- ads/aqua/modeldeployment/utils.py +543 -0
- ads/aqua/resources/gpu_shapes_index.json +94 -0
- ads/aqua/server/__init__.py +4 -0
- ads/aqua/server/__main__.py +24 -0
- ads/aqua/server/app.py +47 -0
- ads/aqua/server/aqua_spec.yml +1291 -0
- ads/aqua/training/__init__.py +4 -0
- ads/aqua/training/exceptions.py +476 -0
- ads/aqua/ui.py +519 -0
- ads/automl/__init__.py +9 -0
- ads/automl/driver.py +330 -0
- ads/automl/provider.py +975 -0
- ads/bds/__init__.py +5 -0
- ads/bds/auth.py +127 -0
- ads/bds/big_data_service.py +255 -0
- ads/catalog/__init__.py +19 -0
- ads/catalog/model.py +1576 -0
- ads/catalog/notebook.py +461 -0
- ads/catalog/project.py +468 -0
- ads/catalog/summary.py +178 -0
- ads/common/__init__.py +11 -0
- ads/common/analyzer.py +65 -0
- ads/common/artifact/.model-ignore +63 -0
- ads/common/artifact/__init__.py +10 -0
- ads/common/auth.py +1122 -0
- ads/common/card_identifier.py +83 -0
- ads/common/config.py +647 -0
- ads/common/data.py +165 -0
- ads/common/decorator/__init__.py +9 -0
- ads/common/decorator/argument_to_case.py +88 -0
- ads/common/decorator/deprecate.py +69 -0
- ads/common/decorator/require_nonempty_arg.py +65 -0
- ads/common/decorator/runtime_dependency.py +178 -0
- ads/common/decorator/threaded.py +97 -0
- ads/common/decorator/utils.py +35 -0
- ads/common/dsc_file_system.py +303 -0
- ads/common/error.py +14 -0
- ads/common/extended_enum.py +81 -0
- ads/common/function/__init__.py +5 -0
- ads/common/function/fn_util.py +142 -0
- ads/common/function/func_conf.yaml +25 -0
- ads/common/ipython.py +76 -0
- ads/common/model.py +679 -0
- ads/common/model_artifact.py +1759 -0
- ads/common/model_artifact_schema.json +107 -0
- ads/common/model_export_util.py +664 -0
- ads/common/model_metadata.py +24 -0
- ads/common/object_storage_details.py +296 -0
- ads/common/oci_client.py +179 -0
- ads/common/oci_datascience.py +46 -0
- ads/common/oci_logging.py +1144 -0
- ads/common/oci_mixin.py +957 -0
- ads/common/oci_resource.py +136 -0
- ads/common/serializer.py +559 -0
- ads/common/utils.py +1852 -0
- ads/common/word_lists.py +1491 -0
- ads/common/work_request.py +189 -0
- ads/config.py +1 -0
- ads/data_labeling/__init__.py +13 -0
- ads/data_labeling/boundingbox.py +253 -0
- ads/data_labeling/constants.py +47 -0
- ads/data_labeling/data_labeling_service.py +244 -0
- ads/data_labeling/interface/__init__.py +5 -0
- ads/data_labeling/interface/loader.py +16 -0
- ads/data_labeling/interface/parser.py +16 -0
- ads/data_labeling/interface/reader.py +23 -0
- ads/data_labeling/loader/__init__.py +5 -0
- ads/data_labeling/loader/file_loader.py +241 -0
- ads/data_labeling/metadata.py +110 -0
- ads/data_labeling/mixin/__init__.py +5 -0
- ads/data_labeling/mixin/data_labeling.py +232 -0
- ads/data_labeling/ner.py +129 -0
- ads/data_labeling/parser/__init__.py +5 -0
- ads/data_labeling/parser/dls_record_parser.py +388 -0
- ads/data_labeling/parser/export_metadata_parser.py +94 -0
- ads/data_labeling/parser/export_record_parser.py +473 -0
- ads/data_labeling/reader/__init__.py +5 -0
- ads/data_labeling/reader/dataset_reader.py +574 -0
- ads/data_labeling/reader/dls_record_reader.py +121 -0
- ads/data_labeling/reader/export_record_reader.py +62 -0
- ads/data_labeling/reader/jsonl_reader.py +75 -0
- ads/data_labeling/reader/metadata_reader.py +203 -0
- ads/data_labeling/reader/record_reader.py +263 -0
- ads/data_labeling/record.py +52 -0
- ads/data_labeling/visualizer/__init__.py +5 -0
- ads/data_labeling/visualizer/image_visualizer.py +525 -0
- ads/data_labeling/visualizer/text_visualizer.py +357 -0
- ads/database/__init__.py +5 -0
- ads/database/connection.py +338 -0
- ads/dataset/__init__.py +10 -0
- ads/dataset/capabilities.md +51 -0
- ads/dataset/classification_dataset.py +339 -0
- ads/dataset/correlation.py +226 -0
- ads/dataset/correlation_plot.py +563 -0
- ads/dataset/dask_series.py +173 -0
- ads/dataset/dataframe_transformer.py +110 -0
- ads/dataset/dataset.py +1979 -0
- ads/dataset/dataset_browser.py +360 -0
- ads/dataset/dataset_with_target.py +995 -0
- ads/dataset/exception.py +25 -0
- ads/dataset/factory.py +987 -0
- ads/dataset/feature_engineering_transformer.py +35 -0
- ads/dataset/feature_selection.py +107 -0
- ads/dataset/forecasting_dataset.py +26 -0
- ads/dataset/helper.py +1450 -0
- ads/dataset/label_encoder.py +99 -0
- ads/dataset/mixin/__init__.py +5 -0
- ads/dataset/mixin/dataset_accessor.py +134 -0
- ads/dataset/pipeline.py +58 -0
- ads/dataset/plot.py +710 -0
- ads/dataset/progress.py +86 -0
- ads/dataset/recommendation.py +297 -0
- ads/dataset/recommendation_transformer.py +502 -0
- ads/dataset/regression_dataset.py +14 -0
- ads/dataset/sampled_dataset.py +1050 -0
- ads/dataset/target.py +98 -0
- ads/dataset/timeseries.py +18 -0
- ads/dbmixin/__init__.py +5 -0
- ads/dbmixin/db_pandas_accessor.py +153 -0
- ads/environment/__init__.py +9 -0
- ads/environment/ml_runtime.py +66 -0
- ads/evaluations/README.md +14 -0
- ads/evaluations/__init__.py +109 -0
- ads/evaluations/evaluation_plot.py +983 -0
- ads/evaluations/evaluator.py +1334 -0
- ads/evaluations/statistical_metrics.py +543 -0
- ads/experiments/__init__.py +9 -0
- ads/experiments/capabilities.md +0 -0
- ads/explanations/__init__.py +21 -0
- ads/explanations/base_explainer.py +142 -0
- ads/explanations/capabilities.md +83 -0
- ads/explanations/explainer.py +190 -0
- ads/explanations/mlx_global_explainer.py +1050 -0
- ads/explanations/mlx_interface.py +386 -0
- ads/explanations/mlx_local_explainer.py +287 -0
- ads/explanations/mlx_whatif_explainer.py +201 -0
- ads/feature_engineering/__init__.py +20 -0
- ads/feature_engineering/accessor/__init__.py +5 -0
- ads/feature_engineering/accessor/dataframe_accessor.py +535 -0
- ads/feature_engineering/accessor/mixin/__init__.py +5 -0
- ads/feature_engineering/accessor/mixin/correlation.py +166 -0
- ads/feature_engineering/accessor/mixin/eda_mixin.py +266 -0
- ads/feature_engineering/accessor/mixin/eda_mixin_series.py +85 -0
- ads/feature_engineering/accessor/mixin/feature_types_mixin.py +211 -0
- ads/feature_engineering/accessor/mixin/utils.py +65 -0
- ads/feature_engineering/accessor/series_accessor.py +431 -0
- ads/feature_engineering/adsimage/__init__.py +5 -0
- ads/feature_engineering/adsimage/image.py +192 -0
- ads/feature_engineering/adsimage/image_reader.py +170 -0
- ads/feature_engineering/adsimage/interface/__init__.py +5 -0
- ads/feature_engineering/adsimage/interface/reader.py +19 -0
- ads/feature_engineering/adsstring/__init__.py +7 -0
- ads/feature_engineering/adsstring/oci_language/__init__.py +8 -0
- ads/feature_engineering/adsstring/string/__init__.py +8 -0
- ads/feature_engineering/data_schema.json +57 -0
- ads/feature_engineering/dataset/__init__.py +5 -0
- ads/feature_engineering/dataset/zip_code_data.py +42062 -0
- ads/feature_engineering/exceptions.py +40 -0
- ads/feature_engineering/feature_type/__init__.py +133 -0
- ads/feature_engineering/feature_type/address.py +184 -0
- ads/feature_engineering/feature_type/adsstring/__init__.py +5 -0
- ads/feature_engineering/feature_type/adsstring/common_regex_mixin.py +164 -0
- ads/feature_engineering/feature_type/adsstring/oci_language.py +93 -0
- ads/feature_engineering/feature_type/adsstring/parsers/__init__.py +5 -0
- ads/feature_engineering/feature_type/adsstring/parsers/base.py +47 -0
- ads/feature_engineering/feature_type/adsstring/parsers/nltk_parser.py +96 -0
- ads/feature_engineering/feature_type/adsstring/parsers/spacy_parser.py +221 -0
- ads/feature_engineering/feature_type/adsstring/string.py +258 -0
- ads/feature_engineering/feature_type/base.py +58 -0
- ads/feature_engineering/feature_type/boolean.py +183 -0
- ads/feature_engineering/feature_type/category.py +146 -0
- ads/feature_engineering/feature_type/constant.py +137 -0
- ads/feature_engineering/feature_type/continuous.py +151 -0
- ads/feature_engineering/feature_type/creditcard.py +314 -0
- ads/feature_engineering/feature_type/datetime.py +190 -0
- ads/feature_engineering/feature_type/discrete.py +134 -0
- ads/feature_engineering/feature_type/document.py +43 -0
- ads/feature_engineering/feature_type/gis.py +251 -0
- ads/feature_engineering/feature_type/handler/__init__.py +5 -0
- ads/feature_engineering/feature_type/handler/feature_validator.py +524 -0
- ads/feature_engineering/feature_type/handler/feature_warning.py +319 -0
- ads/feature_engineering/feature_type/handler/warnings.py +128 -0
- ads/feature_engineering/feature_type/integer.py +142 -0
- ads/feature_engineering/feature_type/ip_address.py +144 -0
- ads/feature_engineering/feature_type/ip_address_v4.py +138 -0
- ads/feature_engineering/feature_type/ip_address_v6.py +138 -0
- ads/feature_engineering/feature_type/lat_long.py +256 -0
- ads/feature_engineering/feature_type/object.py +43 -0
- ads/feature_engineering/feature_type/ordinal.py +132 -0
- ads/feature_engineering/feature_type/phone_number.py +135 -0
- ads/feature_engineering/feature_type/string.py +171 -0
- ads/feature_engineering/feature_type/text.py +93 -0
- ads/feature_engineering/feature_type/unknown.py +43 -0
- ads/feature_engineering/feature_type/zip_code.py +164 -0
- ads/feature_engineering/feature_type_manager.py +406 -0
- ads/feature_engineering/schema.py +795 -0
- ads/feature_engineering/utils.py +245 -0
- ads/feature_store/.readthedocs.yaml +19 -0
- ads/feature_store/README.md +65 -0
- ads/feature_store/__init__.py +9 -0
- ads/feature_store/common/__init__.py +0 -0
- ads/feature_store/common/enums.py +339 -0
- ads/feature_store/common/exceptions.py +18 -0
- ads/feature_store/common/spark_session_singleton.py +125 -0
- ads/feature_store/common/utils/__init__.py +0 -0
- ads/feature_store/common/utils/base64_encoder_decoder.py +72 -0
- ads/feature_store/common/utils/feature_schema_mapper.py +283 -0
- ads/feature_store/common/utils/transformation_utils.py +82 -0
- ads/feature_store/common/utils/utility.py +403 -0
- ads/feature_store/data_validation/__init__.py +0 -0
- ads/feature_store/data_validation/great_expectation.py +129 -0
- ads/feature_store/dataset.py +1230 -0
- ads/feature_store/dataset_job.py +530 -0
- ads/feature_store/docs/Dockerfile +7 -0
- ads/feature_store/docs/Makefile +44 -0
- ads/feature_store/docs/conf.py +28 -0
- ads/feature_store/docs/requirements.txt +14 -0
- ads/feature_store/docs/source/ads.feature_store.query.rst +20 -0
- ads/feature_store/docs/source/cicd.rst +137 -0
- ads/feature_store/docs/source/conf.py +86 -0
- ads/feature_store/docs/source/data_versioning.rst +33 -0
- ads/feature_store/docs/source/dataset.rst +388 -0
- ads/feature_store/docs/source/dataset_job.rst +27 -0
- ads/feature_store/docs/source/demo.rst +70 -0
- ads/feature_store/docs/source/entity.rst +78 -0
- ads/feature_store/docs/source/feature_group.rst +624 -0
- ads/feature_store/docs/source/feature_group_job.rst +29 -0
- ads/feature_store/docs/source/feature_store.rst +122 -0
- ads/feature_store/docs/source/feature_store_class.rst +123 -0
- ads/feature_store/docs/source/feature_validation.rst +66 -0
- ads/feature_store/docs/source/figures/cicd.png +0 -0
- ads/feature_store/docs/source/figures/data_validation.png +0 -0
- ads/feature_store/docs/source/figures/data_versioning.png +0 -0
- ads/feature_store/docs/source/figures/dataset.gif +0 -0
- ads/feature_store/docs/source/figures/dataset.png +0 -0
- ads/feature_store/docs/source/figures/dataset_lineage.png +0 -0
- ads/feature_store/docs/source/figures/dataset_statistics.png +0 -0
- ads/feature_store/docs/source/figures/dataset_statistics_viz.png +0 -0
- ads/feature_store/docs/source/figures/dataset_validation_results.png +0 -0
- ads/feature_store/docs/source/figures/dataset_validation_summary.png +0 -0
- ads/feature_store/docs/source/figures/drift_monitoring.png +0 -0
- ads/feature_store/docs/source/figures/entity.png +0 -0
- ads/feature_store/docs/source/figures/feature_group.png +0 -0
- ads/feature_store/docs/source/figures/feature_group_lineage.png +0 -0
- ads/feature_store/docs/source/figures/feature_group_statistics_viz.png +0 -0
- ads/feature_store/docs/source/figures/feature_store_deployment.png +0 -0
- ads/feature_store/docs/source/figures/feature_store_overview.png +0 -0
- ads/feature_store/docs/source/figures/featuregroup.gif +0 -0
- ads/feature_store/docs/source/figures/lineage_d1.png +0 -0
- ads/feature_store/docs/source/figures/lineage_d2.png +0 -0
- ads/feature_store/docs/source/figures/lineage_fg.png +0 -0
- ads/feature_store/docs/source/figures/logo-dark-mode.png +0 -0
- ads/feature_store/docs/source/figures/logo-light-mode.png +0 -0
- ads/feature_store/docs/source/figures/overview.png +0 -0
- ads/feature_store/docs/source/figures/resource_manager.png +0 -0
- ads/feature_store/docs/source/figures/resource_manager_feature_store_stack.png +0 -0
- ads/feature_store/docs/source/figures/resource_manager_home.png +0 -0
- ads/feature_store/docs/source/figures/stats_1.png +0 -0
- ads/feature_store/docs/source/figures/stats_2.png +0 -0
- ads/feature_store/docs/source/figures/stats_d.png +0 -0
- ads/feature_store/docs/source/figures/stats_fg.png +0 -0
- ads/feature_store/docs/source/figures/transformation.png +0 -0
- ads/feature_store/docs/source/figures/transformations.gif +0 -0
- ads/feature_store/docs/source/figures/validation.png +0 -0
- ads/feature_store/docs/source/figures/validation_fg.png +0 -0
- ads/feature_store/docs/source/figures/validation_results.png +0 -0
- ads/feature_store/docs/source/figures/validation_summary.png +0 -0
- ads/feature_store/docs/source/index.rst +81 -0
- ads/feature_store/docs/source/module.rst +8 -0
- ads/feature_store/docs/source/notebook.rst +94 -0
- ads/feature_store/docs/source/overview.rst +47 -0
- ads/feature_store/docs/source/quickstart.rst +176 -0
- ads/feature_store/docs/source/release_notes.rst +194 -0
- ads/feature_store/docs/source/setup_feature_store.rst +81 -0
- ads/feature_store/docs/source/statistics.rst +58 -0
- ads/feature_store/docs/source/transformation.rst +199 -0
- ads/feature_store/docs/source/ui.rst +65 -0
- ads/feature_store/docs/source/user_guides.setup.feature_store_operator.rst +66 -0
- ads/feature_store/docs/source/user_guides.setup.helm_chart.rst +192 -0
- ads/feature_store/docs/source/user_guides.setup.terraform.rst +338 -0
- ads/feature_store/entity.py +718 -0
- ads/feature_store/execution_strategy/__init__.py +0 -0
- ads/feature_store/execution_strategy/delta_lake/__init__.py +0 -0
- ads/feature_store/execution_strategy/delta_lake/delta_lake_service.py +375 -0
- ads/feature_store/execution_strategy/engine/__init__.py +0 -0
- ads/feature_store/execution_strategy/engine/spark_engine.py +316 -0
- ads/feature_store/execution_strategy/execution_strategy.py +113 -0
- ads/feature_store/execution_strategy/execution_strategy_provider.py +47 -0
- ads/feature_store/execution_strategy/spark/__init__.py +0 -0
- ads/feature_store/execution_strategy/spark/spark_execution.py +618 -0
- ads/feature_store/feature.py +192 -0
- ads/feature_store/feature_group.py +1494 -0
- ads/feature_store/feature_group_expectation.py +346 -0
- ads/feature_store/feature_group_job.py +602 -0
- ads/feature_store/feature_lineage/__init__.py +0 -0
- ads/feature_store/feature_lineage/graphviz_service.py +180 -0
- ads/feature_store/feature_option_details.py +50 -0
- ads/feature_store/feature_statistics/__init__.py +0 -0
- ads/feature_store/feature_statistics/statistics_service.py +99 -0
- ads/feature_store/feature_store.py +699 -0
- ads/feature_store/feature_store_registrar.py +518 -0
- ads/feature_store/input_feature_detail.py +149 -0
- ads/feature_store/mixin/__init__.py +4 -0
- ads/feature_store/mixin/oci_feature_store.py +145 -0
- ads/feature_store/model_details.py +73 -0
- ads/feature_store/query/__init__.py +0 -0
- ads/feature_store/query/filter.py +266 -0
- ads/feature_store/query/generator/__init__.py +0 -0
- ads/feature_store/query/generator/query_generator.py +298 -0
- ads/feature_store/query/join.py +161 -0
- ads/feature_store/query/query.py +403 -0
- ads/feature_store/query/validator/__init__.py +0 -0
- ads/feature_store/query/validator/query_validator.py +57 -0
- ads/feature_store/response/__init__.py +0 -0
- ads/feature_store/response/response_builder.py +68 -0
- ads/feature_store/service/__init__.py +0 -0
- ads/feature_store/service/oci_dataset.py +139 -0
- ads/feature_store/service/oci_dataset_job.py +199 -0
- ads/feature_store/service/oci_entity.py +125 -0
- ads/feature_store/service/oci_feature_group.py +164 -0
- ads/feature_store/service/oci_feature_group_job.py +214 -0
- ads/feature_store/service/oci_feature_store.py +182 -0
- ads/feature_store/service/oci_lineage.py +87 -0
- ads/feature_store/service/oci_transformation.py +104 -0
- ads/feature_store/statistics/__init__.py +0 -0
- ads/feature_store/statistics/abs_feature_value.py +49 -0
- ads/feature_store/statistics/charts/__init__.py +0 -0
- ads/feature_store/statistics/charts/abstract_feature_plot.py +37 -0
- ads/feature_store/statistics/charts/box_plot.py +148 -0
- ads/feature_store/statistics/charts/frequency_distribution.py +65 -0
- ads/feature_store/statistics/charts/probability_distribution.py +68 -0
- ads/feature_store/statistics/charts/top_k_frequent_elements.py +98 -0
- ads/feature_store/statistics/feature_stat.py +126 -0
- ads/feature_store/statistics/generic_feature_value.py +33 -0
- ads/feature_store/statistics/statistics.py +41 -0
- ads/feature_store/statistics_config.py +101 -0
- ads/feature_store/templates/feature_store_template.yaml +45 -0
- ads/feature_store/transformation.py +499 -0
- ads/feature_store/validation_output.py +57 -0
- ads/hpo/__init__.py +9 -0
- ads/hpo/_imports.py +91 -0
- ads/hpo/ads_search_space.py +439 -0
- ads/hpo/distributions.py +325 -0
- ads/hpo/objective.py +280 -0
- ads/hpo/search_cv.py +1657 -0
- ads/hpo/stopping_criterion.py +75 -0
- ads/hpo/tuner_artifact.py +413 -0
- ads/hpo/utils.py +91 -0
- ads/hpo/validation.py +140 -0
- ads/hpo/visualization/__init__.py +5 -0
- ads/hpo/visualization/_contour.py +23 -0
- ads/hpo/visualization/_edf.py +20 -0
- ads/hpo/visualization/_intermediate_values.py +21 -0
- ads/hpo/visualization/_optimization_history.py +25 -0
- ads/hpo/visualization/_parallel_coordinate.py +169 -0
- ads/hpo/visualization/_param_importances.py +26 -0
- ads/jobs/__init__.py +53 -0
- ads/jobs/ads_job.py +663 -0
- ads/jobs/builders/__init__.py +5 -0
- ads/jobs/builders/base.py +156 -0
- ads/jobs/builders/infrastructure/__init__.py +6 -0
- ads/jobs/builders/infrastructure/base.py +165 -0
- ads/jobs/builders/infrastructure/dataflow.py +1252 -0
- ads/jobs/builders/infrastructure/dsc_job.py +1894 -0
- ads/jobs/builders/infrastructure/dsc_job_runtime.py +1233 -0
- ads/jobs/builders/infrastructure/utils.py +65 -0
- ads/jobs/builders/runtimes/__init__.py +5 -0
- ads/jobs/builders/runtimes/artifact.py +338 -0
- ads/jobs/builders/runtimes/base.py +325 -0
- ads/jobs/builders/runtimes/container_runtime.py +242 -0
- ads/jobs/builders/runtimes/python_runtime.py +1016 -0
- ads/jobs/builders/runtimes/pytorch_runtime.py +204 -0
- ads/jobs/cli.py +104 -0
- ads/jobs/env_var_parser.py +131 -0
- ads/jobs/extension.py +160 -0
- ads/jobs/schema/__init__.py +5 -0
- ads/jobs/schema/infrastructure_schema.json +116 -0
- ads/jobs/schema/job_schema.json +42 -0
- ads/jobs/schema/runtime_schema.json +183 -0
- ads/jobs/schema/validator.py +141 -0
- ads/jobs/serializer.py +296 -0
- ads/jobs/templates/__init__.py +5 -0
- ads/jobs/templates/container.py +6 -0
- ads/jobs/templates/driver_notebook.py +177 -0
- ads/jobs/templates/driver_oci.py +500 -0
- ads/jobs/templates/driver_python.py +48 -0
- ads/jobs/templates/driver_pytorch.py +852 -0
- ads/jobs/templates/driver_utils.py +615 -0
- ads/jobs/templates/hostname_from_env.c +55 -0
- ads/jobs/templates/oci_metrics.py +181 -0
- ads/jobs/utils.py +104 -0
- ads/llm/__init__.py +28 -0
- ads/llm/autogen/__init__.py +2 -0
- ads/llm/autogen/constants.py +15 -0
- ads/llm/autogen/reports/__init__.py +2 -0
- ads/llm/autogen/reports/base.py +67 -0
- ads/llm/autogen/reports/data.py +103 -0
- ads/llm/autogen/reports/session.py +526 -0
- ads/llm/autogen/reports/templates/chat_box.html +13 -0
- ads/llm/autogen/reports/templates/chat_box_lt.html +5 -0
- ads/llm/autogen/reports/templates/chat_box_rt.html +6 -0
- ads/llm/autogen/reports/utils.py +56 -0
- ads/llm/autogen/v02/__init__.py +4 -0
- ads/llm/autogen/v02/client.py +295 -0
- ads/llm/autogen/v02/log_handlers/__init__.py +2 -0
- ads/llm/autogen/v02/log_handlers/oci_file_handler.py +83 -0
- ads/llm/autogen/v02/loggers/__init__.py +6 -0
- ads/llm/autogen/v02/loggers/metric_logger.py +320 -0
- ads/llm/autogen/v02/loggers/session_logger.py +580 -0
- ads/llm/autogen/v02/loggers/utils.py +86 -0
- ads/llm/autogen/v02/runtime_logging.py +163 -0
- ads/llm/chain.py +268 -0
- ads/llm/chat_template.py +31 -0
- ads/llm/deploy.py +63 -0
- ads/llm/guardrails/__init__.py +5 -0
- ads/llm/guardrails/base.py +442 -0
- ads/llm/guardrails/huggingface.py +44 -0
- ads/llm/langchain/__init__.py +5 -0
- ads/llm/langchain/plugins/__init__.py +5 -0
- ads/llm/langchain/plugins/chat_models/__init__.py +5 -0
- ads/llm/langchain/plugins/chat_models/oci_data_science.py +1027 -0
- ads/llm/langchain/plugins/embeddings/__init__.py +4 -0
- ads/llm/langchain/plugins/embeddings/oci_data_science_model_deployment_endpoint.py +184 -0
- ads/llm/langchain/plugins/llms/__init__.py +5 -0
- ads/llm/langchain/plugins/llms/oci_data_science_model_deployment_endpoint.py +979 -0
- ads/llm/requirements.txt +3 -0
- ads/llm/serialize.py +219 -0
- ads/llm/serializers/__init__.py +0 -0
- ads/llm/serializers/retrieval_qa.py +153 -0
- ads/llm/serializers/runnable_parallel.py +27 -0
- ads/llm/templates/score_chain.jinja2 +155 -0
- ads/llm/templates/tool_chat_template_hermes.jinja +130 -0
- ads/llm/templates/tool_chat_template_mistral_parallel.jinja +94 -0
- ads/model/__init__.py +52 -0
- ads/model/artifact.py +573 -0
- ads/model/artifact_downloader.py +254 -0
- ads/model/artifact_uploader.py +267 -0
- ads/model/base_properties.py +238 -0
- ads/model/common/.model-ignore +66 -0
- ads/model/common/__init__.py +5 -0
- ads/model/common/utils.py +142 -0
- ads/model/datascience_model.py +2635 -0
- ads/model/deployment/__init__.py +20 -0
- ads/model/deployment/common/__init__.py +5 -0
- ads/model/deployment/common/utils.py +308 -0
- ads/model/deployment/model_deployer.py +466 -0
- ads/model/deployment/model_deployment.py +1846 -0
- ads/model/deployment/model_deployment_infrastructure.py +671 -0
- ads/model/deployment/model_deployment_properties.py +493 -0
- ads/model/deployment/model_deployment_runtime.py +838 -0
- ads/model/extractor/__init__.py +5 -0
- ads/model/extractor/automl_extractor.py +74 -0
- ads/model/extractor/embedding_onnx_extractor.py +80 -0
- ads/model/extractor/huggingface_extractor.py +88 -0
- ads/model/extractor/keras_extractor.py +84 -0
- ads/model/extractor/lightgbm_extractor.py +93 -0
- ads/model/extractor/model_info_extractor.py +114 -0
- ads/model/extractor/model_info_extractor_factory.py +105 -0
- ads/model/extractor/pytorch_extractor.py +87 -0
- ads/model/extractor/sklearn_extractor.py +112 -0
- ads/model/extractor/spark_extractor.py +89 -0
- ads/model/extractor/tensorflow_extractor.py +85 -0
- ads/model/extractor/xgboost_extractor.py +94 -0
- ads/model/framework/__init__.py +5 -0
- ads/model/framework/automl_model.py +178 -0
- ads/model/framework/embedding_onnx_model.py +438 -0
- ads/model/framework/huggingface_model.py +399 -0
- ads/model/framework/lightgbm_model.py +266 -0
- ads/model/framework/pytorch_model.py +266 -0
- ads/model/framework/sklearn_model.py +250 -0
- ads/model/framework/spark_model.py +326 -0
- ads/model/framework/tensorflow_model.py +254 -0
- ads/model/framework/xgboost_model.py +258 -0
- ads/model/generic_model.py +3518 -0
- ads/model/model_artifact_boilerplate/README.md +381 -0
- ads/model/model_artifact_boilerplate/__init__.py +5 -0
- ads/model/model_artifact_boilerplate/artifact_introspection_test/__init__.py +5 -0
- ads/model/model_artifact_boilerplate/artifact_introspection_test/model_artifact_validate.py +427 -0
- ads/model/model_artifact_boilerplate/artifact_introspection_test/requirements.txt +2 -0
- ads/model/model_artifact_boilerplate/runtime.yaml +7 -0
- ads/model/model_artifact_boilerplate/score.py +61 -0
- ads/model/model_file_description_schema.json +68 -0
- ads/model/model_introspect.py +331 -0
- ads/model/model_metadata.py +1810 -0
- ads/model/model_metadata_mixin.py +460 -0
- ads/model/model_properties.py +63 -0
- ads/model/model_version_set.py +739 -0
- ads/model/runtime/__init__.py +5 -0
- ads/model/runtime/env_info.py +306 -0
- ads/model/runtime/model_deployment_details.py +37 -0
- ads/model/runtime/model_provenance_details.py +58 -0
- ads/model/runtime/runtime_info.py +81 -0
- ads/model/runtime/schemas/inference_env_info_schema.yaml +16 -0
- ads/model/runtime/schemas/model_provenance_schema.yaml +36 -0
- ads/model/runtime/schemas/training_env_info_schema.yaml +16 -0
- ads/model/runtime/utils.py +201 -0
- ads/model/serde/__init__.py +5 -0
- ads/model/serde/common.py +40 -0
- ads/model/serde/model_input.py +547 -0
- ads/model/serde/model_serializer.py +1184 -0
- ads/model/service/__init__.py +5 -0
- ads/model/service/oci_datascience_model.py +1076 -0
- ads/model/service/oci_datascience_model_deployment.py +500 -0
- ads/model/service/oci_datascience_model_version_set.py +176 -0
- ads/model/transformer/__init__.py +5 -0
- ads/model/transformer/onnx_transformer.py +324 -0
- ads/mysqldb/__init__.py +5 -0
- ads/mysqldb/mysql_db.py +227 -0
- ads/opctl/__init__.py +18 -0
- ads/opctl/anomaly_detection.py +11 -0
- ads/opctl/backend/__init__.py +5 -0
- ads/opctl/backend/ads_dataflow.py +353 -0
- ads/opctl/backend/ads_ml_job.py +710 -0
- ads/opctl/backend/ads_ml_pipeline.py +164 -0
- ads/opctl/backend/ads_model_deployment.py +209 -0
- ads/opctl/backend/base.py +146 -0
- ads/opctl/backend/local.py +1053 -0
- ads/opctl/backend/marketplace/__init__.py +9 -0
- ads/opctl/backend/marketplace/helm_helper.py +173 -0
- ads/opctl/backend/marketplace/local_marketplace.py +271 -0
- ads/opctl/backend/marketplace/marketplace_backend_runner.py +71 -0
- ads/opctl/backend/marketplace/marketplace_operator_interface.py +44 -0
- ads/opctl/backend/marketplace/marketplace_operator_runner.py +24 -0
- ads/opctl/backend/marketplace/marketplace_utils.py +212 -0
- ads/opctl/backend/marketplace/models/__init__.py +5 -0
- ads/opctl/backend/marketplace/models/bearer_token.py +94 -0
- ads/opctl/backend/marketplace/models/marketplace_type.py +70 -0
- ads/opctl/backend/marketplace/models/ocir_details.py +56 -0
- ads/opctl/backend/marketplace/prerequisite_checker.py +238 -0
- ads/opctl/cli.py +707 -0
- ads/opctl/cmds.py +869 -0
- ads/opctl/conda/__init__.py +5 -0
- ads/opctl/conda/cli.py +193 -0
- ads/opctl/conda/cmds.py +749 -0
- ads/opctl/conda/config.yaml +34 -0
- ads/opctl/conda/manifest_template.yaml +13 -0
- ads/opctl/conda/multipart_uploader.py +188 -0
- ads/opctl/conda/pack.py +89 -0
- ads/opctl/config/__init__.py +5 -0
- ads/opctl/config/base.py +57 -0
- ads/opctl/config/diagnostics/__init__.py +5 -0
- ads/opctl/config/diagnostics/distributed/default_requirements_config.yaml +62 -0
- ads/opctl/config/merger.py +255 -0
- ads/opctl/config/resolver.py +297 -0
- ads/opctl/config/utils.py +79 -0
- ads/opctl/config/validator.py +17 -0
- ads/opctl/config/versioner.py +68 -0
- ads/opctl/config/yaml_parsers/__init__.py +7 -0
- ads/opctl/config/yaml_parsers/base.py +58 -0
- ads/opctl/config/yaml_parsers/distributed/__init__.py +7 -0
- ads/opctl/config/yaml_parsers/distributed/yaml_parser.py +201 -0
- ads/opctl/constants.py +66 -0
- ads/opctl/decorator/__init__.py +5 -0
- ads/opctl/decorator/common.py +129 -0
- ads/opctl/diagnostics/__init__.py +5 -0
- ads/opctl/diagnostics/__main__.py +25 -0
- ads/opctl/diagnostics/check_distributed_job_requirements.py +212 -0
- ads/opctl/diagnostics/check_requirements.py +144 -0
- ads/opctl/diagnostics/requirement_exception.py +9 -0
- ads/opctl/distributed/README.md +109 -0
- ads/opctl/distributed/__init__.py +5 -0
- ads/opctl/distributed/certificates.py +32 -0
- ads/opctl/distributed/cli.py +207 -0
- ads/opctl/distributed/cmds.py +731 -0
- ads/opctl/distributed/common/__init__.py +5 -0
- ads/opctl/distributed/common/abstract_cluster_provider.py +449 -0
- ads/opctl/distributed/common/abstract_framework_spec_builder.py +88 -0
- ads/opctl/distributed/common/cluster_config_helper.py +103 -0
- ads/opctl/distributed/common/cluster_provider_factory.py +21 -0
- ads/opctl/distributed/common/cluster_runner.py +54 -0
- ads/opctl/distributed/common/framework_factory.py +29 -0
- ads/opctl/docker/Dockerfile.job +103 -0
- ads/opctl/docker/Dockerfile.job.arm +107 -0
- ads/opctl/docker/Dockerfile.job.gpu +175 -0
- ads/opctl/docker/base-env.yaml +13 -0
- ads/opctl/docker/cuda.repo +6 -0
- ads/opctl/docker/operator/.dockerignore +0 -0
- ads/opctl/docker/operator/Dockerfile +41 -0
- ads/opctl/docker/operator/Dockerfile.gpu +85 -0
- ads/opctl/docker/operator/cuda.repo +6 -0
- ads/opctl/docker/operator/environment.yaml +8 -0
- ads/opctl/forecast.py +11 -0
- ads/opctl/index.yaml +3 -0
- ads/opctl/model/__init__.py +5 -0
- ads/opctl/model/cli.py +65 -0
- ads/opctl/model/cmds.py +73 -0
- ads/opctl/operator/README.md +4 -0
- ads/opctl/operator/__init__.py +31 -0
- ads/opctl/operator/cli.py +344 -0
- ads/opctl/operator/cmd.py +596 -0
- ads/opctl/operator/common/__init__.py +5 -0
- ads/opctl/operator/common/backend_factory.py +460 -0
- ads/opctl/operator/common/const.py +27 -0
- ads/opctl/operator/common/data/synthetic.csv +16001 -0
- ads/opctl/operator/common/dictionary_merger.py +148 -0
- ads/opctl/operator/common/errors.py +42 -0
- ads/opctl/operator/common/operator_config.py +99 -0
- ads/opctl/operator/common/operator_loader.py +811 -0
- ads/opctl/operator/common/operator_schema.yaml +130 -0
- ads/opctl/operator/common/operator_yaml_generator.py +152 -0
- ads/opctl/operator/common/utils.py +208 -0
- ads/opctl/operator/lowcode/__init__.py +5 -0
- ads/opctl/operator/lowcode/anomaly/MLoperator +16 -0
- ads/opctl/operator/lowcode/anomaly/README.md +207 -0
- ads/opctl/operator/lowcode/anomaly/__init__.py +5 -0
- ads/opctl/operator/lowcode/anomaly/__main__.py +103 -0
- ads/opctl/operator/lowcode/anomaly/cmd.py +35 -0
- ads/opctl/operator/lowcode/anomaly/const.py +167 -0
- ads/opctl/operator/lowcode/anomaly/environment.yaml +10 -0
- ads/opctl/operator/lowcode/anomaly/model/__init__.py +5 -0
- ads/opctl/operator/lowcode/anomaly/model/anomaly_dataset.py +146 -0
- ads/opctl/operator/lowcode/anomaly/model/anomaly_merlion.py +162 -0
- ads/opctl/operator/lowcode/anomaly/model/automlx.py +99 -0
- ads/opctl/operator/lowcode/anomaly/model/autots.py +115 -0
- ads/opctl/operator/lowcode/anomaly/model/base_model.py +404 -0
- ads/opctl/operator/lowcode/anomaly/model/factory.py +110 -0
- ads/opctl/operator/lowcode/anomaly/model/isolationforest.py +78 -0
- ads/opctl/operator/lowcode/anomaly/model/oneclasssvm.py +78 -0
- ads/opctl/operator/lowcode/anomaly/model/randomcutforest.py +120 -0
- ads/opctl/operator/lowcode/anomaly/model/tods.py +119 -0
- ads/opctl/operator/lowcode/anomaly/operator_config.py +127 -0
- ads/opctl/operator/lowcode/anomaly/schema.yaml +401 -0
- ads/opctl/operator/lowcode/anomaly/utils.py +88 -0
- ads/opctl/operator/lowcode/common/__init__.py +5 -0
- ads/opctl/operator/lowcode/common/const.py +10 -0
- ads/opctl/operator/lowcode/common/data.py +116 -0
- ads/opctl/operator/lowcode/common/errors.py +47 -0
- ads/opctl/operator/lowcode/common/transformations.py +296 -0
- ads/opctl/operator/lowcode/common/utils.py +384 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/MLoperator +13 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/README.md +30 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/__init__.py +5 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/__main__.py +116 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/cmd.py +85 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/const.py +15 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/environment.yaml +0 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/models/__init__.py +4 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/models/apigw_config.py +32 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/models/db_config.py +43 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/models/mysql_config.py +120 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/models/serializable_yaml_model.py +34 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/operator_utils.py +386 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/schema.yaml +160 -0
- ads/opctl/operator/lowcode/forecast/MLoperator +25 -0
- ads/opctl/operator/lowcode/forecast/README.md +209 -0
- ads/opctl/operator/lowcode/forecast/__init__.py +5 -0
- ads/opctl/operator/lowcode/forecast/__main__.py +89 -0
- ads/opctl/operator/lowcode/forecast/cmd.py +40 -0
- ads/opctl/operator/lowcode/forecast/const.py +92 -0
- ads/opctl/operator/lowcode/forecast/environment.yaml +20 -0
- ads/opctl/operator/lowcode/forecast/errors.py +26 -0
- ads/opctl/operator/lowcode/forecast/model/__init__.py +5 -0
- ads/opctl/operator/lowcode/forecast/model/arima.py +279 -0
- ads/opctl/operator/lowcode/forecast/model/automlx.py +553 -0
- ads/opctl/operator/lowcode/forecast/model/autots.py +312 -0
- ads/opctl/operator/lowcode/forecast/model/base_model.py +875 -0
- ads/opctl/operator/lowcode/forecast/model/factory.py +106 -0
- ads/opctl/operator/lowcode/forecast/model/forecast_datasets.py +492 -0
- ads/opctl/operator/lowcode/forecast/model/ml_forecast.py +243 -0
- ads/opctl/operator/lowcode/forecast/model/neuralprophet.py +482 -0
- ads/opctl/operator/lowcode/forecast/model/prophet.py +450 -0
- ads/opctl/operator/lowcode/forecast/model_evaluator.py +244 -0
- ads/opctl/operator/lowcode/forecast/operator_config.py +234 -0
- ads/opctl/operator/lowcode/forecast/schema.yaml +506 -0
- ads/opctl/operator/lowcode/forecast/utils.py +397 -0
- ads/opctl/operator/lowcode/forecast/whatifserve/__init__.py +7 -0
- ads/opctl/operator/lowcode/forecast/whatifserve/deployment_manager.py +285 -0
- ads/opctl/operator/lowcode/forecast/whatifserve/score.py +246 -0
- ads/opctl/operator/lowcode/pii/MLoperator +17 -0
- ads/opctl/operator/lowcode/pii/README.md +208 -0
- ads/opctl/operator/lowcode/pii/__init__.py +5 -0
- ads/opctl/operator/lowcode/pii/__main__.py +78 -0
- ads/opctl/operator/lowcode/pii/cmd.py +39 -0
- ads/opctl/operator/lowcode/pii/constant.py +84 -0
- ads/opctl/operator/lowcode/pii/environment.yaml +17 -0
- ads/opctl/operator/lowcode/pii/errors.py +27 -0
- ads/opctl/operator/lowcode/pii/model/__init__.py +5 -0
- ads/opctl/operator/lowcode/pii/model/factory.py +82 -0
- ads/opctl/operator/lowcode/pii/model/guardrails.py +167 -0
- ads/opctl/operator/lowcode/pii/model/pii.py +145 -0
- ads/opctl/operator/lowcode/pii/model/processor/__init__.py +34 -0
- ads/opctl/operator/lowcode/pii/model/processor/email_replacer.py +34 -0
- ads/opctl/operator/lowcode/pii/model/processor/mbi_replacer.py +35 -0
- ads/opctl/operator/lowcode/pii/model/processor/name_replacer.py +225 -0
- ads/opctl/operator/lowcode/pii/model/processor/number_replacer.py +73 -0
- ads/opctl/operator/lowcode/pii/model/processor/remover.py +26 -0
- ads/opctl/operator/lowcode/pii/model/report.py +487 -0
- ads/opctl/operator/lowcode/pii/operator_config.py +95 -0
- ads/opctl/operator/lowcode/pii/schema.yaml +108 -0
- ads/opctl/operator/lowcode/pii/utils.py +43 -0
- ads/opctl/operator/lowcode/recommender/MLoperator +16 -0
- ads/opctl/operator/lowcode/recommender/README.md +206 -0
- ads/opctl/operator/lowcode/recommender/__init__.py +5 -0
- ads/opctl/operator/lowcode/recommender/__main__.py +82 -0
- ads/opctl/operator/lowcode/recommender/cmd.py +33 -0
- ads/opctl/operator/lowcode/recommender/constant.py +30 -0
- ads/opctl/operator/lowcode/recommender/environment.yaml +11 -0
- ads/opctl/operator/lowcode/recommender/model/base_model.py +212 -0
- ads/opctl/operator/lowcode/recommender/model/factory.py +56 -0
- ads/opctl/operator/lowcode/recommender/model/recommender_dataset.py +25 -0
- ads/opctl/operator/lowcode/recommender/model/svd.py +106 -0
- ads/opctl/operator/lowcode/recommender/operator_config.py +81 -0
- ads/opctl/operator/lowcode/recommender/schema.yaml +265 -0
- ads/opctl/operator/lowcode/recommender/utils.py +13 -0
- ads/opctl/operator/runtime/__init__.py +5 -0
- ads/opctl/operator/runtime/const.py +17 -0
- ads/opctl/operator/runtime/container_runtime_schema.yaml +50 -0
- ads/opctl/operator/runtime/marketplace_runtime.py +50 -0
- ads/opctl/operator/runtime/python_marketplace_runtime_schema.yaml +21 -0
- ads/opctl/operator/runtime/python_runtime_schema.yaml +21 -0
- ads/opctl/operator/runtime/runtime.py +115 -0
- ads/opctl/schema.yaml.yml +36 -0
- ads/opctl/script.py +40 -0
- ads/opctl/spark/__init__.py +5 -0
- ads/opctl/spark/cli.py +43 -0
- ads/opctl/spark/cmds.py +147 -0
- ads/opctl/templates/diagnostic_report_template.jinja2 +102 -0
- ads/opctl/utils.py +344 -0
- ads/oracledb/__init__.py +5 -0
- ads/oracledb/oracle_db.py +346 -0
- ads/pipeline/__init__.py +39 -0
- ads/pipeline/ads_pipeline.py +2279 -0
- ads/pipeline/ads_pipeline_run.py +772 -0
- ads/pipeline/ads_pipeline_step.py +605 -0
- ads/pipeline/builders/__init__.py +5 -0
- ads/pipeline/builders/infrastructure/__init__.py +5 -0
- ads/pipeline/builders/infrastructure/custom_script.py +32 -0
- ads/pipeline/cli.py +119 -0
- ads/pipeline/extension.py +291 -0
- ads/pipeline/schema/__init__.py +5 -0
- ads/pipeline/schema/cs_step_schema.json +35 -0
- ads/pipeline/schema/ml_step_schema.json +31 -0
- ads/pipeline/schema/pipeline_schema.json +71 -0
- ads/pipeline/visualizer/__init__.py +5 -0
- ads/pipeline/visualizer/base.py +570 -0
- ads/pipeline/visualizer/graph_renderer.py +272 -0
- ads/pipeline/visualizer/text_renderer.py +84 -0
- ads/secrets/__init__.py +11 -0
- ads/secrets/adb.py +386 -0
- ads/secrets/auth_token.py +86 -0
- ads/secrets/big_data_service.py +365 -0
- ads/secrets/mysqldb.py +149 -0
- ads/secrets/oracledb.py +160 -0
- ads/secrets/secrets.py +407 -0
- ads/telemetry/__init__.py +7 -0
- ads/telemetry/base.py +69 -0
- ads/telemetry/client.py +122 -0
- ads/telemetry/telemetry.py +257 -0
- ads/templates/dataflow_pyspark.jinja2 +13 -0
- ads/templates/dataflow_sparksql.jinja2 +22 -0
- ads/templates/func.jinja2 +20 -0
- ads/templates/schemas/openapi.json +1740 -0
- ads/templates/score-pkl.jinja2 +173 -0
- ads/templates/score.jinja2 +322 -0
- ads/templates/score_embedding_onnx.jinja2 +202 -0
- ads/templates/score_generic.jinja2 +165 -0
- ads/templates/score_huggingface_pipeline.jinja2 +217 -0
- ads/templates/score_lightgbm.jinja2 +185 -0
- ads/templates/score_onnx.jinja2 +407 -0
- ads/templates/score_onnx_new.jinja2 +473 -0
- ads/templates/score_oracle_automl.jinja2 +185 -0
- ads/templates/score_pyspark.jinja2 +154 -0
- ads/templates/score_pytorch.jinja2 +219 -0
- ads/templates/score_scikit-learn.jinja2 +184 -0
- ads/templates/score_tensorflow.jinja2 +184 -0
- ads/templates/score_xgboost.jinja2 +178 -0
- ads/text_dataset/__init__.py +5 -0
- ads/text_dataset/backends.py +211 -0
- ads/text_dataset/dataset.py +445 -0
- ads/text_dataset/extractor.py +207 -0
- ads/text_dataset/options.py +53 -0
- ads/text_dataset/udfs.py +22 -0
- ads/text_dataset/utils.py +49 -0
- ads/type_discovery/__init__.py +9 -0
- ads/type_discovery/abstract_detector.py +21 -0
- ads/type_discovery/constant_detector.py +41 -0
- ads/type_discovery/continuous_detector.py +54 -0
- ads/type_discovery/credit_card_detector.py +99 -0
- ads/type_discovery/datetime_detector.py +92 -0
- ads/type_discovery/discrete_detector.py +118 -0
- ads/type_discovery/document_detector.py +146 -0
- ads/type_discovery/ip_detector.py +68 -0
- ads/type_discovery/latlon_detector.py +90 -0
- ads/type_discovery/phone_number_detector.py +63 -0
- ads/type_discovery/type_discovery_driver.py +87 -0
- ads/type_discovery/typed_feature.py +594 -0
- ads/type_discovery/unknown_detector.py +41 -0
- ads/type_discovery/zipcode_detector.py +48 -0
- ads/vault/__init__.py +7 -0
- ads/vault/vault.py +237 -0
- {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.10.dist-info}/METADATA +150 -149
- oracle_ads-2.13.10.dist-info/RECORD +858 -0
- {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.10.dist-info}/WHEEL +1 -2
- {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.10.dist-info}/entry_points.txt +2 -1
- oracle_ads-2.13.9rc0.dist-info/RECORD +0 -9
- oracle_ads-2.13.9rc0.dist-info/top_level.txt +0 -1
- {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.10.dist-info}/licenses/LICENSE.txt +0 -0
ads/secrets/secrets.py
ADDED
@@ -0,0 +1,407 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# -*- coding: utf-8 -*--
|
3
|
+
|
4
|
+
# Copyright (c) 2021, 2023 Oracle and/or its affiliates.
|
5
|
+
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
|
6
|
+
|
7
|
+
import ads
|
8
|
+
from ads.vault import Vault
|
9
|
+
from base64 import b64encode, b64decode
|
10
|
+
import os
|
11
|
+
import json
|
12
|
+
from contextlib import ContextDecorator
|
13
|
+
from tqdm.auto import tqdm
|
14
|
+
import yaml
|
15
|
+
import fsspec
|
16
|
+
from dataclasses import dataclass, fields, asdict
|
17
|
+
from typing import Union
|
18
|
+
|
19
|
+
logger = ads.getLogger("ads.secrets")
|
20
|
+
|
21
|
+
|
22
|
+
@dataclass
|
23
|
+
class Secret:
|
24
|
+
"""Base class
|
25
|
+
|
26
|
+
Methods
|
27
|
+
-------
|
28
|
+
serialize(self) -> dict
|
29
|
+
Serializes attributes as dictionary. Returns dictionary with the keys that are serializable.
|
30
|
+
to_dict(self) -> dict
|
31
|
+
returns dictionarry with the keys that has `repr` set to True and the value is not None or empty
|
32
|
+
export_dict -> dict
|
33
|
+
returns dictionary with the keys that has `repr` set tp True
|
34
|
+
export_options -> dcit
|
35
|
+
returns list of attributes with the fields that has `repr` set to True
|
36
|
+
"""
|
37
|
+
|
38
|
+
def serialize(self) -> dict:
|
39
|
+
"""Serializes attributes as dictionary. An attribute can be marked as not serializable by using
|
40
|
+
`metadata` field of the `field` constructor provided by the dataclasses module.
|
41
|
+
|
42
|
+
Returns
|
43
|
+
-------
|
44
|
+
dict
|
45
|
+
returns dictionay of key/value pair where the value of the attribute
|
46
|
+
is not None and not empty and the field does not have `metadata` = {"serializable":False}.
|
47
|
+
Refer dataclass python documentation for more details about `metadata`
|
48
|
+
"""
|
49
|
+
return {
|
50
|
+
f.name: getattr(self, f.name)
|
51
|
+
for f in fields(self)
|
52
|
+
if ("serializable" not in f.metadata or f.metadata["serializable"])
|
53
|
+
and getattr(self, f.name)
|
54
|
+
}
|
55
|
+
|
56
|
+
def to_dict(self) -> dict:
|
57
|
+
"""Serializes attributes as dictionary. Returns only non empty attributes.
|
58
|
+
|
59
|
+
Returns
|
60
|
+
-------
|
61
|
+
dict
|
62
|
+
returns dictionary of key/value pair where the value of the attribute is not None or empty
|
63
|
+
"""
|
64
|
+
return asdict(self, dict_factory=lambda x: {k: v for (k, v) in x if v})
|
65
|
+
|
66
|
+
def export_options(self) -> list:
|
67
|
+
"""Returns list of attributes that have `repr=True`.
|
68
|
+
|
69
|
+
Returns
|
70
|
+
-------
|
71
|
+
list
|
72
|
+
returns list of fields that does not have `repr=False`
|
73
|
+
"""
|
74
|
+
return [f.name for f in fields(self) if f.repr]
|
75
|
+
|
76
|
+
def export_dict(self) -> dict:
|
77
|
+
"""Serializes attributes as dictionary.
|
78
|
+
|
79
|
+
Returns
|
80
|
+
-------
|
81
|
+
dict
|
82
|
+
returns dictionary of key/value pair where the value of the attribute is
|
83
|
+
not None and the field does not have `repr`=`False`
|
84
|
+
"""
|
85
|
+
return {k: getattr(self, k) for k in self.export_options()}
|
86
|
+
|
87
|
+
|
88
|
+
class SecretKeeper(Vault, ContextDecorator):
|
89
|
+
|
90
|
+
"""
|
91
|
+
SecretKeeper defines APIs required to serialize and deserialize secrets. Services
|
92
|
+
such as Database, Streaming, and Git require users to provide credentials.
|
93
|
+
These credentials need to be safely accessed at runtime.
|
94
|
+
OCI Vault provides a mechanism for safe storage and access. SecretKeeper uses
|
95
|
+
OCI Vault as a backend to store and retrieve the credentials.
|
96
|
+
|
97
|
+
The exact data structure of the credentials varies from service to service.
|
98
|
+
"""
|
99
|
+
|
100
|
+
required_keys = ["secret_id"]
|
101
|
+
|
102
|
+
def __init__(
|
103
|
+
self,
|
104
|
+
content: bytes = None,
|
105
|
+
encoded: str = None,
|
106
|
+
secret_id: str = None,
|
107
|
+
export_prefix: str = "",
|
108
|
+
export_env: bool = False,
|
109
|
+
**kwargs,
|
110
|
+
):
|
111
|
+
self.encoded = encoded
|
112
|
+
self.secret_id = secret_id
|
113
|
+
self.content = content
|
114
|
+
self.export_prefix = export_prefix
|
115
|
+
self.export_env = export_env
|
116
|
+
|
117
|
+
super().__init__(**kwargs)
|
118
|
+
|
119
|
+
def _encode(self, content: bytes = None, str_encoding="utf-8"):
|
120
|
+
return b64encode(content).decode(str_encoding) if content else None
|
121
|
+
|
122
|
+
def _decode(self, content=None, str_encoding="utf-8"):
|
123
|
+
value = b64decode(content if content else self.encoded)
|
124
|
+
return value.decode(str_encoding) if str_encoding else value
|
125
|
+
|
126
|
+
def encode(self):
|
127
|
+
"""
|
128
|
+
Stores the secret in `self.secret` by calling `serialize` method on self.data.
|
129
|
+
Stores base64 encoded string of `self.secret` in `self.encoded`.
|
130
|
+
"""
|
131
|
+
if not hasattr(self, "data"):
|
132
|
+
raise ValueError("No payload to encode")
|
133
|
+
self.secret = self.data.serialize()
|
134
|
+
self.encoded = self._encode(json.dumps(self.secret).encode("utf-8"))
|
135
|
+
return self
|
136
|
+
|
137
|
+
def decode(self) -> "ads.secrets.SecretKeeper":
|
138
|
+
"""
|
139
|
+
Decodes the content in self.encoded and sets the vaule in self.secret.
|
140
|
+
"""
|
141
|
+
self.secret = self._decode()
|
142
|
+
return self
|
143
|
+
|
144
|
+
def save(
|
145
|
+
self,
|
146
|
+
name: str,
|
147
|
+
description: str,
|
148
|
+
freeform_tags: dict = None,
|
149
|
+
defined_tags: dict = None,
|
150
|
+
) -> "ads.secrets.SecretKeeper":
|
151
|
+
"""Saves credentials to Vault and returns self.
|
152
|
+
|
153
|
+
Parameters
|
154
|
+
----------
|
155
|
+
name : str
|
156
|
+
Name of the secret when saved in the Vault.
|
157
|
+
description : str
|
158
|
+
Description of the secret when saved in the Vault.
|
159
|
+
freeform_tags : dict, optional
|
160
|
+
freeform_tags to be used for saving the secret in OCI console.
|
161
|
+
defined_tags: dict, optional.
|
162
|
+
Save the tags under predefined tags in OCI console.
|
163
|
+
|
164
|
+
Returns
|
165
|
+
-------
|
166
|
+
SecretKeeper:
|
167
|
+
Returns self object.
|
168
|
+
"""
|
169
|
+
with tqdm(total=2, leave=False) as pbar:
|
170
|
+
pbar.set_description("Encoding credentials")
|
171
|
+
self.encode()
|
172
|
+
pbar.update()
|
173
|
+
pbar.set_description("Saving secrets to Vault")
|
174
|
+
logger.debug(
|
175
|
+
f"Saving to vault with following information - Vault ID: {self.id}, Key ID: {self.key_id}, name: {name}, description:{description}, freeform_tags:{freeform_tags}, defined_tags:{defined_tags}"
|
176
|
+
)
|
177
|
+
self.secret_id = self.create_secret(
|
178
|
+
self.encoded,
|
179
|
+
encode=False,
|
180
|
+
secret_name=name,
|
181
|
+
description=description,
|
182
|
+
freeform_tags=freeform_tags,
|
183
|
+
defined_tags=defined_tags,
|
184
|
+
)
|
185
|
+
pbar.update()
|
186
|
+
logger.info(f"Saved secret. Secret ID: {self.secret_id}")
|
187
|
+
return self
|
188
|
+
|
189
|
+
@classmethod
|
190
|
+
def load_secret(
|
191
|
+
cls,
|
192
|
+
source: str,
|
193
|
+
format: str = "ocid",
|
194
|
+
export_env: bool = False,
|
195
|
+
export_prefix: str = "",
|
196
|
+
auth=None,
|
197
|
+
storage_options: dict = None,
|
198
|
+
**kwargs,
|
199
|
+
) -> Union[dict, "ads.secrets.SecretKeeper"]:
|
200
|
+
"""Loads secret from vault using secret_id.
|
201
|
+
|
202
|
+
Parameters
|
203
|
+
----------
|
204
|
+
source : str
|
205
|
+
Source could be one of the following:
|
206
|
+
|
207
|
+
- OCID of the secret that has the secret content.
|
208
|
+
- file path that is json or yaml format with the key - `secret_id: ocid1.vaultsecret..<unique_ID>`
|
209
|
+
|
210
|
+
format : str
|
211
|
+
Defult is `ocid`. When `ocid`, the source must be a secret id
|
212
|
+
Value values:
|
213
|
+
|
214
|
+
- `ocid` - source is expected to be ocid of the secret
|
215
|
+
- `yaml` or `yml` - source is expected to be a path to a valid yaml file
|
216
|
+
- `json` - source is expected to be a path to a valid json file
|
217
|
+
|
218
|
+
export_env : str, Default False
|
219
|
+
When set to true, the credentails will be exported to the environment variable.
|
220
|
+
When `load_secret` is invoked using `with` statement, information exported as
|
221
|
+
environment variable is unset before leaving the `with` scope
|
222
|
+
export_prefix: str, Default ""
|
223
|
+
Prefix to the environment variable that is exported.
|
224
|
+
auth: dict, optional
|
225
|
+
By default authentication will follow what is configured using ads.set_auth API.
|
226
|
+
Accepts dict returned from `ads.common.auth.api_keys()` or
|
227
|
+
`ads.common.auth.resource_principal()`.
|
228
|
+
storage_options: dict, optional
|
229
|
+
storage_options dict as required by `fsspec` library
|
230
|
+
kwargs:
|
231
|
+
key word arguments accepted by the constructor of the class
|
232
|
+
from which this method is invoked.
|
233
|
+
|
234
|
+
Returns
|
235
|
+
-------
|
236
|
+
dict:
|
237
|
+
When called from within `with` block, Returns a dictionary containing the secret
|
238
|
+
ads.secrets.SecretKeeper:
|
239
|
+
When called without using `with` operator.
|
240
|
+
|
241
|
+
Examples
|
242
|
+
--------
|
243
|
+
|
244
|
+
>>> from ads.secrets import APIKeySecretKeeper
|
245
|
+
>>> with APIKeySecretKeeper.load_secret(source="ocid1.vaultsecret.**<unique_ID>**",
|
246
|
+
... export_prefix="mykafka",
|
247
|
+
... export_env=True
|
248
|
+
... ) as apisecret:
|
249
|
+
... import os
|
250
|
+
... print("Credentials inside environment variable:",
|
251
|
+
... os.environ.get('mykafka.api_key'))
|
252
|
+
... print("Credentials inside `apisecret` object: ", apisecret)
|
253
|
+
Credentials inside environment variable: <your api key>
|
254
|
+
Credentials inside `apisecret` object: {'api_key': 'your api key'}
|
255
|
+
|
256
|
+
>>> from ads.secrets import ADBSecretKeeper
|
257
|
+
>>> with ADBSecretKeeper.load_secret("ocid1.vaultsecret.**<unique_ID>**") as adw_creds2:
|
258
|
+
... import pandas as pd
|
259
|
+
... df2 = pd.DataFrame.ads.read_sql("select * from ATTRITION_DATA",
|
260
|
+
... connection_parameters=adw_creds2)
|
261
|
+
... print(df2.head(2))
|
262
|
+
JOBFUNCTION ATTRITION
|
263
|
+
0 Product Management No
|
264
|
+
1 Software Developer No
|
265
|
+
"""
|
266
|
+
logger.info("Fetching secret from Vault..")
|
267
|
+
if format.lower() == "ocid":
|
268
|
+
secret_id = source
|
269
|
+
else:
|
270
|
+
vault_info = {}
|
271
|
+
uri = source
|
272
|
+
with fsspec.open(uri, storage_options=storage_options) as vf:
|
273
|
+
if format.lower() == "json":
|
274
|
+
vault_info = json.load(vf)
|
275
|
+
elif format.lower() in ["yaml", "yml"]:
|
276
|
+
vault_info = yaml.load(vf, Loader=yaml.FullLoader)
|
277
|
+
if not cls._validate_required_vault_attributes(vault_info):
|
278
|
+
logger.error(
|
279
|
+
f"Missing required Attributes in file {uri}: {cls.required_keys}"
|
280
|
+
)
|
281
|
+
raise ValueError(
|
282
|
+
f"The file: {uri} does not contain all the required attributes - {','.join(cls.required_keys)}."
|
283
|
+
)
|
284
|
+
secret_id = vault_info["secret_id"]
|
285
|
+
logger.debug(f"Fetch with details: secret_id:{secret_id}")
|
286
|
+
secret = cls(auth=auth).get_secret(secret_id, decoded=False)
|
287
|
+
logger.info("Fetched secret from Vault successfully")
|
288
|
+
return cls(
|
289
|
+
secret_id=secret_id,
|
290
|
+
encoded=secret,
|
291
|
+
export_env=export_env,
|
292
|
+
export_prefix=export_prefix,
|
293
|
+
**kwargs,
|
294
|
+
).decode()
|
295
|
+
|
296
|
+
@classmethod
|
297
|
+
def _validate_required_vault_attributes(cls, vault_info):
|
298
|
+
return len([k for k in cls.required_keys if k in vault_info]) == len(
|
299
|
+
cls.required_keys
|
300
|
+
)
|
301
|
+
|
302
|
+
def __enter__(self, *args, **kwargs):
|
303
|
+
self.exported_keys = []
|
304
|
+
if self.export_env:
|
305
|
+
secret_data = self.data.export_dict()
|
306
|
+
export_dict = {
|
307
|
+
f"{self.export_prefix}.{key}"
|
308
|
+
if self.export_prefix
|
309
|
+
else key: secret_data[key]
|
310
|
+
for key in secret_data
|
311
|
+
if secret_data[key]
|
312
|
+
}
|
313
|
+
|
314
|
+
# Validate if the keys are already in the environment variable. If they are there
|
315
|
+
# Throw an error and ask user to provide a prefix
|
316
|
+
|
317
|
+
for key in export_dict:
|
318
|
+
if os.environ.get(key):
|
319
|
+
logger.error(
|
320
|
+
f"Environment variable {key} already exists. Please consider providing `export_prefix` to avoid name collision."
|
321
|
+
)
|
322
|
+
raise Exception(
|
323
|
+
f"Environment variable {key} already exists. Please consider providing `export_prefix` to avoid name collision."
|
324
|
+
)
|
325
|
+
os.environ.update(export_dict)
|
326
|
+
self.exported_keys = list(export_dict.keys())
|
327
|
+
logger.debug(f"Exporting credentials to environment.")
|
328
|
+
else:
|
329
|
+
logger.debug(f"Skipping Export credentials to environment.")
|
330
|
+
|
331
|
+
self.context_secret = self.data.export_dict()
|
332
|
+
return self.context_secret
|
333
|
+
|
334
|
+
def __exit__(self, *args, **kwargs):
|
335
|
+
if hasattr(self, "exported_keys"):
|
336
|
+
logger.debug(f"Clearing credetials from environment")
|
337
|
+
for key in self.exported_keys:
|
338
|
+
logger.debug(f"Removed {key}")
|
339
|
+
os.environ.pop(key, None)
|
340
|
+
logger.debug(f"Clearing credetials from dictionary")
|
341
|
+
for key in self.data.export_options():
|
342
|
+
setattr(self, key, None)
|
343
|
+
self.context_secret[key] = None
|
344
|
+
|
345
|
+
def to_dict(self) -> dict:
|
346
|
+
"""Returns dict of credentials retrieved from the vault or set through constructor arguments.
|
347
|
+
|
348
|
+
Returns
|
349
|
+
-------
|
350
|
+
dict
|
351
|
+
dict of credentials retrieved from the vault or set through constructor.
|
352
|
+
"""
|
353
|
+
return {key: getattr(self.data, key) for key in self.data.export_options()}
|
354
|
+
|
355
|
+
def export_vault_details(
|
356
|
+
self, filepath: str, format: str = "json", storage_options: dict = None
|
357
|
+
): # Consider other name.
|
358
|
+
"""Save secret_id in a json file
|
359
|
+
|
360
|
+
Parameters
|
361
|
+
----------
|
362
|
+
filepath : str
|
363
|
+
Filepath to save the file.
|
364
|
+
format : str
|
365
|
+
Default is `json`. Valid values:
|
366
|
+
|
367
|
+
- `yaml` or `yml` - to store vault details in a yaml file
|
368
|
+
- `json` - to store vault details in a json file
|
369
|
+
|
370
|
+
storage_options: dict, optional.
|
371
|
+
storage_options dict as required by `fsspec` library
|
372
|
+
|
373
|
+
Returns
|
374
|
+
-------
|
375
|
+
None
|
376
|
+
Returns None
|
377
|
+
"""
|
378
|
+
import fsspec
|
379
|
+
|
380
|
+
with fsspec.open(
|
381
|
+
filepath, "w", storage_options=storage_options
|
382
|
+
) as cred_info_file:
|
383
|
+
if format.lower() == "json":
|
384
|
+
json.dump(
|
385
|
+
{
|
386
|
+
"vault_id": self.id,
|
387
|
+
"key_id": self.key_id,
|
388
|
+
"secret_id": self.secret_id,
|
389
|
+
},
|
390
|
+
cred_info_file,
|
391
|
+
)
|
392
|
+
elif format.lower() in ["yaml", "yml"]:
|
393
|
+
yaml.dump(
|
394
|
+
{
|
395
|
+
"vault_id": self.id,
|
396
|
+
"key_id": self.key_id,
|
397
|
+
"secret_id": self.secret_id,
|
398
|
+
},
|
399
|
+
cred_info_file,
|
400
|
+
)
|
401
|
+
else:
|
402
|
+
logger.error(
|
403
|
+
f"Unrecognized format: {format}. Value values are - json, yaml, yml"
|
404
|
+
)
|
405
|
+
raise ValueError(
|
406
|
+
f"Unrecognized format: {format}. Value values are - json, yaml, yml"
|
407
|
+
)
|
ads/telemetry/base.py
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# Copyright (c) 2024, 2025 Oracle and/or its affiliates.
|
3
|
+
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
|
4
|
+
|
5
|
+
import logging
|
6
|
+
|
7
|
+
import oci
|
8
|
+
|
9
|
+
from ads.common import oci_client as oc
|
10
|
+
from ads.common.auth import default_signer, resource_principal
|
11
|
+
from ads.config import OCI_RESOURCE_PRINCIPAL_VERSION
|
12
|
+
|
13
|
+
logger = logging.getLogger(__name__)
|
14
|
+
|
15
|
+
|
16
|
+
class TelemetryBase:
|
17
|
+
"""Base class for Telemetry Client."""
|
18
|
+
|
19
|
+
def __init__(self, bucket: str, namespace: str = None) -> None:
|
20
|
+
"""Initializes the telemetry client.
|
21
|
+
|
22
|
+
Parameters
|
23
|
+
----------
|
24
|
+
bucket : str
|
25
|
+
OCI object storage bucket name storing the telemetry objects.
|
26
|
+
namespace : str, optional
|
27
|
+
Namespace of the OCI object storage bucket, by default None.
|
28
|
+
"""
|
29
|
+
# Use resource principal as authentication method if available,
|
30
|
+
# however, do not change the ADS authentication if user configured it by set_auth.
|
31
|
+
if OCI_RESOURCE_PRINCIPAL_VERSION:
|
32
|
+
self._auth = resource_principal()
|
33
|
+
else:
|
34
|
+
self._auth = default_signer()
|
35
|
+
self.os_client: oci.object_storage.ObjectStorageClient = oc.OCIClientFactory(
|
36
|
+
**self._auth
|
37
|
+
).object_storage
|
38
|
+
self.bucket = bucket
|
39
|
+
self._namespace = namespace
|
40
|
+
self._service_endpoint = None
|
41
|
+
logger.debug(
|
42
|
+
f"Initialized Telemetry. Namespace: {self.namespace}, Bucket: {self.bucket}"
|
43
|
+
)
|
44
|
+
|
45
|
+
@property
|
46
|
+
def namespace(self) -> str:
|
47
|
+
"""Gets the namespace of the object storage from the tenancy.
|
48
|
+
|
49
|
+
Returns
|
50
|
+
-------
|
51
|
+
str
|
52
|
+
The namespace of the tenancy.
|
53
|
+
"""
|
54
|
+
if not self._namespace:
|
55
|
+
self._namespace = self.os_client.get_namespace().data
|
56
|
+
return self._namespace
|
57
|
+
|
58
|
+
@property
|
59
|
+
def service_endpoint(self):
|
60
|
+
"""Gets the tenancy-specific endpoint.
|
61
|
+
|
62
|
+
Returns
|
63
|
+
-------
|
64
|
+
str
|
65
|
+
Tenancy-specific endpoint.
|
66
|
+
"""
|
67
|
+
if not self._service_endpoint:
|
68
|
+
self._service_endpoint = str(self.os_client.base_client.endpoint)
|
69
|
+
return self._service_endpoint
|
ads/telemetry/client.py
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# Copyright (c) 2024, 2025 Oracle and/or its affiliates.
|
3
|
+
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
|
4
|
+
|
5
|
+
|
6
|
+
import logging
|
7
|
+
import threading
|
8
|
+
import traceback
|
9
|
+
import urllib.parse
|
10
|
+
from typing import Optional
|
11
|
+
import concurrent.futures
|
12
|
+
|
13
|
+
import oci
|
14
|
+
|
15
|
+
from ads.config import DEBUG_TELEMETRY
|
16
|
+
|
17
|
+
from .base import TelemetryBase
|
18
|
+
|
19
|
+
logger = logging.getLogger(__name__)
|
20
|
+
THREAD_POOL_SIZE = 16
|
21
|
+
thread_pool = concurrent.futures.ThreadPoolExecutor(max_workers=THREAD_POOL_SIZE)
|
22
|
+
|
23
|
+
class TelemetryClient(TelemetryBase):
|
24
|
+
"""Represents a telemetry python client providing functions to record an event.
|
25
|
+
|
26
|
+
Methods
|
27
|
+
-------
|
28
|
+
record_event(category: str = None, action: str = None, path: str = None, **kwargs) -> None
|
29
|
+
Send a head request to generate an event record.
|
30
|
+
record_event_async(category: str = None, action: str = None, path: str = None, **kwargs)
|
31
|
+
Starts thread to send a head request to generate an event record.
|
32
|
+
|
33
|
+
Examples
|
34
|
+
--------
|
35
|
+
>>> import os
|
36
|
+
>>> import traceback
|
37
|
+
>>> from ads.telemetry.client import TelemetryClient
|
38
|
+
>>> AQUA_BUCKET = os.environ.get("AQUA_BUCKET", "service-managed-models")
|
39
|
+
>>> AQUA_BUCKET_NS = os.environ.get("AQUA_BUCKET_NS", "namespace")
|
40
|
+
>>> telemetry = TelemetryClient(bucket=AQUA_BUCKET, namespace=AQUA_BUCKET_NS)
|
41
|
+
>>> telemetry.record_event_async(category="aqua/service/model", action="create") # records create action
|
42
|
+
>>> telemetry.record_event_async(category="aqua/service/model/create", action="shape", detail="VM.GPU.A10.1")
|
43
|
+
"""
|
44
|
+
|
45
|
+
@staticmethod
|
46
|
+
def _encode_user_agent(**kwargs):
|
47
|
+
message = urllib.parse.urlencode(kwargs)
|
48
|
+
return message
|
49
|
+
|
50
|
+
def record_event(
|
51
|
+
self, category: str = None, action: str = None, detail: str = None, **kwargs
|
52
|
+
) -> Optional[int]:
|
53
|
+
"""Send a head request to generate an event record.
|
54
|
+
|
55
|
+
Parameters
|
56
|
+
----------
|
57
|
+
category: (str)
|
58
|
+
Category of the event, which is also the path to the directory containing the object representing the event.
|
59
|
+
action: (str)
|
60
|
+
Filename of the object representing the event.
|
61
|
+
detail: (str)
|
62
|
+
Can be used to pass additional values, if required. When set, detail is converted to an action,
|
63
|
+
category and action are grouped together for telemetry parsing in the backend.
|
64
|
+
**kwargs:
|
65
|
+
Can be used to pass additional attributes like value that will be passed in the headers of the request.
|
66
|
+
|
67
|
+
Returns
|
68
|
+
-------
|
69
|
+
int
|
70
|
+
The status code for the telemetry request.
|
71
|
+
200: The the object exists for the telemetry request
|
72
|
+
404: The the object does not exist for the telemetry request.
|
73
|
+
Note that for telemetry purpose, the object does not need to be exist.
|
74
|
+
`None` will be returned if the telemetry request failed.
|
75
|
+
"""
|
76
|
+
try:
|
77
|
+
if not category or not action:
|
78
|
+
raise ValueError("Please specify the category and the action.")
|
79
|
+
if detail:
|
80
|
+
category, action = f"{category}/{action}", detail
|
81
|
+
# Here `endpoint`` is for debugging purpose
|
82
|
+
# For some federated/domain users, the `endpoint` may not be a valid URL
|
83
|
+
endpoint = f"{self.service_endpoint}/n/{self.namespace}/b/{self.bucket}/o/telemetry/{category}/{action}"
|
84
|
+
logger.debug(f"Sending telemetry to endpoint: {endpoint}")
|
85
|
+
|
86
|
+
self.os_client.base_client.user_agent = self._encode_user_agent(**kwargs)
|
87
|
+
try:
|
88
|
+
response: oci.response.Response = self.os_client.head_object(
|
89
|
+
namespace_name=self.namespace,
|
90
|
+
bucket_name=self.bucket,
|
91
|
+
object_name=f"telemetry/{category}/{action}",
|
92
|
+
)
|
93
|
+
logger.debug(f"Telemetry status: {response.status}")
|
94
|
+
return response.status
|
95
|
+
except oci.exceptions.ServiceError as ex:
|
96
|
+
if ex.status == 404:
|
97
|
+
return ex.status
|
98
|
+
raise ex
|
99
|
+
except Exception as e:
|
100
|
+
if DEBUG_TELEMETRY:
|
101
|
+
logger.error(f"There is an error recording telemetry: {e}")
|
102
|
+
traceback.print_exc()
|
103
|
+
return None
|
104
|
+
|
105
|
+
def record_event_async(
|
106
|
+
self, category: str = None, action: str = None, detail: str = None, **kwargs
|
107
|
+
)-> None:
|
108
|
+
"""Send a head request to generate an event record.
|
109
|
+
|
110
|
+
Parameters
|
111
|
+
----------
|
112
|
+
category (str)
|
113
|
+
Category of the event, which is also the path to the directory containing the object representing the event.
|
114
|
+
action (str)
|
115
|
+
Filename of the object representing the event.
|
116
|
+
|
117
|
+
Returns
|
118
|
+
-------
|
119
|
+
Thread
|
120
|
+
A started thread to send a head request to generate an event record.
|
121
|
+
"""
|
122
|
+
thread_pool.submit(self.record_event, args=(category, action, detail), kwargs=kwargs)
|