cognite-toolkit 0.7.46__py3-none-any.whl → 0.7.48__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 (77) hide show
  1. cognite_toolkit/_cdf_tk/apps/_migrate_app.py +6 -6
  2. cognite_toolkit/_cdf_tk/client/_toolkit_client.py +6 -4
  3. cognite_toolkit/_cdf_tk/client/api/agents.py +107 -0
  4. cognite_toolkit/_cdf_tk/client/api/annotations.py +129 -0
  5. cognite_toolkit/_cdf_tk/client/api/containers.py +132 -0
  6. cognite_toolkit/_cdf_tk/client/api/data_models.py +137 -0
  7. cognite_toolkit/_cdf_tk/client/api/function_schedules.py +115 -0
  8. cognite_toolkit/_cdf_tk/client/api/functions.py +113 -0
  9. cognite_toolkit/_cdf_tk/client/api/graphql_data_models.py +167 -0
  10. cognite_toolkit/_cdf_tk/client/api/groups.py +121 -0
  11. cognite_toolkit/_cdf_tk/client/api/instances.py +139 -0
  12. cognite_toolkit/_cdf_tk/client/api/location_filters.py +177 -0
  13. cognite_toolkit/_cdf_tk/client/api/raw.py +2 -2
  14. cognite_toolkit/_cdf_tk/client/api/relationships.py +133 -0
  15. cognite_toolkit/_cdf_tk/client/api/robotics.py +19 -0
  16. cognite_toolkit/_cdf_tk/client/api/robotics_capabilities.py +127 -0
  17. cognite_toolkit/_cdf_tk/client/api/robotics_data_postprocessing.py +138 -0
  18. cognite_toolkit/_cdf_tk/client/api/robotics_frames.py +122 -0
  19. cognite_toolkit/_cdf_tk/client/api/robotics_locations.py +127 -0
  20. cognite_toolkit/_cdf_tk/client/api/robotics_maps.py +122 -0
  21. cognite_toolkit/_cdf_tk/client/api/robotics_robots.py +122 -0
  22. cognite_toolkit/_cdf_tk/client/api/search_config.py +101 -0
  23. cognite_toolkit/_cdf_tk/client/api/spaces.py +117 -0
  24. cognite_toolkit/_cdf_tk/client/api/streams.py +63 -55
  25. cognite_toolkit/_cdf_tk/client/api/three_d.py +293 -277
  26. cognite_toolkit/_cdf_tk/client/api/views.py +139 -0
  27. cognite_toolkit/_cdf_tk/client/cdf_client/api.py +42 -7
  28. cognite_toolkit/_cdf_tk/client/cdf_client/responses.py +11 -0
  29. cognite_toolkit/_cdf_tk/client/http_client/_client.py +5 -2
  30. cognite_toolkit/_cdf_tk/client/http_client/_data_classes.py +10 -0
  31. cognite_toolkit/_cdf_tk/client/http_client/_data_classes2.py +4 -3
  32. cognite_toolkit/_cdf_tk/client/request_classes/filters.py +75 -0
  33. cognite_toolkit/_cdf_tk/client/request_classes/graphql.py +28 -0
  34. cognite_toolkit/_cdf_tk/client/resource_classes/agent.py +8 -2
  35. cognite_toolkit/_cdf_tk/client/resource_classes/apm_config.py +128 -0
  36. cognite_toolkit/_cdf_tk/client/resource_classes/cognite_file.py +53 -0
  37. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/__init__.py +4 -0
  38. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_instance.py +22 -11
  39. cognite_toolkit/_cdf_tk/client/resource_classes/function_schedule.py +8 -4
  40. cognite_toolkit/_cdf_tk/client/resource_classes/group/group.py +9 -5
  41. cognite_toolkit/_cdf_tk/client/resource_classes/identifiers.py +7 -0
  42. cognite_toolkit/_cdf_tk/client/resource_classes/location_filter.py +9 -2
  43. cognite_toolkit/_cdf_tk/client/resource_classes/relationship.py +9 -3
  44. cognite_toolkit/_cdf_tk/client/resource_classes/resource_view_mapping.py +38 -0
  45. cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_map.py +6 -1
  46. cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_robot.py +10 -5
  47. cognite_toolkit/_cdf_tk/client/resource_classes/streams.py +1 -20
  48. cognite_toolkit/_cdf_tk/client/resource_classes/three_d.py +30 -9
  49. cognite_toolkit/_cdf_tk/client/testing.py +2 -2
  50. cognite_toolkit/_cdf_tk/commands/_migrate/data_mapper.py +5 -5
  51. cognite_toolkit/_cdf_tk/commands/_migrate/migration_io.py +11 -7
  52. cognite_toolkit/_cdf_tk/commands/build_v2/_module_parser.py +138 -0
  53. cognite_toolkit/_cdf_tk/commands/build_v2/_modules_parser.py +163 -0
  54. cognite_toolkit/_cdf_tk/commands/build_v2/build_cmd.py +83 -96
  55. cognite_toolkit/_cdf_tk/commands/build_v2/{build_input.py → build_parameters.py} +8 -22
  56. cognite_toolkit/_cdf_tk/commands/build_v2/data_classes/_modules.py +27 -0
  57. cognite_toolkit/_cdf_tk/commands/build_v2/data_classes/_resource.py +22 -0
  58. cognite_toolkit/_cdf_tk/cruds/__init__.py +11 -5
  59. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/streams.py +14 -30
  60. cognite_toolkit/_cdf_tk/data_classes/__init__.py +3 -0
  61. cognite_toolkit/_cdf_tk/data_classes/_issues.py +36 -0
  62. cognite_toolkit/_cdf_tk/data_classes/_module_directories.py +2 -1
  63. cognite_toolkit/_cdf_tk/storageio/_base.py +2 -0
  64. cognite_toolkit/_cdf_tk/storageio/logger.py +163 -0
  65. cognite_toolkit/_cdf_tk/utils/__init__.py +8 -1
  66. cognite_toolkit/_cdf_tk/utils/interactive_select.py +3 -1
  67. cognite_toolkit/_cdf_tk/utils/modules.py +7 -0
  68. cognite_toolkit/_repo_files/GitHub/.github/workflows/deploy.yaml +1 -1
  69. cognite_toolkit/_repo_files/GitHub/.github/workflows/dry-run.yaml +1 -1
  70. cognite_toolkit/_resources/cdf.toml +1 -1
  71. cognite_toolkit/_version.py +1 -1
  72. {cognite_toolkit-0.7.46.dist-info → cognite_toolkit-0.7.48.dist-info}/METADATA +1 -1
  73. {cognite_toolkit-0.7.46.dist-info → cognite_toolkit-0.7.48.dist-info}/RECORD +76 -46
  74. cognite_toolkit/_cdf_tk/commands/build_v2/build_issues.py +0 -27
  75. /cognite_toolkit/_cdf_tk/client/resource_classes/{search_config_resource.py → search_config.py} +0 -0
  76. {cognite_toolkit-0.7.46.dist-info → cognite_toolkit-0.7.48.dist-info}/WHEEL +0 -0
  77. {cognite_toolkit-0.7.46.dist-info → cognite_toolkit-0.7.48.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,139 @@
1
+ """Views API for managing CDF data modeling views.
2
+
3
+ Based on the API specification at:
4
+ https://api-docs.cognite.com/20230101/tag/Views/operation/ApplyViews
5
+ """
6
+
7
+ from collections.abc import Iterable, Sequence
8
+
9
+ from cognite_toolkit._cdf_tk.client.cdf_client import CDFResourceAPI, Endpoint, PagedResponse
10
+ from cognite_toolkit._cdf_tk.client.http_client import HTTPClient, ItemsSuccessResponse2, SuccessResponse2
11
+ from cognite_toolkit._cdf_tk.client.request_classes.filters import ViewFilter
12
+ from cognite_toolkit._cdf_tk.client.resource_classes.data_modeling import (
13
+ ViewReference,
14
+ ViewRequest,
15
+ ViewResponse,
16
+ )
17
+
18
+
19
+ class ViewsAPI(CDFResourceAPI[ViewReference, ViewRequest, ViewResponse]):
20
+ """API for managing CDF data modeling views.
21
+
22
+ Views use an apply/upsert pattern for create and update operations.
23
+ """
24
+
25
+ def __init__(self, http_client: HTTPClient) -> None:
26
+ super().__init__(
27
+ http_client=http_client,
28
+ method_endpoint_map={
29
+ "upsert": Endpoint(method="POST", path="/models/views", item_limit=100),
30
+ "retrieve": Endpoint(method="POST", path="/models/views/byids", item_limit=100),
31
+ "delete": Endpoint(method="POST", path="/models/views/delete", item_limit=100),
32
+ "list": Endpoint(method="GET", path="/models/views", item_limit=1000),
33
+ },
34
+ )
35
+
36
+ def _validate_page_response(
37
+ self, response: SuccessResponse2 | ItemsSuccessResponse2
38
+ ) -> PagedResponse[ViewResponse]:
39
+ return PagedResponse[ViewResponse].model_validate_json(response.body)
40
+
41
+ def create(self, items: Sequence[ViewRequest]) -> list[ViewResponse]:
42
+ """Apply (create or update) views in CDF.
43
+
44
+ Args:
45
+ items: List of ViewRequest objects to apply.
46
+
47
+ Returns:
48
+ List of applied ViewResponse objects.
49
+ """
50
+ return self._request_item_response(items, "upsert")
51
+
52
+ def update(self, items: Sequence[ViewRequest]) -> list[ViewResponse]:
53
+ """Apply (create or update) views in CDF.
54
+
55
+ Args:
56
+ items: List of ViewRequest objects to apply.
57
+ Returns:
58
+ List of applied ViewResponse objects.
59
+ """
60
+ return self._request_item_response(items, "upsert")
61
+
62
+ def retrieve(self, items: Sequence[ViewReference], include_inherited_properties: bool = True) -> list[ViewResponse]:
63
+ """Retrieve views from CDF.
64
+
65
+ Args:
66
+ items: List of ViewReference objects to retrieve.
67
+ include_inherited_properties: Whether to include inherited properties.
68
+
69
+ Returns:
70
+ List of retrieved ViewResponse objects.
71
+ """
72
+ return self._request_item_response(
73
+ items, method="retrieve", extra_body={"includeInheritedProperties": include_inherited_properties}
74
+ )
75
+
76
+ def delete(self, items: Sequence[ViewReference]) -> None:
77
+ """Delete views from CDF.
78
+
79
+ Args:
80
+ items: List of ViewReference objects to delete.
81
+ """
82
+ self._request_no_response(items, "delete")
83
+
84
+ def paginate(
85
+ self,
86
+ filter: ViewFilter | None = None,
87
+ limit: int = 100,
88
+ cursor: str | None = None,
89
+ ) -> PagedResponse[ViewResponse]:
90
+ """Get a page of views from CDF.
91
+
92
+ Args:
93
+ filter: ViewFilter to filter views.
94
+ limit: Maximum number of views to return.
95
+ cursor: Cursor for pagination.
96
+
97
+ Returns:
98
+ PagedResponse of ViewResponse objects.
99
+ """
100
+ return self._paginate(
101
+ cursor=cursor,
102
+ limit=limit,
103
+ params=filter.dump() if filter else None,
104
+ )
105
+
106
+ def iterate(
107
+ self,
108
+ filter: ViewFilter | None = None,
109
+ limit: int | None = None,
110
+ ) -> Iterable[list[ViewResponse]]:
111
+ """Iterate over all views in CDF.
112
+
113
+ Args:
114
+ filter: ViewFilter to filter views.
115
+ limit: Maximum total number of views to return.
116
+
117
+ Returns:
118
+ Iterable of lists of ViewResponse objects.
119
+ """
120
+ return self._iterate(
121
+ limit=limit,
122
+ params=filter.dump() if filter else None,
123
+ )
124
+
125
+ def list(
126
+ self,
127
+ filter: ViewFilter | None = None,
128
+ limit: int | None = None,
129
+ ) -> list[ViewResponse]:
130
+ """List all views in CDF.
131
+
132
+ Args:
133
+ filter: ViewFilter to filter views.
134
+ limit: Maximum total number of views to return.
135
+
136
+ Returns:
137
+ List of ViewResponse objects.
138
+ """
139
+ return self._list(limit=limit, params=filter.dump() if filter else None)
@@ -51,15 +51,20 @@ class CDFResourceAPI(Generic[T_Identifier, T_RequestResource, T_ResponseResource
51
51
  including creating, retrieving, deleting, and listing resources.
52
52
  """
53
53
 
54
- def __init__(self, http_client: HTTPClient, method_endpoint_map: dict[APIMethod, Endpoint]) -> None:
54
+ def __init__(
55
+ self, http_client: HTTPClient, method_endpoint_map: dict[APIMethod, Endpoint], disable_gzip: bool = False
56
+ ) -> None:
55
57
  """Initialize the resource API.
56
58
 
57
59
  Args:
58
60
  http_client: The HTTP client to use for API requests.
59
61
  method_endpoint_map: A mapping of endpoint suffixes to their properties.
62
+ disable_gzip: Whether to disable gzip compression for requests. Defaults to False.
63
+ This is only used by the robotics API. If that API is dropped, this parameter can be removed.
60
64
  """
61
65
  self._http_client = http_client
62
66
  self._method_endpoint_map = method_endpoint_map
67
+ self._disable_gzip = disable_gzip
63
68
 
64
69
  @classmethod
65
70
  def _serialize_items(cls, items: Sequence[BaseModel]) -> list[dict[str, JsonValue]]:
@@ -151,6 +156,7 @@ class CDFResourceAPI(Generic[T_Identifier, T_RequestResource, T_ResponseResource
151
156
  method=endpoint.method,
152
157
  body_content={"items": serialization(chunk), **(extra_body or {})}, # type: ignore[dict-item]
153
158
  parameters=request_params,
159
+ disable_gzip=self._disable_gzip,
154
160
  )
155
161
  response = self._http_client.request_single_retries(request)
156
162
  yield response.get_success_or_raise()
@@ -180,6 +186,27 @@ class CDFResourceAPI(Generic[T_Identifier, T_RequestResource, T_ResponseResource
180
186
  response_items.extend(self._validate_page_response(response).items)
181
187
  return response_items
182
188
 
189
+ def _request_item_split_retries_no_response(
190
+ self,
191
+ items: Sequence[_T_BaseModel],
192
+ method: APIMethod,
193
+ params: dict[str, Any] | None = None,
194
+ extra_body: dict[str, Any] | None = None,
195
+ ) -> None:
196
+ """Request items with retries, splitting on failures, without returning any response.
197
+
198
+ This method handles large batches of items by chunking them according to the endpoint's item limit.
199
+ If a single item fails, it splits the request into individual item requests to isolate the failure.
200
+
201
+ Args:
202
+ items: Sequence of items to request.
203
+ method: API method to use for the request.
204
+ params: Optional query parameters for the request.
205
+ extra_body: Optional additional body fields for the request.
206
+ """
207
+ list(self._chunk_requests_items_split_retries(items, method, params, extra_body))
208
+ return None
209
+
183
210
  def _chunk_requests_items_split_retries(
184
211
  self,
185
212
  items: Sequence[_T_BaseModel],
@@ -215,6 +242,7 @@ class CDFResourceAPI(Generic[T_Identifier, T_RequestResource, T_ResponseResource
215
242
  parameters=request_params,
216
243
  items=chunk,
217
244
  extra_body_fields=extra_body,
245
+ disable_gzip=self._disable_gzip,
218
246
  )
219
247
  responses = self._http_client.request_items_retries(request)
220
248
  for response in responses:
@@ -230,12 +258,12 @@ class CDFResourceAPI(Generic[T_Identifier, T_RequestResource, T_ResponseResource
230
258
 
231
259
  @classmethod
232
260
  def _group_items_by_text_field(
233
- cls, items: Sequence[_T_BaseModel], field_name: str
234
- ) -> dict[str, list[_T_BaseModel]]:
261
+ cls, items: Sequence[_T_BaseModel], *field_names: str
262
+ ) -> dict[tuple[str, ...], list[_T_BaseModel]]:
235
263
  """Group items by a text field."""
236
- grouped_items: dict[str, list[_T_BaseModel]] = defaultdict(list)
264
+ grouped_items: dict[tuple[str, ...], list[_T_BaseModel]] = defaultdict(list)
237
265
  for item in items:
238
- key = str(getattr(item, field_name))
266
+ key = tuple(str(getattr(item, field_name)) for field_name in field_names)
239
267
  grouped_items[key].append(item)
240
268
  return grouped_items
241
269
 
@@ -287,6 +315,7 @@ class CDFResourceAPI(Generic[T_Identifier, T_RequestResource, T_ResponseResource
287
315
  method=endpoint.method,
288
316
  parameters=request_params,
289
317
  body_content=body,
318
+ disable_gzip=self._disable_gzip,
290
319
  )
291
320
  result = self._http_client.request_single_retries(request)
292
321
  response = result.get_success_or_raise()
@@ -316,9 +345,15 @@ class CDFResourceAPI(Generic[T_Identifier, T_RequestResource, T_ResponseResource
316
345
  next_cursor = page.next_cursor
317
346
 
318
347
  def _list(
319
- self, limit: int | None = None, params: dict[str, Any] | None = None, endpoint_path: str | None = None
348
+ self,
349
+ limit: int | None = None,
350
+ params: dict[str, Any] | None = None,
351
+ endpoint_path: str | None = None,
352
+ body: dict[str, Any] | None = None,
320
353
  ) -> list[T_ResponseResource]:
321
354
  """List all resources, handling pagination automatically."""
322
355
  return [
323
- item for batch in self._iterate(limit=limit, params=params, endpoint_path=endpoint_path) for item in batch
356
+ item
357
+ for batch in self._iterate(limit=limit, params=params, endpoint_path=endpoint_path, body=body)
358
+ for item in batch
324
359
  ]
@@ -2,6 +2,8 @@ from typing import Generic, TypeVar
2
2
 
3
3
  from pydantic import BaseModel, Field, JsonValue
4
4
 
5
+ from cognite_toolkit._cdf_tk.client.resource_classes.graphql_data_model import GraphQLDataModelResponse
6
+
5
7
  T = TypeVar("T", bound=BaseModel)
6
8
 
7
9
 
@@ -25,3 +27,12 @@ class QueryResponse(BaseModel, Generic[T]):
25
27
  typing: dict[str, JsonValue] | None = None
26
28
  next_cursor: dict[str, str] = Field(alias="nextCursor")
27
29
  debug: dict[str, JsonValue] | None = None
30
+
31
+
32
+ class GraphQLResponse(BaseModel):
33
+ data: GraphQLDataModelResponse
34
+ errors: list[dict[str, JsonValue]] | None = None
35
+
36
+
37
+ class GraphQLUpsertResponse(BaseModel):
38
+ upsert_graph_ql_dml_version: GraphQLResponse = Field(alias="upsertGraphQlDmlVersion")
@@ -172,6 +172,7 @@ class HTTPClient:
172
172
  content_type: str = "application/json",
173
173
  accept: str = "application/json",
174
174
  content_length: int | None = None,
175
+ disable_gzip: bool = False,
175
176
  ) -> MutableMapping[str, str]:
176
177
  headers: MutableMapping[str, str] = {}
177
178
  headers["User-Agent"] = f"httpx/{httpx.__version__} {get_user_agent()}"
@@ -184,7 +185,7 @@ class HTTPClient:
184
185
  headers["x-cdp-sdk"] = f"CogniteToolkit:{get_current_toolkit_version()}"
185
186
  headers["x-cdp-app"] = self.config.client_name
186
187
  headers["cdf-version"] = api_version or self.config.api_subversion
187
- if not global_config.disable_gzip and content_length is None:
188
+ if not global_config.disable_gzip and content_length is None and not disable_gzip:
188
189
  headers["Content-Encoding"] = "gzip"
189
190
  return headers
190
191
 
@@ -332,7 +333,9 @@ class HTTPClient:
332
333
  raise TypeError(f"Unexpected result type: {type(result)}")
333
334
 
334
335
  def _make_request2(self, message: BaseRequestMessage) -> httpx.Response:
335
- headers = self._create_headers(message.api_version, message.content_type, message.accept)
336
+ headers = self._create_headers(
337
+ message.api_version, message.content_type, message.accept, disable_gzip=message.disable_gzip
338
+ )
336
339
  return self.session.request(
337
340
  method=message.method,
338
341
  url=message.endpoint_url,
@@ -307,6 +307,11 @@ class ItemsRequest(Generic[T_COVARIANT_ID], BodyRequest):
307
307
  connect_attempt=self.connect_attempt,
308
308
  read_attempt=self.read_attempt,
309
309
  status_attempt=status_attempts,
310
+ api_version=self.api_version,
311
+ content_type=self.content_type,
312
+ accept=self.accept,
313
+ content_length=self.content_length,
314
+ max_failures_before_abort=self.max_failures_before_abort,
310
315
  )
311
316
  first_half.tracker = tracker
312
317
  second_half = ItemsRequest[T_COVARIANT_ID](
@@ -317,6 +322,11 @@ class ItemsRequest(Generic[T_COVARIANT_ID], BodyRequest):
317
322
  connect_attempt=self.connect_attempt,
318
323
  read_attempt=self.read_attempt,
319
324
  status_attempt=status_attempts,
325
+ api_version=self.api_version,
326
+ content_type=self.content_type,
327
+ accept=self.accept,
328
+ content_length=self.content_length,
329
+ max_failures_before_abort=self.max_failures_before_abort,
320
330
  )
321
331
  second_half.tracker = tracker
322
332
  return [first_half, second_half]
@@ -77,6 +77,7 @@ class BaseRequestMessage(BaseModel, ABC):
77
77
  read_attempt: int = 0
78
78
  status_attempt: int = 0
79
79
  api_version: str | None = None
80
+ disable_gzip: bool = False
80
81
  content_type: str = "application/json"
81
82
  accept: str = "application/json"
82
83
 
@@ -106,13 +107,13 @@ class RequestMessage2(BaseRequestMessage):
106
107
  data: str | bytes | None = None
107
108
  if self.data_content is not None:
108
109
  data = self.data_content
109
- if not global_config.disable_gzip:
110
+ if not global_config.disable_gzip and not self.disable_gzip:
110
111
  data = gzip.compress(data)
111
112
  elif self.body_content is not None:
112
113
  # We serialize using pydantic instead of json.dumps. This is because pydantic is faster
113
114
  # and handles more complex types such as datetime, float('nan'), etc.
114
115
  data = _BODY_SERIALIZER.dump_json(self.body_content)
115
- if not global_config.disable_gzip and isinstance(data, bytes):
116
+ if not global_config.disable_gzip and not self.disable_gzip and isinstance(data, bytes):
116
117
  data = gzip.compress(data)
117
118
  return data
118
119
 
@@ -161,7 +162,7 @@ class ItemsRequest2(BaseRequestMessage):
161
162
  if self.extra_body_fields:
162
163
  body.update(self.extra_body_fields)
163
164
  res = _BODY_SERIALIZER.dump_json(body)
164
- if not global_config.disable_gzip and isinstance(res, bytes):
165
+ if not global_config.disable_gzip and not self.disable_gzip and isinstance(res, bytes):
165
166
  return gzip.compress(res)
166
167
  return res
167
168
 
@@ -1,5 +1,10 @@
1
1
  import sys
2
+ from typing import Any, Literal
2
3
 
4
+ from pydantic import Field
5
+
6
+ from cognite_toolkit._cdf_tk.client.resource_classes.annotation import AnnotationStatus, AnnotationType
7
+ from cognite_toolkit._cdf_tk.client.resource_classes.data_modeling import NodeReference, ViewReference
3
8
  from cognite_toolkit._cdf_tk.client.resource_classes.identifiers import ExternalId, InternalId
4
9
 
5
10
  from .base import BaseModelRequest
@@ -36,3 +41,73 @@ class ClassicFilter(Filter):
36
41
  return None
37
42
  ids = id if isinstance(id, list) else [id]
38
43
  return [ExternalId(external_id=item) if isinstance(item, str) else InternalId(id=item) for item in ids]
44
+
45
+
46
+ class DataModelingFilter(Filter):
47
+ space: str | None = None
48
+ include_global: bool | None = None
49
+
50
+
51
+ class ContainerFilter(DataModelingFilter):
52
+ used_for: Literal["node", "edge", "record", "all"] | None
53
+
54
+
55
+ class ViewFilter(DataModelingFilter):
56
+ include_inherited_properties: bool | None = None
57
+ all_versions: bool | None = None
58
+
59
+
60
+ class DataModelFilter(DataModelingFilter):
61
+ inline_views: bool | None = None
62
+ all_versions: bool | None = None
63
+
64
+
65
+ class InstanceFilter(Filter):
66
+ instance_type: Literal["node", "edge"] | None = None
67
+ source: ViewReference | None = None
68
+ space: list[str] | None = None
69
+
70
+ def dump(self, camel_case: bool = True) -> dict[str, Any]:
71
+ body: dict[str, Any] = {}
72
+ if self.instance_type is not None:
73
+ body["instanceType"] = self.instance_type
74
+ if self.source is not None:
75
+ body["sources"] = [{"source": self.source.dump()}]
76
+ if self.space is not None:
77
+ instance_type = self.instance_type or "node"
78
+ body["filter"] = {
79
+ "in": {
80
+ "property": [instance_type, "space"],
81
+ "values": self.space,
82
+ }
83
+ }
84
+ return body
85
+
86
+
87
+ class AnnotationFilter(Filter):
88
+ annotated_resource_type: Literal["file", "threedmodel"]
89
+ annotated_resource_ids: list[ExternalId | InternalId]
90
+ annotation_type: AnnotationType | None = None
91
+ created_app: str | None = None
92
+ creating_app_version: str | None = None
93
+ creating_user: str | None = None
94
+ status: AnnotationStatus | None = None
95
+
96
+
97
+ class ThreeDAssetMappingFilter(Filter): ...
98
+
99
+
100
+ class ThreeDAssetMappingAssetIdFilter(ThreeDAssetMappingFilter):
101
+ asset_ids: list[int] = Field(max_length=100)
102
+
103
+
104
+ class ThreeDAssetMappingAssetInstanceIdFilter(ThreeDAssetMappingFilter):
105
+ asset_instance_ids: list[NodeReference] = Field(max_length=100)
106
+
107
+
108
+ class ThreeDAssetMapping3DNodeFilter(ThreeDAssetMappingFilter):
109
+ node_ids: list[int] = Field(max_length=100)
110
+
111
+
112
+ class ThreeDAssetMappingTreeIndexFilter(ThreeDAssetMappingFilter):
113
+ tree_indexes: list[int] = Field(max_length=100)
@@ -0,0 +1,28 @@
1
+ UPSERT_BODY = """
2
+ mutation UpsertGraphQlDmlVersion($dmCreate: GraphQlDmlVersionUpsert!) {
3
+ upsertGraphQlDmlVersion(graphQlDmlVersion: $dmCreate) {
4
+ errors {
5
+ kind
6
+ message
7
+ hint
8
+ location {
9
+ start {
10
+ line
11
+ column
12
+ }
13
+ }
14
+ }
15
+ result {
16
+ space
17
+ externalId
18
+ version
19
+ name
20
+ description
21
+ graphQlDml
22
+ isGlobal
23
+ createdTime
24
+ lastUpdatedTime
25
+ }
26
+ }
27
+ }
28
+ """
@@ -3,7 +3,6 @@ from typing import Annotated, Any, Literal
3
3
  from pydantic import BeforeValidator, Field
4
4
 
5
5
  from cognite_toolkit._cdf_tk.client.resource_classes.base import BaseModelObject, RequestResource, ResponseResource
6
- from tests.test_unit.test_cdf_tk.test_tk_warnings.test_warnings_metatest import get_all_subclasses
7
6
 
8
7
  from .identifiers import ExternalId
9
8
 
@@ -74,7 +73,14 @@ class UnknownAgentTool(AgentToolDefinition):
74
73
  ...
75
74
 
76
75
 
77
- KNOWN_TOOLS = {tool.type: tool for tool in get_all_subclasses(AgentToolDefinition) if hasattr(tool, "type")}
76
+ # Mapping of known agent tool types to their classes
77
+ KNOWN_TOOLS: dict[str, type[AgentToolDefinition]] = {
78
+ "askDocument": AskDocument,
79
+ "examineDataSemantically": ExamineDataSemantically,
80
+ "queryKnowledgeGraph": QueryKnowledgeGraph,
81
+ "queryTimeSeriesDatapoints": QueryTimeSeriesDatapoints,
82
+ "summarizeDocument": SummarizeDocument,
83
+ }
78
84
 
79
85
 
80
86
  def _handle_unknown_tool(value: Any) -> Any:
@@ -0,0 +1,128 @@
1
+ from typing import ClassVar, Literal
2
+
3
+ from cognite_toolkit._cdf_tk.client.resource_classes.base import (
4
+ BaseModelObject,
5
+ RequestResource,
6
+ ResponseResource,
7
+ )
8
+
9
+ from .data_modeling import ViewReference
10
+ from .identifiers import ExternalId
11
+
12
+
13
+ class ThreeDModelIdentifier(BaseModelObject):
14
+ revision_id: int | None = None
15
+ model_id: int | None = None
16
+ name: str | None = None
17
+
18
+
19
+ class ThreeDConfiguration(BaseModelObject):
20
+ full_weight_models: list[ThreeDModelIdentifier] | None = None
21
+ light_weight_models: list[ThreeDModelIdentifier] | None = None
22
+
23
+
24
+ class ResourceFilters(BaseModelObject):
25
+ data_set_ids: list[int] | None = None
26
+ asset_subtree_external_ids: list[str] | None = None
27
+ root_asset_external_ids: list[str] | None = None
28
+ external_id_prefix: str | None = None
29
+ spaces: list[str] | None = None
30
+
31
+
32
+ class RootLocationDataFilters(BaseModelObject):
33
+ general: ResourceFilters | None = None
34
+ assets: ResourceFilters | None = None
35
+ files: ResourceFilters | None = None
36
+ timeseries: ResourceFilters | None = None
37
+
38
+
39
+ class ObservationFeatureToggles(BaseModelObject):
40
+ is_enabled: bool | None = None
41
+ is_write_back_enabled: bool | None = None
42
+ notifications_endpoint_external_id: str | None = None
43
+ attachments_endpoint_external_id: str | None = None
44
+
45
+
46
+ class RootLocationFeatureToggles(BaseModelObject):
47
+ three_d: bool | None = None
48
+ trends: bool | None = None
49
+ documents: bool | None = None
50
+ workorders: bool | None = None
51
+ notifications: bool | None = None
52
+ media: bool | None = None
53
+ template_checklist_flow: bool | None = None
54
+ workorder_checklist_flow: bool | None = None
55
+ observations: ObservationFeatureToggles | None = None
56
+
57
+
58
+ class ObservationConfigFieldProperty(BaseModelObject):
59
+ display_title: str | None = None
60
+ display_description: str | None = None
61
+ is_required: bool | None = None
62
+
63
+
64
+ class ObservationConfigDropdownPropertyOption(BaseModelObject):
65
+ id: str | None = None
66
+ value: str | None = None
67
+ label: str | None = None
68
+
69
+
70
+ class ObservationConfigDropdownProperty(ObservationConfigFieldProperty):
71
+ options: list[ObservationConfigDropdownPropertyOption] | None = None
72
+
73
+
74
+ class ObservationsConfig(BaseModelObject):
75
+ files: ObservationConfigFieldProperty | None = None
76
+ description: ObservationConfigFieldProperty | None = None
77
+ asset: ObservationConfigFieldProperty | None = None
78
+ troubleshooting: ObservationConfigFieldProperty | None = None
79
+ type: ObservationConfigDropdownProperty | None = None
80
+ priority: ObservationConfigDropdownProperty | None = None
81
+
82
+
83
+ class RootLocationConfiguration(BaseModelObject):
84
+ asset_external_id: str | None = None
85
+ external_id: str | None = None
86
+ display_name: str | None = None
87
+ three_d_configuration: ThreeDConfiguration | None = None
88
+ data_set_id: int | None = None
89
+ template_admins: list[str] | None = None # list of Group Names
90
+ checklist_admins: list[str] | None = None # list of Group Names
91
+ app_data_instance_space: str | None = None
92
+ source_data_instance_space: str | None = None
93
+ data_filters: RootLocationDataFilters | None = None
94
+ feature_toggles: RootLocationFeatureToggles | None = None
95
+ observations: ObservationsConfig | None = None
96
+
97
+
98
+ class FeatureConfiguration(BaseModelObject):
99
+ root_location_configurations: list[RootLocationConfiguration] | None = None
100
+
101
+
102
+ class APMConfig(BaseModelObject):
103
+ space: ClassVar[str] = "APM_Config"
104
+ view_ref: ClassVar[ViewReference] = ViewReference(space="APM_Config", external_id="APM_Config", version="1")
105
+ instance_type: Literal["node"] = "node"
106
+ external_id: str
107
+ name: str | None = None
108
+ app_data_space_id: str | None = None
109
+ app_data_space_version: str | None = None
110
+ customer_data_space_id: str | None = None
111
+ customer_data_space_version: str | None = None
112
+ feature_configuration: FeatureConfiguration | None = None
113
+
114
+ def as_id(self) -> ExternalId:
115
+ return ExternalId(external_id=self.external_id)
116
+
117
+
118
+ class APMConfigRequest(APMConfig, RequestResource):
119
+ existing_version: int | None = None
120
+
121
+
122
+ class APMConfigResponse(APMConfig, ResponseResource[APMConfigRequest]):
123
+ version: int
124
+ created_time: int
125
+ last_updated_time: int
126
+
127
+ def as_request_resource(self) -> APMConfigRequest:
128
+ return APMConfigRequest.model_validate(self.dump(), extra="ignore")
@@ -0,0 +1,53 @@
1
+ from datetime import datetime
2
+ from typing import ClassVar, Literal
3
+
4
+ from cognite_toolkit._cdf_tk.client.resource_classes.base import (
5
+ BaseModelObject,
6
+ RequestResource,
7
+ ResponseResource,
8
+ )
9
+
10
+ from .data_modeling import ViewReference
11
+ from .instance_api import NodeReference, TypedNodeIdentifier
12
+
13
+
14
+ class CogniteFile(BaseModelObject):
15
+ view_ref: ClassVar[ViewReference] = ViewReference(space="cdf_cdm", external_id="CogniteFile", version="v1")
16
+ instance_type: Literal["node"] = "node"
17
+ space: str
18
+ external_id: str
19
+ name: str | None = None
20
+ description: str | None = None
21
+ tags: list[str] | None = None
22
+ aliases: list[str] | None = None
23
+ source_id: str | None = None
24
+ source_context: str | None = None
25
+ source: NodeReference | None = None
26
+ source_created_time: datetime | None = None
27
+ source_updated_time: datetime | None = None
28
+ source_created_user: str | None = None
29
+ source_updated_user: str | None = None
30
+ assets: list[NodeReference] | None = None
31
+ mime_type: str | None = None
32
+ directory: str | None = None
33
+ category: NodeReference | None = None
34
+ type: NodeReference | None = None
35
+
36
+ def as_id(self) -> TypedNodeIdentifier:
37
+ return TypedNodeIdentifier(space=self.space, external_id=self.external_id)
38
+
39
+
40
+ class CogniteFileRequest(CogniteFile, RequestResource):
41
+ existing_version: int | None = None
42
+
43
+
44
+ class CogniteFileResponse(CogniteFile, ResponseResource[CogniteFileRequest]):
45
+ version: int
46
+ created_time: int
47
+ last_updated_time: int
48
+ is_uploaded: bool | None = None
49
+ uploaded_time: datetime | None = None
50
+ deleted_time: int | None = None
51
+
52
+ def as_request_resource(self) -> CogniteFileRequest:
53
+ return CogniteFileRequest.model_validate(self.dump(), extra="ignore")