unique_sdk 0.10.43__py3-none-any.whl → 0.10.51__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.
@@ -19,8 +19,7 @@ class AgenticTableSheetState(StrEnum):
19
19
 
20
20
 
21
21
  class LogDetail(TypedDict, total=False):
22
- text: str
23
- messageId: str | None
22
+ llmRequest: list[dict] | None
24
23
 
25
24
 
26
25
  class LogEntry(TypedDict):
@@ -29,6 +29,7 @@ class Content(APIResource["Content"]):
29
29
  metadata: Optional[Dict[str, Any]]
30
30
  writeUrl: Optional[str]
31
31
  readUrl: Optional[str]
32
+ expiredAt: Optional[str]
32
33
 
33
34
  class QueryMode(Enum):
34
35
  Default = "default"
@@ -177,6 +177,53 @@ class Folder(APIResource["Folder"]):
177
177
  successFolders: List["Folder.DeleteFolderResponse"]
178
178
  failedFolders: List["Folder.DeleteFolderResponse"]
179
179
 
180
+ class FolderPathResponse(TypedDict):
181
+ """
182
+ Response for getting folder path.
183
+ """
184
+
185
+ folderPath: str
186
+
187
+ @classmethod
188
+ def get_folder_path(
189
+ cls,
190
+ user_id: str,
191
+ company_id: str,
192
+ scope_id: str,
193
+ ) -> "Folder.FolderPathResponse":
194
+ """
195
+ Get the complete folder path for a given folder ID.
196
+ """
197
+ return cast(
198
+ "Folder.FolderPathResponse",
199
+ cls._static_request(
200
+ "get",
201
+ f"/folder/{scope_id}/path",
202
+ user_id,
203
+ company_id,
204
+ ),
205
+ )
206
+
207
+ @classmethod
208
+ async def get_folder_path_async(
209
+ cls,
210
+ user_id: str,
211
+ company_id: str,
212
+ scope_id: str,
213
+ ) -> "Folder.FolderPathResponse":
214
+ """
215
+ Async get the complete folder path for a given folder ID.
216
+ """
217
+ return cast(
218
+ "Folder.FolderPathResponse",
219
+ await cls._static_request_async(
220
+ "get",
221
+ f"/folder/{scope_id}/path",
222
+ user_id,
223
+ company_id,
224
+ ),
225
+ )
226
+
180
227
  @classmethod
181
228
  def get_info(
182
229
  cls, user_id: str, company_id: str, **params: Unpack["Folder.GetParams"]
@@ -1,5 +1,7 @@
1
1
  from typing import (
2
+ Any,
2
3
  ClassVar,
4
+ Dict,
3
5
  List,
4
6
  Literal,
5
7
  NotRequired,
@@ -25,6 +27,15 @@ class Group(APIResource["Group"]):
25
27
  take: NotRequired[Optional[int]]
26
28
  name: NotRequired[Optional[str]]
27
29
 
30
+ class CreateParams(RequestOptions):
31
+ """
32
+ Parameters for creating a group.
33
+ """
34
+
35
+ name: str
36
+ externalId: NotRequired[Optional[str]]
37
+ parentId: NotRequired[Optional[str]]
38
+
28
39
  class UpdateParams(RequestOptions):
29
40
  """
30
41
  Parameters for updating a group.
@@ -32,6 +43,27 @@ class Group(APIResource["Group"]):
32
43
 
33
44
  name: NotRequired[Optional[str]]
34
45
 
46
+ class AddUsersParams(RequestOptions):
47
+ """
48
+ Parameters for adding users to a group.
49
+ """
50
+
51
+ userIds: List[str]
52
+
53
+ class RemoveUsersParams(RequestOptions):
54
+ """
55
+ Parameters for removing users from a group.
56
+ """
57
+
58
+ userIds: List[str]
59
+
60
+ class UpdateGroupConfigurationParams(RequestOptions):
61
+ """
62
+ Parameters for updating group configuration.
63
+ """
64
+
65
+ configuration: Dict[str, Any]
66
+
35
67
  class GroupMember(TypedDict):
36
68
  """
37
69
  Represents a member of a group.
@@ -39,6 +71,15 @@ class Group(APIResource["Group"]):
39
71
 
40
72
  entityId: str
41
73
 
74
+ class GroupMembership(TypedDict):
75
+ """
76
+ Represents a membership relationship between a user and a group.
77
+ """
78
+
79
+ entityId: str
80
+ groupId: str
81
+ createdAt: str
82
+
42
83
  class Group(TypedDict):
43
84
  """
44
85
  Represents a group in the company.
@@ -48,11 +89,17 @@ class Group(APIResource["Group"]):
48
89
  name: str
49
90
  externalId: str
50
91
  parentId: Optional[str]
51
- roles: Optional[List[str]]
52
92
  members: Optional[List["Group.GroupMember"]]
53
93
  createdAt: str
54
94
  updatedAt: str
55
95
 
96
+ class GroupWithConfiguration(Group):
97
+ """
98
+ Represents a group in the company with configuration.
99
+ """
100
+
101
+ configuration: Dict[str, Any]
102
+
56
103
  class Groups(TypedDict):
57
104
  """
58
105
  Response for getting groups.
@@ -67,6 +114,62 @@ class Group(APIResource["Group"]):
67
114
 
68
115
  id: str
69
116
 
117
+ class AddUsersToGroupResponse(TypedDict):
118
+ """
119
+ Response for adding users to a group.
120
+ """
121
+
122
+ memberships: List["Group.GroupMembership"]
123
+
124
+ class RemoveUsersFromGroupResponse(TypedDict):
125
+ """
126
+ Response for removing users from a group.
127
+ """
128
+
129
+ success: bool
130
+
131
+ @classmethod
132
+ def create_group(
133
+ cls,
134
+ user_id: str,
135
+ company_id: str,
136
+ **params: Unpack["Group.CreateParams"],
137
+ ) -> "Group.Group":
138
+ """
139
+ Create a group in a company.
140
+ """
141
+ return cast(
142
+ "Group.Group",
143
+ cls._static_request(
144
+ "post",
145
+ "/groups",
146
+ user_id,
147
+ company_id,
148
+ params=params,
149
+ ),
150
+ )
151
+
152
+ @classmethod
153
+ async def create_group_async(
154
+ cls,
155
+ user_id: str,
156
+ company_id: str,
157
+ **params: Unpack["Group.CreateParams"],
158
+ ) -> "Group.Group":
159
+ """
160
+ Async create a group in a company.
161
+ """
162
+ return cast(
163
+ "Group.Group",
164
+ await cls._static_request_async(
165
+ "post",
166
+ "/groups",
167
+ user_id,
168
+ company_id,
169
+ params=params,
170
+ ),
171
+ )
172
+
70
173
  @classmethod
71
174
  def get_groups(
72
175
  cls,
@@ -192,3 +295,135 @@ class Group(APIResource["Group"]):
192
295
  params=params,
193
296
  ),
194
297
  )
298
+
299
+ @classmethod
300
+ def add_users_to_group(
301
+ cls,
302
+ user_id: str,
303
+ company_id: str,
304
+ group_id: str,
305
+ **params: Unpack["Group.AddUsersParams"],
306
+ ) -> "Group.AddUsersToGroupResponse":
307
+ """
308
+ Add users to a group in a company.
309
+ """
310
+ return cast(
311
+ "Group.AddUsersToGroupResponse",
312
+ cls._static_request(
313
+ "post",
314
+ f"/groups/{group_id}/users",
315
+ user_id,
316
+ company_id,
317
+ params=params,
318
+ ),
319
+ )
320
+
321
+ @classmethod
322
+ async def add_users_to_group_async(
323
+ cls,
324
+ user_id: str,
325
+ company_id: str,
326
+ group_id: str,
327
+ **params: Unpack["Group.AddUsersParams"],
328
+ ) -> "Group.AddUsersToGroupResponse":
329
+ """
330
+ Async add users to a group in a company.
331
+ """
332
+ return cast(
333
+ "Group.AddUsersToGroupResponse",
334
+ await cls._static_request_async(
335
+ "post",
336
+ f"/groups/{group_id}/users",
337
+ user_id,
338
+ company_id,
339
+ params=params,
340
+ ),
341
+ )
342
+
343
+ @classmethod
344
+ def remove_users_from_group(
345
+ cls,
346
+ user_id: str,
347
+ company_id: str,
348
+ group_id: str,
349
+ **params: Unpack["Group.RemoveUsersParams"],
350
+ ) -> "Group.RemoveUsersFromGroupResponse":
351
+ """
352
+ Remove users from a group in a company.
353
+ """
354
+ return cast(
355
+ "Group.RemoveUsersFromGroupResponse",
356
+ cls._static_request(
357
+ "delete",
358
+ f"/groups/{group_id}/users",
359
+ user_id,
360
+ company_id,
361
+ params=params,
362
+ ),
363
+ )
364
+
365
+ @classmethod
366
+ async def remove_users_from_group_async(
367
+ cls,
368
+ user_id: str,
369
+ company_id: str,
370
+ group_id: str,
371
+ **params: Unpack["Group.RemoveUsersParams"],
372
+ ) -> "Group.RemoveUsersFromGroupResponse":
373
+ """
374
+ Async remove users from a group in a company.
375
+ """
376
+ return cast(
377
+ "Group.RemoveUsersFromGroupResponse",
378
+ await cls._static_request_async(
379
+ "delete",
380
+ f"/groups/{group_id}/users",
381
+ user_id,
382
+ company_id,
383
+ params=params,
384
+ ),
385
+ )
386
+
387
+ @classmethod
388
+ def update_group_configuration(
389
+ cls,
390
+ user_id: str,
391
+ company_id: str,
392
+ group_id: str,
393
+ **params: Unpack["Group.UpdateGroupConfigurationParams"],
394
+ ) -> "Group.GroupWithConfiguration":
395
+ """
396
+ Update group configuration for the specified group.
397
+ """
398
+ return cast(
399
+ "Group.GroupWithConfiguration",
400
+ cls._static_request(
401
+ "patch",
402
+ f"/groups/{group_id}/configuration",
403
+ user_id,
404
+ company_id,
405
+ params=params,
406
+ ),
407
+ )
408
+
409
+ @classmethod
410
+ async def update_group_configuration_async(
411
+ cls,
412
+ user_id: str,
413
+ company_id: str,
414
+ group_id: str,
415
+ **params: Unpack["Group.UpdateGroupConfigurationParams"],
416
+ ) -> "Group.GroupWithConfiguration":
417
+ """
418
+ Async update group configuration for the specified group.
419
+ """
420
+ return cast(
421
+ "Group.GroupWithConfiguration",
422
+ await cls._static_request_async(
423
+ "patch",
424
+ f"/groups/{group_id}/configuration",
425
+ user_id,
426
+ company_id,
427
+ params=params,
428
+ ),
429
+ )
@@ -29,6 +29,14 @@ class Space(APIResource["Space"]):
29
29
  toolChoices: NotRequired[List[str] | None]
30
30
  scopeRules: NotRequired[dict | None]
31
31
 
32
+ class GetChatMessagesParams(RequestOptions):
33
+ """
34
+ Parameters for getting chat messages.
35
+ """
36
+
37
+ skip: NotRequired[int]
38
+ take: NotRequired[int]
39
+
32
40
  class Reference(TypedDict):
33
41
  """
34
42
  Reference information for a message.
@@ -86,6 +94,94 @@ class Space(APIResource["Space"]):
86
94
 
87
95
  chat_id: str
88
96
 
97
+ class GetAllMessagesResponse(TypedDict):
98
+ """
99
+ Response for getting all messages in a chat.
100
+ """
101
+
102
+ messages: List["Space.Message"]
103
+ totalCount: int
104
+
105
+ class AssistantMcpServer(TypedDict):
106
+ """
107
+ Represents an MCP server associated with an assistant.
108
+ """
109
+
110
+ id: str
111
+ name: str
112
+ assistantId: str
113
+ mcpServerId: str
114
+ isEnabled: bool
115
+ createdAt: str
116
+ updatedAt: str
117
+
118
+ class Module(TypedDict):
119
+ """
120
+ Represents a module configured for a space.
121
+ """
122
+
123
+ id: str
124
+ name: str
125
+ description: Optional[str]
126
+ toolDefinition: Optional[Dict[str, Any]]
127
+ configuration: Dict[str, Any]
128
+ assistantId: str
129
+ weight: int
130
+ isExternal: bool
131
+ isCustomInstructionEnabled: bool
132
+ moduleTemplateId: Optional[str]
133
+ createdAt: str
134
+ updatedAt: str
135
+
136
+ class ScopeRule(TypedDict):
137
+ """
138
+ Represents a scope rule for a space.
139
+ """
140
+
141
+ id: str
142
+ assistantId: str
143
+ title: str
144
+ companyId: str
145
+ rule: Dict[str, Any]
146
+ isAdvanced: bool
147
+ createdAt: str
148
+ updatedAt: str
149
+
150
+ class AssistantAccess(TypedDict):
151
+ """
152
+ Represents access control for a space.
153
+ """
154
+
155
+ id: str
156
+ entityId: str
157
+ entityType: str
158
+ type: str
159
+
160
+ id: str
161
+ name: str
162
+ defaultForCompanyId: Optional[str]
163
+ title: Optional[str]
164
+ subtitle: Optional[str]
165
+ explanation: Optional[str]
166
+ alert: Optional[str]
167
+ inputLimit: Optional[int]
168
+ inputPlaceholder: Optional[str]
169
+ chatUpload: str
170
+ goals: List[str]
171
+ languageModel: Optional[str]
172
+ fallbackModule: str
173
+ access: List[str]
174
+ isExternal: bool
175
+ isPinned: bool
176
+ uiType: str
177
+ settings: Optional[Dict[str, Any]]
178
+ assistantMcpServers: List["Space.AssistantMcpServer"]
179
+ modules: List["Space.Module"]
180
+ scopeRules: List["Space.ScopeRule"]
181
+ assistantAccess: List["Space.AssistantAccess"]
182
+ createdAt: str
183
+ updatedAt: str
184
+
89
185
  @classmethod
90
186
  def create_message(
91
187
  cls,
@@ -130,6 +226,50 @@ class Space(APIResource["Space"]):
130
226
  ),
131
227
  )
132
228
 
229
+ @classmethod
230
+ def get_chat_messages(
231
+ cls,
232
+ user_id: str,
233
+ company_id: str,
234
+ chat_id: str,
235
+ **params: Unpack["Space.GetChatMessagesParams"],
236
+ ) -> "Space.GetAllMessagesResponse":
237
+ """
238
+ Get all messages in a space chat.
239
+ """
240
+ return cast(
241
+ "Space.GetAllMessagesResponse",
242
+ cls._static_request(
243
+ "get",
244
+ f"/space/chat/{chat_id}/messages",
245
+ user_id,
246
+ company_id,
247
+ params=params,
248
+ ),
249
+ )
250
+
251
+ @classmethod
252
+ async def get_chat_messages_async(
253
+ cls,
254
+ user_id: str,
255
+ company_id: str,
256
+ chat_id: str,
257
+ **params: Unpack["Space.GetChatMessagesParams"],
258
+ ) -> "Space.GetAllMessagesResponse":
259
+ """
260
+ Async get all messages in a space chat.
261
+ """
262
+ return cast(
263
+ "Space.GetAllMessagesResponse",
264
+ await cls._static_request_async(
265
+ "get",
266
+ f"/space/chat/{chat_id}/messages",
267
+ user_id,
268
+ company_id,
269
+ params=params,
270
+ ),
271
+ )
272
+
133
273
  @classmethod
134
274
  def get_latest_message(
135
275
  cls, user_id: str, company_id: str, chat_id: str
@@ -203,3 +343,43 @@ class Space(APIResource["Space"]):
203
343
  company_id,
204
344
  ),
205
345
  )
346
+
347
+ @classmethod
348
+ def get_space(
349
+ cls,
350
+ user_id: str,
351
+ company_id: str,
352
+ space_id: str,
353
+ ) -> "Space":
354
+ """
355
+ Get detailed information about a space (assistant).
356
+ """
357
+ return cast(
358
+ "Space",
359
+ cls._static_request(
360
+ "get",
361
+ f"/space/{space_id}",
362
+ user_id,
363
+ company_id,
364
+ ),
365
+ )
366
+
367
+ @classmethod
368
+ async def get_space_async(
369
+ cls,
370
+ user_id: str,
371
+ company_id: str,
372
+ space_id: str,
373
+ ) -> "Space":
374
+ """
375
+ Async get detailed information about a space (assistant).
376
+ """
377
+ return cast(
378
+ "Space",
379
+ await cls._static_request_async(
380
+ "get",
381
+ f"/space/{space_id}",
382
+ user_id,
383
+ company_id,
384
+ ),
385
+ )
@@ -1,5 +1,7 @@
1
1
  from typing import (
2
+ Any,
2
3
  ClassVar,
4
+ Dict,
3
5
  List,
4
6
  NotRequired,
5
7
  Optional,
@@ -25,6 +27,13 @@ class User(APIResource["User"]):
25
27
  email: NotRequired[Optional[str]]
26
28
  displayName: NotRequired[Optional[str]]
27
29
 
30
+ class UpdateUserConfigurationParams(RequestOptions):
31
+ """
32
+ Parameters for updating user configuration.
33
+ """
34
+
35
+ userConfiguration: Dict[str, Any]
36
+
28
37
  class User(TypedDict):
29
38
  """
30
39
  Represents a user in the company.
@@ -41,6 +50,13 @@ class User(APIResource["User"]):
41
50
  createdAt: str
42
51
  active: bool
43
52
 
53
+ class UserWithConfiguration(User):
54
+ """
55
+ Represents a user in the company with configuration.
56
+ """
57
+
58
+ userConfiguration: Dict[str, Any]
59
+
44
60
  class Users(TypedDict):
45
61
  """
46
62
  Response for getting users.
@@ -89,3 +105,45 @@ class User(APIResource["User"]):
89
105
  params=params,
90
106
  ),
91
107
  )
108
+
109
+ @classmethod
110
+ def update_user_configuration(
111
+ cls,
112
+ user_id: str,
113
+ company_id: str,
114
+ **params: Unpack["User.UpdateUserConfigurationParams"],
115
+ ) -> "User.UserWithConfiguration":
116
+ """
117
+ Update user configuration for the current user.
118
+ """
119
+ return cast(
120
+ "User.UserWithConfiguration",
121
+ cls._static_request(
122
+ "patch",
123
+ f"/users/{user_id}/configuration",
124
+ user_id,
125
+ company_id,
126
+ params=params,
127
+ ),
128
+ )
129
+
130
+ @classmethod
131
+ async def update_user_configuration_async(
132
+ cls,
133
+ user_id: str,
134
+ company_id: str,
135
+ **params: Unpack["User.UpdateUserConfigurationParams"],
136
+ ) -> "User.UserWithConfiguration":
137
+ """
138
+ Async update user configuration for the current user.
139
+ """
140
+ return cast(
141
+ "User.UserWithConfiguration",
142
+ await cls._static_request_async(
143
+ "patch",
144
+ f"/users/{user_id}/configuration",
145
+ user_id,
146
+ company_id,
147
+ params=params,
148
+ ),
149
+ )
@@ -76,6 +76,7 @@ async def chat_against_file(
76
76
  text: str,
77
77
  poll_interval: float = 1.0,
78
78
  max_wait: float = 60.0,
79
+ should_delete_chat: bool = True,
79
80
  ) -> "Space.Message":
80
81
  """
81
82
  Chat against a file by uploading it, sending a message and waiting for a reply.
@@ -140,8 +141,8 @@ async def chat_against_file(
140
141
  print(f"Error during chat against file: {err}")
141
142
  raise
142
143
  finally:
143
- if chat_id:
144
- Space.delete_chat(
144
+ if chat_id and should_delete_chat:
145
+ await Space.delete_chat_async(
145
146
  user_id=user_id,
146
147
  company_id=company_id,
147
148
  chat_id=chat_id,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: unique_sdk
3
- Version: 0.10.43
3
+ Version: 0.10.51
4
4
  Summary:
5
5
  License: MIT
6
6
  Author: Martin Fadler
@@ -1138,6 +1138,18 @@ unique_sdk.Folder.get_info(
1138
1138
  )
1139
1139
  ```
1140
1140
 
1141
+ #### `unique_sdk.Folder.get_folder_path` (Compatible with release >.48)
1142
+
1143
+ Get the complete folder path for a given scope ID. Returns the full path string with folder names (e.g., "/company/subfolder1/subfolder2").
1144
+
1145
+ ```python
1146
+ folder_path = unique_sdk.Folder.get_folder_path(
1147
+ user_id=user_id,
1148
+ company_id=company_id,
1149
+ scope_id="scope_w78wfn114va9o22s13r03yq",
1150
+ )
1151
+ ```
1152
+
1141
1153
  #### `unique_sdl.Folder.get_infos`
1142
1154
 
1143
1155
  Get paginated folders info based on parentId. If the parentId is not defined, the root folders will be returned.
@@ -1392,6 +1404,20 @@ message = unique_sdk.Space.create_message(
1392
1404
  )
1393
1405
  ```
1394
1406
 
1407
+ #### `unique_sdk.Space.get_chat_messages` (Compatible with release >.48)
1408
+
1409
+ Get all messages in a space chat. Returns a list of paginated messages in the specified chat.
1410
+
1411
+ ```python
1412
+ messages = unique_sdk.Space.get_chat_messages(
1413
+ user_id=user_id,
1414
+ company_id=company_id,
1415
+ chat_id="chat_dejfhe729br398",
1416
+ skip=0, # Optional (defaults to 0) - number of messages to skip for pagination
1417
+ take=50, # Optional (defaults to 10) - number of messages to return
1418
+ )
1419
+ ```
1420
+
1395
1421
  #### `unique_sdk.Space.get_latest_message`
1396
1422
 
1397
1423
  Get the latest message in a space chat.
@@ -1404,6 +1430,18 @@ message = unique_sdk.Space.get_latest_message(
1404
1430
  )
1405
1431
  ```
1406
1432
 
1433
+ #### `unique_sdk.Space.get_space` (Compatible with release >.48)
1434
+
1435
+ Get detailed information about a space, including its configuration, modules and scope rules.
1436
+
1437
+ ```python
1438
+ space_info = unique_sdk.Space.get_space(
1439
+ user_id=user_id,
1440
+ company_id=company_id,
1441
+ space_id="assistant_hjcdga64bkcjnhu4",
1442
+ )
1443
+ ```
1444
+
1407
1445
  #### `unique_sdk.Space.delete_chat`
1408
1446
 
1409
1447
  Delete a space chat by id. If the chat does not exist, the function will return an error.
@@ -1447,8 +1485,36 @@ users = unique_sdk.User.get_users(
1447
1485
  )
1448
1486
  ```
1449
1487
 
1488
+ #### `unique_sdk.User.update_user_configuration` (Compatible with release >.48)
1489
+
1490
+ Update the user configuration for the current user. The configuration is stored as a JSON object.
1491
+
1492
+ ```python
1493
+ updated_user = unique_sdk.User.update_user_configuration(
1494
+ user_id=user_id,
1495
+ company_id=company_id,
1496
+ userConfiguration={ # Required - user configuration object (JSON)
1497
+ {"location": "CH"}
1498
+ }
1499
+ )
1500
+ ```
1501
+
1450
1502
  ### Group
1451
1503
 
1504
+ #### `unique_sdk.Group.create_group` (Compatible with release >.48)
1505
+
1506
+ Create a new group in a company. You can specify the group name (required), external ID and parent group ID.
1507
+
1508
+ ```python
1509
+ group = unique_sdk.Group.create_group(
1510
+ user_id=user_id,
1511
+ company_id=company_id,
1512
+ name="New Group", # Required - the name of the group
1513
+ externalId="ext_123", # Optional - external ID for the group
1514
+ parentId="group_a9cs7wr2z1bg2sxczvltgjch", # Optional - parent group ID
1515
+ )
1516
+ ```
1517
+
1452
1518
  #### `unique_sdk.Group.get_groups` (Compatible with release >.48)
1453
1519
 
1454
1520
  Get groups in a company. You can filter by name and use pagination with skip and take parameters.
@@ -1471,11 +1537,52 @@ Update a group in a company. You can update the group's name.
1471
1537
  updated_group = unique_sdk.Group.update_group(
1472
1538
  user_id=user_id,
1473
1539
  company_id=company_id,
1474
- group_id="group_id_here",
1540
+ group_id="group_a9cs7wr2z1bg2sxczvltgjch",
1475
1541
  name="New Group Name", # Optional - update the group name
1476
1542
  )
1477
1543
  ```
1478
1544
 
1545
+ #### `unique_sdk.Group.add_users_to_group` (Compatible with release >.48)
1546
+
1547
+ Add users to a group. Provide an array of user IDs to add as members to the specified group.
1548
+
1549
+ ```python
1550
+ result = unique_sdk.Group.add_users_to_group(
1551
+ user_id=user_id,
1552
+ company_id=company_id,
1553
+ group_id="group_a9cs7wr2z1bg2sxczvltgjch",
1554
+ userIds=["299420877169688584", "325402458132058201", "299426678160031752"], # Required - array of user IDs to add
1555
+ )
1556
+ ```
1557
+
1558
+ #### `unique_sdk.Group.remove_users_from_group` (Compatible with release >.48)
1559
+
1560
+ Remove users from a group. Provide an array of user IDs to remove from the specified group.
1561
+
1562
+ ```python
1563
+ result = unique_sdk.Group.remove_users_from_group(
1564
+ user_id=user_id,
1565
+ company_id=company_id,
1566
+ group_id="group_a9cs7wr2z1bg2sxczvltgjch",
1567
+ userIds=["299426678160031752", "299426678160031752"], # Required - array of user IDs to remove
1568
+ )
1569
+ ```
1570
+
1571
+ #### `unique_sdk.Group.update_group_configuration` (Compatible with release >.48)
1572
+
1573
+ Update the group configuration for the specified group. The configuration is stored as a JSON object.
1574
+
1575
+ ```python
1576
+ updated_group = unique_sdk.Group.update_group_configuration(
1577
+ user_id=user_id,
1578
+ company_id=company_id,
1579
+ group_id="group_abc123",
1580
+ configuration={ # Required - group configuration object (JSON)
1581
+ {"email": "team@unique.ai"}
1582
+ }
1583
+ )
1584
+ ```
1585
+
1479
1586
  #### `unique_sdk.Group.delete_group` (Compatible with release >.48)
1480
1587
 
1481
1588
  Delete a group in a company by its group ID.
@@ -1484,7 +1591,7 @@ Delete a group in a company by its group ID.
1484
1591
  result = unique_sdk.Group.delete_group(
1485
1592
  user_id=user_id,
1486
1593
  company_id=company_id,
1487
- group_id="group_id_here",
1594
+ group_id="group_a9cs7wr2z1bg2sxczvltgjch",
1488
1595
  )
1489
1596
  ```
1490
1597
 
@@ -2032,11 +2139,12 @@ You must provide the following parameters:
2032
2139
  - `mime_type`: The mime type of the ifle to be uploaded.
2033
2140
  - `text`: The text to be sent to the chat for chatting against the file.
2034
2141
 
2035
- The script creates a chat and uploads the file to it. It then keeps polling the `ingestionState` field of the message, waiting for it to reach `FINISHED`, signaling the upload is complete. Once the file uploads successfully, the script sends the text, continues polling for completion, and finally retrieves the response message.
2142
+ The script creates a chat and uploads the file to it. It then keeps polling the `ingestionState` field of the message, waiting for it to reach `FINISHED`, signaling the upload is complete. Once the file uploads successfully, the script sends the text, continues polling for completion, and finally retrieves the response message. The function deletes the chat at the end unless the `should_delete_chat` is set to false.
2036
2143
 
2037
2144
  **Optional parameters:**
2038
2145
  - `poll_interval`: The number of seconds to wait between polling attempts (default: `1` second).
2039
2146
  - `max_wait`: The maximum number of seconds to wait for the message to complete (default: `60` seconds).
2147
+ - `should_delete_chat`: Setting this flag determines whether the chat should be deleted at the end or not. Default is True.
2040
2148
 
2041
2149
  Example of chatting against a PDF. (The usage can be extended to any supported file type)
2042
2150
 
@@ -2046,8 +2154,8 @@ latest_message = await unique_sdk.utils.chat_in_space.chat_against_file(
2046
2154
  company_id=company_id,
2047
2155
  assistant_id="assistant_hjcdga64bkcjnhu4",
2048
2156
  path_to_file="/files/hello.pdf",
2049
- displayed_filename="hello.pdf"
2050
- mime_type="application/pdf"
2157
+ displayed_filename="hello.pdf",
2158
+ mime_type="application/pdf",
2051
2159
  text="Give me a bullet point summary of the file.",
2052
2160
  )
2053
2161
  ```
@@ -2093,6 +2201,30 @@ All notable changes to this project will be documented in this file.
2093
2201
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
2094
2202
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
2095
2203
 
2204
+ ## [0.10.51] - 2025-11-21
2205
+ - Add function to get a space.
2206
+
2207
+ ## [0.10.50] - 2025-11-21
2208
+ - Allow updating the configuration of a user and group.
2209
+
2210
+ ## [0.10.49] - 2025-11-21
2211
+ - Add get folder by scope id function
2212
+
2213
+ ## [0.10.48] - 2025-11-20
2214
+ - Update Agentic Table LogDetail and LogEntry types.
2215
+
2216
+ ## [0.10.47] - 2025-11-19
2217
+ - Add expired/s at fields on content search result.
2218
+
2219
+ ## [0.10.46] - 2025-11-18
2220
+ - chat_against_file function allows now a should_delete_chat flag.
2221
+
2222
+ ## [0.10.45] - 2025-11-18
2223
+ - Create group and manage users functions.
2224
+
2225
+ ## [0.10.44] - 2025-11-18
2226
+ - add function to get all messages in a chat.
2227
+
2096
2228
  ## [0.10.43] - 2025-11-14
2097
2229
  - Add get, delete and update groups functions.
2098
2230
 
@@ -15,13 +15,13 @@ unique_sdk/_version.py,sha256=j4_tPC6t3enRds7LqiRuWSyfrYHfEo6CXIDARAWW98I,19
15
15
  unique_sdk/_webhook.py,sha256=GYxbUibQN_W4XlNTHaMIksT9FQJk4LJmlKcxOu3jqiU,2855
16
16
  unique_sdk/api_resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
17
  unique_sdk/api_resources/_acronyms.py,sha256=GIU1XH1flGWQYcpsFqTYwg4ioIGxVmb15tux84nmhEg,891
18
- unique_sdk/api_resources/_agentic_table.py,sha256=8-_f7t-m_iiiOj2835iESoxz91YRxl4-tkxpzQbgdcI,9958
18
+ unique_sdk/api_resources/_agentic_table.py,sha256=ejYVASkJshxyI89TrC2dMdhwOJ0fEjYOsh1DeTluBO4,9952
19
19
  unique_sdk/api_resources/_chat_completion.py,sha256=ILCAffxkbkfh2iV9L4KKnfe80gZmT9pWfkNmf3mq68U,2172
20
- unique_sdk/api_resources/_content.py,sha256=Z7BU2bw1qULnn-UBX0f6ix_XV0qI1yaRH6zOSgtMvho,17514
20
+ unique_sdk/api_resources/_content.py,sha256=vRynwj4QBZA1v2CVg_xbhmLqqh3m4cPGMoLeFZTaSYA,17543
21
21
  unique_sdk/api_resources/_embedding.py,sha256=C6qak7cCUBMBINfPhgH8taCJZ9n6w1MUElqDJJ8dG10,1281
22
22
  unique_sdk/api_resources/_event.py,sha256=bpWF9vstdoAWbUzr-iiGP713ceP0zPk77GJXiImf9zg,374
23
- unique_sdk/api_resources/_folder.py,sha256=WPyRPsdAE62tU7p4hEYiVB4OoArv_60b8t4j7hgrJKk,15765
24
- unique_sdk/api_resources/_group.py,sha256=f3spoWF0fX0rZkWrJZdalBMLkwRtccNOSSxFadypum0,4341
23
+ unique_sdk/api_resources/_folder.py,sha256=PRNTsyrtfWnHS8wR1Ls16_iXlNFjOmTjlwxSSjCTrAo,16904
24
+ unique_sdk/api_resources/_group.py,sha256=8A8mSjhWuhFxBA2r_z7q-70miJ_ugz7NAffVwbPu1oo,10302
25
25
  unique_sdk/api_resources/_integrated.py,sha256=O8e673z-RB7FRFMQYn_YEuHijebr5W7KJxkUnymbBZk,6164
26
26
  unique_sdk/api_resources/_llm_models.py,sha256=3Jn6MpxWgZ43Hze8JHd4_n27si5xmwd3JE8r8cEZq_M,1640
27
27
  unique_sdk/api_resources/_mcp.py,sha256=zKh0dyn0QnkKk57N2zlGVN_GQoxEp5T2CS38vVm6jQY,3341
@@ -32,14 +32,14 @@ unique_sdk/api_resources/_message_log.py,sha256=_DifZ4Di7uKyzkP0i8rwu5IIiYZPCBp5
32
32
  unique_sdk/api_resources/_search.py,sha256=GQItZKoGNOVZfkLLltBmsRZYBIreRKU0lGW8Kgpj1_Q,1959
33
33
  unique_sdk/api_resources/_search_string.py,sha256=LZz2_QPZXV1NXucRR06dnDC2miK7J8XBY7dXX2xoDY4,1610
34
34
  unique_sdk/api_resources/_short_term_memory.py,sha256=vPRN-Y0WPx74E6y-A3LocGc0TxJdzT-xGL66WzZwKRg,2820
35
- unique_sdk/api_resources/_space.py,sha256=JjIPauH37wULEiNO5PqOfgsipyfbRlC0KqjJ4_1Uugg,5035
36
- unique_sdk/api_resources/_user.py,sha256=u59Hgq9i-QhYlqIYgk-KE7OeSx5xuNVo_gUgDpZTLcI,1974
35
+ unique_sdk/api_resources/_space.py,sha256=YfAywlTl0BUtl3U6Zml9CRyWqhrFeKCoo15mYmynErw,9380
36
+ unique_sdk/api_resources/_user.py,sha256=CAIT1GOk-knaLLIofl73O3WVGc_zeUv5XjqhuYcgD50,3522
37
37
  unique_sdk/utils/chat_history.py,sha256=5UqL9hF1O9pV7skbNOlEibF5rHdYsmG3m5-YEPUowOs,3037
38
- unique_sdk/utils/chat_in_space.py,sha256=cdjETBLnjv-OE8qsQpm626ks5yBdfQG_KBeG0WIzCbY,5994
38
+ unique_sdk/utils/chat_in_space.py,sha256=e_Ny03eB7Q8oijdUR_sPlFTIgq2rsCbSR-Sin8jnxM8,6066
39
39
  unique_sdk/utils/file_io.py,sha256=lskRULIh7qExK26o_1YqRs0f5mqJHTS9m_mdxlsVo4s,4497
40
40
  unique_sdk/utils/sources.py,sha256=DoxxhMLcLhmDfNarjXa41H4JD2GSSDywr71hiC-4pYc,4952
41
41
  unique_sdk/utils/token.py,sha256=AzKuAA1AwBtnvSFxGcsHLpxXr_wWE5Mj4jYBbOz2ljA,1740
42
- unique_sdk-0.10.43.dist-info/LICENSE,sha256=EJCWoHgrXVBUb47PnjeV4MFIEOR71MAdCOIgv61J-4k,1065
43
- unique_sdk-0.10.43.dist-info/METADATA,sha256=KdrdST-aefdKEsL0BaXUxAm4IyhnZSwc4TcKVDEVOBA,71736
44
- unique_sdk-0.10.43.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
45
- unique_sdk-0.10.43.dist-info/RECORD,,
42
+ unique_sdk-0.10.51.dist-info/LICENSE,sha256=EJCWoHgrXVBUb47PnjeV4MFIEOR71MAdCOIgv61J-4k,1065
43
+ unique_sdk-0.10.51.dist-info/METADATA,sha256=cxsS4dYfr_-0nfPYemOmvufXO9XpbinIasdMkyQMqag,75966
44
+ unique_sdk-0.10.51.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
45
+ unique_sdk-0.10.51.dist-info/RECORD,,