snowflake-ml-python 1.6.2__py3-none-any.whl → 1.6.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. snowflake/cortex/__init__.py +4 -0
  2. snowflake/cortex/_classify_text.py +2 -2
  3. snowflake/cortex/_embed_text_1024.py +37 -0
  4. snowflake/cortex/_embed_text_768.py +37 -0
  5. snowflake/cortex/_extract_answer.py +2 -2
  6. snowflake/cortex/_sentiment.py +2 -2
  7. snowflake/cortex/_summarize.py +2 -2
  8. snowflake/cortex/_translate.py +2 -2
  9. snowflake/cortex/_util.py +4 -4
  10. snowflake/ml/_internal/env_utils.py +5 -5
  11. snowflake/ml/_internal/exceptions/error_codes.py +2 -0
  12. snowflake/ml/_internal/utils/db_utils.py +50 -0
  13. snowflake/ml/_internal/utils/service_logger.py +63 -0
  14. snowflake/ml/_internal/utils/sql_identifier.py +25 -1
  15. snowflake/ml/data/_internal/arrow_ingestor.py +1 -11
  16. snowflake/ml/data/ingestor_utils.py +20 -10
  17. snowflake/ml/feature_store/access_manager.py +3 -3
  18. snowflake/ml/feature_store/feature_store.py +19 -2
  19. snowflake/ml/feature_store/feature_view.py +82 -28
  20. snowflake/ml/fileset/stage_fs.py +2 -1
  21. snowflake/ml/lineage/lineage_node.py +7 -2
  22. snowflake/ml/model/__init__.py +1 -2
  23. snowflake/ml/model/_client/model/model_version_impl.py +78 -9
  24. snowflake/ml/model/_client/ops/model_ops.py +89 -7
  25. snowflake/ml/model/_client/ops/service_ops.py +200 -91
  26. snowflake/ml/model/_client/service/model_deployment_spec.py +4 -0
  27. snowflake/ml/model/_client/service/model_deployment_spec_schema.py +1 -0
  28. snowflake/ml/model/_client/sql/_base.py +5 -0
  29. snowflake/ml/model/_client/sql/model.py +1 -0
  30. snowflake/ml/model/_client/sql/model_version.py +9 -5
  31. snowflake/ml/model/_client/sql/service.py +35 -13
  32. snowflake/ml/model/_model_composer/model_composer.py +11 -41
  33. snowflake/ml/model/_model_composer/model_manifest/model_manifest.py +29 -4
  34. snowflake/ml/model/_packager/model_env/model_env.py +4 -38
  35. snowflake/ml/model/_packager/model_handlers/_utils.py +106 -32
  36. snowflake/ml/model/_packager/model_handlers/catboost.py +26 -27
  37. snowflake/ml/model/_packager/model_handlers/huggingface_pipeline.py +3 -3
  38. snowflake/ml/model/_packager/model_handlers/lightgbm.py +21 -6
  39. snowflake/ml/model/_packager/model_handlers/mlflow.py +3 -5
  40. snowflake/ml/model/_packager/model_handlers/model_objective_utils.py +111 -58
  41. snowflake/ml/model/_packager/model_handlers/sentence_transformers.py +15 -8
  42. snowflake/ml/model/_packager/model_handlers/sklearn.py +50 -66
  43. snowflake/ml/model/_packager/model_handlers/snowmlmodel.py +36 -17
  44. snowflake/ml/model/_packager/model_handlers/xgboost.py +22 -7
  45. snowflake/ml/model/_packager/model_meta/model_meta.py +16 -45
  46. snowflake/ml/model/_packager/model_meta/model_meta_schema.py +1 -6
  47. snowflake/ml/model/_packager/model_packager.py +14 -10
  48. snowflake/ml/model/_packager/model_runtime/model_runtime.py +11 -0
  49. snowflake/ml/model/_signatures/snowpark_handler.py +3 -2
  50. snowflake/ml/model/type_hints.py +11 -152
  51. snowflake/ml/modeling/_internal/snowpark_implementations/distributed_hpo_trainer.py +0 -2
  52. snowflake/ml/modeling/_internal/snowpark_implementations/snowpark_trainer.py +17 -6
  53. snowflake/ml/modeling/_internal/snowpark_implementations/xgboost_external_memory_trainer.py +0 -1
  54. snowflake/ml/modeling/calibration/calibrated_classifier_cv.py +1 -0
  55. snowflake/ml/modeling/cluster/affinity_propagation.py +1 -0
  56. snowflake/ml/modeling/cluster/agglomerative_clustering.py +1 -0
  57. snowflake/ml/modeling/cluster/birch.py +1 -0
  58. snowflake/ml/modeling/cluster/bisecting_k_means.py +1 -0
  59. snowflake/ml/modeling/cluster/dbscan.py +1 -0
  60. snowflake/ml/modeling/cluster/feature_agglomeration.py +1 -0
  61. snowflake/ml/modeling/cluster/k_means.py +1 -0
  62. snowflake/ml/modeling/cluster/mean_shift.py +1 -0
  63. snowflake/ml/modeling/cluster/mini_batch_k_means.py +1 -0
  64. snowflake/ml/modeling/cluster/optics.py +1 -0
  65. snowflake/ml/modeling/cluster/spectral_biclustering.py +1 -0
  66. snowflake/ml/modeling/cluster/spectral_clustering.py +1 -0
  67. snowflake/ml/modeling/cluster/spectral_coclustering.py +1 -0
  68. snowflake/ml/modeling/compose/column_transformer.py +1 -0
  69. snowflake/ml/modeling/compose/transformed_target_regressor.py +1 -0
  70. snowflake/ml/modeling/covariance/elliptic_envelope.py +1 -0
  71. snowflake/ml/modeling/covariance/empirical_covariance.py +1 -0
  72. snowflake/ml/modeling/covariance/graphical_lasso.py +1 -0
  73. snowflake/ml/modeling/covariance/graphical_lasso_cv.py +1 -0
  74. snowflake/ml/modeling/covariance/ledoit_wolf.py +1 -0
  75. snowflake/ml/modeling/covariance/min_cov_det.py +1 -0
  76. snowflake/ml/modeling/covariance/oas.py +1 -0
  77. snowflake/ml/modeling/covariance/shrunk_covariance.py +1 -0
  78. snowflake/ml/modeling/decomposition/dictionary_learning.py +1 -0
  79. snowflake/ml/modeling/decomposition/factor_analysis.py +1 -0
  80. snowflake/ml/modeling/decomposition/fast_ica.py +1 -0
  81. snowflake/ml/modeling/decomposition/incremental_pca.py +1 -0
  82. snowflake/ml/modeling/decomposition/kernel_pca.py +1 -0
  83. snowflake/ml/modeling/decomposition/mini_batch_dictionary_learning.py +1 -0
  84. snowflake/ml/modeling/decomposition/mini_batch_sparse_pca.py +1 -0
  85. snowflake/ml/modeling/decomposition/pca.py +1 -0
  86. snowflake/ml/modeling/decomposition/sparse_pca.py +1 -0
  87. snowflake/ml/modeling/decomposition/truncated_svd.py +1 -0
  88. snowflake/ml/modeling/discriminant_analysis/linear_discriminant_analysis.py +1 -0
  89. snowflake/ml/modeling/discriminant_analysis/quadratic_discriminant_analysis.py +1 -0
  90. snowflake/ml/modeling/ensemble/ada_boost_classifier.py +1 -0
  91. snowflake/ml/modeling/ensemble/ada_boost_regressor.py +1 -0
  92. snowflake/ml/modeling/ensemble/bagging_classifier.py +1 -0
  93. snowflake/ml/modeling/ensemble/bagging_regressor.py +1 -0
  94. snowflake/ml/modeling/ensemble/extra_trees_classifier.py +1 -0
  95. snowflake/ml/modeling/ensemble/extra_trees_regressor.py +1 -0
  96. snowflake/ml/modeling/ensemble/gradient_boosting_classifier.py +1 -0
  97. snowflake/ml/modeling/ensemble/gradient_boosting_regressor.py +1 -0
  98. snowflake/ml/modeling/ensemble/hist_gradient_boosting_classifier.py +1 -0
  99. snowflake/ml/modeling/ensemble/hist_gradient_boosting_regressor.py +1 -0
  100. snowflake/ml/modeling/ensemble/isolation_forest.py +1 -0
  101. snowflake/ml/modeling/ensemble/random_forest_classifier.py +1 -0
  102. snowflake/ml/modeling/ensemble/random_forest_regressor.py +1 -0
  103. snowflake/ml/modeling/ensemble/stacking_regressor.py +1 -0
  104. snowflake/ml/modeling/ensemble/voting_classifier.py +1 -0
  105. snowflake/ml/modeling/ensemble/voting_regressor.py +1 -0
  106. snowflake/ml/modeling/feature_selection/generic_univariate_select.py +1 -0
  107. snowflake/ml/modeling/feature_selection/select_fdr.py +1 -0
  108. snowflake/ml/modeling/feature_selection/select_fpr.py +1 -0
  109. snowflake/ml/modeling/feature_selection/select_fwe.py +1 -0
  110. snowflake/ml/modeling/feature_selection/select_k_best.py +1 -0
  111. snowflake/ml/modeling/feature_selection/select_percentile.py +1 -0
  112. snowflake/ml/modeling/feature_selection/sequential_feature_selector.py +1 -0
  113. snowflake/ml/modeling/feature_selection/variance_threshold.py +1 -0
  114. snowflake/ml/modeling/gaussian_process/gaussian_process_classifier.py +1 -0
  115. snowflake/ml/modeling/gaussian_process/gaussian_process_regressor.py +1 -0
  116. snowflake/ml/modeling/impute/iterative_imputer.py +1 -0
  117. snowflake/ml/modeling/impute/knn_imputer.py +1 -0
  118. snowflake/ml/modeling/impute/missing_indicator.py +1 -0
  119. snowflake/ml/modeling/kernel_approximation/additive_chi2_sampler.py +1 -0
  120. snowflake/ml/modeling/kernel_approximation/nystroem.py +1 -0
  121. snowflake/ml/modeling/kernel_approximation/polynomial_count_sketch.py +1 -0
  122. snowflake/ml/modeling/kernel_approximation/rbf_sampler.py +1 -0
  123. snowflake/ml/modeling/kernel_approximation/skewed_chi2_sampler.py +1 -0
  124. snowflake/ml/modeling/kernel_ridge/kernel_ridge.py +1 -0
  125. snowflake/ml/modeling/lightgbm/lgbm_classifier.py +1 -0
  126. snowflake/ml/modeling/lightgbm/lgbm_regressor.py +1 -0
  127. snowflake/ml/modeling/linear_model/ard_regression.py +1 -0
  128. snowflake/ml/modeling/linear_model/bayesian_ridge.py +1 -0
  129. snowflake/ml/modeling/linear_model/elastic_net.py +1 -0
  130. snowflake/ml/modeling/linear_model/elastic_net_cv.py +1 -0
  131. snowflake/ml/modeling/linear_model/gamma_regressor.py +1 -0
  132. snowflake/ml/modeling/linear_model/huber_regressor.py +1 -0
  133. snowflake/ml/modeling/linear_model/lars.py +1 -0
  134. snowflake/ml/modeling/linear_model/lars_cv.py +1 -0
  135. snowflake/ml/modeling/linear_model/lasso.py +1 -0
  136. snowflake/ml/modeling/linear_model/lasso_cv.py +1 -0
  137. snowflake/ml/modeling/linear_model/lasso_lars.py +1 -0
  138. snowflake/ml/modeling/linear_model/lasso_lars_cv.py +1 -0
  139. snowflake/ml/modeling/linear_model/lasso_lars_ic.py +1 -0
  140. snowflake/ml/modeling/linear_model/linear_regression.py +1 -0
  141. snowflake/ml/modeling/linear_model/logistic_regression.py +1 -0
  142. snowflake/ml/modeling/linear_model/logistic_regression_cv.py +1 -0
  143. snowflake/ml/modeling/linear_model/multi_task_elastic_net.py +1 -0
  144. snowflake/ml/modeling/linear_model/multi_task_elastic_net_cv.py +1 -0
  145. snowflake/ml/modeling/linear_model/multi_task_lasso.py +1 -0
  146. snowflake/ml/modeling/linear_model/multi_task_lasso_cv.py +1 -0
  147. snowflake/ml/modeling/linear_model/orthogonal_matching_pursuit.py +1 -0
  148. snowflake/ml/modeling/linear_model/passive_aggressive_classifier.py +1 -0
  149. snowflake/ml/modeling/linear_model/passive_aggressive_regressor.py +1 -0
  150. snowflake/ml/modeling/linear_model/perceptron.py +1 -0
  151. snowflake/ml/modeling/linear_model/poisson_regressor.py +1 -0
  152. snowflake/ml/modeling/linear_model/ransac_regressor.py +1 -0
  153. snowflake/ml/modeling/linear_model/ridge.py +1 -0
  154. snowflake/ml/modeling/linear_model/ridge_classifier.py +1 -0
  155. snowflake/ml/modeling/linear_model/ridge_classifier_cv.py +1 -0
  156. snowflake/ml/modeling/linear_model/ridge_cv.py +1 -0
  157. snowflake/ml/modeling/linear_model/sgd_classifier.py +1 -0
  158. snowflake/ml/modeling/linear_model/sgd_one_class_svm.py +1 -0
  159. snowflake/ml/modeling/linear_model/sgd_regressor.py +1 -0
  160. snowflake/ml/modeling/linear_model/theil_sen_regressor.py +1 -0
  161. snowflake/ml/modeling/linear_model/tweedie_regressor.py +1 -0
  162. snowflake/ml/modeling/manifold/isomap.py +1 -0
  163. snowflake/ml/modeling/manifold/mds.py +1 -0
  164. snowflake/ml/modeling/manifold/spectral_embedding.py +1 -0
  165. snowflake/ml/modeling/manifold/tsne.py +1 -0
  166. snowflake/ml/modeling/metrics/metrics_utils.py +2 -2
  167. snowflake/ml/modeling/metrics/ranking.py +0 -3
  168. snowflake/ml/modeling/metrics/regression.py +0 -3
  169. snowflake/ml/modeling/mixture/bayesian_gaussian_mixture.py +1 -0
  170. snowflake/ml/modeling/mixture/gaussian_mixture.py +1 -0
  171. snowflake/ml/modeling/multiclass/one_vs_one_classifier.py +1 -0
  172. snowflake/ml/modeling/multiclass/one_vs_rest_classifier.py +1 -0
  173. snowflake/ml/modeling/multiclass/output_code_classifier.py +1 -0
  174. snowflake/ml/modeling/naive_bayes/bernoulli_nb.py +1 -0
  175. snowflake/ml/modeling/naive_bayes/categorical_nb.py +1 -0
  176. snowflake/ml/modeling/naive_bayes/complement_nb.py +1 -0
  177. snowflake/ml/modeling/naive_bayes/gaussian_nb.py +1 -0
  178. snowflake/ml/modeling/naive_bayes/multinomial_nb.py +1 -0
  179. snowflake/ml/modeling/neighbors/k_neighbors_classifier.py +1 -0
  180. snowflake/ml/modeling/neighbors/k_neighbors_regressor.py +1 -0
  181. snowflake/ml/modeling/neighbors/kernel_density.py +1 -0
  182. snowflake/ml/modeling/neighbors/local_outlier_factor.py +1 -0
  183. snowflake/ml/modeling/neighbors/nearest_centroid.py +1 -0
  184. snowflake/ml/modeling/neighbors/nearest_neighbors.py +1 -0
  185. snowflake/ml/modeling/neighbors/neighborhood_components_analysis.py +1 -0
  186. snowflake/ml/modeling/neighbors/radius_neighbors_classifier.py +1 -0
  187. snowflake/ml/modeling/neighbors/radius_neighbors_regressor.py +1 -0
  188. snowflake/ml/modeling/neural_network/bernoulli_rbm.py +1 -0
  189. snowflake/ml/modeling/neural_network/mlp_classifier.py +1 -0
  190. snowflake/ml/modeling/neural_network/mlp_regressor.py +1 -0
  191. snowflake/ml/modeling/pipeline/pipeline.py +0 -1
  192. snowflake/ml/modeling/preprocessing/polynomial_features.py +1 -0
  193. snowflake/ml/modeling/semi_supervised/label_propagation.py +1 -0
  194. snowflake/ml/modeling/semi_supervised/label_spreading.py +1 -0
  195. snowflake/ml/modeling/svm/linear_svc.py +1 -0
  196. snowflake/ml/modeling/svm/linear_svr.py +1 -0
  197. snowflake/ml/modeling/svm/nu_svc.py +1 -0
  198. snowflake/ml/modeling/svm/nu_svr.py +1 -0
  199. snowflake/ml/modeling/svm/svc.py +1 -0
  200. snowflake/ml/modeling/svm/svr.py +1 -0
  201. snowflake/ml/modeling/tree/decision_tree_classifier.py +1 -0
  202. snowflake/ml/modeling/tree/decision_tree_regressor.py +1 -0
  203. snowflake/ml/modeling/tree/extra_tree_classifier.py +1 -0
  204. snowflake/ml/modeling/tree/extra_tree_regressor.py +1 -0
  205. snowflake/ml/modeling/xgboost/xgb_classifier.py +1 -0
  206. snowflake/ml/modeling/xgboost/xgb_regressor.py +1 -0
  207. snowflake/ml/modeling/xgboost/xgbrf_classifier.py +1 -0
  208. snowflake/ml/modeling/xgboost/xgbrf_regressor.py +1 -0
  209. snowflake/ml/monitoring/_client/model_monitor.py +126 -0
  210. snowflake/ml/monitoring/_client/model_monitor_manager.py +361 -0
  211. snowflake/ml/monitoring/_client/model_monitor_version.py +1 -0
  212. snowflake/ml/monitoring/_client/monitor_sql_client.py +1335 -0
  213. snowflake/ml/monitoring/_client/queries/record_count.ssql +14 -0
  214. snowflake/ml/monitoring/_client/queries/rmse.ssql +28 -0
  215. snowflake/ml/monitoring/entities/model_monitor_config.py +28 -0
  216. snowflake/ml/monitoring/entities/model_monitor_interval.py +46 -0
  217. snowflake/ml/monitoring/entities/output_score_type.py +90 -0
  218. snowflake/ml/registry/_manager/model_manager.py +4 -4
  219. snowflake/ml/registry/registry.py +165 -6
  220. snowflake/ml/version.py +1 -1
  221. {snowflake_ml_python-1.6.2.dist-info → snowflake_ml_python-1.6.4.dist-info}/METADATA +30 -9
  222. {snowflake_ml_python-1.6.2.dist-info → snowflake_ml_python-1.6.4.dist-info}/RECORD +225 -249
  223. {snowflake_ml_python-1.6.2.dist-info → snowflake_ml_python-1.6.4.dist-info}/WHEEL +1 -1
  224. snowflake/ml/_internal/container_services/image_registry/credential.py +0 -84
  225. snowflake/ml/_internal/container_services/image_registry/http_client.py +0 -127
  226. snowflake/ml/_internal/container_services/image_registry/imagelib.py +0 -400
  227. snowflake/ml/_internal/container_services/image_registry/registry_client.py +0 -212
  228. snowflake/ml/_internal/utils/log_stream_processor.py +0 -30
  229. snowflake/ml/_internal/utils/session_token_manager.py +0 -46
  230. snowflake/ml/_internal/utils/spcs_attribution_utils.py +0 -122
  231. snowflake/ml/_internal/utils/uri.py +0 -77
  232. snowflake/ml/model/_api.py +0 -568
  233. snowflake/ml/model/_deploy_client/image_builds/base_image_builder.py +0 -12
  234. snowflake/ml/model/_deploy_client/image_builds/client_image_builder.py +0 -249
  235. snowflake/ml/model/_deploy_client/image_builds/docker_context.py +0 -130
  236. snowflake/ml/model/_deploy_client/image_builds/gunicorn_run.sh +0 -36
  237. snowflake/ml/model/_deploy_client/image_builds/inference_server/main.py +0 -268
  238. snowflake/ml/model/_deploy_client/image_builds/server_image_builder.py +0 -215
  239. snowflake/ml/model/_deploy_client/image_builds/templates/dockerfile_template +0 -53
  240. snowflake/ml/model/_deploy_client/image_builds/templates/image_build_job_spec_template +0 -38
  241. snowflake/ml/model/_deploy_client/image_builds/templates/kaniko_shell_script_template +0 -105
  242. snowflake/ml/model/_deploy_client/snowservice/deploy.py +0 -611
  243. snowflake/ml/model/_deploy_client/snowservice/deploy_options.py +0 -116
  244. snowflake/ml/model/_deploy_client/snowservice/instance_types.py +0 -10
  245. snowflake/ml/model/_deploy_client/snowservice/templates/service_spec_template +0 -28
  246. snowflake/ml/model/_deploy_client/snowservice/templates/service_spec_template_with_model +0 -21
  247. snowflake/ml/model/_deploy_client/utils/constants.py +0 -48
  248. snowflake/ml/model/_deploy_client/utils/snowservice_client.py +0 -280
  249. snowflake/ml/model/_deploy_client/warehouse/deploy.py +0 -202
  250. snowflake/ml/model/_deploy_client/warehouse/infer_template.py +0 -99
  251. snowflake/ml/model/_packager/model_handlers/llm.py +0 -269
  252. snowflake/ml/model/_packager/model_meta/_core_requirements.py +0 -11
  253. snowflake/ml/model/deploy_platforms.py +0 -6
  254. snowflake/ml/model/models/llm.py +0 -106
  255. snowflake/ml/monitoring/monitor.py +0 -203
  256. snowflake/ml/registry/_initial_schema.py +0 -142
  257. snowflake/ml/registry/_schema.py +0 -82
  258. snowflake/ml/registry/_schema_upgrade_plans.py +0 -116
  259. snowflake/ml/registry/_schema_version_manager.py +0 -163
  260. snowflake/ml/registry/model_registry.py +0 -2048
  261. {snowflake_ml_python-1.6.2.dist-info → snowflake_ml_python-1.6.4.dist-info}/LICENSE.txt +0 -0
  262. {snowflake_ml_python-1.6.2.dist-info → snowflake_ml_python-1.6.4.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,7 @@
1
1
  from snowflake.cortex._classify_text import ClassifyText
2
2
  from snowflake.cortex._complete import Complete, CompleteOptions
3
+ from snowflake.cortex._embed_text_768 import EmbedText768
4
+ from snowflake.cortex._embed_text_1024 import EmbedText1024
3
5
  from snowflake.cortex._extract_answer import ExtractAnswer
4
6
  from snowflake.cortex._sentiment import Sentiment
5
7
  from snowflake.cortex._summarize import Summarize
@@ -9,6 +11,8 @@ __all__ = [
9
11
  "ClassifyText",
10
12
  "Complete",
11
13
  "CompleteOptions",
14
+ "EmbedText768",
15
+ "EmbedText1024",
12
16
  "ExtractAnswer",
13
17
  "Sentiment",
14
18
  "Summarize",
@@ -1,4 +1,4 @@
1
- from typing import List, Optional, Union
1
+ from typing import List, Optional, Union, cast
2
2
 
3
3
  from snowflake import snowpark
4
4
  from snowflake.cortex._util import CORTEX_FUNCTIONS_TELEMETRY_PROJECT, call_sql_function
@@ -33,4 +33,4 @@ def _classify_text_impl(
33
33
  categories: Union[List[str], snowpark.Column],
34
34
  session: Optional[snowpark.Session] = None,
35
35
  ) -> Union[str, snowpark.Column]:
36
- return call_sql_function(function, session, str_input, categories)
36
+ return cast(Union[str, snowpark.Column], call_sql_function(function, session, str_input, categories))
@@ -0,0 +1,37 @@
1
+ from typing import List, Optional, Union, cast
2
+
3
+ from snowflake import snowpark
4
+ from snowflake.cortex._util import CORTEX_FUNCTIONS_TELEMETRY_PROJECT, call_sql_function
5
+ from snowflake.ml._internal import telemetry
6
+
7
+
8
+ @telemetry.send_api_usage_telemetry(
9
+ project=CORTEX_FUNCTIONS_TELEMETRY_PROJECT,
10
+ )
11
+ def EmbedText1024(
12
+ model: Union[str, snowpark.Column],
13
+ text: Union[str, snowpark.Column],
14
+ session: Optional[snowpark.Session] = None,
15
+ ) -> Union[List[float], snowpark.Column]:
16
+ """TextEmbed calls into the LLM inference service to embed the text.
17
+
18
+ Args:
19
+ model: A Column of strings representing the model to use for embedding. The value
20
+ of the strings must be within the SUPPORTED_MODELS list.
21
+ text: A Column of strings representing input text.
22
+ session: The snowpark session to use. Will be inferred by context if not specified.
23
+
24
+ Returns:
25
+ A column of vectors containing embeddings.
26
+ """
27
+
28
+ return _embed_text_1024_impl("snowflake.cortex.embed_text_1024", model, text, session=session)
29
+
30
+
31
+ def _embed_text_1024_impl(
32
+ function: str,
33
+ model: Union[str, snowpark.Column],
34
+ text: Union[str, snowpark.Column],
35
+ session: Optional[snowpark.Session] = None,
36
+ ) -> Union[List[float], snowpark.Column]:
37
+ return cast(Union[List[float], snowpark.Column], call_sql_function(function, session, model, text))
@@ -0,0 +1,37 @@
1
+ from typing import List, Optional, Union, cast
2
+
3
+ from snowflake import snowpark
4
+ from snowflake.cortex._util import CORTEX_FUNCTIONS_TELEMETRY_PROJECT, call_sql_function
5
+ from snowflake.ml._internal import telemetry
6
+
7
+
8
+ @telemetry.send_api_usage_telemetry(
9
+ project=CORTEX_FUNCTIONS_TELEMETRY_PROJECT,
10
+ )
11
+ def EmbedText768(
12
+ model: Union[str, snowpark.Column],
13
+ text: Union[str, snowpark.Column],
14
+ session: Optional[snowpark.Session] = None,
15
+ ) -> Union[List[float], snowpark.Column]:
16
+ """TextEmbed calls into the LLM inference service to embed the text.
17
+
18
+ Args:
19
+ model: A Column of strings representing the model to use for embedding. The value
20
+ of the strings must be within the SUPPORTED_MODELS list.
21
+ text: A Column of strings representing input text.
22
+ session: The snowpark session to use. Will be inferred by context if not specified.
23
+
24
+ Returns:
25
+ A column of vectors containing embeddings.
26
+ """
27
+
28
+ return _embed_text_768_impl("snowflake.cortex.embed_text_768", model, text, session=session)
29
+
30
+
31
+ def _embed_text_768_impl(
32
+ function: str,
33
+ model: Union[str, snowpark.Column],
34
+ text: Union[str, snowpark.Column],
35
+ session: Optional[snowpark.Session] = None,
36
+ ) -> Union[List[float], snowpark.Column]:
37
+ return cast(Union[List[float], snowpark.Column], call_sql_function(function, session, model, text))
@@ -1,4 +1,4 @@
1
- from typing import Optional, Union
1
+ from typing import Optional, Union, cast
2
2
 
3
3
  from snowflake import snowpark
4
4
  from snowflake.cortex._util import CORTEX_FUNCTIONS_TELEMETRY_PROJECT, call_sql_function
@@ -33,4 +33,4 @@ def _extract_answer_impl(
33
33
  question: Union[str, snowpark.Column],
34
34
  session: Optional[snowpark.Session] = None,
35
35
  ) -> Union[str, snowpark.Column]:
36
- return call_sql_function(function, session, from_text, question)
36
+ return cast(Union[str, snowpark.Column], call_sql_function(function, session, from_text, question))
@@ -1,4 +1,4 @@
1
- from typing import Optional, Union
1
+ from typing import Optional, Union, cast
2
2
 
3
3
  from snowflake import snowpark
4
4
  from snowflake.cortex._util import CORTEX_FUNCTIONS_TELEMETRY_PROJECT, call_sql_function
@@ -30,4 +30,4 @@ def _sentiment_impl(
30
30
  output = call_sql_function(function, session, text)
31
31
  if isinstance(output, snowpark.Column):
32
32
  return output
33
- return float(output)
33
+ return float(cast(str, output))
@@ -1,4 +1,4 @@
1
- from typing import Optional, Union
1
+ from typing import Optional, Union, cast
2
2
 
3
3
  from snowflake import snowpark
4
4
  from snowflake.cortex._util import CORTEX_FUNCTIONS_TELEMETRY_PROJECT, call_sql_function
@@ -30,4 +30,4 @@ def _summarize_impl(
30
30
  text: Union[str, snowpark.Column],
31
31
  session: Optional[snowpark.Session] = None,
32
32
  ) -> Union[str, snowpark.Column]:
33
- return call_sql_function(function, session, text)
33
+ return cast(Union[str, snowpark.Column], call_sql_function(function, session, text))
@@ -1,4 +1,4 @@
1
- from typing import Optional, Union
1
+ from typing import Optional, Union, cast
2
2
 
3
3
  from snowflake import snowpark
4
4
  from snowflake.cortex._util import CORTEX_FUNCTIONS_TELEMETRY_PROJECT, call_sql_function
@@ -36,4 +36,4 @@ def _translate_impl(
36
36
  to_language: Union[str, snowpark.Column],
37
37
  session: Optional[snowpark.Session] = None,
38
38
  ) -> Union[str, snowpark.Column]:
39
- return call_sql_function(function, session, text, from_language, to_language)
39
+ return cast(Union[str, snowpark.Column], call_sql_function(function, session, text, from_language, to_language))
snowflake/cortex/_util.py CHANGED
@@ -24,7 +24,7 @@ def call_sql_function(
24
24
  function: str,
25
25
  session: Optional[snowpark.Session],
26
26
  *args: Union[str, List[str], snowpark.Column, Dict[str, Union[int, float]]],
27
- ) -> Union[str, snowpark.Column]:
27
+ ) -> Union[str, List[float], snowpark.Column]:
28
28
  handle_as_column = False
29
29
 
30
30
  for arg in args:
@@ -32,9 +32,9 @@ def call_sql_function(
32
32
  handle_as_column = True
33
33
 
34
34
  if handle_as_column:
35
- return cast(Union[str, snowpark.Column], _call_sql_function_column(function, *args))
35
+ return cast(Union[str, List[float], snowpark.Column], _call_sql_function_column(function, *args))
36
36
  return cast(
37
- Union[str, snowpark.Column],
37
+ Union[str, List[float], snowpark.Column],
38
38
  _call_sql_function_immediate(function, session, *args),
39
39
  )
40
40
 
@@ -49,7 +49,7 @@ def _call_sql_function_immediate(
49
49
  function: str,
50
50
  session: Optional[snowpark.Session],
51
51
  *args: Union[str, List[str], snowpark.Column, Dict[str, Union[int, float]]],
52
- ) -> str:
52
+ ) -> Union[str, List[float]]:
53
53
  session = session or context.get_active_session()
54
54
  if session is None:
55
55
  raise SnowflakeAuthenticationException(
@@ -9,7 +9,7 @@ from importlib import metadata as importlib_metadata
9
9
  from typing import Any, DefaultDict, Dict, List, Optional, Tuple
10
10
 
11
11
  import yaml
12
- from packaging import requirements, specifiers, utils as packaging_utils, version
12
+ from packaging import requirements, specifiers, version
13
13
 
14
14
  import snowflake.connector
15
15
  from snowflake.ml._internal import env as snowml_env
@@ -54,15 +54,12 @@ def _validate_pip_requirement_string(req_str: str) -> requirements.Requirement:
54
54
  """
55
55
  try:
56
56
  r = requirements.Requirement(req_str)
57
- r.name = packaging_utils.canonicalize_name(r.name)
58
57
 
59
58
  if r.name == "python":
60
59
  raise ValueError("Don't specify python as a dependency, use python version argument instead.")
61
60
  except requirements.InvalidRequirement:
62
61
  raise ValueError(f"Invalid package requirement {req_str} found.")
63
62
 
64
- if r.marker:
65
- raise ValueError("Markers is not supported in conda dependency.")
66
63
  return r
67
64
 
68
65
 
@@ -84,6 +81,8 @@ def _validate_conda_dependency_string(dep_str: str) -> Tuple[str, requirements.R
84
81
  channel_str, _, requirement_str = dep_str.rpartition("::")
85
82
  r = _validate_pip_requirement_string(requirement_str)
86
83
  if channel_str != "pip":
84
+ if r.marker:
85
+ raise ValueError("Markers is not supported in conda dependency.")
87
86
  if r.extras:
88
87
  raise ValueError("Extras is not supported in conda dependency.")
89
88
  if r.url:
@@ -221,7 +220,7 @@ def get_local_installed_version_of_pip_package(pip_req: requirements.Requirement
221
220
  else:
222
221
  return pip_req
223
222
  new_pip_req = copy.deepcopy(pip_req)
224
- new_pip_req.specifier = specifiers.SpecifierSet(specifiers=f"=={local_dist_version}")
223
+ new_pip_req.specifier = specifiers.SpecifierSet(specifiers=f"=={version.parse(local_dist_version).base_version}")
225
224
  if not pip_req.specifier.contains(local_dist_version):
226
225
  warnings.warn(
227
226
  f"Package requirement {str(pip_req)} specified, while version {local_dist_version} is installed. "
@@ -513,6 +512,7 @@ def save_conda_env_file(
513
512
  )
514
513
 
515
514
  with open(path, "w", encoding="utf-8") as f:
515
+ yaml.SafeDumper.ignore_aliases = lambda *args: True # type: ignore[method-assign]
516
516
  yaml.safe_dump(env, stream=f, default_flow_style=False)
517
517
 
518
518
 
@@ -58,6 +58,8 @@ NOT_FOUND = "2101"
58
58
  METHOD_NOT_ALLOWED = "2102"
59
59
  # Not implemented.
60
60
  NOT_IMPLEMENTED = "2103"
61
+ # User needs to opt in to use a feature.
62
+ OPT_IN_REQUIRED = "2104"
61
63
 
62
64
  # Calling an API with unsupported keywords/values.
63
65
  INVALID_ARGUMENT = "2110"
@@ -0,0 +1,50 @@
1
+ from enum import Enum
2
+ from typing import Any, Dict, Optional
3
+
4
+ from snowflake.ml._internal.utils import query_result_checker, sql_identifier
5
+ from snowflake.snowpark import session
6
+
7
+ MAX_IDENTIFIER_LENGTH = 255
8
+
9
+
10
+ class SnowflakeDbObjectType(Enum):
11
+ TABLE = "TABLE"
12
+ WAREHOUSE = "WAREHOUSE"
13
+
14
+
15
+ def db_object_exists(
16
+ session: session.Session,
17
+ object_type: SnowflakeDbObjectType,
18
+ object_name: sql_identifier.SqlIdentifier,
19
+ *,
20
+ database_name: Optional[sql_identifier.SqlIdentifier] = None,
21
+ schema_name: Optional[sql_identifier.SqlIdentifier] = None,
22
+ statement_params: Optional[Dict[str, Any]] = None,
23
+ ) -> bool:
24
+ """Check if object exists in database.
25
+
26
+ Args:
27
+ session: Active Snowpark Session.
28
+ object_type: Type of object to search for.
29
+ object_name: Name of object to search for.
30
+ database_name: Optional database name to search in. Only used if both schema is also provided.
31
+ schema_name: Optional schema to search in.
32
+ statement_params: Optional set of statement_params to include with queries.
33
+
34
+ Returns:
35
+ boolean indicating whether object exists.
36
+ """
37
+ optional_in_clause = ""
38
+ if database_name and schema_name:
39
+ optional_in_clause = f" IN {database_name}.{schema_name}"
40
+
41
+ result = (
42
+ query_result_checker.SqlResultValidator(
43
+ session,
44
+ f"""SHOW {object_type.value}S LIKE '{object_name}'{optional_in_clause}""",
45
+ statement_params=statement_params,
46
+ )
47
+ .has_column("name", allow_empty=True) # TODO: Check this is actually what is returned from server
48
+ .validate()
49
+ )
50
+ return len(result) == 1
@@ -0,0 +1,63 @@
1
+ import enum
2
+ import logging
3
+ import sys
4
+
5
+
6
+ class LogColor(enum.Enum):
7
+ GREY = "\x1b[38;20m"
8
+ RED = "\x1b[31;20m"
9
+ BOLD_RED = "\x1b[31;1m"
10
+ YELLOW = "\x1b[33;20m"
11
+ BLUE = "\x1b[34;20m"
12
+ GREEN = "\x1b[32;20m"
13
+
14
+
15
+ class CustomFormatter(logging.Formatter):
16
+
17
+ reset = "\x1b[0m"
18
+ log_format = "%(name)s [%(asctime)s] [%(levelname)s] %(message)s"
19
+
20
+ def __init__(self, info_color: LogColor) -> None:
21
+ super().__init__()
22
+ self.level_colors = {
23
+ logging.DEBUG: LogColor.GREY.value,
24
+ logging.INFO: info_color.value,
25
+ logging.WARNING: LogColor.YELLOW.value,
26
+ logging.ERROR: LogColor.RED.value,
27
+ logging.CRITICAL: LogColor.BOLD_RED.value,
28
+ }
29
+
30
+ def format(self, record: logging.LogRecord) -> str:
31
+ # default to DEBUG color
32
+ fmt = self.level_colors.get(record.levelno, self.level_colors[logging.DEBUG]) + self.log_format + self.reset
33
+ formatter = logging.Formatter(fmt)
34
+
35
+ # split the log message by lines and format each line individually
36
+ original_message = record.getMessage()
37
+ message_lines = original_message.splitlines()
38
+ formatted_lines = [
39
+ formatter.format(
40
+ logging.LogRecord(
41
+ name=record.name,
42
+ level=record.levelno,
43
+ pathname=record.pathname,
44
+ lineno=record.lineno,
45
+ msg=line,
46
+ args=None,
47
+ exc_info=None,
48
+ )
49
+ )
50
+ for line in message_lines
51
+ ]
52
+
53
+ return "\n".join(formatted_lines)
54
+
55
+
56
+ def get_logger(logger_name: str, info_color: LogColor) -> logging.Logger:
57
+ logger = logging.getLogger(logger_name)
58
+ logger.setLevel(logging.INFO)
59
+ handler = logging.StreamHandler(sys.stdout)
60
+ handler.setLevel(logging.INFO)
61
+ handler.setFormatter(CustomFormatter(info_color))
62
+ logger.addHandler(handler)
63
+ return logger
@@ -1,4 +1,4 @@
1
- from typing import List, Optional, Tuple
1
+ from typing import List, Optional, Tuple, Union
2
2
 
3
3
  from snowflake.ml._internal.utils import identifier
4
4
 
@@ -92,3 +92,27 @@ def parse_fully_qualified_name(
92
92
  SqlIdentifier(schema) if schema else None,
93
93
  SqlIdentifier(object),
94
94
  )
95
+
96
+
97
+ def get_fully_qualified_name(
98
+ db: Union[SqlIdentifier, str, None],
99
+ schema: Union[SqlIdentifier, str, None],
100
+ object: Union[SqlIdentifier, str],
101
+ session_db: Optional[str] = None,
102
+ session_schema: Optional[str] = None,
103
+ ) -> str:
104
+ db_name: Optional[SqlIdentifier] = None
105
+ schema_name: Optional[SqlIdentifier] = None
106
+ if not db and session_db:
107
+ db_name = SqlIdentifier(session_db)
108
+ elif isinstance(db, str):
109
+ db_name = SqlIdentifier(db)
110
+ if not schema and session_schema:
111
+ schema_name = SqlIdentifier(session_schema)
112
+ elif isinstance(schema, str):
113
+ schema_name = SqlIdentifier(schema)
114
+ return identifier.get_schema_level_object_identifier(
115
+ db=db_name.identifier() if db_name else None,
116
+ schema=schema_name.identifier() if schema_name else None,
117
+ object_name=object.identifier() if isinstance(object, SqlIdentifier) else SqlIdentifier(object).identifier(),
118
+ )
@@ -11,7 +11,6 @@ import pyarrow as pa
11
11
  import pyarrow.dataset as pds
12
12
 
13
13
  from snowflake import snowpark
14
- from snowflake.connector import result_batch
15
14
  from snowflake.ml.data import data_ingestor, data_source, ingestor_utils
16
15
 
17
16
  _EMPTY_RECORD_BATCH = pa.RecordBatch.from_arrays([], [])
@@ -140,16 +139,7 @@ class ArrowIngestor(data_ingestor.DataIngestor):
140
139
  # We may be able to optimize this by splitting the result batches into
141
140
  # in-memory (first batch) and file URLs (subsequent batches) and creating a
142
141
  # union dataset.
143
- result_batches = ingestor_utils.get_dataframe_result_batches(self._session, source)
144
- sources.extend(
145
- b.to_arrow(self._session.connection)
146
- if isinstance(b, result_batch.ArrowResultBatch)
147
- else b.to_arrow()
148
- for b in result_batches
149
- )
150
- # HACK: Mitigate typing inconsistencies in Snowpark results
151
- if len(sources) > 0:
152
- sources = [_cast_if_needed(s, sources[-1].schema) for s in sources]
142
+ sources.append(_cast_if_needed(ingestor_utils.get_dataframe_arrow_table(self._session, source)))
153
143
  source_format = None # Arrow Dataset expects "None" for in-memory datasets
154
144
  else:
155
145
  raise RuntimeError(f"Unsupported data source type: {type(source)}")
@@ -1,19 +1,17 @@
1
1
  from typing import List, Optional
2
2
 
3
3
  import fsspec
4
+ import pyarrow as pa
4
5
 
5
6
  from snowflake import snowpark
6
- from snowflake.connector import result_batch
7
+ from snowflake.connector import cursor as sf_cursor, result_batch
7
8
  from snowflake.ml.data import data_source
8
9
  from snowflake.ml.fileset import snowfs
9
10
 
10
11
  _TARGET_FILE_SIZE = 32 * 2**20 # The max file size for data loading.
11
12
 
12
13
 
13
- def get_dataframe_result_batches(
14
- session: snowpark.Session, df_info: data_source.DataFrameInfo
15
- ) -> List[result_batch.ResultBatch]:
16
- """Retrieve the ResultBatches for a given query"""
14
+ def _get_dataframe_cursor(session: snowpark.Session, df_info: data_source.DataFrameInfo) -> sf_cursor.SnowflakeCursor:
17
15
  cursor = session._conn._cursor
18
16
 
19
17
  if df_info.query_id:
@@ -29,12 +27,24 @@ def get_dataframe_result_batches(
29
27
  if cursor._prefetch_hook is None:
30
28
  raise RuntimeError("Loading data from result query failed unexpectedly. Please contact Snowflake support.")
31
29
  cursor._prefetch_hook()
30
+
31
+ return cursor
32
+
33
+
34
+ def get_dataframe_result_batches(
35
+ session: snowpark.Session, df_info: data_source.DataFrameInfo
36
+ ) -> List[result_batch.ResultBatch]:
37
+ """Retrieve the ResultBatches for a given query"""
38
+ cursor = _get_dataframe_cursor(session, df_info)
32
39
  batches = cursor.get_result_batches()
33
- if batches is None:
34
- raise ValueError(
35
- "Failed to retrieve training data. Query status:" f" {session._conn._conn.get_query_status(query_id)}"
36
- )
37
- return batches
40
+ return batches or []
41
+
42
+
43
+ def get_dataframe_arrow_table(session: snowpark.Session, df_info: data_source.DataFrameInfo) -> pa.Table:
44
+ """Retrieve the full in-memory result for a given query"""
45
+ cursor = _get_dataframe_cursor(session, df_info)
46
+ table = cursor.fetch_arrow_all() # type: ignore[call-overload]
47
+ return table
38
48
 
39
49
 
40
50
  def get_dataset_filesystem(
@@ -30,6 +30,7 @@ class _Privilege:
30
30
  object_name: str
31
31
  privileges: List[str]
32
32
  scope: Optional[str] = None
33
+ optional: bool = False
33
34
 
34
35
 
35
36
  @dataclass(frozen=True)
@@ -72,8 +73,7 @@ _PRE_INIT_PRIVILEGES: Dict[_FeatureStoreRole, List[_Privilege]] = {
72
73
  _Privilege("VIEW", _ALL_OBJECTS, ["SELECT", "REFERENCES"], "SCHEMA {database}.{schema}"),
73
74
  _Privilege("TABLE", _ALL_OBJECTS, ["SELECT", "REFERENCES"], "SCHEMA {database}.{schema}"),
74
75
  _Privilege("DATASET", _ALL_OBJECTS, ["USAGE"], "SCHEMA {database}.{schema}"),
75
- # User should decide whether they want to grant warehouse usage to CONSUMER
76
- # _Privilege("WAREHOUSE", "{warehouse}", ["USAGE"]),
76
+ _Privilege("WAREHOUSE", "{warehouse}", ["USAGE"], optional=True),
77
77
  ],
78
78
  _FeatureStoreRole.NONE: [],
79
79
  }
@@ -109,7 +109,7 @@ def _grant_privileges(
109
109
  query += f" TO ROLE {role_name}"
110
110
  session.sql(query).collect()
111
111
  except exceptions.SnowparkSQLException as e:
112
- if any(
112
+ if p.optional or any(
113
113
  s in e.message
114
114
  for s in (
115
115
  "Ask your account admin",
@@ -122,6 +122,14 @@ _DT_OR_VIEW_QUERY_PATTERN = re.compile(
122
122
  flags=re.DOTALL | re.IGNORECASE | re.X,
123
123
  )
124
124
 
125
+ _DT_INITIALIZE_PATTERN = re.compile(
126
+ r"""CREATE\ DYNAMIC\ TABLE\ .*
127
+ initialize\ =\ '(?P<initialize>.*)'\ .*?
128
+ AS\ .*
129
+ """,
130
+ flags=re.DOTALL | re.IGNORECASE | re.X,
131
+ )
132
+
125
133
  _LIST_FEATURE_VIEW_SCHEMA = StructType(
126
134
  [
127
135
  StructField("name", StringType()),
@@ -565,11 +573,15 @@ class FeatureStore:
565
573
  tagging_clause_str = ",\n".join(tagging_clause)
566
574
 
567
575
  def create_col_desc(col: StructField) -> str:
568
- desc = feature_view.feature_descs.get(SqlIdentifier(col.name), None)
576
+ desc = feature_view.feature_descs.get(SqlIdentifier(col.name), None) # type: ignore[union-attr]
569
577
  desc = "" if desc is None else f"COMMENT '{desc}'"
570
578
  return f"{col.name} {desc}"
571
579
 
572
- column_descs = ", ".join([f"{create_col_desc(col)}" for col in feature_view.output_schema.fields])
580
+ column_descs = (
581
+ ", ".join([f"{create_col_desc(col)}" for col in feature_view.output_schema.fields])
582
+ if feature_view.feature_descs is not None
583
+ else ""
584
+ )
573
585
 
574
586
  if refresh_freq is not None:
575
587
  schedule_task = refresh_freq != "DOWNSTREAM" and timeparse(refresh_freq) is None
@@ -1819,6 +1831,7 @@ class FeatureStore:
1819
1831
  )
1820
1832
  WAREHOUSE = {warehouse}
1821
1833
  REFRESH_MODE = {feature_view.refresh_mode}
1834
+ INITIALIZE = {feature_view.initialize}
1822
1835
  AS {feature_view.query}
1823
1836
  """
1824
1837
  self._session.sql(query).collect(block=block, statement_params=self._telemetry_stmp)
@@ -2293,6 +2306,8 @@ class FeatureStore:
2293
2306
  entities = [find_and_compose_entity(n) for n in fv_metadata.entities]
2294
2307
  ts_col = fv_metadata.timestamp_col
2295
2308
  timestamp_col = ts_col if ts_col not in _LEGACY_TIMESTAMP_COL_PLACEHOLDER_VALS else None
2309
+ re_initialize = re.match(_DT_INITIALIZE_PATTERN, row["text"])
2310
+ initialize = re_initialize.group("initialize") if re_initialize is not None else "ON_CREATE"
2296
2311
 
2297
2312
  fv = FeatureView._construct_feature_view(
2298
2313
  name=name,
@@ -2317,6 +2332,7 @@ class FeatureStore:
2317
2332
  ),
2318
2333
  refresh_mode=row["refresh_mode"],
2319
2334
  refresh_mode_reason=row["refresh_mode_reason"],
2335
+ initialize=initialize,
2320
2336
  owner=row["owner"],
2321
2337
  infer_schema_df=infer_schema_df,
2322
2338
  session=self._session,
@@ -2343,6 +2359,7 @@ class FeatureStore:
2343
2359
  warehouse=None,
2344
2360
  refresh_mode=None,
2345
2361
  refresh_mode_reason=None,
2362
+ initialize="ON_CREATE",
2346
2363
  owner=row["owner"],
2347
2364
  infer_schema_df=infer_schema_df,
2348
2365
  session=self._session,