From 586df2ad4d30ad236464e9805671af1ba901d8f2 Mon Sep 17 00:00:00 2001 From: Shuang Wu Date: Wed, 9 Jul 2025 17:45:53 +0200 Subject: [PATCH 1/8] allow PK to be an empty string --- mostlyai/sdk/_data/base.py | 4 ++-- mostlyai/sdk/_data/db/base.py | 2 +- mostlyai/sdk/_data/pull_utils.py | 4 ++-- mostlyai/sdk/domain.py | 6 +++--- tools/custom_template/pydantic_v2/BaseModel.jinja2 | 4 ++-- tools/model.py | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/mostlyai/sdk/_data/base.py b/mostlyai/sdk/_data/base.py index c9138f07..057f33a6 100644 --- a/mostlyai/sdk/_data/base.py +++ b/mostlyai/sdk/_data/base.py @@ -189,7 +189,7 @@ def get_context_key(self, table_name: str) -> DataIdentifier | None: def get_primary_key(self, table_name: str) -> DataIdentifier | None: primary_key = None - if self.tables[table_name].primary_key is not None: + if self.tables[table_name].primary_key: # first, check primary key on table primary_key = DataIdentifier(table_name, self.tables[table_name].primary_key) elif context_relations := self.get_child_context_relations(table_name): @@ -260,7 +260,7 @@ def get_scp_relations(self, table: str) -> list[ContextRelation]: def _update_key_encoding_types(self) -> None: for tbl_name, tbl_table in self.tables.items(): - if tbl_table.primary_key is not None: + if tbl_table.primary_key: if tbl_table.primary_key in tbl_table.encoding_types: del tbl_table.encoding_types[tbl_table.primary_key] for rel in self.get_relations_to_table(tbl_name): diff --git a/mostlyai/sdk/_data/db/base.py b/mostlyai/sdk/_data/db/base.py index 418e2a6e..2fc22f6d 100644 --- a/mostlyai/sdk/_data/db/base.py +++ b/mostlyai/sdk/_data/db/base.py @@ -1042,7 +1042,7 @@ def _get_primary_key(self) -> str | None: assert not self.is_output primary_key_constraint = self._sa_table.primary_key primary_key = next(iter(primary_key_constraint.columns), None) - return primary_key.name if primary_key is not None else None + return primary_key.name if primary_key else None def _get_dtypes(self) -> dict[str, WrappedDType]: assert not self.is_output diff --git a/mostlyai/sdk/_data/pull_utils.py b/mostlyai/sdk/_data/pull_utils.py index 3a7239d9..52e0922f 100644 --- a/mostlyai/sdk/_data/pull_utils.py +++ b/mostlyai/sdk/_data/pull_utils.py @@ -448,7 +448,7 @@ def fetch_table_data( ) n_fetched_rows = 0 for idx, chunk_df in enumerate(iterator): - if deduplicate_pks and primary_key is not None and primary_key.column in chunk_df.columns: + if deduplicate_pks and primary_key and primary_key.column in chunk_df.columns: # consider only the first occurrence of each primary key if not chunk_df[primary_key.column].is_unique: drop_idx = chunk_df[primary_key.column].duplicated() @@ -568,7 +568,7 @@ def fetch_target_table( key_fraction_df[FRACTION] = keys[MAX_TGT_ROWS_PER_CTX_KEY] / schema.tables[tgt].row_count key_fraction_df = key_fraction_df.rename(columns={tgt_context_key.ref_name(): tgt_context_key.column}) key_fraction_df = key_fraction_df.drop(columns=[MAX_TGT_ROWS_PER_CTX_KEY]) - elif tgt_primary_key is not None: + elif tgt_primary_key: # flat setup with primary key # sample target table by target primary key # use provided keys to filter and order the target table (max_sample_size=None, do_shuffle=False) diff --git a/mostlyai/sdk/domain.py b/mostlyai/sdk/domain.py index 20249198..3e2f7216 100644 --- a/mostlyai/sdk/domain.py +++ b/mostlyai/sdk/domain.py @@ -13,7 +13,7 @@ # limitations under the License. # generated by datamodel-codegen: -# timestamp: 2025-06-26T08:04:20+00:00 +# timestamp: 2025-07-09T15:31:45+00:00 from __future__ import annotations @@ -2735,7 +2735,7 @@ def validate_keys_exists_in_columns(cls, values): if values.columns: column_names = {col.name for col in values.columns} pk = values.primary_key - if pk is not None and pk not in column_names: + if pk and pk not in column_names: raise ValueError(f"Primary key column '{pk}' does not exist in the table's columns.") for fk in values.foreign_keys or []: if fk.column not in column_names: @@ -2747,7 +2747,7 @@ def validate_keys_exists_in_columns(cls, values): def validate_pk_and_fks_are_not_overlapping(cls, values): primary_key = values.primary_key foreign_keys = [fk.column for fk in values.foreign_keys or []] - if primary_key is not None and primary_key in foreign_keys: + if primary_key and primary_key in foreign_keys: raise ValueError(f"Column '{primary_key}' is both a primary key and a foreign key.") return values diff --git a/tools/custom_template/pydantic_v2/BaseModel.jinja2 b/tools/custom_template/pydantic_v2/BaseModel.jinja2 index 65310c32..353f41ec 100644 --- a/tools/custom_template/pydantic_v2/BaseModel.jinja2 +++ b/tools/custom_template/pydantic_v2/BaseModel.jinja2 @@ -786,7 +786,7 @@ class {{ class_name }}({{ base_class }}):{% if comment is defined %} # {{ comme if values.columns: column_names = {col.name for col in values.columns} pk = values.primary_key - if pk is not None and pk not in column_names: + if pk and pk not in column_names: raise ValueError(f"Primary key column '{pk}' does not exist in the table's columns.") for fk in values.foreign_keys or []: if fk.column not in column_names: @@ -798,7 +798,7 @@ class {{ class_name }}({{ base_class }}):{% if comment is defined %} # {{ comme def validate_pk_and_fks_are_not_overlapping(cls, values): primary_key = values.primary_key foreign_keys = [fk.column for fk in values.foreign_keys or []] - if primary_key is not None and primary_key in foreign_keys: + if primary_key and primary_key in foreign_keys: raise ValueError(f"Column '{primary_key}' is both a primary key and a foreign key.") return values {%- endif %}{%- if class_name == "SyntheticTableConfiguration" %} diff --git a/tools/model.py b/tools/model.py index 72757f55..ad85a490 100644 --- a/tools/model.py +++ b/tools/model.py @@ -600,7 +600,7 @@ def validate_keys_exists_in_columns(cls, values): if values.columns: column_names = {col.name for col in values.columns} pk = values.primary_key - if pk is not None and pk not in column_names: + if pk and pk not in column_names: raise ValueError(f"Primary key column '{pk}' does not exist in the table's columns.") for fk in values.foreign_keys or []: if fk.column not in column_names: @@ -612,7 +612,7 @@ def validate_keys_exists_in_columns(cls, values): def validate_pk_and_fks_are_not_overlapping(cls, values): primary_key = values.primary_key foreign_keys = [fk.column for fk in values.foreign_keys or []] - if primary_key is not None and primary_key in foreign_keys: + if primary_key and primary_key in foreign_keys: raise ValueError(f"Column '{primary_key}' is both a primary key and a foreign key.") return values From af881981bde347382194c3bd7efa96ab14290a8f Mon Sep 17 00:00:00 2001 From: Shuang Wu Date: Wed, 9 Jul 2025 17:54:10 +0200 Subject: [PATCH 2/8] fix --- mostlyai/sdk/_data/db/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mostlyai/sdk/_data/db/base.py b/mostlyai/sdk/_data/db/base.py index 2fc22f6d..418e2a6e 100644 --- a/mostlyai/sdk/_data/db/base.py +++ b/mostlyai/sdk/_data/db/base.py @@ -1042,7 +1042,7 @@ def _get_primary_key(self) -> str | None: assert not self.is_output primary_key_constraint = self._sa_table.primary_key primary_key = next(iter(primary_key_constraint.columns), None) - return primary_key.name if primary_key else None + return primary_key.name if primary_key is not None else None def _get_dtypes(self) -> dict[str, WrappedDType]: assert not self.is_output From f629a7a078340bbe32498a6c1b8cabd5eac27b37 Mon Sep 17 00:00:00 2001 From: Shuang Wu Date: Tue, 15 Jul 2025 16:14:42 +0200 Subject: [PATCH 3/8] debug log --- mostlyai/sdk/_data/pull.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mostlyai/sdk/_data/pull.py b/mostlyai/sdk/_data/pull.py index 17c1045b..567f0417 100644 --- a/mostlyai/sdk/_data/pull.py +++ b/mostlyai/sdk/_data/pull.py @@ -60,6 +60,7 @@ def pull( _LOG.info(f"tgt: {tgt}") _LOG.info(f"model_type: {model_type}") _LOG.info(f"max_sample_size: {max_sample_size}") + _LOG.info(f"{schema.tables[tgt].primary_key = }") # initialize progress counter tbl_count_rows = 0 From 4669c0c417db5f9a2a38a30ae1c5f311d7a0d9b7 Mon Sep 17 00:00:00 2001 From: Shuang Wu Date: Tue, 15 Jul 2025 17:01:41 +0200 Subject: [PATCH 4/8] debug log --- mostlyai/sdk/_local/execution/step_pull_training_data.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mostlyai/sdk/_local/execution/step_pull_training_data.py b/mostlyai/sdk/_local/execution/step_pull_training_data.py index 16cedb09..68e26706 100644 --- a/mostlyai/sdk/_local/execution/step_pull_training_data.py +++ b/mostlyai/sdk/_local/execution/step_pull_training_data.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import logging from collections.abc import Callable from pathlib import Path @@ -21,6 +22,8 @@ from mostlyai.sdk._data.file.utils import make_data_table_from_container from mostlyai.sdk.domain import Connector, Generator, ModelType +_LOG = logging.getLogger(__name__) + def execute_step_pull_training_data( *, @@ -32,6 +35,8 @@ def execute_step_pull_training_data( update_progress: Callable, ) -> tuple[list[str], int]: schema = _create_training_schema(generator=generator, connectors=connectors) + _LOG.info(f"execute_step_pull_training_data: {generator = }") + _LOG.info(f"execute_step_pull_training_data: {schema.tables[target_table_name].primary_key = }") # fetch total rows tgt_table_total_rows = schema.tables[target_table_name].row_count From 688d116bbbc47ae5363c9a906694de7f61992922 Mon Sep 17 00:00:00 2001 From: Shuang Wu Date: Tue, 15 Jul 2025 18:41:50 +0200 Subject: [PATCH 5/8] do not fetch original DB primary key when creating training schema --- mostlyai/sdk/_data/db/base.py | 3 ++- mostlyai/sdk/_data/file/utils.py | 6 ++++-- mostlyai/sdk/_data/pull.py | 1 - mostlyai/sdk/_local/execution/step_pull_training_data.py | 7 +------ 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/mostlyai/sdk/_data/db/base.py b/mostlyai/sdk/_data/db/base.py index 418e2a6e..8eb24153 100644 --- a/mostlyai/sdk/_data/db/base.py +++ b/mostlyai/sdk/_data/db/base.py @@ -876,6 +876,7 @@ class SqlAlchemyTable(DBTable, abc.ABC): def __init__(self, *args, **kwargs): self.is_view = kwargs.get("is_view", False) + self.lazy_fetch_primary_key = kwargs.get("lazy_fetch_primary_key", True) super().__init__(*args, **kwargs) def __repr__(self): @@ -1065,7 +1066,7 @@ def _lazy_fetch(self, item: str) -> None: if item == "columns": self.columns = [c.name for c in self._sa_table.columns] elif item == "primary_key": - self.primary_key = self._get_primary_key() + self.primary_key = self._get_primary_key() if self.lazy_fetch_primary_key else None elif item == "dtypes": self.dtypes = self._get_dtypes() else: diff --git a/mostlyai/sdk/_data/file/utils.py b/mostlyai/sdk/_data/file/utils.py index 140cd10c..00115126 100644 --- a/mostlyai/sdk/_data/file/utils.py +++ b/mostlyai/sdk/_data/file/utils.py @@ -88,7 +88,9 @@ def _fetch_file_data_table( return data_table -def make_data_table_from_container(container: DataContainer, is_output=False) -> DataTable: +def make_data_table_from_container( + container: DataContainer, is_output: bool = False, lazy_fetch_primary_key: bool = True +) -> DataTable: if isinstance(container, SqlAlchemyContainer): # handle DB containers data_table_class = container.table_class() @@ -100,4 +102,4 @@ def make_data_table_from_container(container: DataContainer, is_output=False) -> data_table_class = read_data_table_from_path(container, return_class=True) else: raise RuntimeError(f"Unknown container type: {type(container)}") - return data_table_class(container=container, is_output=is_output) + return data_table_class(container=container, is_output=is_output, lazy_fetch_primary_key=lazy_fetch_primary_key) diff --git a/mostlyai/sdk/_data/pull.py b/mostlyai/sdk/_data/pull.py index 567f0417..17c1045b 100644 --- a/mostlyai/sdk/_data/pull.py +++ b/mostlyai/sdk/_data/pull.py @@ -60,7 +60,6 @@ def pull( _LOG.info(f"tgt: {tgt}") _LOG.info(f"model_type: {model_type}") _LOG.info(f"max_sample_size: {max_sample_size}") - _LOG.info(f"{schema.tables[tgt].primary_key = }") # initialize progress counter tbl_count_rows = 0 diff --git a/mostlyai/sdk/_local/execution/step_pull_training_data.py b/mostlyai/sdk/_local/execution/step_pull_training_data.py index 68e26706..511b666f 100644 --- a/mostlyai/sdk/_local/execution/step_pull_training_data.py +++ b/mostlyai/sdk/_local/execution/step_pull_training_data.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging from collections.abc import Callable from pathlib import Path @@ -22,8 +21,6 @@ from mostlyai.sdk._data.file.utils import make_data_table_from_container from mostlyai.sdk.domain import Connector, Generator, ModelType -_LOG = logging.getLogger(__name__) - def execute_step_pull_training_data( *, @@ -35,8 +32,6 @@ def execute_step_pull_training_data( update_progress: Callable, ) -> tuple[list[str], int]: schema = _create_training_schema(generator=generator, connectors=connectors) - _LOG.info(f"execute_step_pull_training_data: {generator = }") - _LOG.info(f"execute_step_pull_training_data: {schema.tables[target_table_name].primary_key = }") # fetch total rows tgt_table_total_rows = schema.tables[target_table_name].row_count @@ -72,7 +67,7 @@ def _create_training_schema(generator: Generator, connectors: list[Connector]) - container = create_container_from_connector(connector) container.set_location(table.location) # create DataTable - data_table = make_data_table_from_container(container) + data_table = make_data_table_from_container(container, lazy_fetch_primary_key=False) data_table.name = table.name data_table.primary_key = table.primary_key if table.columns: From db3c6ccfda81113a900146a5515cc6de12f92090 Mon Sep 17 00:00:00 2001 From: Shuang Wu Date: Tue, 15 Jul 2025 18:53:55 +0200 Subject: [PATCH 6/8] update unit test --- tests/_data/unit/test_pull.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/tests/_data/unit/test_pull.py b/tests/_data/unit/test_pull.py index 448df580..1712264a 100644 --- a/tests/_data/unit/test_pull.py +++ b/tests/_data/unit/test_pull.py @@ -2120,7 +2120,15 @@ def test_pull_empty_sequences(self, tmp_path): class TestPullWithDB: - def test_excluded_primary_key(self, tmp_path): + @pytest.mark.parametrize( + "columns,lazy_fetch_primary_key,expected_keys", + [ + (["id", "username", "email"], True, {"primary_key": "id"}), + (["id", "username", "email"], False, {}), + (["username", "email"], True, {}), + ], + ) + def test_excluded_primary_key(self, tmp_path, columns, lazy_fetch_primary_key, expected_keys): db_path = tmp_path / "database.db" with sqlite3.connect(str(db_path)) as conn: cursor = conn.cursor() @@ -2137,14 +2145,18 @@ def test_excluded_primary_key(self, tmp_path): "users": SqliteTable( name="users", container=SqliteContainer(dbname=str(db_path)), - primary_key=None, # we specifically exclude the existing primary key in this test - columns=["username", "email"], + primary_key=None, + columns=columns, + lazy_fetch_primary_key=lazy_fetch_primary_key, ), } schema = Schema(tables=tables) pull(tgt="users", schema=schema, workspace_dir=tmp_path) + keys = read_json(tmp_path / "OriginalData" / "tgt-meta" / "keys.json") + assert keys == expected_keys + df = pd.read_parquet(tmp_path / "OriginalData" / "tgt-data") assert len(df) == 2 - assert set(df.columns) == {"username", "email"} + assert set(df.columns) == set(columns) From cd5586df35a0326409bd37daf96e97324e9af290 Mon Sep 17 00:00:00 2001 From: Shuang Wu Date: Tue, 15 Jul 2025 19:00:16 +0200 Subject: [PATCH 7/8] sync api --- mostlyai/sdk/domain.py | 90 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) diff --git a/mostlyai/sdk/domain.py b/mostlyai/sdk/domain.py index 3e2f7216..b5cfbdd9 100644 --- a/mostlyai/sdk/domain.py +++ b/mostlyai/sdk/domain.py @@ -13,7 +13,7 @@ # limitations under the License. # generated by datamodel-codegen: -# timestamp: 2025-07-09T15:31:45+00:00 +# timestamp: 2025-07-15T16:59:52+00:00 from __future__ import annotations @@ -175,6 +175,20 @@ class PaginatedTotalCount(RootModel[int]): root: int = Field(..., description="The total number of entities within the list") +class DatasetUsage(CustomBaseModel): + """ + Usage statistics of a dataset. + """ + + no_of_likes: int | None = Field(None, alias="noOfLikes", description="Number of likes of this dataset.") + + +class DatasetSortField(str, Enum): + recency = "RECENCY" + no_of_likes = "NO_OF_LIKES" + no_of_threads = "NO_OF_THREADS" + + class ConnectorAccessType(str, Enum): """ The access permissions of a connector. @@ -244,6 +258,11 @@ class ConnectorUsage(CustomBaseModel): description="Number of generators using this connector.", ) no_of_likes: int | None = Field(None, alias="noOfLikes", description="Number of likes of this connector.") + no_of_threads: int | None = Field( + None, + alias="noOfThreads", + description="Number of assistant threads using this connector.", + ) class ConnectorConfig(CustomBaseModel): @@ -466,6 +485,7 @@ class ConnectorSortField(str, Enum): recency = "RECENCY" no_of_generators = "NO_OF_GENERATORS" no_of_likes = "NO_OF_LIKES" + no_of_threads = "NO_OF_THREADS" class GeneratorUsage(CustomBaseModel): @@ -504,6 +524,11 @@ class GeneratorUsage(CustomBaseModel): description="Number of synthetic datasets generated by this generator.", ) no_of_likes: int | None = Field(None, alias="noOfLikes", description="Number of likes of this generator.") + no_of_threads: int | None = Field( + None, + alias="noOfThreads", + description="Number of assistant threads using this generator.", + ) class SourceColumnValueRange(CustomBaseModel): @@ -628,6 +653,7 @@ class SourceForeignKeyPatchConfig(CustomBaseModel): class GeneratorSortField(str, Enum): recency = "RECENCY" no_of_likes = "NO_OF_LIKES" + no_of_threads = "NO_OF_THREADS" no_of_synthetic_datasets = "NO_OF_SYNTHETIC_DATASETS" @@ -761,6 +787,11 @@ class SyntheticDatasetUsage(CustomBaseModel): alias="noOfDownloads", description="Number of downloads of this synthetic dataset.", ) + no_of_threads: int | None = Field( + None, + alias="noOfThreads", + description="Number of assistant threads using this synthetic dataset.", + ) class SyntheticDatasetFormat(str, Enum): @@ -796,6 +827,7 @@ class SyntheticDatasetSortField(str, Enum): recency = "RECENCY" no_of_likes = "NO_OF_LIKES" no_of_downloads = "NO_OF_DOWNLOADS" + no_of_threads = "NO_OF_THREADS" class AssistantLiteLlmExtraItem(CustomBaseModel): @@ -889,6 +921,7 @@ class AssistantMessageContentType(str, Enum): artifact_generator = "artifact/generator" artifact_synthetic_dataset = "artifact/synthetic-dataset" artifact_connector = "artifact/connector" + artifact_dataset = "artifact/dataset" class AssistantMessageDeltaContentType(str, Enum): @@ -906,6 +939,7 @@ class AssistantMessageDeltaContentType(str, Enum): artifact_generator = "artifact/generator" artifact_synthetic_dataset = "artifact/synthetic-dataset" artifact_connector = "artifact/connector" + artifact_dataset = "artifact/dataset" class AssistantMessageFile(CustomBaseModel): @@ -1794,6 +1828,60 @@ class Metadata(CustomBaseModel): ) +class DatasetConnector(CustomBaseModel): + """ + Configuration for a dataset connector. + """ + + connector_id: str | None = Field(None, alias="connectorId", description="The unique identifier of a connector.") + locations: list[str] | None = None + + +class Dataset(CustomBaseModel): + """ + A dataset to be consumed via the assistant. + """ + + id: str = Field(..., description="The unique identifier of a dataset.") + name: str | None = Field(None, description="The name of a dataset.") + description: str | None = Field(None, description="The description of / instructions for a dataset.") + connectors: list[DatasetConnector] + files: list[str] + usage: DatasetUsage | None = None + metadata: Metadata | None = None + + +class DatasetListItem(CustomBaseModel): + """ + Essential dataset details for listings. + """ + + id: str = Field(..., description="The unique identifier of a dataset.") + name: str | None = Field(None, description="The name of a dataset.") + usage: DatasetUsage | None = None + metadata: Metadata | None = None + + +class DatasetConfig(CustomBaseModel): + """ + The configuration for creating a dataset. + """ + + name: str | None = Field(None, description="The name of a dataset.") + description: str | None = Field(None, description="The description of / instructions for a dataset.") + connectors: list[DatasetConnector] | None = None + + +class DatasetPatchConfig(CustomBaseModel): + """ + The configuration for updating a dataset. + """ + + name: str | None = Field(None, description="The name of a dataset.") + description: str | None = Field(None, description="The description of / instructions for a dataset.") + connectors: list[DatasetConnector] | None = None + + class ConnectorListItem(CustomBaseModel): """ Essential connector details for listings. From 5c88537f8950c3fbadfc338657db7271404861ee Mon Sep 17 00:00:00 2001 From: Shuang Wu Date: Tue, 15 Jul 2025 19:02:43 +0200 Subject: [PATCH 8/8] Revert "sync api" This reverts commit cd5586df35a0326409bd37daf96e97324e9af290. --- mostlyai/sdk/domain.py | 90 +----------------------------------------- 1 file changed, 1 insertion(+), 89 deletions(-) diff --git a/mostlyai/sdk/domain.py b/mostlyai/sdk/domain.py index b5cfbdd9..3e2f7216 100644 --- a/mostlyai/sdk/domain.py +++ b/mostlyai/sdk/domain.py @@ -13,7 +13,7 @@ # limitations under the License. # generated by datamodel-codegen: -# timestamp: 2025-07-15T16:59:52+00:00 +# timestamp: 2025-07-09T15:31:45+00:00 from __future__ import annotations @@ -175,20 +175,6 @@ class PaginatedTotalCount(RootModel[int]): root: int = Field(..., description="The total number of entities within the list") -class DatasetUsage(CustomBaseModel): - """ - Usage statistics of a dataset. - """ - - no_of_likes: int | None = Field(None, alias="noOfLikes", description="Number of likes of this dataset.") - - -class DatasetSortField(str, Enum): - recency = "RECENCY" - no_of_likes = "NO_OF_LIKES" - no_of_threads = "NO_OF_THREADS" - - class ConnectorAccessType(str, Enum): """ The access permissions of a connector. @@ -258,11 +244,6 @@ class ConnectorUsage(CustomBaseModel): description="Number of generators using this connector.", ) no_of_likes: int | None = Field(None, alias="noOfLikes", description="Number of likes of this connector.") - no_of_threads: int | None = Field( - None, - alias="noOfThreads", - description="Number of assistant threads using this connector.", - ) class ConnectorConfig(CustomBaseModel): @@ -485,7 +466,6 @@ class ConnectorSortField(str, Enum): recency = "RECENCY" no_of_generators = "NO_OF_GENERATORS" no_of_likes = "NO_OF_LIKES" - no_of_threads = "NO_OF_THREADS" class GeneratorUsage(CustomBaseModel): @@ -524,11 +504,6 @@ class GeneratorUsage(CustomBaseModel): description="Number of synthetic datasets generated by this generator.", ) no_of_likes: int | None = Field(None, alias="noOfLikes", description="Number of likes of this generator.") - no_of_threads: int | None = Field( - None, - alias="noOfThreads", - description="Number of assistant threads using this generator.", - ) class SourceColumnValueRange(CustomBaseModel): @@ -653,7 +628,6 @@ class SourceForeignKeyPatchConfig(CustomBaseModel): class GeneratorSortField(str, Enum): recency = "RECENCY" no_of_likes = "NO_OF_LIKES" - no_of_threads = "NO_OF_THREADS" no_of_synthetic_datasets = "NO_OF_SYNTHETIC_DATASETS" @@ -787,11 +761,6 @@ class SyntheticDatasetUsage(CustomBaseModel): alias="noOfDownloads", description="Number of downloads of this synthetic dataset.", ) - no_of_threads: int | None = Field( - None, - alias="noOfThreads", - description="Number of assistant threads using this synthetic dataset.", - ) class SyntheticDatasetFormat(str, Enum): @@ -827,7 +796,6 @@ class SyntheticDatasetSortField(str, Enum): recency = "RECENCY" no_of_likes = "NO_OF_LIKES" no_of_downloads = "NO_OF_DOWNLOADS" - no_of_threads = "NO_OF_THREADS" class AssistantLiteLlmExtraItem(CustomBaseModel): @@ -921,7 +889,6 @@ class AssistantMessageContentType(str, Enum): artifact_generator = "artifact/generator" artifact_synthetic_dataset = "artifact/synthetic-dataset" artifact_connector = "artifact/connector" - artifact_dataset = "artifact/dataset" class AssistantMessageDeltaContentType(str, Enum): @@ -939,7 +906,6 @@ class AssistantMessageDeltaContentType(str, Enum): artifact_generator = "artifact/generator" artifact_synthetic_dataset = "artifact/synthetic-dataset" artifact_connector = "artifact/connector" - artifact_dataset = "artifact/dataset" class AssistantMessageFile(CustomBaseModel): @@ -1828,60 +1794,6 @@ class Metadata(CustomBaseModel): ) -class DatasetConnector(CustomBaseModel): - """ - Configuration for a dataset connector. - """ - - connector_id: str | None = Field(None, alias="connectorId", description="The unique identifier of a connector.") - locations: list[str] | None = None - - -class Dataset(CustomBaseModel): - """ - A dataset to be consumed via the assistant. - """ - - id: str = Field(..., description="The unique identifier of a dataset.") - name: str | None = Field(None, description="The name of a dataset.") - description: str | None = Field(None, description="The description of / instructions for a dataset.") - connectors: list[DatasetConnector] - files: list[str] - usage: DatasetUsage | None = None - metadata: Metadata | None = None - - -class DatasetListItem(CustomBaseModel): - """ - Essential dataset details for listings. - """ - - id: str = Field(..., description="The unique identifier of a dataset.") - name: str | None = Field(None, description="The name of a dataset.") - usage: DatasetUsage | None = None - metadata: Metadata | None = None - - -class DatasetConfig(CustomBaseModel): - """ - The configuration for creating a dataset. - """ - - name: str | None = Field(None, description="The name of a dataset.") - description: str | None = Field(None, description="The description of / instructions for a dataset.") - connectors: list[DatasetConnector] | None = None - - -class DatasetPatchConfig(CustomBaseModel): - """ - The configuration for updating a dataset. - """ - - name: str | None = Field(None, description="The name of a dataset.") - description: str | None = Field(None, description="The description of / instructions for a dataset.") - connectors: list[DatasetConnector] | None = None - - class ConnectorListItem(CustomBaseModel): """ Essential connector details for listings.