oracle-ads 2.13.9rc0__py3-none-any.whl → 2.13.9rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (857) hide show
  1. ads/aqua/__init__.py +40 -0
  2. ads/aqua/app.py +506 -0
  3. ads/aqua/cli.py +96 -0
  4. ads/aqua/client/__init__.py +3 -0
  5. ads/aqua/client/client.py +836 -0
  6. ads/aqua/client/openai_client.py +305 -0
  7. ads/aqua/common/__init__.py +5 -0
  8. ads/aqua/common/decorator.py +125 -0
  9. ads/aqua/common/entities.py +269 -0
  10. ads/aqua/common/enums.py +122 -0
  11. ads/aqua/common/errors.py +109 -0
  12. ads/aqua/common/utils.py +1285 -0
  13. ads/aqua/config/__init__.py +4 -0
  14. ads/aqua/config/container_config.py +248 -0
  15. ads/aqua/config/evaluation/__init__.py +4 -0
  16. ads/aqua/config/evaluation/evaluation_service_config.py +147 -0
  17. ads/aqua/config/utils/__init__.py +4 -0
  18. ads/aqua/config/utils/serializer.py +339 -0
  19. ads/aqua/constants.py +116 -0
  20. ads/aqua/data.py +14 -0
  21. ads/aqua/dummy_data/icon.txt +1 -0
  22. ads/aqua/dummy_data/oci_model_deployments.json +56 -0
  23. ads/aqua/dummy_data/oci_models.json +1 -0
  24. ads/aqua/dummy_data/readme.md +26 -0
  25. ads/aqua/evaluation/__init__.py +8 -0
  26. ads/aqua/evaluation/constants.py +53 -0
  27. ads/aqua/evaluation/entities.py +186 -0
  28. ads/aqua/evaluation/errors.py +70 -0
  29. ads/aqua/evaluation/evaluation.py +1814 -0
  30. ads/aqua/extension/__init__.py +42 -0
  31. ads/aqua/extension/aqua_ws_msg_handler.py +76 -0
  32. ads/aqua/extension/base_handler.py +90 -0
  33. ads/aqua/extension/common_handler.py +121 -0
  34. ads/aqua/extension/common_ws_msg_handler.py +36 -0
  35. ads/aqua/extension/deployment_handler.py +298 -0
  36. ads/aqua/extension/deployment_ws_msg_handler.py +54 -0
  37. ads/aqua/extension/errors.py +30 -0
  38. ads/aqua/extension/evaluation_handler.py +129 -0
  39. ads/aqua/extension/evaluation_ws_msg_handler.py +61 -0
  40. ads/aqua/extension/finetune_handler.py +96 -0
  41. ads/aqua/extension/model_handler.py +390 -0
  42. ads/aqua/extension/models/__init__.py +0 -0
  43. ads/aqua/extension/models/ws_models.py +145 -0
  44. ads/aqua/extension/models_ws_msg_handler.py +50 -0
  45. ads/aqua/extension/ui_handler.py +282 -0
  46. ads/aqua/extension/ui_websocket_handler.py +130 -0
  47. ads/aqua/extension/utils.py +133 -0
  48. ads/aqua/finetuning/__init__.py +7 -0
  49. ads/aqua/finetuning/constants.py +23 -0
  50. ads/aqua/finetuning/entities.py +181 -0
  51. ads/aqua/finetuning/finetuning.py +749 -0
  52. ads/aqua/model/__init__.py +8 -0
  53. ads/aqua/model/constants.py +60 -0
  54. ads/aqua/model/entities.py +385 -0
  55. ads/aqua/model/enums.py +32 -0
  56. ads/aqua/model/model.py +2114 -0
  57. ads/aqua/modeldeployment/__init__.py +8 -0
  58. ads/aqua/modeldeployment/constants.py +10 -0
  59. ads/aqua/modeldeployment/deployment.py +1326 -0
  60. ads/aqua/modeldeployment/entities.py +653 -0
  61. ads/aqua/modeldeployment/inference.py +74 -0
  62. ads/aqua/modeldeployment/utils.py +543 -0
  63. ads/aqua/resources/gpu_shapes_index.json +94 -0
  64. ads/aqua/server/__init__.py +4 -0
  65. ads/aqua/server/__main__.py +24 -0
  66. ads/aqua/server/app.py +47 -0
  67. ads/aqua/server/aqua_spec.yml +1291 -0
  68. ads/aqua/training/__init__.py +4 -0
  69. ads/aqua/training/exceptions.py +476 -0
  70. ads/aqua/ui.py +499 -0
  71. ads/automl/__init__.py +9 -0
  72. ads/automl/driver.py +330 -0
  73. ads/automl/provider.py +975 -0
  74. ads/bds/__init__.py +5 -0
  75. ads/bds/auth.py +127 -0
  76. ads/bds/big_data_service.py +255 -0
  77. ads/catalog/__init__.py +19 -0
  78. ads/catalog/model.py +1576 -0
  79. ads/catalog/notebook.py +461 -0
  80. ads/catalog/project.py +468 -0
  81. ads/catalog/summary.py +178 -0
  82. ads/common/__init__.py +11 -0
  83. ads/common/analyzer.py +65 -0
  84. ads/common/artifact/.model-ignore +63 -0
  85. ads/common/artifact/__init__.py +10 -0
  86. ads/common/auth.py +1122 -0
  87. ads/common/card_identifier.py +83 -0
  88. ads/common/config.py +647 -0
  89. ads/common/data.py +165 -0
  90. ads/common/decorator/__init__.py +9 -0
  91. ads/common/decorator/argument_to_case.py +88 -0
  92. ads/common/decorator/deprecate.py +69 -0
  93. ads/common/decorator/require_nonempty_arg.py +65 -0
  94. ads/common/decorator/runtime_dependency.py +178 -0
  95. ads/common/decorator/threaded.py +97 -0
  96. ads/common/decorator/utils.py +35 -0
  97. ads/common/dsc_file_system.py +303 -0
  98. ads/common/error.py +14 -0
  99. ads/common/extended_enum.py +81 -0
  100. ads/common/function/__init__.py +5 -0
  101. ads/common/function/fn_util.py +142 -0
  102. ads/common/function/func_conf.yaml +25 -0
  103. ads/common/ipython.py +76 -0
  104. ads/common/model.py +679 -0
  105. ads/common/model_artifact.py +1759 -0
  106. ads/common/model_artifact_schema.json +107 -0
  107. ads/common/model_export_util.py +664 -0
  108. ads/common/model_metadata.py +24 -0
  109. ads/common/object_storage_details.py +296 -0
  110. ads/common/oci_client.py +175 -0
  111. ads/common/oci_datascience.py +46 -0
  112. ads/common/oci_logging.py +1144 -0
  113. ads/common/oci_mixin.py +957 -0
  114. ads/common/oci_resource.py +136 -0
  115. ads/common/serializer.py +559 -0
  116. ads/common/utils.py +1852 -0
  117. ads/common/word_lists.py +1491 -0
  118. ads/common/work_request.py +189 -0
  119. ads/data_labeling/__init__.py +13 -0
  120. ads/data_labeling/boundingbox.py +253 -0
  121. ads/data_labeling/constants.py +47 -0
  122. ads/data_labeling/data_labeling_service.py +244 -0
  123. ads/data_labeling/interface/__init__.py +5 -0
  124. ads/data_labeling/interface/loader.py +16 -0
  125. ads/data_labeling/interface/parser.py +16 -0
  126. ads/data_labeling/interface/reader.py +23 -0
  127. ads/data_labeling/loader/__init__.py +5 -0
  128. ads/data_labeling/loader/file_loader.py +241 -0
  129. ads/data_labeling/metadata.py +110 -0
  130. ads/data_labeling/mixin/__init__.py +5 -0
  131. ads/data_labeling/mixin/data_labeling.py +232 -0
  132. ads/data_labeling/ner.py +129 -0
  133. ads/data_labeling/parser/__init__.py +5 -0
  134. ads/data_labeling/parser/dls_record_parser.py +388 -0
  135. ads/data_labeling/parser/export_metadata_parser.py +94 -0
  136. ads/data_labeling/parser/export_record_parser.py +473 -0
  137. ads/data_labeling/reader/__init__.py +5 -0
  138. ads/data_labeling/reader/dataset_reader.py +574 -0
  139. ads/data_labeling/reader/dls_record_reader.py +121 -0
  140. ads/data_labeling/reader/export_record_reader.py +62 -0
  141. ads/data_labeling/reader/jsonl_reader.py +75 -0
  142. ads/data_labeling/reader/metadata_reader.py +203 -0
  143. ads/data_labeling/reader/record_reader.py +263 -0
  144. ads/data_labeling/record.py +52 -0
  145. ads/data_labeling/visualizer/__init__.py +5 -0
  146. ads/data_labeling/visualizer/image_visualizer.py +525 -0
  147. ads/data_labeling/visualizer/text_visualizer.py +357 -0
  148. ads/database/__init__.py +5 -0
  149. ads/database/connection.py +338 -0
  150. ads/dataset/__init__.py +10 -0
  151. ads/dataset/capabilities.md +51 -0
  152. ads/dataset/classification_dataset.py +339 -0
  153. ads/dataset/correlation.py +226 -0
  154. ads/dataset/correlation_plot.py +563 -0
  155. ads/dataset/dask_series.py +173 -0
  156. ads/dataset/dataframe_transformer.py +110 -0
  157. ads/dataset/dataset.py +1979 -0
  158. ads/dataset/dataset_browser.py +360 -0
  159. ads/dataset/dataset_with_target.py +995 -0
  160. ads/dataset/exception.py +25 -0
  161. ads/dataset/factory.py +987 -0
  162. ads/dataset/feature_engineering_transformer.py +35 -0
  163. ads/dataset/feature_selection.py +107 -0
  164. ads/dataset/forecasting_dataset.py +26 -0
  165. ads/dataset/helper.py +1450 -0
  166. ads/dataset/label_encoder.py +99 -0
  167. ads/dataset/mixin/__init__.py +5 -0
  168. ads/dataset/mixin/dataset_accessor.py +134 -0
  169. ads/dataset/pipeline.py +58 -0
  170. ads/dataset/plot.py +710 -0
  171. ads/dataset/progress.py +86 -0
  172. ads/dataset/recommendation.py +297 -0
  173. ads/dataset/recommendation_transformer.py +502 -0
  174. ads/dataset/regression_dataset.py +14 -0
  175. ads/dataset/sampled_dataset.py +1050 -0
  176. ads/dataset/target.py +98 -0
  177. ads/dataset/timeseries.py +18 -0
  178. ads/dbmixin/__init__.py +5 -0
  179. ads/dbmixin/db_pandas_accessor.py +153 -0
  180. ads/environment/__init__.py +9 -0
  181. ads/environment/ml_runtime.py +66 -0
  182. ads/evaluations/README.md +14 -0
  183. ads/evaluations/__init__.py +109 -0
  184. ads/evaluations/evaluation_plot.py +983 -0
  185. ads/evaluations/evaluator.py +1334 -0
  186. ads/evaluations/statistical_metrics.py +543 -0
  187. ads/experiments/__init__.py +9 -0
  188. ads/experiments/capabilities.md +0 -0
  189. ads/explanations/__init__.py +21 -0
  190. ads/explanations/base_explainer.py +142 -0
  191. ads/explanations/capabilities.md +83 -0
  192. ads/explanations/explainer.py +190 -0
  193. ads/explanations/mlx_global_explainer.py +1050 -0
  194. ads/explanations/mlx_interface.py +386 -0
  195. ads/explanations/mlx_local_explainer.py +287 -0
  196. ads/explanations/mlx_whatif_explainer.py +201 -0
  197. ads/feature_engineering/__init__.py +20 -0
  198. ads/feature_engineering/accessor/__init__.py +5 -0
  199. ads/feature_engineering/accessor/dataframe_accessor.py +535 -0
  200. ads/feature_engineering/accessor/mixin/__init__.py +5 -0
  201. ads/feature_engineering/accessor/mixin/correlation.py +166 -0
  202. ads/feature_engineering/accessor/mixin/eda_mixin.py +266 -0
  203. ads/feature_engineering/accessor/mixin/eda_mixin_series.py +85 -0
  204. ads/feature_engineering/accessor/mixin/feature_types_mixin.py +211 -0
  205. ads/feature_engineering/accessor/mixin/utils.py +65 -0
  206. ads/feature_engineering/accessor/series_accessor.py +431 -0
  207. ads/feature_engineering/adsimage/__init__.py +5 -0
  208. ads/feature_engineering/adsimage/image.py +192 -0
  209. ads/feature_engineering/adsimage/image_reader.py +170 -0
  210. ads/feature_engineering/adsimage/interface/__init__.py +5 -0
  211. ads/feature_engineering/adsimage/interface/reader.py +19 -0
  212. ads/feature_engineering/adsstring/__init__.py +7 -0
  213. ads/feature_engineering/adsstring/oci_language/__init__.py +8 -0
  214. ads/feature_engineering/adsstring/string/__init__.py +8 -0
  215. ads/feature_engineering/data_schema.json +57 -0
  216. ads/feature_engineering/dataset/__init__.py +5 -0
  217. ads/feature_engineering/dataset/zip_code_data.py +42062 -0
  218. ads/feature_engineering/exceptions.py +40 -0
  219. ads/feature_engineering/feature_type/__init__.py +133 -0
  220. ads/feature_engineering/feature_type/address.py +184 -0
  221. ads/feature_engineering/feature_type/adsstring/__init__.py +5 -0
  222. ads/feature_engineering/feature_type/adsstring/common_regex_mixin.py +164 -0
  223. ads/feature_engineering/feature_type/adsstring/oci_language.py +93 -0
  224. ads/feature_engineering/feature_type/adsstring/parsers/__init__.py +5 -0
  225. ads/feature_engineering/feature_type/adsstring/parsers/base.py +47 -0
  226. ads/feature_engineering/feature_type/adsstring/parsers/nltk_parser.py +96 -0
  227. ads/feature_engineering/feature_type/adsstring/parsers/spacy_parser.py +221 -0
  228. ads/feature_engineering/feature_type/adsstring/string.py +258 -0
  229. ads/feature_engineering/feature_type/base.py +58 -0
  230. ads/feature_engineering/feature_type/boolean.py +183 -0
  231. ads/feature_engineering/feature_type/category.py +146 -0
  232. ads/feature_engineering/feature_type/constant.py +137 -0
  233. ads/feature_engineering/feature_type/continuous.py +151 -0
  234. ads/feature_engineering/feature_type/creditcard.py +314 -0
  235. ads/feature_engineering/feature_type/datetime.py +190 -0
  236. ads/feature_engineering/feature_type/discrete.py +134 -0
  237. ads/feature_engineering/feature_type/document.py +43 -0
  238. ads/feature_engineering/feature_type/gis.py +251 -0
  239. ads/feature_engineering/feature_type/handler/__init__.py +5 -0
  240. ads/feature_engineering/feature_type/handler/feature_validator.py +524 -0
  241. ads/feature_engineering/feature_type/handler/feature_warning.py +319 -0
  242. ads/feature_engineering/feature_type/handler/warnings.py +128 -0
  243. ads/feature_engineering/feature_type/integer.py +142 -0
  244. ads/feature_engineering/feature_type/ip_address.py +144 -0
  245. ads/feature_engineering/feature_type/ip_address_v4.py +138 -0
  246. ads/feature_engineering/feature_type/ip_address_v6.py +138 -0
  247. ads/feature_engineering/feature_type/lat_long.py +256 -0
  248. ads/feature_engineering/feature_type/object.py +43 -0
  249. ads/feature_engineering/feature_type/ordinal.py +132 -0
  250. ads/feature_engineering/feature_type/phone_number.py +135 -0
  251. ads/feature_engineering/feature_type/string.py +171 -0
  252. ads/feature_engineering/feature_type/text.py +93 -0
  253. ads/feature_engineering/feature_type/unknown.py +43 -0
  254. ads/feature_engineering/feature_type/zip_code.py +164 -0
  255. ads/feature_engineering/feature_type_manager.py +406 -0
  256. ads/feature_engineering/schema.py +795 -0
  257. ads/feature_engineering/utils.py +245 -0
  258. ads/feature_store/.readthedocs.yaml +19 -0
  259. ads/feature_store/README.md +65 -0
  260. ads/feature_store/__init__.py +9 -0
  261. ads/feature_store/common/__init__.py +0 -0
  262. ads/feature_store/common/enums.py +339 -0
  263. ads/feature_store/common/exceptions.py +18 -0
  264. ads/feature_store/common/spark_session_singleton.py +125 -0
  265. ads/feature_store/common/utils/__init__.py +0 -0
  266. ads/feature_store/common/utils/base64_encoder_decoder.py +72 -0
  267. ads/feature_store/common/utils/feature_schema_mapper.py +283 -0
  268. ads/feature_store/common/utils/transformation_utils.py +82 -0
  269. ads/feature_store/common/utils/utility.py +403 -0
  270. ads/feature_store/data_validation/__init__.py +0 -0
  271. ads/feature_store/data_validation/great_expectation.py +129 -0
  272. ads/feature_store/dataset.py +1230 -0
  273. ads/feature_store/dataset_job.py +530 -0
  274. ads/feature_store/docs/Dockerfile +7 -0
  275. ads/feature_store/docs/Makefile +44 -0
  276. ads/feature_store/docs/conf.py +28 -0
  277. ads/feature_store/docs/requirements.txt +14 -0
  278. ads/feature_store/docs/source/ads.feature_store.query.rst +20 -0
  279. ads/feature_store/docs/source/cicd.rst +137 -0
  280. ads/feature_store/docs/source/conf.py +86 -0
  281. ads/feature_store/docs/source/data_versioning.rst +33 -0
  282. ads/feature_store/docs/source/dataset.rst +388 -0
  283. ads/feature_store/docs/source/dataset_job.rst +27 -0
  284. ads/feature_store/docs/source/demo.rst +70 -0
  285. ads/feature_store/docs/source/entity.rst +78 -0
  286. ads/feature_store/docs/source/feature_group.rst +624 -0
  287. ads/feature_store/docs/source/feature_group_job.rst +29 -0
  288. ads/feature_store/docs/source/feature_store.rst +122 -0
  289. ads/feature_store/docs/source/feature_store_class.rst +123 -0
  290. ads/feature_store/docs/source/feature_validation.rst +66 -0
  291. ads/feature_store/docs/source/figures/cicd.png +0 -0
  292. ads/feature_store/docs/source/figures/data_validation.png +0 -0
  293. ads/feature_store/docs/source/figures/data_versioning.png +0 -0
  294. ads/feature_store/docs/source/figures/dataset.gif +0 -0
  295. ads/feature_store/docs/source/figures/dataset.png +0 -0
  296. ads/feature_store/docs/source/figures/dataset_lineage.png +0 -0
  297. ads/feature_store/docs/source/figures/dataset_statistics.png +0 -0
  298. ads/feature_store/docs/source/figures/dataset_statistics_viz.png +0 -0
  299. ads/feature_store/docs/source/figures/dataset_validation_results.png +0 -0
  300. ads/feature_store/docs/source/figures/dataset_validation_summary.png +0 -0
  301. ads/feature_store/docs/source/figures/drift_monitoring.png +0 -0
  302. ads/feature_store/docs/source/figures/entity.png +0 -0
  303. ads/feature_store/docs/source/figures/feature_group.png +0 -0
  304. ads/feature_store/docs/source/figures/feature_group_lineage.png +0 -0
  305. ads/feature_store/docs/source/figures/feature_group_statistics_viz.png +0 -0
  306. ads/feature_store/docs/source/figures/feature_store_deployment.png +0 -0
  307. ads/feature_store/docs/source/figures/feature_store_overview.png +0 -0
  308. ads/feature_store/docs/source/figures/featuregroup.gif +0 -0
  309. ads/feature_store/docs/source/figures/lineage_d1.png +0 -0
  310. ads/feature_store/docs/source/figures/lineage_d2.png +0 -0
  311. ads/feature_store/docs/source/figures/lineage_fg.png +0 -0
  312. ads/feature_store/docs/source/figures/logo-dark-mode.png +0 -0
  313. ads/feature_store/docs/source/figures/logo-light-mode.png +0 -0
  314. ads/feature_store/docs/source/figures/overview.png +0 -0
  315. ads/feature_store/docs/source/figures/resource_manager.png +0 -0
  316. ads/feature_store/docs/source/figures/resource_manager_feature_store_stack.png +0 -0
  317. ads/feature_store/docs/source/figures/resource_manager_home.png +0 -0
  318. ads/feature_store/docs/source/figures/stats_1.png +0 -0
  319. ads/feature_store/docs/source/figures/stats_2.png +0 -0
  320. ads/feature_store/docs/source/figures/stats_d.png +0 -0
  321. ads/feature_store/docs/source/figures/stats_fg.png +0 -0
  322. ads/feature_store/docs/source/figures/transformation.png +0 -0
  323. ads/feature_store/docs/source/figures/transformations.gif +0 -0
  324. ads/feature_store/docs/source/figures/validation.png +0 -0
  325. ads/feature_store/docs/source/figures/validation_fg.png +0 -0
  326. ads/feature_store/docs/source/figures/validation_results.png +0 -0
  327. ads/feature_store/docs/source/figures/validation_summary.png +0 -0
  328. ads/feature_store/docs/source/index.rst +81 -0
  329. ads/feature_store/docs/source/module.rst +8 -0
  330. ads/feature_store/docs/source/notebook.rst +94 -0
  331. ads/feature_store/docs/source/overview.rst +47 -0
  332. ads/feature_store/docs/source/quickstart.rst +176 -0
  333. ads/feature_store/docs/source/release_notes.rst +194 -0
  334. ads/feature_store/docs/source/setup_feature_store.rst +81 -0
  335. ads/feature_store/docs/source/statistics.rst +58 -0
  336. ads/feature_store/docs/source/transformation.rst +199 -0
  337. ads/feature_store/docs/source/ui.rst +65 -0
  338. ads/feature_store/docs/source/user_guides.setup.feature_store_operator.rst +66 -0
  339. ads/feature_store/docs/source/user_guides.setup.helm_chart.rst +192 -0
  340. ads/feature_store/docs/source/user_guides.setup.terraform.rst +338 -0
  341. ads/feature_store/entity.py +718 -0
  342. ads/feature_store/execution_strategy/__init__.py +0 -0
  343. ads/feature_store/execution_strategy/delta_lake/__init__.py +0 -0
  344. ads/feature_store/execution_strategy/delta_lake/delta_lake_service.py +375 -0
  345. ads/feature_store/execution_strategy/engine/__init__.py +0 -0
  346. ads/feature_store/execution_strategy/engine/spark_engine.py +316 -0
  347. ads/feature_store/execution_strategy/execution_strategy.py +113 -0
  348. ads/feature_store/execution_strategy/execution_strategy_provider.py +47 -0
  349. ads/feature_store/execution_strategy/spark/__init__.py +0 -0
  350. ads/feature_store/execution_strategy/spark/spark_execution.py +618 -0
  351. ads/feature_store/feature.py +192 -0
  352. ads/feature_store/feature_group.py +1494 -0
  353. ads/feature_store/feature_group_expectation.py +346 -0
  354. ads/feature_store/feature_group_job.py +602 -0
  355. ads/feature_store/feature_lineage/__init__.py +0 -0
  356. ads/feature_store/feature_lineage/graphviz_service.py +180 -0
  357. ads/feature_store/feature_option_details.py +50 -0
  358. ads/feature_store/feature_statistics/__init__.py +0 -0
  359. ads/feature_store/feature_statistics/statistics_service.py +99 -0
  360. ads/feature_store/feature_store.py +699 -0
  361. ads/feature_store/feature_store_registrar.py +518 -0
  362. ads/feature_store/input_feature_detail.py +149 -0
  363. ads/feature_store/mixin/__init__.py +4 -0
  364. ads/feature_store/mixin/oci_feature_store.py +145 -0
  365. ads/feature_store/model_details.py +73 -0
  366. ads/feature_store/query/__init__.py +0 -0
  367. ads/feature_store/query/filter.py +266 -0
  368. ads/feature_store/query/generator/__init__.py +0 -0
  369. ads/feature_store/query/generator/query_generator.py +298 -0
  370. ads/feature_store/query/join.py +161 -0
  371. ads/feature_store/query/query.py +403 -0
  372. ads/feature_store/query/validator/__init__.py +0 -0
  373. ads/feature_store/query/validator/query_validator.py +57 -0
  374. ads/feature_store/response/__init__.py +0 -0
  375. ads/feature_store/response/response_builder.py +68 -0
  376. ads/feature_store/service/__init__.py +0 -0
  377. ads/feature_store/service/oci_dataset.py +139 -0
  378. ads/feature_store/service/oci_dataset_job.py +199 -0
  379. ads/feature_store/service/oci_entity.py +125 -0
  380. ads/feature_store/service/oci_feature_group.py +164 -0
  381. ads/feature_store/service/oci_feature_group_job.py +214 -0
  382. ads/feature_store/service/oci_feature_store.py +182 -0
  383. ads/feature_store/service/oci_lineage.py +87 -0
  384. ads/feature_store/service/oci_transformation.py +104 -0
  385. ads/feature_store/statistics/__init__.py +0 -0
  386. ads/feature_store/statistics/abs_feature_value.py +49 -0
  387. ads/feature_store/statistics/charts/__init__.py +0 -0
  388. ads/feature_store/statistics/charts/abstract_feature_plot.py +37 -0
  389. ads/feature_store/statistics/charts/box_plot.py +148 -0
  390. ads/feature_store/statistics/charts/frequency_distribution.py +65 -0
  391. ads/feature_store/statistics/charts/probability_distribution.py +68 -0
  392. ads/feature_store/statistics/charts/top_k_frequent_elements.py +98 -0
  393. ads/feature_store/statistics/feature_stat.py +126 -0
  394. ads/feature_store/statistics/generic_feature_value.py +33 -0
  395. ads/feature_store/statistics/statistics.py +41 -0
  396. ads/feature_store/statistics_config.py +101 -0
  397. ads/feature_store/templates/feature_store_template.yaml +45 -0
  398. ads/feature_store/transformation.py +499 -0
  399. ads/feature_store/validation_output.py +57 -0
  400. ads/hpo/__init__.py +9 -0
  401. ads/hpo/_imports.py +91 -0
  402. ads/hpo/ads_search_space.py +439 -0
  403. ads/hpo/distributions.py +325 -0
  404. ads/hpo/objective.py +280 -0
  405. ads/hpo/search_cv.py +1657 -0
  406. ads/hpo/stopping_criterion.py +75 -0
  407. ads/hpo/tuner_artifact.py +413 -0
  408. ads/hpo/utils.py +91 -0
  409. ads/hpo/validation.py +140 -0
  410. ads/hpo/visualization/__init__.py +5 -0
  411. ads/hpo/visualization/_contour.py +23 -0
  412. ads/hpo/visualization/_edf.py +20 -0
  413. ads/hpo/visualization/_intermediate_values.py +21 -0
  414. ads/hpo/visualization/_optimization_history.py +25 -0
  415. ads/hpo/visualization/_parallel_coordinate.py +169 -0
  416. ads/hpo/visualization/_param_importances.py +26 -0
  417. ads/jobs/__init__.py +53 -0
  418. ads/jobs/ads_job.py +663 -0
  419. ads/jobs/builders/__init__.py +5 -0
  420. ads/jobs/builders/base.py +156 -0
  421. ads/jobs/builders/infrastructure/__init__.py +6 -0
  422. ads/jobs/builders/infrastructure/base.py +165 -0
  423. ads/jobs/builders/infrastructure/dataflow.py +1252 -0
  424. ads/jobs/builders/infrastructure/dsc_job.py +1894 -0
  425. ads/jobs/builders/infrastructure/dsc_job_runtime.py +1233 -0
  426. ads/jobs/builders/infrastructure/utils.py +65 -0
  427. ads/jobs/builders/runtimes/__init__.py +5 -0
  428. ads/jobs/builders/runtimes/artifact.py +338 -0
  429. ads/jobs/builders/runtimes/base.py +325 -0
  430. ads/jobs/builders/runtimes/container_runtime.py +242 -0
  431. ads/jobs/builders/runtimes/python_runtime.py +1016 -0
  432. ads/jobs/builders/runtimes/pytorch_runtime.py +204 -0
  433. ads/jobs/cli.py +104 -0
  434. ads/jobs/env_var_parser.py +131 -0
  435. ads/jobs/extension.py +160 -0
  436. ads/jobs/schema/__init__.py +5 -0
  437. ads/jobs/schema/infrastructure_schema.json +116 -0
  438. ads/jobs/schema/job_schema.json +42 -0
  439. ads/jobs/schema/runtime_schema.json +183 -0
  440. ads/jobs/schema/validator.py +141 -0
  441. ads/jobs/serializer.py +296 -0
  442. ads/jobs/templates/__init__.py +5 -0
  443. ads/jobs/templates/container.py +6 -0
  444. ads/jobs/templates/driver_notebook.py +177 -0
  445. ads/jobs/templates/driver_oci.py +500 -0
  446. ads/jobs/templates/driver_python.py +48 -0
  447. ads/jobs/templates/driver_pytorch.py +852 -0
  448. ads/jobs/templates/driver_utils.py +615 -0
  449. ads/jobs/templates/hostname_from_env.c +55 -0
  450. ads/jobs/templates/oci_metrics.py +181 -0
  451. ads/jobs/utils.py +104 -0
  452. ads/llm/__init__.py +28 -0
  453. ads/llm/autogen/__init__.py +2 -0
  454. ads/llm/autogen/constants.py +15 -0
  455. ads/llm/autogen/reports/__init__.py +2 -0
  456. ads/llm/autogen/reports/base.py +67 -0
  457. ads/llm/autogen/reports/data.py +103 -0
  458. ads/llm/autogen/reports/session.py +526 -0
  459. ads/llm/autogen/reports/templates/chat_box.html +13 -0
  460. ads/llm/autogen/reports/templates/chat_box_lt.html +5 -0
  461. ads/llm/autogen/reports/templates/chat_box_rt.html +6 -0
  462. ads/llm/autogen/reports/utils.py +56 -0
  463. ads/llm/autogen/v02/__init__.py +4 -0
  464. ads/llm/autogen/v02/client.py +295 -0
  465. ads/llm/autogen/v02/log_handlers/__init__.py +2 -0
  466. ads/llm/autogen/v02/log_handlers/oci_file_handler.py +83 -0
  467. ads/llm/autogen/v02/loggers/__init__.py +6 -0
  468. ads/llm/autogen/v02/loggers/metric_logger.py +320 -0
  469. ads/llm/autogen/v02/loggers/session_logger.py +580 -0
  470. ads/llm/autogen/v02/loggers/utils.py +86 -0
  471. ads/llm/autogen/v02/runtime_logging.py +163 -0
  472. ads/llm/chain.py +268 -0
  473. ads/llm/chat_template.py +31 -0
  474. ads/llm/deploy.py +63 -0
  475. ads/llm/guardrails/__init__.py +5 -0
  476. ads/llm/guardrails/base.py +442 -0
  477. ads/llm/guardrails/huggingface.py +44 -0
  478. ads/llm/langchain/__init__.py +5 -0
  479. ads/llm/langchain/plugins/__init__.py +5 -0
  480. ads/llm/langchain/plugins/chat_models/__init__.py +5 -0
  481. ads/llm/langchain/plugins/chat_models/oci_data_science.py +1027 -0
  482. ads/llm/langchain/plugins/embeddings/__init__.py +4 -0
  483. ads/llm/langchain/plugins/embeddings/oci_data_science_model_deployment_endpoint.py +184 -0
  484. ads/llm/langchain/plugins/llms/__init__.py +5 -0
  485. ads/llm/langchain/plugins/llms/oci_data_science_model_deployment_endpoint.py +979 -0
  486. ads/llm/requirements.txt +3 -0
  487. ads/llm/serialize.py +219 -0
  488. ads/llm/serializers/__init__.py +0 -0
  489. ads/llm/serializers/retrieval_qa.py +153 -0
  490. ads/llm/serializers/runnable_parallel.py +27 -0
  491. ads/llm/templates/score_chain.jinja2 +155 -0
  492. ads/llm/templates/tool_chat_template_hermes.jinja +130 -0
  493. ads/llm/templates/tool_chat_template_mistral_parallel.jinja +94 -0
  494. ads/model/__init__.py +52 -0
  495. ads/model/artifact.py +573 -0
  496. ads/model/artifact_downloader.py +254 -0
  497. ads/model/artifact_uploader.py +267 -0
  498. ads/model/base_properties.py +238 -0
  499. ads/model/common/.model-ignore +66 -0
  500. ads/model/common/__init__.py +5 -0
  501. ads/model/common/utils.py +142 -0
  502. ads/model/datascience_model.py +2635 -0
  503. ads/model/deployment/__init__.py +20 -0
  504. ads/model/deployment/common/__init__.py +5 -0
  505. ads/model/deployment/common/utils.py +308 -0
  506. ads/model/deployment/model_deployer.py +466 -0
  507. ads/model/deployment/model_deployment.py +1846 -0
  508. ads/model/deployment/model_deployment_infrastructure.py +671 -0
  509. ads/model/deployment/model_deployment_properties.py +493 -0
  510. ads/model/deployment/model_deployment_runtime.py +838 -0
  511. ads/model/extractor/__init__.py +5 -0
  512. ads/model/extractor/automl_extractor.py +74 -0
  513. ads/model/extractor/embedding_onnx_extractor.py +80 -0
  514. ads/model/extractor/huggingface_extractor.py +88 -0
  515. ads/model/extractor/keras_extractor.py +84 -0
  516. ads/model/extractor/lightgbm_extractor.py +93 -0
  517. ads/model/extractor/model_info_extractor.py +114 -0
  518. ads/model/extractor/model_info_extractor_factory.py +105 -0
  519. ads/model/extractor/pytorch_extractor.py +87 -0
  520. ads/model/extractor/sklearn_extractor.py +112 -0
  521. ads/model/extractor/spark_extractor.py +89 -0
  522. ads/model/extractor/tensorflow_extractor.py +85 -0
  523. ads/model/extractor/xgboost_extractor.py +94 -0
  524. ads/model/framework/__init__.py +5 -0
  525. ads/model/framework/automl_model.py +178 -0
  526. ads/model/framework/embedding_onnx_model.py +438 -0
  527. ads/model/framework/huggingface_model.py +399 -0
  528. ads/model/framework/lightgbm_model.py +266 -0
  529. ads/model/framework/pytorch_model.py +266 -0
  530. ads/model/framework/sklearn_model.py +250 -0
  531. ads/model/framework/spark_model.py +326 -0
  532. ads/model/framework/tensorflow_model.py +254 -0
  533. ads/model/framework/xgboost_model.py +258 -0
  534. ads/model/generic_model.py +3518 -0
  535. ads/model/model_artifact_boilerplate/README.md +381 -0
  536. ads/model/model_artifact_boilerplate/__init__.py +5 -0
  537. ads/model/model_artifact_boilerplate/artifact_introspection_test/__init__.py +5 -0
  538. ads/model/model_artifact_boilerplate/artifact_introspection_test/model_artifact_validate.py +427 -0
  539. ads/model/model_artifact_boilerplate/artifact_introspection_test/requirements.txt +2 -0
  540. ads/model/model_artifact_boilerplate/runtime.yaml +7 -0
  541. ads/model/model_artifact_boilerplate/score.py +61 -0
  542. ads/model/model_file_description_schema.json +68 -0
  543. ads/model/model_introspect.py +331 -0
  544. ads/model/model_metadata.py +1810 -0
  545. ads/model/model_metadata_mixin.py +460 -0
  546. ads/model/model_properties.py +63 -0
  547. ads/model/model_version_set.py +739 -0
  548. ads/model/runtime/__init__.py +5 -0
  549. ads/model/runtime/env_info.py +306 -0
  550. ads/model/runtime/model_deployment_details.py +37 -0
  551. ads/model/runtime/model_provenance_details.py +58 -0
  552. ads/model/runtime/runtime_info.py +81 -0
  553. ads/model/runtime/schemas/inference_env_info_schema.yaml +16 -0
  554. ads/model/runtime/schemas/model_provenance_schema.yaml +36 -0
  555. ads/model/runtime/schemas/training_env_info_schema.yaml +16 -0
  556. ads/model/runtime/utils.py +201 -0
  557. ads/model/serde/__init__.py +5 -0
  558. ads/model/serde/common.py +40 -0
  559. ads/model/serde/model_input.py +547 -0
  560. ads/model/serde/model_serializer.py +1184 -0
  561. ads/model/service/__init__.py +5 -0
  562. ads/model/service/oci_datascience_model.py +1076 -0
  563. ads/model/service/oci_datascience_model_deployment.py +500 -0
  564. ads/model/service/oci_datascience_model_version_set.py +176 -0
  565. ads/model/transformer/__init__.py +5 -0
  566. ads/model/transformer/onnx_transformer.py +324 -0
  567. ads/mysqldb/__init__.py +5 -0
  568. ads/mysqldb/mysql_db.py +227 -0
  569. ads/opctl/__init__.py +18 -0
  570. ads/opctl/anomaly_detection.py +11 -0
  571. ads/opctl/backend/__init__.py +5 -0
  572. ads/opctl/backend/ads_dataflow.py +353 -0
  573. ads/opctl/backend/ads_ml_job.py +710 -0
  574. ads/opctl/backend/ads_ml_pipeline.py +164 -0
  575. ads/opctl/backend/ads_model_deployment.py +209 -0
  576. ads/opctl/backend/base.py +146 -0
  577. ads/opctl/backend/local.py +1053 -0
  578. ads/opctl/backend/marketplace/__init__.py +9 -0
  579. ads/opctl/backend/marketplace/helm_helper.py +173 -0
  580. ads/opctl/backend/marketplace/local_marketplace.py +271 -0
  581. ads/opctl/backend/marketplace/marketplace_backend_runner.py +71 -0
  582. ads/opctl/backend/marketplace/marketplace_operator_interface.py +44 -0
  583. ads/opctl/backend/marketplace/marketplace_operator_runner.py +24 -0
  584. ads/opctl/backend/marketplace/marketplace_utils.py +212 -0
  585. ads/opctl/backend/marketplace/models/__init__.py +5 -0
  586. ads/opctl/backend/marketplace/models/bearer_token.py +94 -0
  587. ads/opctl/backend/marketplace/models/marketplace_type.py +70 -0
  588. ads/opctl/backend/marketplace/models/ocir_details.py +56 -0
  589. ads/opctl/backend/marketplace/prerequisite_checker.py +238 -0
  590. ads/opctl/cli.py +707 -0
  591. ads/opctl/cmds.py +869 -0
  592. ads/opctl/conda/__init__.py +5 -0
  593. ads/opctl/conda/cli.py +193 -0
  594. ads/opctl/conda/cmds.py +749 -0
  595. ads/opctl/conda/config.yaml +34 -0
  596. ads/opctl/conda/manifest_template.yaml +13 -0
  597. ads/opctl/conda/multipart_uploader.py +188 -0
  598. ads/opctl/conda/pack.py +89 -0
  599. ads/opctl/config/__init__.py +5 -0
  600. ads/opctl/config/base.py +57 -0
  601. ads/opctl/config/diagnostics/__init__.py +5 -0
  602. ads/opctl/config/diagnostics/distributed/default_requirements_config.yaml +62 -0
  603. ads/opctl/config/merger.py +255 -0
  604. ads/opctl/config/resolver.py +297 -0
  605. ads/opctl/config/utils.py +79 -0
  606. ads/opctl/config/validator.py +17 -0
  607. ads/opctl/config/versioner.py +68 -0
  608. ads/opctl/config/yaml_parsers/__init__.py +7 -0
  609. ads/opctl/config/yaml_parsers/base.py +58 -0
  610. ads/opctl/config/yaml_parsers/distributed/__init__.py +7 -0
  611. ads/opctl/config/yaml_parsers/distributed/yaml_parser.py +201 -0
  612. ads/opctl/constants.py +66 -0
  613. ads/opctl/decorator/__init__.py +5 -0
  614. ads/opctl/decorator/common.py +129 -0
  615. ads/opctl/diagnostics/__init__.py +5 -0
  616. ads/opctl/diagnostics/__main__.py +25 -0
  617. ads/opctl/diagnostics/check_distributed_job_requirements.py +212 -0
  618. ads/opctl/diagnostics/check_requirements.py +144 -0
  619. ads/opctl/diagnostics/requirement_exception.py +9 -0
  620. ads/opctl/distributed/README.md +109 -0
  621. ads/opctl/distributed/__init__.py +5 -0
  622. ads/opctl/distributed/certificates.py +32 -0
  623. ads/opctl/distributed/cli.py +207 -0
  624. ads/opctl/distributed/cmds.py +731 -0
  625. ads/opctl/distributed/common/__init__.py +5 -0
  626. ads/opctl/distributed/common/abstract_cluster_provider.py +449 -0
  627. ads/opctl/distributed/common/abstract_framework_spec_builder.py +88 -0
  628. ads/opctl/distributed/common/cluster_config_helper.py +103 -0
  629. ads/opctl/distributed/common/cluster_provider_factory.py +21 -0
  630. ads/opctl/distributed/common/cluster_runner.py +54 -0
  631. ads/opctl/distributed/common/framework_factory.py +29 -0
  632. ads/opctl/docker/Dockerfile.job +103 -0
  633. ads/opctl/docker/Dockerfile.job.arm +107 -0
  634. ads/opctl/docker/Dockerfile.job.gpu +175 -0
  635. ads/opctl/docker/base-env.yaml +13 -0
  636. ads/opctl/docker/cuda.repo +6 -0
  637. ads/opctl/docker/operator/.dockerignore +0 -0
  638. ads/opctl/docker/operator/Dockerfile +41 -0
  639. ads/opctl/docker/operator/Dockerfile.gpu +85 -0
  640. ads/opctl/docker/operator/cuda.repo +6 -0
  641. ads/opctl/docker/operator/environment.yaml +8 -0
  642. ads/opctl/forecast.py +11 -0
  643. ads/opctl/index.yaml +3 -0
  644. ads/opctl/model/__init__.py +5 -0
  645. ads/opctl/model/cli.py +65 -0
  646. ads/opctl/model/cmds.py +73 -0
  647. ads/opctl/operator/README.md +4 -0
  648. ads/opctl/operator/__init__.py +31 -0
  649. ads/opctl/operator/cli.py +344 -0
  650. ads/opctl/operator/cmd.py +596 -0
  651. ads/opctl/operator/common/__init__.py +5 -0
  652. ads/opctl/operator/common/backend_factory.py +460 -0
  653. ads/opctl/operator/common/const.py +27 -0
  654. ads/opctl/operator/common/data/synthetic.csv +16001 -0
  655. ads/opctl/operator/common/dictionary_merger.py +148 -0
  656. ads/opctl/operator/common/errors.py +42 -0
  657. ads/opctl/operator/common/operator_config.py +99 -0
  658. ads/opctl/operator/common/operator_loader.py +811 -0
  659. ads/opctl/operator/common/operator_schema.yaml +130 -0
  660. ads/opctl/operator/common/operator_yaml_generator.py +152 -0
  661. ads/opctl/operator/common/utils.py +208 -0
  662. ads/opctl/operator/lowcode/__init__.py +5 -0
  663. ads/opctl/operator/lowcode/anomaly/MLoperator +16 -0
  664. ads/opctl/operator/lowcode/anomaly/README.md +207 -0
  665. ads/opctl/operator/lowcode/anomaly/__init__.py +5 -0
  666. ads/opctl/operator/lowcode/anomaly/__main__.py +103 -0
  667. ads/opctl/operator/lowcode/anomaly/cmd.py +35 -0
  668. ads/opctl/operator/lowcode/anomaly/const.py +167 -0
  669. ads/opctl/operator/lowcode/anomaly/environment.yaml +10 -0
  670. ads/opctl/operator/lowcode/anomaly/model/__init__.py +5 -0
  671. ads/opctl/operator/lowcode/anomaly/model/anomaly_dataset.py +146 -0
  672. ads/opctl/operator/lowcode/anomaly/model/anomaly_merlion.py +162 -0
  673. ads/opctl/operator/lowcode/anomaly/model/automlx.py +99 -0
  674. ads/opctl/operator/lowcode/anomaly/model/autots.py +115 -0
  675. ads/opctl/operator/lowcode/anomaly/model/base_model.py +404 -0
  676. ads/opctl/operator/lowcode/anomaly/model/factory.py +110 -0
  677. ads/opctl/operator/lowcode/anomaly/model/isolationforest.py +78 -0
  678. ads/opctl/operator/lowcode/anomaly/model/oneclasssvm.py +78 -0
  679. ads/opctl/operator/lowcode/anomaly/model/randomcutforest.py +120 -0
  680. ads/opctl/operator/lowcode/anomaly/model/tods.py +119 -0
  681. ads/opctl/operator/lowcode/anomaly/operator_config.py +127 -0
  682. ads/opctl/operator/lowcode/anomaly/schema.yaml +401 -0
  683. ads/opctl/operator/lowcode/anomaly/utils.py +88 -0
  684. ads/opctl/operator/lowcode/common/__init__.py +5 -0
  685. ads/opctl/operator/lowcode/common/const.py +10 -0
  686. ads/opctl/operator/lowcode/common/data.py +116 -0
  687. ads/opctl/operator/lowcode/common/errors.py +47 -0
  688. ads/opctl/operator/lowcode/common/transformations.py +296 -0
  689. ads/opctl/operator/lowcode/common/utils.py +384 -0
  690. ads/opctl/operator/lowcode/feature_store_marketplace/MLoperator +13 -0
  691. ads/opctl/operator/lowcode/feature_store_marketplace/README.md +30 -0
  692. ads/opctl/operator/lowcode/feature_store_marketplace/__init__.py +5 -0
  693. ads/opctl/operator/lowcode/feature_store_marketplace/__main__.py +116 -0
  694. ads/opctl/operator/lowcode/feature_store_marketplace/cmd.py +85 -0
  695. ads/opctl/operator/lowcode/feature_store_marketplace/const.py +15 -0
  696. ads/opctl/operator/lowcode/feature_store_marketplace/environment.yaml +0 -0
  697. ads/opctl/operator/lowcode/feature_store_marketplace/models/__init__.py +4 -0
  698. ads/opctl/operator/lowcode/feature_store_marketplace/models/apigw_config.py +32 -0
  699. ads/opctl/operator/lowcode/feature_store_marketplace/models/db_config.py +43 -0
  700. ads/opctl/operator/lowcode/feature_store_marketplace/models/mysql_config.py +120 -0
  701. ads/opctl/operator/lowcode/feature_store_marketplace/models/serializable_yaml_model.py +34 -0
  702. ads/opctl/operator/lowcode/feature_store_marketplace/operator_utils.py +386 -0
  703. ads/opctl/operator/lowcode/feature_store_marketplace/schema.yaml +160 -0
  704. ads/opctl/operator/lowcode/forecast/MLoperator +25 -0
  705. ads/opctl/operator/lowcode/forecast/README.md +209 -0
  706. ads/opctl/operator/lowcode/forecast/__init__.py +5 -0
  707. ads/opctl/operator/lowcode/forecast/__main__.py +89 -0
  708. ads/opctl/operator/lowcode/forecast/cmd.py +40 -0
  709. ads/opctl/operator/lowcode/forecast/const.py +92 -0
  710. ads/opctl/operator/lowcode/forecast/environment.yaml +20 -0
  711. ads/opctl/operator/lowcode/forecast/errors.py +26 -0
  712. ads/opctl/operator/lowcode/forecast/model/__init__.py +5 -0
  713. ads/opctl/operator/lowcode/forecast/model/arima.py +279 -0
  714. ads/opctl/operator/lowcode/forecast/model/automlx.py +553 -0
  715. ads/opctl/operator/lowcode/forecast/model/autots.py +312 -0
  716. ads/opctl/operator/lowcode/forecast/model/base_model.py +875 -0
  717. ads/opctl/operator/lowcode/forecast/model/factory.py +106 -0
  718. ads/opctl/operator/lowcode/forecast/model/forecast_datasets.py +492 -0
  719. ads/opctl/operator/lowcode/forecast/model/ml_forecast.py +243 -0
  720. ads/opctl/operator/lowcode/forecast/model/neuralprophet.py +482 -0
  721. ads/opctl/operator/lowcode/forecast/model/prophet.py +445 -0
  722. ads/opctl/operator/lowcode/forecast/model_evaluator.py +244 -0
  723. ads/opctl/operator/lowcode/forecast/operator_config.py +234 -0
  724. ads/opctl/operator/lowcode/forecast/schema.yaml +506 -0
  725. ads/opctl/operator/lowcode/forecast/utils.py +397 -0
  726. ads/opctl/operator/lowcode/forecast/whatifserve/__init__.py +7 -0
  727. ads/opctl/operator/lowcode/forecast/whatifserve/deployment_manager.py +285 -0
  728. ads/opctl/operator/lowcode/forecast/whatifserve/score.py +246 -0
  729. ads/opctl/operator/lowcode/pii/MLoperator +17 -0
  730. ads/opctl/operator/lowcode/pii/README.md +208 -0
  731. ads/opctl/operator/lowcode/pii/__init__.py +5 -0
  732. ads/opctl/operator/lowcode/pii/__main__.py +78 -0
  733. ads/opctl/operator/lowcode/pii/cmd.py +39 -0
  734. ads/opctl/operator/lowcode/pii/constant.py +84 -0
  735. ads/opctl/operator/lowcode/pii/environment.yaml +17 -0
  736. ads/opctl/operator/lowcode/pii/errors.py +27 -0
  737. ads/opctl/operator/lowcode/pii/model/__init__.py +5 -0
  738. ads/opctl/operator/lowcode/pii/model/factory.py +82 -0
  739. ads/opctl/operator/lowcode/pii/model/guardrails.py +167 -0
  740. ads/opctl/operator/lowcode/pii/model/pii.py +145 -0
  741. ads/opctl/operator/lowcode/pii/model/processor/__init__.py +34 -0
  742. ads/opctl/operator/lowcode/pii/model/processor/email_replacer.py +34 -0
  743. ads/opctl/operator/lowcode/pii/model/processor/mbi_replacer.py +35 -0
  744. ads/opctl/operator/lowcode/pii/model/processor/name_replacer.py +225 -0
  745. ads/opctl/operator/lowcode/pii/model/processor/number_replacer.py +73 -0
  746. ads/opctl/operator/lowcode/pii/model/processor/remover.py +26 -0
  747. ads/opctl/operator/lowcode/pii/model/report.py +487 -0
  748. ads/opctl/operator/lowcode/pii/operator_config.py +95 -0
  749. ads/opctl/operator/lowcode/pii/schema.yaml +108 -0
  750. ads/opctl/operator/lowcode/pii/utils.py +43 -0
  751. ads/opctl/operator/lowcode/recommender/MLoperator +16 -0
  752. ads/opctl/operator/lowcode/recommender/README.md +206 -0
  753. ads/opctl/operator/lowcode/recommender/__init__.py +5 -0
  754. ads/opctl/operator/lowcode/recommender/__main__.py +82 -0
  755. ads/opctl/operator/lowcode/recommender/cmd.py +33 -0
  756. ads/opctl/operator/lowcode/recommender/constant.py +30 -0
  757. ads/opctl/operator/lowcode/recommender/environment.yaml +11 -0
  758. ads/opctl/operator/lowcode/recommender/model/base_model.py +212 -0
  759. ads/opctl/operator/lowcode/recommender/model/factory.py +56 -0
  760. ads/opctl/operator/lowcode/recommender/model/recommender_dataset.py +25 -0
  761. ads/opctl/operator/lowcode/recommender/model/svd.py +106 -0
  762. ads/opctl/operator/lowcode/recommender/operator_config.py +81 -0
  763. ads/opctl/operator/lowcode/recommender/schema.yaml +265 -0
  764. ads/opctl/operator/lowcode/recommender/utils.py +13 -0
  765. ads/opctl/operator/runtime/__init__.py +5 -0
  766. ads/opctl/operator/runtime/const.py +17 -0
  767. ads/opctl/operator/runtime/container_runtime_schema.yaml +50 -0
  768. ads/opctl/operator/runtime/marketplace_runtime.py +50 -0
  769. ads/opctl/operator/runtime/python_marketplace_runtime_schema.yaml +21 -0
  770. ads/opctl/operator/runtime/python_runtime_schema.yaml +21 -0
  771. ads/opctl/operator/runtime/runtime.py +115 -0
  772. ads/opctl/schema.yaml.yml +36 -0
  773. ads/opctl/script.py +40 -0
  774. ads/opctl/spark/__init__.py +5 -0
  775. ads/opctl/spark/cli.py +43 -0
  776. ads/opctl/spark/cmds.py +147 -0
  777. ads/opctl/templates/diagnostic_report_template.jinja2 +102 -0
  778. ads/opctl/utils.py +344 -0
  779. ads/oracledb/__init__.py +5 -0
  780. ads/oracledb/oracle_db.py +346 -0
  781. ads/pipeline/__init__.py +39 -0
  782. ads/pipeline/ads_pipeline.py +2279 -0
  783. ads/pipeline/ads_pipeline_run.py +772 -0
  784. ads/pipeline/ads_pipeline_step.py +605 -0
  785. ads/pipeline/builders/__init__.py +5 -0
  786. ads/pipeline/builders/infrastructure/__init__.py +5 -0
  787. ads/pipeline/builders/infrastructure/custom_script.py +32 -0
  788. ads/pipeline/cli.py +119 -0
  789. ads/pipeline/extension.py +291 -0
  790. ads/pipeline/schema/__init__.py +5 -0
  791. ads/pipeline/schema/cs_step_schema.json +35 -0
  792. ads/pipeline/schema/ml_step_schema.json +31 -0
  793. ads/pipeline/schema/pipeline_schema.json +71 -0
  794. ads/pipeline/visualizer/__init__.py +5 -0
  795. ads/pipeline/visualizer/base.py +570 -0
  796. ads/pipeline/visualizer/graph_renderer.py +272 -0
  797. ads/pipeline/visualizer/text_renderer.py +84 -0
  798. ads/secrets/__init__.py +11 -0
  799. ads/secrets/adb.py +386 -0
  800. ads/secrets/auth_token.py +86 -0
  801. ads/secrets/big_data_service.py +365 -0
  802. ads/secrets/mysqldb.py +149 -0
  803. ads/secrets/oracledb.py +160 -0
  804. ads/secrets/secrets.py +407 -0
  805. ads/telemetry/__init__.py +7 -0
  806. ads/telemetry/base.py +69 -0
  807. ads/telemetry/client.py +125 -0
  808. ads/telemetry/telemetry.py +257 -0
  809. ads/templates/dataflow_pyspark.jinja2 +13 -0
  810. ads/templates/dataflow_sparksql.jinja2 +22 -0
  811. ads/templates/func.jinja2 +20 -0
  812. ads/templates/schemas/openapi.json +1740 -0
  813. ads/templates/score-pkl.jinja2 +173 -0
  814. ads/templates/score.jinja2 +322 -0
  815. ads/templates/score_embedding_onnx.jinja2 +202 -0
  816. ads/templates/score_generic.jinja2 +165 -0
  817. ads/templates/score_huggingface_pipeline.jinja2 +217 -0
  818. ads/templates/score_lightgbm.jinja2 +185 -0
  819. ads/templates/score_onnx.jinja2 +407 -0
  820. ads/templates/score_onnx_new.jinja2 +473 -0
  821. ads/templates/score_oracle_automl.jinja2 +185 -0
  822. ads/templates/score_pyspark.jinja2 +154 -0
  823. ads/templates/score_pytorch.jinja2 +219 -0
  824. ads/templates/score_scikit-learn.jinja2 +184 -0
  825. ads/templates/score_tensorflow.jinja2 +184 -0
  826. ads/templates/score_xgboost.jinja2 +178 -0
  827. ads/text_dataset/__init__.py +5 -0
  828. ads/text_dataset/backends.py +211 -0
  829. ads/text_dataset/dataset.py +445 -0
  830. ads/text_dataset/extractor.py +207 -0
  831. ads/text_dataset/options.py +53 -0
  832. ads/text_dataset/udfs.py +22 -0
  833. ads/text_dataset/utils.py +49 -0
  834. ads/type_discovery/__init__.py +9 -0
  835. ads/type_discovery/abstract_detector.py +21 -0
  836. ads/type_discovery/constant_detector.py +41 -0
  837. ads/type_discovery/continuous_detector.py +54 -0
  838. ads/type_discovery/credit_card_detector.py +99 -0
  839. ads/type_discovery/datetime_detector.py +92 -0
  840. ads/type_discovery/discrete_detector.py +118 -0
  841. ads/type_discovery/document_detector.py +146 -0
  842. ads/type_discovery/ip_detector.py +68 -0
  843. ads/type_discovery/latlon_detector.py +90 -0
  844. ads/type_discovery/phone_number_detector.py +63 -0
  845. ads/type_discovery/type_discovery_driver.py +87 -0
  846. ads/type_discovery/typed_feature.py +594 -0
  847. ads/type_discovery/unknown_detector.py +41 -0
  848. ads/type_discovery/zipcode_detector.py +48 -0
  849. ads/vault/__init__.py +7 -0
  850. ads/vault/vault.py +237 -0
  851. {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.9rc1.dist-info}/METADATA +150 -150
  852. oracle_ads-2.13.9rc1.dist-info/RECORD +858 -0
  853. {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.9rc1.dist-info}/WHEEL +1 -2
  854. {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.9rc1.dist-info}/entry_points.txt +2 -1
  855. oracle_ads-2.13.9rc0.dist-info/RECORD +0 -9
  856. oracle_ads-2.13.9rc0.dist-info/top_level.txt +0 -1
  857. {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.9rc1.dist-info}/licenses/LICENSE.txt +0 -0
ads/common/auth.py ADDED
@@ -0,0 +1,1122 @@
1
+ #!/usr/bin/env python
2
+
3
+ # Copyright (c) 2021, 2025 Oracle and/or its affiliates.
4
+ # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
5
+
6
+ import copy
7
+ import os
8
+ import time
9
+ from dataclasses import dataclass
10
+ from datetime import datetime
11
+ from typing import Any, Callable, Dict, Optional, Union
12
+
13
+ import oci
14
+ from oci.config import (
15
+ DEFAULT_LOCATION, # "~/.oci/config"
16
+ DEFAULT_PROFILE, # "DEFAULT"
17
+ )
18
+
19
+ import ads.telemetry
20
+ from ads.common import logger
21
+ from ads.common.decorator.deprecate import deprecated
22
+ from ads.common.extended_enum import ExtendedEnum
23
+
24
+ SECURITY_TOKEN_LEFT_TIME = 600
25
+
26
+
27
+ class SecurityTokenError(Exception): # pragma: no cover
28
+ pass
29
+
30
+
31
+ class AuthType(ExtendedEnum):
32
+ API_KEY = "api_key"
33
+ RESOURCE_PRINCIPAL = "resource_principal"
34
+ INSTANCE_PRINCIPAL = "instance_principal"
35
+ SECURITY_TOKEN = "security_token"
36
+
37
+
38
+ class SingletonMeta(type):
39
+ _instances = {}
40
+
41
+ def __call__(cls, *args, **kwargs):
42
+ if cls not in cls._instances:
43
+ cls._instances[cls] = super().__call__(*args, **kwargs)
44
+ return cls._instances[cls]
45
+
46
+
47
+ @dataclass()
48
+ class AuthState(metaclass=SingletonMeta):
49
+ """
50
+ Class stores state of variables specified for auth method, configuration,
51
+ configuration file location, profile name, signer or signer_callable, which
52
+ set by use at any given time and can be provided by this class in any ADS module.
53
+ """
54
+
55
+ oci_iam_type: str = None
56
+ oci_cli_auth: str = None
57
+ oci_config_path: str = None
58
+ oci_key_profile: str = None
59
+ oci_config: Dict = None
60
+ oci_signer: Any = None
61
+ oci_signer_callable: Callable = None
62
+ oci_signer_kwargs: Dict = None
63
+ oci_client_kwargs: Dict = None
64
+
65
+ def __post_init__(self):
66
+ self.oci_iam_type = self.oci_iam_type or os.environ.get(
67
+ "OCI_IAM_TYPE", AuthType.API_KEY
68
+ )
69
+ self.oci_cli_auth = self.oci_cli_auth or os.environ.get(
70
+ "OCI_CLI_AUTH", AuthType.RESOURCE_PRINCIPAL
71
+ )
72
+ self.oci_config_path = self.oci_config_path or os.environ.get(
73
+ "OCI_CONFIG_LOCATION", DEFAULT_LOCATION
74
+ )
75
+ self.oci_key_profile = self.oci_key_profile or os.environ.get(
76
+ "OCI_CONFIG_PROFILE", DEFAULT_PROFILE
77
+ )
78
+ self.oci_config = (
79
+ self.oci_config or {"region": os.environ["OCI_RESOURCE_REGION"]}
80
+ if os.environ.get("OCI_RESOURCE_REGION")
81
+ else {}
82
+ )
83
+ self.oci_signer_kwargs = self.oci_signer_kwargs or {}
84
+ self.oci_client_kwargs = self.oci_client_kwargs or {}
85
+
86
+
87
+ def set_auth(
88
+ auth: Optional[str] = AuthType.API_KEY,
89
+ oci_config_location: Optional[str] = DEFAULT_LOCATION,
90
+ profile: Optional[str] = DEFAULT_PROFILE,
91
+ config: Optional[Dict] = (
92
+ {"region": os.environ["OCI_RESOURCE_REGION"]}
93
+ if os.environ.get("OCI_RESOURCE_REGION")
94
+ else {}
95
+ ),
96
+ signer: Optional[Any] = None,
97
+ signer_callable: Optional[Callable] = None,
98
+ signer_kwargs: Optional[Dict] = None,
99
+ client_kwargs: Optional[Dict] = None,
100
+ ) -> None:
101
+ """
102
+ Sets the default authentication type.
103
+
104
+ Parameters
105
+ ----------
106
+ auth: Optional[str], default 'api_key'
107
+ 'api_key', 'resource_principal' or 'instance_principal'. Enable/disable resource principal identity,
108
+ instance principal or keypair identity in a notebook session
109
+ oci_config_location: Optional[str], default '~/.oci/config'
110
+ config file location
111
+ profile: Optional[str], default is DEFAULT_PROFILE, which is 'DEFAULT'
112
+ profile name for api keys config file
113
+ config: Optional[Dict], default {}
114
+ created config dictionary
115
+ signer: Optional[Any], default None
116
+ created signer, can be resource principals signer, instance principal signer or other.
117
+ Check documentation for more signers: https://docs.oracle.com/en-us/iaas/tools/python/latest/api/signing.html
118
+ signer_callable: Optional[Callable], default None
119
+ a callable object that returns signer
120
+ signer_kwargs: Optional[Dict], default None
121
+ parameters accepted by the signer.
122
+ Check documentation: https://docs.oracle.com/en-us/iaas/tools/python/latest/api/signing.html
123
+ client_kwargs: Optional[Dict], default None
124
+ Additional keyword arguments for initializing the OCI client.
125
+ Example: client_kwargs = {"timeout": 60}
126
+
127
+ Examples
128
+ --------
129
+ >>> ads.set_auth("api_key") # default signer is set to api keys
130
+
131
+ >>> ads.set_auth("api_key", profile = "TEST") # default signer is set to api keys and to use TEST profile
132
+
133
+ >>> ads.set_auth("api_key", oci_config_location = "other_config_location") # use non-default oci_config_location
134
+
135
+ >>> ads.set_auth("api_key", client_kwargs={"timeout": 60}) # default signer with connection and read timeouts set to 60 seconds for the client.
136
+
137
+ >>> other_config = oci.config.from_file("other_config_location", "OTHER_PROFILE") # Create non-default config
138
+ >>> ads.set_auth(config=other_config) # Set api keys type of authentication based on provided config
139
+
140
+ >>> config={
141
+ ... user=ocid1.user.oc1..<unique_ID>,
142
+ ... fingerprint=<fingerprint>,
143
+ ... tenancy=ocid1.tenancy.oc1..<unique_ID>,
144
+ ... region=us-ashburn-1,
145
+ ... key_content=<private key content>,
146
+ ... }
147
+ >>> ads.set_auth(config=config) # Set api key authentication using private key content based on provided config
148
+
149
+ >>> config={
150
+ ... user=ocid1.user.oc1..<unique_ID>,
151
+ ... fingerprint=<fingerprint>,
152
+ ... tenancy=ocid1.tenancy.oc1..<unique_ID>,
153
+ ... region=us-ashburn-1,
154
+ ... key_file=~/.oci/oci_api_key.pem,
155
+ ... }
156
+ >>> ads.set_auth(config=config) # Set api key authentication using private key file location based on provided config
157
+
158
+ >>> ads.set_auth("resource_principal") # Set resource principal authentication
159
+
160
+ >>> ads.set_auth("instance_principal") # Set instance principal authentication
161
+
162
+ >>> ads.set_auth("security_token") # Set security token authentication
163
+
164
+ >>> config = dict(
165
+ ... region=us-ashburn-1,
166
+ ... key_file=~/.oci/sessions/DEFAULT/oci_api_key.pem,
167
+ ... security_token_file=~/.oci/sessions/DEFAULT/token
168
+ ... )
169
+ >>> ads.set_auth("security_token", config=config) # Set security token authentication from provided config
170
+
171
+ >>> signer = oci.signer.Signer(
172
+ ... user=ocid1.user.oc1..<unique_ID>,
173
+ ... fingerprint=<fingerprint>,
174
+ ... tenancy=ocid1.tenancy.oc1..<unique_ID>,
175
+ ... region=us-ashburn-1,
176
+ ... private_key_content=<private key content>,
177
+ ... )
178
+ >>> ads.set_auth(signer=signer) # Set api keys authentication with private key content based on provided signer
179
+
180
+ >>> signer = oci.signer.Signer(
181
+ ... user=ocid1.user.oc1..<unique_ID>,
182
+ ... fingerprint=<fingerprint>,
183
+ ... tenancy=ocid1.tenancy.oc1..<unique_ID>,
184
+ ... region=us-ashburn-1,
185
+ ... private_key_file_location=<private key content>,
186
+ ... )
187
+ >>> ads.set_auth(signer=signer) # Set api keys authentication with private key file location based on provided signer
188
+
189
+ >>> signer = oci.auth.signers.get_resource_principals_signer()
190
+ >>> ads.auth.create_signer(config={}, signer=signer) # resource principals authentication dictionary created
191
+
192
+ >>> signer_callable = oci.auth.signers.ResourcePrincipalsFederationSigner
193
+ >>> ads.set_auth(signer_callable=signer_callable) # Set resource principal federation signer callable
194
+
195
+ >>> signer_callable = oci.auth.signers.InstancePrincipalsSecurityTokenSigner
196
+ >>> signer_kwargs = dict(log_requests=True) # will log the request url and response data when retrieving
197
+ >>> # instance principals authentication dictionary created based on callable with kwargs parameters:
198
+ >>> ads.set_auth(signer_callable=signer_callable, signer_kwargs=signer_kwargs)
199
+ """
200
+ signer_kwargs = signer_kwargs or {}
201
+ client_kwargs = client_kwargs or {}
202
+
203
+ auth_state = AuthState()
204
+
205
+ valid_auth_keys = AuthFactory.classes.keys()
206
+ if auth in valid_auth_keys:
207
+ auth_state.oci_iam_type = auth
208
+ else:
209
+ raise ValueError(
210
+ f"Allowed values are: {valid_auth_keys}. If you wish to use other authentication form, "
211
+ f"pass a valid signer or use signer_callable and signer_kwargs"
212
+ )
213
+
214
+ if config and (
215
+ oci_config_location != DEFAULT_LOCATION or profile != DEFAULT_PROFILE
216
+ ):
217
+ raise ValueError(
218
+ "'config' and 'oci_config_location', 'profile' pair are mutually exclusive."
219
+ "Please specify 'config' OR 'oci_config_location', 'profile' pair."
220
+ )
221
+
222
+ auth_state.oci_config = config
223
+ auth_state.oci_key_profile = profile
224
+ auth_state.oci_config_path = oci_config_location
225
+ auth_state.oci_signer = signer
226
+ auth_state.oci_signer_callable = signer_callable
227
+ auth_state.oci_signer_kwargs = signer_kwargs
228
+ auth_state.oci_client_kwargs = client_kwargs
229
+
230
+
231
+ def api_keys(
232
+ oci_config: Union[str, Dict] = os.path.expanduser(DEFAULT_LOCATION),
233
+ profile: str = DEFAULT_PROFILE,
234
+ client_kwargs: Dict = None,
235
+ ) -> Dict:
236
+ """
237
+ Prepares authentication and extra arguments necessary for creating clients for different OCI services using API
238
+ Keys.
239
+
240
+ Parameters
241
+ ----------
242
+ oci_config: Optional[Union[str, Dict]], default is ~/.oci/config
243
+ OCI authentication config file location or a dictionary with config attributes.
244
+ profile: Optional[str], is DEFAULT_PROFILE, which is 'DEFAULT'
245
+ Profile name to select from the config file.
246
+ client_kwargs: Optional[Dict], default None
247
+ kwargs that are required to instantiate the Client if we need to override the defaults.
248
+
249
+ Returns
250
+ -------
251
+ dict
252
+ Contains keys - config, signer and client_kwargs.
253
+
254
+ - The config contains the config loaded from the configuration loaded from `oci_config`.
255
+ - The signer contains the signer object created from the api keys.
256
+ - client_kwargs contains the `client_kwargs` that was passed in as input parameter.
257
+
258
+ Examples
259
+ --------
260
+ >>> from ads.common import oci_client as oc
261
+ >>> auth = ads.auth.api_keys(oci_config="/home/datascience/.oci/config", profile="TEST", client_kwargs={"timeout": 6000})
262
+ >>> oc.OCIClientFactory(**auth).object_storage # Creates Object storage client with timeout set to 6000 using API Key authentication
263
+ """
264
+ signer_args = dict(
265
+ oci_config=oci_config if isinstance(oci_config, Dict) else {},
266
+ oci_config_location=(
267
+ oci_config
268
+ if isinstance(oci_config, str)
269
+ else os.path.expanduser(DEFAULT_LOCATION)
270
+ ),
271
+ oci_key_profile=profile,
272
+ client_kwargs=client_kwargs,
273
+ )
274
+ signer_generator = AuthFactory().signerGenerator(AuthType.API_KEY)
275
+ return signer_generator(signer_args).create_signer()
276
+
277
+
278
+ def resource_principal(
279
+ client_kwargs: Optional[Dict] = None,
280
+ ) -> Dict:
281
+ """
282
+ Prepares authentication and extra arguments necessary for creating clients for different OCI services using
283
+ Resource Principals.
284
+
285
+ Parameters
286
+ ----------
287
+ client_kwargs: Dict, default None
288
+ kwargs that are required to instantiate the Client if we need to override the defaults.
289
+
290
+ Returns
291
+ -------
292
+ dict
293
+ Contains keys - config, signer and client_kwargs.
294
+
295
+ - The config contains and empty dictionary.
296
+ - The signer contains the signer object created from the resource principal.
297
+ - client_kwargs contains the `client_kwargs` that was passed in as input parameter.
298
+
299
+ Examples
300
+ --------
301
+ >>> from ads.common import oci_client as oc
302
+ >>> auth = ads.auth.resource_principal({"timeout": 6000})
303
+ >>> oc.OCIClientFactory(**auth).object_storage # Creates Object Storage client with timeout set to 6000 seconds using resource principal authentication
304
+ """
305
+ signer_args = dict(client_kwargs=client_kwargs)
306
+ signer_generator = AuthFactory().signerGenerator(AuthType.RESOURCE_PRINCIPAL)
307
+ return signer_generator(signer_args).create_signer()
308
+
309
+
310
+ def security_token(
311
+ oci_config: Union[str, Dict] = os.path.expanduser(DEFAULT_LOCATION),
312
+ profile: str = DEFAULT_PROFILE,
313
+ client_kwargs: Dict = None,
314
+ ) -> Dict:
315
+ """
316
+ Prepares authentication and extra arguments necessary for creating clients for different OCI services using Security Token.
317
+
318
+ Parameters
319
+ ----------
320
+ oci_config: Optional[Union[str, Dict]], default is ~/.oci/config
321
+ OCI authentication config file location or a dictionary with config attributes.
322
+ profile: Optional[str], is DEFAULT_PROFILE, which is 'DEFAULT'
323
+ Profile name to select from the config file.
324
+ client_kwargs: Optional[Dict], default None
325
+ kwargs that are required to instantiate the Client if we need to override the defaults.
326
+
327
+ Returns
328
+ -------
329
+ dict
330
+ Contains keys - config, signer and client_kwargs.
331
+
332
+ - The config contains the config loaded from the configuration loaded from `oci_config`.
333
+ - The signer contains the signer object created from the security token.
334
+ - client_kwargs contains the `client_kwargs` that was passed in as input parameter.
335
+
336
+ Examples
337
+ --------
338
+ >>> from ads.common import oci_client as oc
339
+ >>> auth = ads.auth.security_token(oci_config="/home/datascience/.oci/config", profile="TEST", client_kwargs={"timeout": 6000})
340
+ >>> oc.OCIClientFactory(**auth).object_storage # Creates Object storage client with timeout set to 6000 using Security Token authentication
341
+ """
342
+ signer_args = dict(
343
+ oci_config=oci_config if isinstance(oci_config, Dict) else {},
344
+ oci_config_location=(
345
+ oci_config
346
+ if isinstance(oci_config, str)
347
+ else os.path.expanduser(DEFAULT_LOCATION)
348
+ ),
349
+ oci_key_profile=profile,
350
+ client_kwargs=client_kwargs,
351
+ )
352
+ signer_generator = AuthFactory().signerGenerator(AuthType.SECURITY_TOKEN)
353
+ return signer_generator(signer_args).create_signer()
354
+
355
+
356
+ def create_signer(
357
+ auth_type: Optional[str] = AuthType.API_KEY,
358
+ oci_config_location: Optional[str] = DEFAULT_LOCATION,
359
+ profile: Optional[str] = DEFAULT_PROFILE,
360
+ config: Optional[Dict] = {},
361
+ signer: Optional[Any] = None,
362
+ signer_callable: Optional[Callable] = None,
363
+ signer_kwargs: Optional[Dict] = {},
364
+ client_kwargs: Optional[Dict] = None,
365
+ ) -> Dict:
366
+ """
367
+ Prepares authentication and extra arguments necessary for creating clients for different OCI services based on
368
+ provided parameters. If `signer` or `signer`_callable` provided, authentication with that signer will be created.
369
+ If `config` provided, api_key type of authentication will be created. Accepted values for `auth_type`:
370
+ `api_key` (default), 'instance_principal', 'resource_principal'.
371
+
372
+ Parameters
373
+ ----------
374
+ auth_type: Optional[str], default 'api_key'
375
+ 'api_key', 'resource_principal' or 'instance_principal'. Enable/disable resource principal identity,
376
+ instance principal or keypair identity in a notebook session
377
+ oci_config_location: Optional[str], default oci.config.DEFAULT_LOCATION, which is '~/.oci/config'
378
+ config file location
379
+ profile: Optional[str], default is DEFAULT_PROFILE, which is 'DEFAULT'
380
+ profile name for api keys config file
381
+ config: Optional[Dict], default {}
382
+ created config dictionary
383
+ signer: Optional[Any], default None
384
+ created signer, can be resource principals signer, instance principal signer or other.
385
+ Check documentation for more signers: https://docs.oracle.com/en-us/iaas/tools/python/latest/api/signing.html
386
+ signer_callable: Optional[Callable], default None
387
+ a callable object that returns signer
388
+ signer_kwargs: Optional[Dict], default None
389
+ parameters accepted by the signer.
390
+ Check documentation: https://docs.oracle.com/en-us/iaas/tools/python/latest/api/signing.html
391
+ client_kwargs : dict
392
+ kwargs that are required to instantiate the Client if we need to override the defaults
393
+
394
+ Examples
395
+ --------
396
+ >>> import ads
397
+ >>> auth = ads.auth.create_signer() # api_key type of authentication dictionary created with default config location and default profile
398
+
399
+ >>> config = oci.config.from_file("other_config_location", "OTHER_PROFILE")
400
+ >>> auth = ads.auth.create_signer(config=config) # api_key type of authentication dictionary created based on provided config
401
+
402
+ >>> config={
403
+ ... user=ocid1.user.oc1..<unique_ID>,
404
+ ... fingerprint=<fingerprint>,
405
+ ... tenancy=ocid1.tenancy.oc1..<unique_ID>,
406
+ ... region=us-ashburn-1,
407
+ ... key_content=<private key content>,
408
+ ... }
409
+ >>> auth = ads.auth.create_signer(config=config) # api_key type of authentication dictionary with private key content created based on provided config
410
+
411
+ >>> config={
412
+ ... user=ocid1.user.oc1..<unique_ID>,
413
+ ... fingerprint=<fingerprint>,
414
+ ... tenancy=ocid1.tenancy.oc1..<unique_ID>,
415
+ ... region=us-ashburn-1,
416
+ ... key_file=~/.oci/oci_api_key.pem,
417
+ ... }
418
+ >>> auth = ads.auth.create_signer(config=config) # api_key type of authentication dictionary with private key file location created based on provided config
419
+
420
+ >>> signer = oci.auth.signers.get_resource_principals_signer()
421
+ >>> auth = ads.auth.create_signer(config={}, signer=signer) # resource principals authentication dictionary created
422
+
423
+ >>> auth = ads.auth.create_signer(auth_type='instance_principal') # instance principals authentication dictionary created
424
+
425
+ >>> signer_callable = oci.auth.signers.InstancePrincipalsSecurityTokenSigner
426
+ >>> signer_kwargs = dict(log_requests=True) # will log the request url and response data when retrieving
427
+ >>> auth = ads.auth.create_signer(signer_callable=signer_callable, signer_kwargs=signer_kwargs) # instance principals authentication dictionary created based on callable with kwargs parameters
428
+ >>> config = dict(
429
+ ... region=us-ashburn-1,
430
+ ... key_file=~/.oci/sessions/DEFAULT/oci_api_key.pem,
431
+ ... security_token_file=~/.oci/sessions/DEFAULT/token
432
+ ... )
433
+ >>> auth = ads.auth.create_signer(auth_type="security_token", config=config) # security token authentication created based on provided config
434
+ """
435
+ if signer or signer_callable:
436
+ configuration = ads.telemetry.update_oci_client_config(config)
437
+ if signer_callable:
438
+ signer = signer_callable(**signer_kwargs)
439
+ signer_dict = {
440
+ "config": configuration,
441
+ "signer": signer,
442
+ "client_kwargs": client_kwargs,
443
+ }
444
+ logger.debug(f"Using authentication signer type {type(signer)}.")
445
+ return signer_dict
446
+ else:
447
+ signer_args = dict(
448
+ oci_config_location=oci_config_location,
449
+ oci_key_profile=profile,
450
+ oci_config=config,
451
+ client_kwargs=client_kwargs,
452
+ )
453
+
454
+ signer_generator = AuthFactory().signerGenerator(auth_type)
455
+
456
+ return signer_generator(signer_args).create_signer()
457
+
458
+
459
+ def default_signer(client_kwargs: Optional[Dict] = None) -> Dict:
460
+ """
461
+ Prepares authentication and extra arguments necessary for creating clients for different OCI services based on
462
+ the default authentication setting for the session. Refer ads.set_auth API for further reference.
463
+
464
+ Parameters
465
+ ----------
466
+ client_kwargs : dict
467
+ kwargs that are required to instantiate the Client if we need to override the defaults.
468
+ Example: client_kwargs = {"timeout": 60}
469
+
470
+ Returns
471
+ -------
472
+ dict
473
+ Contains keys - config, signer and client_kwargs.
474
+
475
+ - The config contains the config loaded from the configuration loaded from the default location if the default
476
+ auth mode is API keys, otherwise it is empty dictionary.
477
+ - The signer contains the signer object created from default auth mode.
478
+ - client_kwargs contains the `client_kwargs` that was passed in as input parameter.
479
+
480
+ Examples
481
+ --------
482
+ >>> import ads
483
+ >>> from ads.common import oci_client as oc
484
+
485
+ >>> auth = ads.auth.default_signer()
486
+ >>> oc.OCIClientFactory(**auth).object_storage # Creates Object storage client
487
+
488
+ >>> ads.set_auth("resource_principal")
489
+ >>> auth = ads.auth.default_signer()
490
+ >>> oc.OCIClientFactory(**auth).object_storage # Creates Object storage client using resource principal authentication
491
+
492
+ >>> signer_callable = oci.auth.signers.InstancePrincipalsSecurityTokenSigner
493
+ >>> ads.set_auth(signer_callable=signer_callable) # Set instance principal callable
494
+ >>> auth = ads.auth.default_signer() # signer_callable instantiated
495
+ >>> oc.OCIClientFactory(**auth).object_storage # Creates Object storage client using instance principal authentication
496
+ """
497
+ auth_state = AuthState()
498
+ if auth_state.oci_signer or auth_state.oci_signer_callable:
499
+ configuration = ads.telemetry.update_oci_client_config(auth_state.oci_config)
500
+ signer = auth_state.oci_signer
501
+ if auth_state.oci_signer_callable:
502
+ signer_kwargs = auth_state.oci_signer_kwargs or {}
503
+ signer = auth_state.oci_signer_callable(**signer_kwargs)
504
+ signer_dict = {
505
+ "config": configuration,
506
+ "signer": signer,
507
+ "client_kwargs": {
508
+ **(auth_state.oci_client_kwargs or {}),
509
+ **(client_kwargs or {}),
510
+ },
511
+ }
512
+ logger.debug(f"Using authentication signer type {type(signer)}.")
513
+ return signer_dict
514
+ else:
515
+ signer_args = dict(
516
+ oci_config_location=auth_state.oci_config_path,
517
+ oci_key_profile=auth_state.oci_key_profile,
518
+ oci_config=auth_state.oci_config,
519
+ client_kwargs={
520
+ **(auth_state.oci_client_kwargs or {}),
521
+ **(client_kwargs or {}),
522
+ },
523
+ )
524
+ signer_generator = AuthFactory().signerGenerator(auth_state.oci_iam_type)
525
+ return signer_generator(signer_args).create_signer()
526
+
527
+
528
+ @deprecated(
529
+ "2.7.3",
530
+ details="Deprecated, use: from ads.common.auth import create_signer. https://accelerated-data-science.readthedocs.io/en/latest/user_guide/cli/authentication.html#overriding-defaults.",
531
+ )
532
+ def get_signer(
533
+ oci_config: Optional[str] = None, oci_profile: Optional[str] = None, **client_kwargs
534
+ ) -> Dict:
535
+ """
536
+ Provides config and signer based given parameters. If oci_config (api key config file location) and
537
+ oci_profile specified new signer will ge generated. Else signer of a type specified in OCI_CLI_AUTH
538
+ environment variable will be used to generate signer and return. If OCI_CLI_AUTH not set,
539
+ resource principal signer will be provided. Accepted values for OCI_CLI_AUTH: 'api_key',
540
+ 'instance_principal', 'resource_principal'.
541
+
542
+ Parameters
543
+ ----------
544
+ oci_config: Optional[str], default None
545
+ Path to the config file
546
+ oci_profile: Optional[str], default None
547
+ the profile to load from the config file
548
+ client_kwargs:
549
+ kwargs that are required to instantiate the Client if we need to override the defaults
550
+ """
551
+ if oci_config and oci_profile:
552
+ signer_args = dict(
553
+ oci_config_location=oci_config,
554
+ oci_key_profile=oci_profile,
555
+ client_kwargs=client_kwargs,
556
+ )
557
+ signer_generator = AuthFactory().signerGenerator(AuthType.API_KEY)
558
+ else:
559
+ oci_cli_auth = (
560
+ AuthState().oci_cli_auth
561
+ ) # "resource_principal", if env variable OCI_CLI_AUTH not set
562
+ valid_auth_keys = AuthFactory.classes.keys()
563
+ if oci_cli_auth not in valid_auth_keys:
564
+ oci_cli_auth = AuthType.RESOURCE_PRINCIPAL
565
+ signer_args = dict(
566
+ client_kwargs=client_kwargs,
567
+ )
568
+ signer_generator = AuthFactory().signerGenerator(oci_cli_auth)
569
+ return signer_generator(signer_args).create_signer()
570
+
571
+
572
+ class AuthSignerGenerator: # pragma: no cover
573
+ """
574
+ Abstract class for auth configuration and signer creation.
575
+ """
576
+
577
+ def create_signer(self):
578
+ pass
579
+
580
+
581
+ class APIKey(AuthSignerGenerator):
582
+ """
583
+ Creates api keys auth instance. This signer is intended to be used when signing requests for
584
+ a given user - it requires that user’s ID, their private key and certificate fingerprint.
585
+ It prepares extra arguments necessary for creating clients for variety of OCI services.
586
+ """
587
+
588
+ def __init__(self, args: Optional[Dict] = None):
589
+ """
590
+ Signer created based on args provided. If not provided current values of according arguments
591
+ will be used from current global state from AuthState class.
592
+
593
+ Parameters
594
+ ----------
595
+ args: dict
596
+ args that are required to create api key config and signer. Contains keys: oci_config,
597
+ oci_config_location, oci_key_profile, client_kwargs.
598
+
599
+ - oci_config is a configuration dict that can be used to create clients
600
+ - oci_config_location - path to config file
601
+ - oci_key_profile - the profile to load from config file
602
+ - client_kwargs - optional parameters for OCI client creation in next steps
603
+ """
604
+ self.oci_config = args.get("oci_config")
605
+ self.oci_config_location = args.get("oci_config_location")
606
+ self.oci_key_profile = args.get("oci_key_profile")
607
+ self.client_kwargs = args.get("client_kwargs")
608
+
609
+ def create_signer(self) -> Dict:
610
+ """
611
+ Creates api keys configuration and signer with extra arguments necessary for creating clients.
612
+ Signer constructed from the `oci_config` provided. If not 'oci_config', configuration will be
613
+ constructed from 'oci_config_location' and 'oci_key_profile' in place.
614
+
615
+ Returns
616
+ -------
617
+ dict
618
+ Contains keys - config, signer and client_kwargs.
619
+
620
+ - config contains the configuration information
621
+ - signer contains the signer object created. It is instantiated from signer_callable, or
622
+ signer provided in args used, or instantiated in place
623
+ - client_kwargs contains the `client_kwargs` that was passed in as input parameter
624
+
625
+ Examples
626
+ --------
627
+ >>> signer_args = dict(
628
+ >>> client_kwargs=client_kwargs
629
+ >>> )
630
+ >>> signer_generator = AuthFactory().signerGenerator(AuthType.API_KEY)
631
+ >>> signer_generator(signer_args).create_signer()
632
+ """
633
+ if self.oci_config:
634
+ configuration = ads.telemetry.update_oci_client_config(self.oci_config)
635
+ else:
636
+ configuration = ads.telemetry.update_oci_client_config(
637
+ oci.config.from_file(self.oci_config_location, self.oci_key_profile)
638
+ )
639
+
640
+ oci.config.validate_config(configuration)
641
+ logger.debug("Using 'api_key' authentication.")
642
+ return {
643
+ "config": configuration,
644
+ "signer": oci.signer.Signer(
645
+ tenancy=configuration["tenancy"],
646
+ user=configuration["user"],
647
+ fingerprint=configuration["fingerprint"],
648
+ private_key_file_location=configuration.get("key_file"),
649
+ pass_phrase=configuration.get("pass_phrase"),
650
+ private_key_content=configuration.get("key_content"),
651
+ ),
652
+ "client_kwargs": self.client_kwargs,
653
+ }
654
+
655
+
656
+ class ResourcePrincipal(AuthSignerGenerator):
657
+ """
658
+ Creates Resource Principal signer - a security token for a resource principal.
659
+ It prepares extra arguments necessary for creating clients for variety of OCI services.
660
+ """
661
+
662
+ def __init__(self, args: Optional[Dict] = None):
663
+ """
664
+ Signer created based on args provided. If not provided current values of according arguments
665
+ will be used from current global state from AuthState class.
666
+
667
+ Parameters
668
+ ----------
669
+ args: dict
670
+ args that are required to create Resource Principal signer. Contains keys: client_kwargs.
671
+
672
+ - client_kwargs - optional parameters for OCI client creation in next steps
673
+ """
674
+ self.client_kwargs = args.get("client_kwargs")
675
+
676
+ def create_signer(self) -> Dict:
677
+ """
678
+ Creates Resource Principal signer with extra arguments necessary for creating clients.
679
+
680
+ Returns
681
+ -------
682
+ dict
683
+ Contains keys - config, signer and client_kwargs.
684
+
685
+ - config contains the configuration information
686
+ - signer contains the signer object created. It is instantiated from signer_callable, or
687
+ signer provided in args used, or instantiated in place
688
+ - client_kwargs contains the `client_kwargs` that was passed in as input parameter
689
+
690
+ Examples
691
+ --------
692
+ >>> signer_args = dict(
693
+ >>> signer=oci.auth.signers.get_resource_principals_signer()
694
+ >>> )
695
+ >>> signer_generator = AuthFactory().signerGenerator(AuthType.RESOURCE_PRINCIPAL)
696
+ >>> signer_generator(signer_args).create_signer()
697
+ """
698
+ configuration = ads.telemetry.update_oci_client_config(AuthState().oci_config)
699
+ signer_dict = {
700
+ "config": configuration,
701
+ "signer": oci.auth.signers.get_resource_principals_signer(),
702
+ "client_kwargs": self.client_kwargs,
703
+ }
704
+ logger.debug("Using 'resource_principal' authentication.")
705
+ return signer_dict
706
+
707
+ @staticmethod
708
+ def supported():
709
+ return any(
710
+ os.environ.get(var)
711
+ for var in [
712
+ "JOB_RUN_OCID",
713
+ "NB_SESSION_OCID",
714
+ "DATAFLOW_RUN_ID",
715
+ "PIPELINE_RUN_OCID",
716
+ ]
717
+ )
718
+
719
+
720
+ class InstancePrincipal(AuthSignerGenerator):
721
+ """
722
+ Creates Instance Principal signer - a SecurityTokenSigner which uses a security token for an instance
723
+ principal. It prepares extra arguments necessary for creating clients for variety of OCI services.
724
+ """
725
+
726
+ def __init__(self, args: Optional[Dict] = None):
727
+ """
728
+ Signer created based on args provided. If not provided current values of according arguments
729
+ will be used from current global state from AuthState class.
730
+
731
+ Parameters
732
+ ----------
733
+ args: dict
734
+ args that are required to create Instance Principal signer. Contains keys: signer_kwargs, client_kwargs.
735
+
736
+ - signer_kwargs - optional parameters required to instantiate instance principal signer
737
+ - client_kwargs - optional parameters for OCI client creation in next steps
738
+ """
739
+ self.signer_kwargs = args.get("signer_kwargs", dict())
740
+ self.client_kwargs = args.get("client_kwargs")
741
+
742
+ def create_signer(self) -> Dict:
743
+ """
744
+ Creates Instance Principal signer with extra arguments necessary for creating clients.
745
+ Signer instantiated from the `signer_callable` or if the `signer` provided is will be return by this method.
746
+ If `signer_callable` or `signer` not provided new signer will be created in place.
747
+
748
+ Returns
749
+ -------
750
+ dict
751
+ Contains keys - config, signer and client_kwargs.
752
+
753
+ - config contains the configuration information
754
+ - signer contains the signer object created. It is instantiated from signer_callable, or
755
+ signer provided in args used, or instantiated in place
756
+ - client_kwargs contains the `client_kwargs` that was passed in as input parameter
757
+
758
+ Examples
759
+ --------
760
+ >>> signer_args = dict(signer_kwargs={"log_requests": True})
761
+ >>> signer_generator = AuthFactory().signerGenerator(AuthType.INSTANCE_PRINCIPAL)
762
+ >>> signer_generator(signer_args).create_signer()
763
+ """
764
+ configuration = ads.telemetry.update_oci_client_config(AuthState().oci_config)
765
+ signer_dict = {
766
+ "config": configuration,
767
+ "signer": oci.auth.signers.InstancePrincipalsSecurityTokenSigner(
768
+ **self.signer_kwargs
769
+ ),
770
+ "client_kwargs": self.client_kwargs,
771
+ }
772
+ logger.debug("Using 'instance_principal' authentication.")
773
+ return signer_dict
774
+
775
+
776
+ class SecurityToken(AuthSignerGenerator):
777
+ """
778
+ Creates security token auth instance. This signer is intended to be used when signing requests for
779
+ a given user - it requires that user's private key and security token.
780
+ It prepares extra arguments necessary for creating clients for variety of OCI services.
781
+ """
782
+
783
+ SECURITY_TOKEN_GENERIC_HEADERS = ["date", "(request-target)", "host"]
784
+ SECURITY_TOKEN_BODY_HEADERS = ["content-length", "content-type", "x-content-sha256"]
785
+ SECURITY_TOKEN_REQUIRED = ["security_token_file", "key_file", "region"]
786
+
787
+ def __init__(self, args: Optional[Dict] = None):
788
+ """
789
+ Signer created based on args provided. If not provided current values of according arguments
790
+ will be used from current global state from AuthState class.
791
+
792
+ Parameters
793
+ ----------
794
+ args: dict
795
+ args that are required to create Security Token signer. Contains keys: oci_config,
796
+ oci_config_location, oci_key_profile, client_kwargs.
797
+
798
+ - oci_config is a configuration dict that can be used to create clients
799
+ - oci_config_location - path to config file
800
+ - oci_key_profile - the profile to load from config file
801
+ - client_kwargs - optional parameters for OCI client creation in next steps
802
+ """
803
+ self.oci_config = args.get("oci_config")
804
+ self.oci_config_location = args.get("oci_config_location")
805
+ self.oci_key_profile = args.get("oci_key_profile")
806
+ self.client_kwargs = args.get("client_kwargs")
807
+
808
+ def create_signer(self) -> Dict:
809
+ """
810
+ Creates security token configuration and signer with extra arguments necessary for creating clients.
811
+ Signer constructed from the `oci_config` provided. If not 'oci_config', configuration will be
812
+ constructed from 'oci_config_location' and 'oci_key_profile' in place.
813
+
814
+ Returns
815
+ -------
816
+ dict
817
+ Contains keys - config, signer and client_kwargs.
818
+
819
+ - config contains the configuration information
820
+ - signer contains the signer object created. It is instantiated from signer_callable, or
821
+ signer provided in args used, or instantiated in place
822
+ - client_kwargs contains the `client_kwargs` that was passed in as input parameter
823
+
824
+ Examples
825
+ --------
826
+ >>> signer_args = dict(
827
+ ... client_kwargs=client_kwargs
828
+ ... )
829
+ >>> signer_generator = AuthFactory().signerGenerator(AuthType.SECURITY_TOKEN)
830
+ >>> signer_generator(signer_args).create_signer()
831
+ """
832
+ if self.oci_config:
833
+ configuration = ads.telemetry.update_oci_client_config(self.oci_config)
834
+ else:
835
+ configuration = ads.telemetry.update_oci_client_config(
836
+ oci.config.from_file(self.oci_config_location, self.oci_key_profile)
837
+ )
838
+
839
+ logger.debug("Using 'security_token' authentication.")
840
+
841
+ for parameter in self.SECURITY_TOKEN_REQUIRED:
842
+ if parameter not in configuration:
843
+ raise ValueError(
844
+ f"Parameter `{parameter}` must be provided for using `security_token` authentication."
845
+ )
846
+
847
+ self._validate_and_refresh_token(configuration)
848
+
849
+ return {
850
+ "config": configuration,
851
+ "signer": oci.auth.signers.SecurityTokenSigner(
852
+ token=self._read_security_token_file(
853
+ configuration.get("security_token_file")
854
+ ),
855
+ private_key=oci.signer.load_private_key_from_file(
856
+ configuration.get("key_file"), configuration.get("pass_phrase")
857
+ ),
858
+ generic_headers=configuration.get(
859
+ "generic_headers", self.SECURITY_TOKEN_GENERIC_HEADERS
860
+ ),
861
+ body_headers=configuration.get(
862
+ "body_headers", self.SECURITY_TOKEN_BODY_HEADERS
863
+ ),
864
+ ),
865
+ "client_kwargs": self.client_kwargs,
866
+ }
867
+
868
+ def _validate_and_refresh_token(self, configuration: Dict[str, Any]):
869
+ """Validates and refreshes security token.
870
+
871
+ Parameters
872
+ ----------
873
+ configuration: Dict
874
+ Security token configuration.
875
+ """
876
+ security_token = self._read_security_token_file(
877
+ configuration.get("security_token_file")
878
+ )
879
+ security_token_container = (
880
+ oci.auth.security_token_container.SecurityTokenContainer(
881
+ session_key_supplier=None, security_token=security_token
882
+ )
883
+ )
884
+
885
+ if not security_token_container.valid():
886
+ raise SecurityTokenError(
887
+ "Security token has expired. Call `oci session authenticate` to generate new session."
888
+ )
889
+
890
+ time_now = int(time.time())
891
+ time_expired = security_token_container.get_jwt()["exp"]
892
+ if time_expired - time_now < SECURITY_TOKEN_LEFT_TIME:
893
+ if not self.oci_config_location:
894
+ logger.warning(
895
+ "Can not auto-refresh token. Specify parameter `oci_config_location` through ads.set_auth() or ads.auth.create_signer()."
896
+ )
897
+ else:
898
+ result = os.system(
899
+ f"oci session refresh --config-file {self.oci_config_location} --profile {self.oci_key_profile}"
900
+ )
901
+ if result == 1:
902
+ logger.warning(
903
+ "Some error happened during auto-refreshing the token. Continue using the current one that's expiring in less than {SECURITY_TOKEN_LEFT_TIME} seconds."
904
+ "Please follow steps in https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/clitoken.htm to renew token."
905
+ )
906
+
907
+ date_time = datetime.fromtimestamp(time_expired).strftime("%Y-%m-%d %H:%M:%S")
908
+ logger.debug(f"Session is valid until {date_time}.")
909
+
910
+ def _read_security_token_file(self, security_token_file: str) -> str:
911
+ """Reads security token from file.
912
+
913
+ Parameters
914
+ ----------
915
+ security_token_file: str
916
+ The path to security token file.
917
+
918
+ Returns
919
+ -------
920
+ str:
921
+ Security token string.
922
+ """
923
+ expanded_path = os.path.expanduser(security_token_file)
924
+ if not os.path.isfile(expanded_path):
925
+ raise ValueError("Invalid `security_token_file`. Specify a valid path.")
926
+ try:
927
+ token = None
928
+ with open(expanded_path) as f:
929
+ token = f.read()
930
+ return token
931
+ except:
932
+ raise
933
+
934
+
935
+ class AuthFactory:
936
+ """
937
+ AuthFactory class which contains list of registered signers and allows to register new signers.
938
+ Check documentation for more signers: https://docs.oracle.com/en-us/iaas/tools/python/latest/api/signing.html.
939
+
940
+ Current signers:
941
+ * APIKey
942
+ * ResourcePrincipal
943
+ * InstancePrincipal
944
+ * SecurityToken
945
+ """
946
+
947
+ classes = {
948
+ AuthType.API_KEY: APIKey,
949
+ AuthType.RESOURCE_PRINCIPAL: ResourcePrincipal,
950
+ AuthType.INSTANCE_PRINCIPAL: InstancePrincipal,
951
+ AuthType.SECURITY_TOKEN: SecurityToken,
952
+ }
953
+
954
+ @classmethod
955
+ def register(cls, signer_type: str, signer: Any) -> None:
956
+ """Registers a new signer.
957
+
958
+ Parameters
959
+ ----------
960
+ signer_type: str
961
+ signer type to be registers
962
+ signer: RecordParser
963
+ A new signer class to be registered.
964
+
965
+ Returns
966
+ -------
967
+ None
968
+ Nothing.
969
+ """
970
+ cls.classes[signer_type] = signer
971
+
972
+ def signerGenerator(self, iam_type: Optional[str] = "api_key"):
973
+ """
974
+ Generates signer classes based of iam_type, which specify one of auth methods:
975
+ 'api_key', 'resource_principal' or 'instance_principal'.
976
+
977
+ Parameters
978
+ ----------
979
+ iam_type: str, default 'api_key'
980
+ type of auth provided in IAM_TYPE environment variable or set in parameters in
981
+ ads.set_auth() method.
982
+
983
+ Returns
984
+ -------
985
+ :class:`APIKey` or :class:`ResourcePrincipal` or :class:`InstancePrincipal` or :class:`SecurityToken`
986
+ returns one of classes, which implements creation of signer of specified type
987
+
988
+ Raises
989
+ ------
990
+ ValueError
991
+ If iam_type is not supported.
992
+ """
993
+
994
+ valid_auth_keys = AuthFactory.classes.keys()
995
+ if iam_type in valid_auth_keys:
996
+ return AuthFactory.classes[iam_type]
997
+ else:
998
+ raise ValueError(
999
+ f"Allowed values are: {valid_auth_keys}. If you wish to use other authentication form, "
1000
+ f"pass a valid signer or use signer_callable and signer_kwargs"
1001
+ )
1002
+
1003
+
1004
+ class OCIAuthContext:
1005
+ """
1006
+ OCIAuthContext used in 'with' statement for properly managing global authentication type
1007
+ and global configuration profile parameters.
1008
+
1009
+ Examples
1010
+ --------
1011
+ >>> from ads.jobs import DataFlowRun
1012
+ >>> with OCIAuthContext(profile='TEST'):
1013
+ >>> df_run = DataFlowRun.from_ocid(run_id)
1014
+ """
1015
+
1016
+ @deprecated(
1017
+ "2.7.3",
1018
+ details="Deprecated, use: from ads.common.auth import AuthContext",
1019
+ )
1020
+ def __init__(self, profile: str = None):
1021
+ """
1022
+ Initialize class OCIAuthContext and saves global state of authentication type and configuration profile.
1023
+
1024
+ Parameters
1025
+ ----------
1026
+ profile: str, default is None
1027
+ profile name for api keys config file
1028
+ """
1029
+ self.profile = profile
1030
+ self.prev_mode = AuthState().oci_iam_type
1031
+ self.prev_profile = AuthState().oci_key_profile
1032
+ self.oci_cli_auth = AuthState().oci_cli_auth
1033
+
1034
+ @deprecated(
1035
+ "2.7.3",
1036
+ details="Deprecated, use: from ads.common.auth import AuthContext",
1037
+ )
1038
+ def __enter__(self):
1039
+ """
1040
+ When called by the 'with' statement and if 'profile' provided - 'api_key' authentication with 'profile' used.
1041
+ If 'profile' not provided, authentication method will be 'resource_principal'.
1042
+ """
1043
+ if self.profile:
1044
+ ads.set_auth(auth=AuthType.API_KEY, profile=self.profile)
1045
+ logger.debug(f"OCI profile set to {self.profile}")
1046
+ else:
1047
+ ads.set_auth(auth=AuthType.RESOURCE_PRINCIPAL)
1048
+ logger.debug("OCI auth set to resource principal")
1049
+ return self
1050
+
1051
+ def __exit__(self, exc_type, exc_val, exc_tb):
1052
+ """
1053
+ When called by the 'with' statement restores initial state of authentication type and profile value.
1054
+ """
1055
+ ads.set_auth(auth=self.prev_mode, profile=self.prev_profile)
1056
+
1057
+
1058
+ class AuthContext:
1059
+ """
1060
+ AuthContext used in 'with' statement for properly managing global authentication type, signer, config
1061
+ and global configuration parameters.
1062
+
1063
+ Examples
1064
+ --------
1065
+ >>> from ads import set_auth
1066
+ >>> from ads.jobs import DataFlowRun
1067
+ >>> with AuthContext(auth='resource_principal'):
1068
+ >>> df_run = DataFlowRun.from_ocid(run_id)
1069
+
1070
+ >>> from ads.model.framework.sklearn_model import SklearnModel
1071
+ >>> model = SklearnModel.from_model_artifact(uri="model_artifact_path", artifact_dir="model_artifact_path")
1072
+ >>> set_auth(auth='api_key', oci_config_location="~/.oci/config")
1073
+ >>> with AuthContext(auth='api_key', oci_config_location="~/another_config_location/config"):
1074
+ >>> # upload model to Object Storage using config from another_config_location/config
1075
+ >>> model.upload_artifact(uri="oci://bucket@namespace/prefix/")
1076
+ >>> # upload model to Object Storage using config from ~/.oci/config, which was set before 'with AuthContext():'
1077
+ >>> model.upload_artifact(uri="oci://bucket@namespace/prefix/")
1078
+ """
1079
+
1080
+ def __init__(self, **kwargs):
1081
+ """
1082
+ Initialize class AuthContext and saves global state of authentication type, signer, config
1083
+ and global configuration parameters.
1084
+
1085
+ Parameters
1086
+ ----------
1087
+ **kwargs: optional, list of parameters passed to ads.set_auth() method, which can be:
1088
+ auth: Optional[str], default 'api_key'
1089
+ 'api_key', 'resource_principal' or 'instance_principal'. Enable/disable resource principal
1090
+ identity, instance principal or keypair identity
1091
+ oci_config_location: Optional[str], default oci.config.DEFAULT_LOCATION, which is '~/.oci/config'
1092
+ config file location
1093
+ profile: Optional[str], default is DEFAULT_PROFILE, which is 'DEFAULT'
1094
+ profile name for api keys config file
1095
+ config: Optional[Dict], default {}
1096
+ created config dictionary
1097
+ signer: Optional[Any], default None
1098
+ created signer, can be resource principals signer, instance principal signer or other
1099
+ signer_callable: Optional[Callable], default None
1100
+ a callable object that returns signer
1101
+ signer_kwargs: Optional[Dict], default None
1102
+ parameters accepted by the signer
1103
+ client_kwargs: Optional[Dict], default None
1104
+ Additional keyword arguments for initializing the OCI client.
1105
+ Example: client_kwargs = {"timeout": 60}
1106
+ """
1107
+ self.kwargs = kwargs
1108
+
1109
+ def __enter__(self):
1110
+ """
1111
+ When called by the 'with' statement current state of authentication type, signer, config
1112
+ and configuration parameters saved.
1113
+ """
1114
+ self.previous_state = copy.deepcopy(AuthState())
1115
+ set_auth(**self.kwargs)
1116
+
1117
+ def __exit__(self, exc_type, exc_val, exc_tb):
1118
+ """
1119
+ When called by the 'with' statement initial state of authentication type, signer, config
1120
+ and configuration parameters restored.
1121
+ """
1122
+ AuthState().__dict__.update(self.previous_state.__dict__)