dataiku-api-client 14.7.4__tar.gz → 15.0.1__tar.gz
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.
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/HISTORY.txt +9 -0
- {dataiku_api_client-14.7.4/dataiku_api_client.egg-info → dataiku_api_client-15.0.1}/PKG-INFO +11 -2
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1/dataiku_api_client.egg-info}/PKG-INFO +11 -2
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataiku_api_client.egg-info/SOURCES.txt +1 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/admin.py +55 -0
- dataiku_api_client-15.0.1/dataikuapi/dss/agent_skill.py +237 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/agent_tool.py +99 -2
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/analysis.py +33 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/apiservice.py +14 -1
- dataiku_api_client-15.0.1/dataikuapi/dss/data_collection.py +447 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/dataset.py +53 -8
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/document_extractor.py +25 -4
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/enterprise_asset_library.py +147 -90
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/evaluationstore.py +1 -1
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/knowledgebank.py +11 -1
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/langchain/llm.py +3 -2
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/llm.py +1127 -25
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/llm_utils/__init__.py +6 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/ml.py +279 -19
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/project.py +186 -3
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/retrieval_augmented_llm.py +1 -1
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/savedmodel.py +4 -2
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/scenario.py +2 -1
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/semantic_model.py +11 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dssclient.py +117 -13
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/setup.py +1 -1
- dataiku_api_client-14.7.4/dataikuapi/dss/data_collection.py +0 -308
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/LICENSE.txt +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/MANIFEST.in +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/README +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataiku_api_client.egg-info/dependency_links.txt +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataiku_api_client.egg-info/requires.txt +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataiku_api_client.egg-info/top_level.txt +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/__init__.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/apinode_admin/__init__.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/apinode_admin/auth.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/apinode_admin/service.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/apinode_admin_client.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/apinode_client.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/auth.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/base_client.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/__init__.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/agent.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/agent_review.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/apideployer.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/app.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/businessapp.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/cobuild.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/codestudio.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/continuousactivity.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/dashboard.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/data_directories_footprint.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/data_quality.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/discussion.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/drift.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/evaluationcomparison.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/feature_store.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/flow.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/future.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/insight.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/job.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/jupyternotebook.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/labeling_task.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/langchain/__init__.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/langchain/embeddings.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/langchain/knowledge_bank.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/langchain/tool.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/langchain/utils.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/llm_tracing/__init__.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/local_model.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/macro.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/managedfolder.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/meaning.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/messaging_channel.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/metrics.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/mira.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/mlflow.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/modelcomparison.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/modelevaluationstore.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/notebook.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/plugin.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/project_standards.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/projectdeployer.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/projectfolder.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/projectlibrary.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/recipe.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/sqlnotebook.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/sqlquery.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/statistics.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/streaming_endpoint.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/tools/__init__.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/tools/codegen.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/tools/langchain.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/unifiedmonitoring.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/utils.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/webapp.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/wiki.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss/workspace.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss_plugin_mlflow/__init__.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss_plugin_mlflow/artifact_repository.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss_plugin_mlflow/header_provider.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/dss_plugin_mlflow/utils.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/fm/__init__.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/fm/cloudaccounts.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/fm/future.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/fm/instances.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/fm/instancesettingstemplates.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/fm/loadbalancers.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/fm/tenant.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/fm/virtualnetworks.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/fmclient.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/govern/__init__.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/govern/admin.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/govern/admin_blueprint_designer.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/govern/admin_custom_pages_handler.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/govern/admin_roles_permissions_handler.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/govern/artifact.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/govern/artifact_search.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/govern/blueprint.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/govern/custom_page.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/govern/future.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/govern/time_series.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/govern/uploaded_file.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/govern/users_container.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/govern_client.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/iam/__init__.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/iam/settings.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/launchpad/__init__.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/launchpad/exceptions.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/launchpad/group.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/launchpad/node.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/launchpad/profile.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/launchpad/response.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/launchpad/task.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/launchpad/user.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/launchpad_client.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/dataikuapi/utils.py +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/requirements.txt +0 -0
- {dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1}/setup.cfg +0 -0
{dataiku_api_client-14.7.4/dataiku_api_client.egg-info → dataiku_api_client-15.0.1}/PKG-INFO
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dataiku-api-client
|
|
3
|
-
Version:
|
|
3
|
+
Version: 15.0.1
|
|
4
4
|
Summary: Python API client for Dataiku APIs
|
|
5
5
|
Home-page: https://www.dataiku.com
|
|
6
|
-
Download-URL: https://github.com/dataiku/dataiku-api-client-python/tarball/
|
|
6
|
+
Download-URL: https://github.com/dataiku/dataiku-api-client-python/tarball/15.0.1
|
|
7
7
|
Author: Dataiku
|
|
8
8
|
Author-email: support@dataiku.com
|
|
9
9
|
License: Apache Software License
|
|
@@ -35,6 +35,15 @@ https://doc.dataiku.com/dss/latest/python-api/rest-api-client/index.html
|
|
|
35
35
|
Changelog
|
|
36
36
|
==========
|
|
37
37
|
|
|
38
|
+
15.0.1 (2026-09-15)
|
|
39
|
+
-------------------
|
|
40
|
+
|
|
41
|
+
* Initial release for DSS 15.0.1
|
|
42
|
+
|
|
43
|
+
15.0.0 (2026-08-14)
|
|
44
|
+
-------------------
|
|
45
|
+
|
|
46
|
+
* Initial release for DSS 15.0.0
|
|
38
47
|
|
|
39
48
|
14.7.4 (2026-09-14)
|
|
40
49
|
-------------------
|
{dataiku_api_client-14.7.4 → dataiku_api_client-15.0.1/dataiku_api_client.egg-info}/PKG-INFO
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dataiku-api-client
|
|
3
|
-
Version:
|
|
3
|
+
Version: 15.0.1
|
|
4
4
|
Summary: Python API client for Dataiku APIs
|
|
5
5
|
Home-page: https://www.dataiku.com
|
|
6
|
-
Download-URL: https://github.com/dataiku/dataiku-api-client-python/tarball/
|
|
6
|
+
Download-URL: https://github.com/dataiku/dataiku-api-client-python/tarball/15.0.1
|
|
7
7
|
Author: Dataiku
|
|
8
8
|
Author-email: support@dataiku.com
|
|
9
9
|
License: Apache Software License
|
|
@@ -35,6 +35,15 @@ https://doc.dataiku.com/dss/latest/python-api/rest-api-client/index.html
|
|
|
35
35
|
Changelog
|
|
36
36
|
==========
|
|
37
37
|
|
|
38
|
+
15.0.1 (2026-09-15)
|
|
39
|
+
-------------------
|
|
40
|
+
|
|
41
|
+
* Initial release for DSS 15.0.1
|
|
42
|
+
|
|
43
|
+
15.0.0 (2026-08-14)
|
|
44
|
+
-------------------
|
|
45
|
+
|
|
46
|
+
* Initial release for DSS 15.0.0
|
|
38
47
|
|
|
39
48
|
14.7.4 (2026-09-14)
|
|
40
49
|
-------------------
|
|
@@ -4,6 +4,8 @@ import json
|
|
|
4
4
|
import warnings
|
|
5
5
|
import logging
|
|
6
6
|
from datetime import datetime
|
|
7
|
+
|
|
8
|
+
from .utils import DSSInfoMessages
|
|
7
9
|
from ..utils import _timestamp_ms_to_zoned_datetime
|
|
8
10
|
|
|
9
11
|
logger = logging.getLogger("dataikuapi.dss.admin")
|
|
@@ -2208,6 +2210,7 @@ class DSSCodeEnvContainerConfsBearer(object):
|
|
|
2208
2210
|
* SYSTEM_LEVEL_CUDA_122_CUDNN_897
|
|
2209
2211
|
* CUDA_SUPPORT_FOR_TORCH2_WITH_PYPI_NVIDIA_PACKAGES
|
|
2210
2212
|
* BASIC_GPU_ENABLING
|
|
2213
|
+
* HUGGING_FACE_LOCAL_CPU
|
|
2211
2214
|
* PYTHON36_SUPPORT
|
|
2212
2215
|
* PYTHON37_SUPPORT
|
|
2213
2216
|
* PYTHON38_SUPPORT
|
|
@@ -3305,6 +3308,58 @@ class DSSCodeStudioTemplate(object):
|
|
|
3305
3308
|
params={"withNoCache": disable_docker_cache})
|
|
3306
3309
|
return DSSFuture(self.client, future_response.get('jobId', None), future_response)
|
|
3307
3310
|
|
|
3311
|
+
def get_export_stream(self):
|
|
3312
|
+
"""
|
|
3313
|
+
Export the template as a zip archive.
|
|
3314
|
+
|
|
3315
|
+
:returns: the exported archive as a stream
|
|
3316
|
+
:rtype: file-like object
|
|
3317
|
+
"""
|
|
3318
|
+
return self.client._perform_raw(
|
|
3319
|
+
"GET", "/admin/code-studios/%s/export" % (self.template_id)
|
|
3320
|
+
).raw
|
|
3321
|
+
|
|
3322
|
+
def export_to_file(self, path):
|
|
3323
|
+
"""
|
|
3324
|
+
Export the template to a file.
|
|
3325
|
+
|
|
3326
|
+
This produces a zip file with the template's definition and its resources, if any. The zip can be imported with
|
|
3327
|
+
:meth:`dataikuapi.DSSClient.import_code_studio_template`
|
|
3328
|
+
|
|
3329
|
+
:param str path: the destination file path
|
|
3330
|
+
"""
|
|
3331
|
+
with open(path, 'wb') as f:
|
|
3332
|
+
export_stream = self.client._perform_raw(
|
|
3333
|
+
"GET", "/admin/code-studios/%s/export" % (self.template_id)
|
|
3334
|
+
)
|
|
3335
|
+
for chunk in export_stream.iter_content(chunk_size=32768):
|
|
3336
|
+
if chunk:
|
|
3337
|
+
f.write(chunk)
|
|
3338
|
+
f.flush()
|
|
3339
|
+
|
|
3340
|
+
########################################################
|
|
3341
|
+
# Template deletion
|
|
3342
|
+
########################################################
|
|
3343
|
+
|
|
3344
|
+
def delete(self, delete_runtime=False, delete_images=False):
|
|
3345
|
+
"""
|
|
3346
|
+
Delete the template.
|
|
3347
|
+
|
|
3348
|
+
:param bool delete_runtime: if True, also delete the Code Studio runtimes created from this template
|
|
3349
|
+
:param bool delete_images: if True, also delete the Docker images and build folders associated with this template
|
|
3350
|
+
|
|
3351
|
+
:return: backend info/warning/error messages about the deletion
|
|
3352
|
+
:rtype: dict
|
|
3353
|
+
"""
|
|
3354
|
+
resp = self.client._perform_json(
|
|
3355
|
+
"DELETE",
|
|
3356
|
+
"/admin/code-studios/%s" % (self.template_id),
|
|
3357
|
+
params={
|
|
3358
|
+
"deleteRuntime": delete_runtime,
|
|
3359
|
+
"deleteImages": delete_images
|
|
3360
|
+
})
|
|
3361
|
+
return DSSInfoMessages(resp)
|
|
3362
|
+
|
|
3308
3363
|
class DSSCodeStudioTemplateSettings(object):
|
|
3309
3364
|
"""
|
|
3310
3365
|
The settings of a code studio template
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
from requests import utils
|
|
2
|
+
|
|
3
|
+
from .utils import DSSTaggableObjectListItem, DSSTaggableObjectSettings
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class DSSAgentSkillListItem(DSSTaggableObjectListItem):
|
|
7
|
+
"""
|
|
8
|
+
.. important::
|
|
9
|
+
Do not instantiate this class directly, instead use :meth:`dataikuapi.dss.project.DSSProject.list_agent_skills`.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
def __init__(self, client, project_key, data):
|
|
13
|
+
super(DSSAgentSkillListItem, self).__init__(data)
|
|
14
|
+
self.client = client
|
|
15
|
+
self.project_key = data.get("projectKey", project_key)
|
|
16
|
+
|
|
17
|
+
def to_agent_skill(self):
|
|
18
|
+
"""
|
|
19
|
+
Convert the current item.
|
|
20
|
+
|
|
21
|
+
:rtype: :class:`dataikuapi.dss.agent_skill.DSSAgentSkill`
|
|
22
|
+
"""
|
|
23
|
+
return DSSAgentSkill(self.client, self.project_key, self._data["id"])
|
|
24
|
+
|
|
25
|
+
@property
|
|
26
|
+
def id(self):
|
|
27
|
+
"""
|
|
28
|
+
:returns: The id of the skill.
|
|
29
|
+
:rtype: string
|
|
30
|
+
"""
|
|
31
|
+
return self._data["id"]
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def name(self):
|
|
35
|
+
"""
|
|
36
|
+
:returns: The name of the skill.
|
|
37
|
+
:rtype: string
|
|
38
|
+
"""
|
|
39
|
+
return self._data.get("name")
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class DSSAgentSkill(object):
|
|
43
|
+
"""
|
|
44
|
+
.. important::
|
|
45
|
+
Do not instantiate this class directly, instead use :meth:`dataikuapi.dss.project.DSSProject.get_agent_skill`.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
def __init__(self, client, project_key, skill_id):
|
|
49
|
+
self.client = client
|
|
50
|
+
self.project_key = project_key
|
|
51
|
+
self.skill_id = skill_id
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def id(self):
|
|
55
|
+
"""
|
|
56
|
+
:returns: The id of the skill.
|
|
57
|
+
:rtype: string
|
|
58
|
+
"""
|
|
59
|
+
return self.skill_id
|
|
60
|
+
|
|
61
|
+
def get_settings(self):
|
|
62
|
+
"""
|
|
63
|
+
Get the DSS metadata settings of the agent skill.
|
|
64
|
+
|
|
65
|
+
The parsed ``SKILL.md`` fields are available through
|
|
66
|
+
:meth:`get_skill_content` and the raw file through :meth:`get_file`.
|
|
67
|
+
|
|
68
|
+
:return: a handle on the skill settings
|
|
69
|
+
:rtype: :class:`dataikuapi.dss.agent_skill.DSSAgentSkillSettings`
|
|
70
|
+
"""
|
|
71
|
+
settings = self.client._perform_json(
|
|
72
|
+
"GET",
|
|
73
|
+
"/projects/%s/agents/skills/%s" % (self.project_key, self.id),
|
|
74
|
+
)
|
|
75
|
+
return DSSAgentSkillSettings(self, settings)
|
|
76
|
+
|
|
77
|
+
def get_skill_content(self):
|
|
78
|
+
"""
|
|
79
|
+
Get the parsed contents of ``SKILL.md``.
|
|
80
|
+
|
|
81
|
+
:returns: A dictionary containing ``name``, ``description``,
|
|
82
|
+
``metadata``, and ``instructions``.
|
|
83
|
+
:rtype: dict
|
|
84
|
+
"""
|
|
85
|
+
return self.client._perform_json(
|
|
86
|
+
"GET",
|
|
87
|
+
"/projects/%s/agents/skills/%s/content"
|
|
88
|
+
% (self.project_key, self.id),
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
def delete(self):
|
|
92
|
+
"""
|
|
93
|
+
Delete the agent skill.
|
|
94
|
+
"""
|
|
95
|
+
return self.client._perform_empty("DELETE", "/projects/%s/agents/skills/%s" % (self.project_key, self.id))
|
|
96
|
+
|
|
97
|
+
def list_resources(self):
|
|
98
|
+
"""
|
|
99
|
+
List the files and folders attached to this skill as a recursive tree.
|
|
100
|
+
|
|
101
|
+
:rtype: list[dict]
|
|
102
|
+
"""
|
|
103
|
+
return self.client._perform_json(
|
|
104
|
+
"GET",
|
|
105
|
+
"/projects/%s/agents/skills/%s/resources/contents" % (self.project_key, self.id),
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
def get_file(self, path):
|
|
109
|
+
"""
|
|
110
|
+
Get a file's contents.
|
|
111
|
+
|
|
112
|
+
:param str path: Root-relative path of the file to download
|
|
113
|
+
:rtype: :class:`requests.models.Response`
|
|
114
|
+
"""
|
|
115
|
+
return self.client._perform_raw(
|
|
116
|
+
"GET",
|
|
117
|
+
"/projects/%s/agents/skills/%s/resources/contents/%s"
|
|
118
|
+
% (self.project_key, self.id, utils.quote(path)),
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
def get_file_details(self, path):
|
|
122
|
+
"""
|
|
123
|
+
Get a file's metadata without its content.
|
|
124
|
+
|
|
125
|
+
:param str path: Root-relative path of the file
|
|
126
|
+
:rtype: dict
|
|
127
|
+
"""
|
|
128
|
+
return self.client._perform_json(
|
|
129
|
+
"GET",
|
|
130
|
+
"/projects/%s/agents/skills/%s/resources/details/%s"
|
|
131
|
+
% (self.project_key, self.id, utils.quote(path)),
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
def put_file(self, path, data):
|
|
135
|
+
"""
|
|
136
|
+
Create or overwrite a file.
|
|
137
|
+
|
|
138
|
+
Strings are encoded as UTF-8 and bytes are stored unchanged. Parent
|
|
139
|
+
folders must already exist. Replacing the root ``SKILL.md`` validates
|
|
140
|
+
the supplied content and rejects an invalid skill file.
|
|
141
|
+
|
|
142
|
+
:param str path: Root-relative path of the file
|
|
143
|
+
:param data: String, bytes, or file-like content
|
|
144
|
+
:rtype: dict
|
|
145
|
+
"""
|
|
146
|
+
if isinstance(data, str):
|
|
147
|
+
data = data.encode("utf-8")
|
|
148
|
+
elif not isinstance(data, bytes) and not hasattr(data, "read"):
|
|
149
|
+
raise TypeError("data must be a string, bytes, or file-like object")
|
|
150
|
+
return self.client._perform_json(
|
|
151
|
+
"PUT",
|
|
152
|
+
"/projects/%s/agents/skills/%s/resources/contents/%s"
|
|
153
|
+
% (self.project_key, self.id, utils.quote(path)),
|
|
154
|
+
files={"file": (path.rsplit("/", 1)[-1], data)},
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
def rename_resource(self, path, new_name):
|
|
158
|
+
"""
|
|
159
|
+
Rename a resource.
|
|
160
|
+
|
|
161
|
+
:param str path: Root-relative path of the existing resource
|
|
162
|
+
:param str new_name: New file name, without a folder path
|
|
163
|
+
:rtype: str
|
|
164
|
+
"""
|
|
165
|
+
return self.client._perform_raw(
|
|
166
|
+
"POST",
|
|
167
|
+
"/projects/%s/agents/skills/%s/resources/contents-actions/rename"
|
|
168
|
+
% (self.project_key, self.id),
|
|
169
|
+
body={"oldPath": path, "newName": new_name},
|
|
170
|
+
).text
|
|
171
|
+
|
|
172
|
+
def move_resource(self, path, new_path):
|
|
173
|
+
"""
|
|
174
|
+
Move a resource to a destination folder.
|
|
175
|
+
|
|
176
|
+
:param str path: Root-relative path of the existing resource
|
|
177
|
+
:param str new_path: Root-relative path of the destination folder, or an empty string for the skill root
|
|
178
|
+
:rtype: str
|
|
179
|
+
"""
|
|
180
|
+
return self.client._perform_raw(
|
|
181
|
+
"POST",
|
|
182
|
+
"/projects/%s/agents/skills/%s/resources/contents-actions/move"
|
|
183
|
+
% (self.project_key, self.id),
|
|
184
|
+
body={"oldPath": path, "newPath": new_path},
|
|
185
|
+
).text
|
|
186
|
+
|
|
187
|
+
def create_folder(self, path):
|
|
188
|
+
"""
|
|
189
|
+
Create a resource folder in the skill.
|
|
190
|
+
|
|
191
|
+
Missing parent folders are created as needed.
|
|
192
|
+
|
|
193
|
+
:param str path: Root-relative path of the folder to create
|
|
194
|
+
"""
|
|
195
|
+
return self.client._perform_empty(
|
|
196
|
+
"POST",
|
|
197
|
+
"/projects/%s/agents/skills/%s/resources/folders/%s"
|
|
198
|
+
% (self.project_key, self.id, utils.quote(path)),
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
def delete_resource(self, path):
|
|
202
|
+
"""
|
|
203
|
+
Delete a resource from the skill.
|
|
204
|
+
|
|
205
|
+
:param str path: Root-relative path of the resource to delete
|
|
206
|
+
"""
|
|
207
|
+
return self.client._perform_empty(
|
|
208
|
+
"DELETE",
|
|
209
|
+
"/projects/%s/agents/skills/%s/resources/contents/%s"
|
|
210
|
+
% (self.project_key, self.id, utils.quote(path)),
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
class DSSAgentSkillSettings(DSSTaggableObjectSettings):
|
|
214
|
+
def __init__(self, agent_skill, settings):
|
|
215
|
+
super(DSSAgentSkillSettings, self).__init__(settings)
|
|
216
|
+
self.agent_skill = agent_skill
|
|
217
|
+
|
|
218
|
+
def get_raw(self):
|
|
219
|
+
"""
|
|
220
|
+
Get the raw settings of the skill.
|
|
221
|
+
|
|
222
|
+
:rtype: dict
|
|
223
|
+
"""
|
|
224
|
+
return self._tod
|
|
225
|
+
|
|
226
|
+
def save(self):
|
|
227
|
+
"""
|
|
228
|
+
Saves the DSS metadata settings of the agent skill.
|
|
229
|
+
|
|
230
|
+
This does not modify ``SKILL.md``. Use :meth:`DSSAgentSkill.put_file`
|
|
231
|
+
to replace the skill file.
|
|
232
|
+
"""
|
|
233
|
+
self.agent_skill.client._perform_empty(
|
|
234
|
+
"PUT",
|
|
235
|
+
"/projects/%s/agents/skills/%s" % (self.agent_skill.project_key, self.agent_skill.id),
|
|
236
|
+
body=self._tod,
|
|
237
|
+
)
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import hashlib
|
|
2
|
+
import json
|
|
1
3
|
from .utils import DSSTaggableObjectListItem, DSSTaggableObjectSettings, AnyLoc
|
|
2
4
|
from .knowledgebank import DSSKnowledgeBank, DSSKnowledgeBankListItem
|
|
3
5
|
from .llm_tracing import prepare_query_for_nested_llm_mesh_call
|
|
4
|
-
import json
|
|
5
6
|
|
|
6
7
|
class DSSAgentToolListItem(DSSTaggableObjectListItem):
|
|
7
8
|
"""
|
|
@@ -55,6 +56,7 @@ class DSSAgentTool(object):
|
|
|
55
56
|
self.project_key = project_key
|
|
56
57
|
self.tool_id = tool_id
|
|
57
58
|
self._descriptor = descriptor
|
|
59
|
+
self._subtool_mapping = {}
|
|
58
60
|
|
|
59
61
|
@property
|
|
60
62
|
def id(self):
|
|
@@ -108,11 +110,106 @@ class DSSAgentTool(object):
|
|
|
108
110
|
from dataikuapi.dss.langchain.tool import convert_to_langchain_structured_tool
|
|
109
111
|
return convert_to_langchain_structured_tool(self, context)
|
|
110
112
|
|
|
113
|
+
@staticmethod
|
|
114
|
+
def _compute_spec_hash(tool_ref, additional_description, subtool_name=None):
|
|
115
|
+
additional_description = (additional_description or "").strip()
|
|
116
|
+
subtool_name = (subtool_name or "").strip()
|
|
117
|
+
fields = [tool_ref, additional_description, subtool_name]
|
|
118
|
+
serialized_fields = json.dumps(fields, sort_keys=True, ensure_ascii=True)
|
|
119
|
+
return hashlib.sha256(serialized_fields.encode("utf-8")).hexdigest()[:6]
|
|
120
|
+
|
|
121
|
+
@staticmethod
|
|
122
|
+
def _get_function_tool_descriptor_parts(
|
|
123
|
+
tool_descriptor,
|
|
124
|
+
spec_hash,
|
|
125
|
+
additional_description,
|
|
126
|
+
subtool_descriptor=None,
|
|
127
|
+
):
|
|
128
|
+
|
|
129
|
+
name = "{}__{}".format(tool_descriptor['name'], spec_hash)
|
|
130
|
+
|
|
131
|
+
if subtool_descriptor:
|
|
132
|
+
description = subtool_descriptor.get("description", "")
|
|
133
|
+
parameters = subtool_descriptor["inputSchema"]
|
|
134
|
+
name += "__" + subtool_descriptor["name"]
|
|
135
|
+
else:
|
|
136
|
+
description = tool_descriptor.get("description", "")
|
|
137
|
+
parameters = tool_descriptor["inputSchema"]
|
|
138
|
+
|
|
139
|
+
if additional_description:
|
|
140
|
+
description = "{}\n\n{}".format(description, additional_description).strip()
|
|
141
|
+
|
|
142
|
+
return (
|
|
143
|
+
name,
|
|
144
|
+
description,
|
|
145
|
+
parameters,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
@staticmethod
|
|
149
|
+
def _build_function_tool_descriptor(name, description, parameters):
|
|
150
|
+
return {
|
|
151
|
+
"type": "function",
|
|
152
|
+
"function": {
|
|
153
|
+
"name": name,
|
|
154
|
+
"description": description,
|
|
155
|
+
"parameters": parameters,
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
def _as_llm_mesh_tool(self):
|
|
160
|
+
tool_descriptor = self.get_descriptor()
|
|
161
|
+
if type(self._descriptor) is not dict:
|
|
162
|
+
raise Exception("Invalid descriptor type: expected `dict`, got %s" % type(self._descriptor))
|
|
163
|
+
settings = self.get_settings().get_raw()
|
|
164
|
+
additional_description = settings.get("additionalDescriptionForLLM") or ""
|
|
165
|
+
result = []
|
|
166
|
+
if tool_descriptor.get("multiple"):
|
|
167
|
+
for subtool in tool_descriptor.get("subtools", []):
|
|
168
|
+
if not subtool.get("enabled"):
|
|
169
|
+
continue
|
|
170
|
+
subtool_spec_hash = self._compute_spec_hash(
|
|
171
|
+
self.tool_id,
|
|
172
|
+
additional_description,
|
|
173
|
+
subtool.get("name"),
|
|
174
|
+
)
|
|
175
|
+
name, description, parameters = self._get_function_tool_descriptor_parts(
|
|
176
|
+
tool_descriptor,
|
|
177
|
+
subtool_spec_hash,
|
|
178
|
+
additional_description,
|
|
179
|
+
subtool_descriptor=subtool,
|
|
180
|
+
)
|
|
181
|
+
self._subtool_mapping[name] = subtool.get("name")
|
|
182
|
+
result.append(self._build_function_tool_descriptor(
|
|
183
|
+
name=name,
|
|
184
|
+
description=description,
|
|
185
|
+
parameters=parameters,
|
|
186
|
+
))
|
|
187
|
+
else:
|
|
188
|
+
computed_spec_hash = self._compute_spec_hash(
|
|
189
|
+
self.tool_id,
|
|
190
|
+
additional_description,
|
|
191
|
+
)
|
|
192
|
+
name, description, parameters = self._get_function_tool_descriptor_parts(
|
|
193
|
+
tool_descriptor,
|
|
194
|
+
computed_spec_hash,
|
|
195
|
+
additional_description,
|
|
196
|
+
)
|
|
197
|
+
result.append(self._build_function_tool_descriptor(
|
|
198
|
+
name=name,
|
|
199
|
+
description=description,
|
|
200
|
+
parameters=parameters,
|
|
201
|
+
))
|
|
202
|
+
|
|
203
|
+
return result
|
|
204
|
+
|
|
205
|
+
def _get_subtool_name(self, tool_name):
|
|
206
|
+
return self._subtool_mapping.get(tool_name)
|
|
207
|
+
|
|
111
208
|
def run(self, input, context=None, subtool_name=None, memory_fragment=None, tool_validation_responses=None, tool_validation_requests=None):
|
|
112
209
|
"""
|
|
113
210
|
Execute a tool call
|
|
114
211
|
|
|
115
|
-
:param
|
|
212
|
+
:param dict input: Input for the tool
|
|
116
213
|
:param dict context: Additional request context
|
|
117
214
|
:param str subtool_name: Name of the sub-tool, if applicable (e.g., for a MCP tool)
|
|
118
215
|
:rtype: dict
|
|
@@ -258,6 +258,39 @@ class DSSAnalysis(object):
|
|
|
258
258
|
mltask.wait_guess_complete()
|
|
259
259
|
return mltask
|
|
260
260
|
|
|
261
|
+
def create_multi_target_prediction_ml_task(self,
|
|
262
|
+
target_variables,
|
|
263
|
+
guess_policy="MULTI_TARGET_DEFAULT",
|
|
264
|
+
wait_guess_complete=True):
|
|
265
|
+
"""Creates a new multi-target regression task in this visual analysis lab for a dataset.
|
|
266
|
+
|
|
267
|
+
:param list target_variables: List of target variables to predict
|
|
268
|
+
:param string guess_policy: Policy to use for setting the default parameters.
|
|
269
|
+
Valid values are: MULTI_TARGET_DEFAULT
|
|
270
|
+
:param boolean wait_guess_complete: If False, the returned ML task will be in 'guessing' state, i.e. analyzing the input dataset to determine feature handling and algorithms.
|
|
271
|
+
You should wait for the guessing to be completed by calling
|
|
272
|
+
``wait_guess_complete`` on the returned object before doing anything
|
|
273
|
+
else (in particular calling ``train`` or ``get_settings``)
|
|
274
|
+
:return :class dataiku.dss.ml.DSSMLTask
|
|
275
|
+
"""
|
|
276
|
+
obj = {
|
|
277
|
+
"taskType": "PREDICTION",
|
|
278
|
+
"targetVariables": target_variables,
|
|
279
|
+
"backendType": "PY_MEMORY",
|
|
280
|
+
"guessPolicy": guess_policy,
|
|
281
|
+
"predictionType": "MULTI_TARGET_REGRESSION"
|
|
282
|
+
}
|
|
283
|
+
ref = self.client._perform_json(
|
|
284
|
+
"POST",
|
|
285
|
+
"/projects/{project_key}/lab/{analysis_id}/models/".format(project_key=self.project_key, analysis_id=self.analysis_id),
|
|
286
|
+
body=obj
|
|
287
|
+
)
|
|
288
|
+
mltask = DSSMLTask(self.client, self.project_key, self.analysis_id, ref["mlTaskId"])
|
|
289
|
+
|
|
290
|
+
if wait_guess_complete:
|
|
291
|
+
mltask.wait_guess_complete()
|
|
292
|
+
return mltask
|
|
293
|
+
|
|
261
294
|
def create_causal_prediction_ml_task(self,
|
|
262
295
|
outcome_variable,
|
|
263
296
|
treatment_variable,
|
|
@@ -116,7 +116,7 @@ class DSSAPIServiceSettings(object):
|
|
|
116
116
|
:return: ist of endpoints, each one a dict. Endpoint have different fields depending on their type, but always have at least:
|
|
117
117
|
|
|
118
118
|
* **id** : identifier of the endpoint
|
|
119
|
-
* **type** : type of endpoint. Possible values: STD_PREDICTION, STD_CLUSTERING, STD_FORECAST, STD_CAUSAL_PREDICTION, CUSTOM_PREDICTION, CUSTOM_R_PREDICTION, R_FUNCTION, PY_FUNCTION, DATASETS_LOOKUP, SQL_QUERY
|
|
119
|
+
* **type** : type of endpoint. Possible values: STD_PREDICTION, STD_CLUSTERING, STD_FORECAST, STD_CAUSAL_PREDICTION, STD_MULTITARGET_PREDICTION, CUSTOM_PREDICTION, CUSTOM_R_PREDICTION, R_FUNCTION, PY_FUNCTION, DATASETS_LOOKUP, SQL_QUERY
|
|
120
120
|
|
|
121
121
|
:rtype: list[dict]
|
|
122
122
|
"""
|
|
@@ -135,6 +135,19 @@ class DSSAPIServiceSettings(object):
|
|
|
135
135
|
"modelRef": saved_model_id
|
|
136
136
|
})
|
|
137
137
|
|
|
138
|
+
def add_multitarget_prediction_endpoint(self, endpoint_id, saved_model_id):
|
|
139
|
+
"""
|
|
140
|
+
Add a new "visual multi-target prediction" endpoint to this API service.
|
|
141
|
+
|
|
142
|
+
:param string endpoint_id: identifier of the new endpoint to create
|
|
143
|
+
:param string saved_model_id: identifier of the saved model (that is currently deployed to the Flow) to use
|
|
144
|
+
"""
|
|
145
|
+
self.settings["endpoints"].append({
|
|
146
|
+
"id" : endpoint_id,
|
|
147
|
+
"type" : "STD_MULTITARGET_PREDICTION",
|
|
148
|
+
"modelRef": saved_model_id
|
|
149
|
+
})
|
|
150
|
+
|
|
138
151
|
def add_clustering_endpoint(self, endpoint_id, saved_model_id):
|
|
139
152
|
"""
|
|
140
153
|
Add a new "visual clustering" endpoint to this API service.
|