unique_sdk 0.10.32__tar.gz → 0.10.38__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.
Files changed (43) hide show
  1. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/CHANGELOG.md +18 -0
  2. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/PKG-INFO +233 -5
  3. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/README.md +214 -4
  4. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/pyproject.toml +3 -1
  5. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/api_resources/_content.py +12 -10
  6. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/api_resources/_folder.py +8 -4
  7. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/api_resources/_message.py +2 -0
  8. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/api_resources/_message_execution.py +13 -10
  9. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/api_resources/_message_log.py +13 -10
  10. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/api_resources/_space.py +4 -3
  11. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/utils/file_io.py +4 -0
  12. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/LICENSE +0 -0
  13. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/__init__.py +0 -0
  14. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/_api_requestor.py +0 -0
  15. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/_api_resource.py +0 -0
  16. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/_api_version.py +0 -0
  17. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/_error.py +0 -0
  18. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/_http_client.py +0 -0
  19. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/_list_object.py +0 -0
  20. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/_object_classes.py +0 -0
  21. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/_request_options.py +0 -0
  22. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/_unique_object.py +0 -0
  23. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/_unique_ql.py +0 -0
  24. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/_unique_response.py +0 -0
  25. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/_util.py +0 -0
  26. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/_version.py +0 -0
  27. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/_webhook.py +0 -0
  28. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/api_resources/__init__.py +0 -0
  29. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/api_resources/_acronyms.py +0 -0
  30. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/api_resources/_agentic_table.py +0 -0
  31. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/api_resources/_chat_completion.py +0 -0
  32. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/api_resources/_embedding.py +0 -0
  33. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/api_resources/_event.py +0 -0
  34. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/api_resources/_integrated.py +0 -0
  35. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/api_resources/_mcp.py +0 -0
  36. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/api_resources/_message_assessment.py +0 -0
  37. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/api_resources/_search.py +0 -0
  38. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/api_resources/_search_string.py +0 -0
  39. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/api_resources/_short_term_memory.py +0 -0
  40. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/utils/chat_history.py +0 -0
  41. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/utils/chat_in_space.py +0 -0
  42. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/utils/sources.py +0 -0
  43. {unique_sdk-0.10.32 → unique_sdk-0.10.38}/unique_sdk/utils/token.py +0 -0
@@ -5,6 +5,24 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.10.38] - 2025-11-06
9
+ - Add description property to Reference and Content.
10
+
11
+ ## [0.10.37] - 2025-11-04
12
+ - Introduce local integration tests for Content API Resource
13
+
14
+ ## [0.10.36] - 2025-11-04
15
+ - Introduce local integration tests for Folder API Resource
16
+
17
+ ## [0.10.35] - 2025-11-04
18
+ - Inmprove folder get infos types.
19
+
20
+ ## [0.10.34] - 2025-10-29
21
+ - Add documentation for agentic table.
22
+
23
+ ## [0.10.33] - 2025-10-27
24
+ - Improve messagelog and message execution types.
25
+
8
26
  ## [0.10.32] - 2025-10-14
9
27
  - Add function to stream to chat frontend.
10
28
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: unique_sdk
3
- Version: 0.10.32
3
+ Version: 0.10.38
4
4
  Summary:
5
5
  License: MIT
6
6
  Author: Martin Fadler
@@ -42,6 +42,7 @@ The Unique Python SDK provides access to the public API of Unique AI. It also en
42
42
  - [Message Assessment](#message-assessment)
43
43
  - [Folder](#folder)
44
44
  - [Space](#space)
45
+ - [Agentic Table](#agentic-table)
45
46
  6. [UniqueQL](#uniqueql)
46
47
  - [Query Structure](#uniqueql-query-structure)
47
48
  - [Metadata Filtering](#metadata-filtering)
@@ -259,6 +260,7 @@ unique_sdk.Message.modify(
259
260
  - [Message Assessment](#message-assessment)
260
261
  - [Folder](#folder)
261
262
  - [Space](#space)
263
+ - [Agentic Table](#agentic-table)
262
264
 
263
265
  Most of the API services provide an asynchronous version of the method. The async methods are suffixed with `_async`.
264
266
 
@@ -475,6 +477,7 @@ def upload_file(
475
477
  path_to_file,
476
478
  displayed_filename,
477
479
  mimeType,
480
+ description=None,
478
481
  scope_or_unique_path,
479
482
  ingestion_config=None,
480
483
  metadata=None,
@@ -487,6 +490,7 @@ def upload_file(
487
490
  "key": displayed_filename,
488
491
  "title": displayed_filename,
489
492
  "mimeType": mimeType,
493
+ "description": description,
490
494
  "ingestionConfig": ingestionConfig,
491
495
  "metadata": metadata,
492
496
  },
@@ -513,6 +517,7 @@ def upload_file(
513
517
  "key": displayed_filename,
514
518
  "title": displayed_filename,
515
519
  "mimeType": mimeType,
520
+ "description": description,
516
521
  "byteSize": size,
517
522
  "ingestionConfig": ingestionConfig,
518
523
  "metadata": metadata,
@@ -890,10 +895,7 @@ msg_execution = unique_sdk.MessageExecution.create(
890
895
  user_id=user_id,
891
896
  company_id=company_id,
892
897
  messageId="msg_a0jgnt1jrqv143uzr750waxw",
893
- chatId="chat_nx21havszl1skchd7544oykh",
894
898
  type="DEEP_RESEARCH",
895
- secondsRemaining=None, # optional, number defining the seconds remaining
896
- percentageCompleted=None, # optional, number defining the percentage completed
897
899
  )
898
900
  ```
899
901
 
@@ -918,7 +920,7 @@ msg_execution = unique_sdk.MessageExecution.update(
918
920
  user_id=user_id,
919
921
  company_id=company_id,
920
922
  messageId="msg_a0jgnt1jrqv143uzr750waxw",
921
- status="COMPLETED", # one of: COMPLETED, FAILED
923
+ status="COMPLETED", # optional, one of: COMPLETED, FAILED - not specifying the status will have no effect over the status
922
924
  secondsRemaining=55, # optional, number defining the seconds remaining
923
925
  percentageCompleted=10, # optional, number defining the percentage completed
924
926
  )
@@ -1372,6 +1374,214 @@ unique_sdk.Space.delete_chat(
1372
1374
  )
1373
1375
  ```
1374
1376
 
1377
+ ### Agentic Table
1378
+
1379
+ The Agentic Table (Magic Table) API provides functionality for managing interactive tables with AI-powered cells, activity tracking, and metadata management.
1380
+
1381
+ #### `unique_sdk.AgenticTable.set_cell`
1382
+
1383
+ Set the content of a specific cell in the magic table. This method allows you to update cell text and optionally add log entries to track changes.
1384
+
1385
+ ```python
1386
+ cell = await unique_sdk.AgenticTable.set_cell(
1387
+ user_id=user_id,
1388
+ company_id=company_id,
1389
+ tableId="sheet_abc123",
1390
+ rowOrder=0,
1391
+ columnOrder=1,
1392
+ text="Updated cell content",
1393
+ logEntries=[ # optional
1394
+ {
1395
+ "text": "Cell updated by automation",
1396
+ "createdAt": "2024-01-01T00:00:00.000Z",
1397
+ "actorType": "SYSTEM", # One of: "USER", "SYSTEM", "ASSISTANT", "TOOL"
1398
+ "messageId": "msg_123", # optional
1399
+ "details": [ # optional
1400
+ {
1401
+ "text": "Processing completed",
1402
+ "messageId": "msg_456" # optional
1403
+ }
1404
+ ]
1405
+ }
1406
+ ]
1407
+ )
1408
+ ```
1409
+
1410
+ #### `unique_sdk.AgenticTable.get_cell`
1411
+
1412
+ Retrieve the content and metadata of a specific cell.
1413
+
1414
+ ```python
1415
+ cell = await unique_sdk.AgenticTable.get_cell(
1416
+ user_id=user_id,
1417
+ company_id=company_id,
1418
+ tableId="sheet_abc123",
1419
+ rowOrder=0,
1420
+ columnOrder=1,
1421
+ )
1422
+ ```
1423
+
1424
+ #### `unique_sdk.AgenticTable.set_multiple_cells`
1425
+
1426
+ Bulk update multiple cells in a single operation for better performance.
1427
+
1428
+ ```python
1429
+ result = await unique_sdk.AgenticTable.set_multiple_cells(
1430
+ user_id=user_id,
1431
+ company_id=company_id,
1432
+ tableId="sheet_abc123",
1433
+ cells=[
1434
+ {
1435
+ "rowOrder": 0,
1436
+ "columnOrder": 0,
1437
+ "text": "Cell A1"
1438
+ },
1439
+ {
1440
+ "rowOrder": 0,
1441
+ "columnOrder": 1,
1442
+ "text": "Cell B1"
1443
+ },
1444
+ {
1445
+ "rowOrder": 1,
1446
+ "columnOrder": 0,
1447
+ "text": "Cell A2"
1448
+ }
1449
+ ]
1450
+ )
1451
+ ```
1452
+
1453
+ #### `unique_sdk.AgenticTable.get_sheet_data`
1454
+
1455
+ Retrieve comprehensive data about a magic table sheet, including cells, log history, and metadata.
1456
+
1457
+ ```python
1458
+ sheet = await unique_sdk.AgenticTable.get_sheet_data(
1459
+ user_id=user_id,
1460
+ company_id=company_id,
1461
+ tableId="sheet_abc123",
1462
+ includeCells=True, # optional
1463
+ includeLogHistory=True, # optional
1464
+ includeRowCount=True, # optional
1465
+ includeCellMetaData=True, # optional
1466
+ startRow=0, # optional: specify row range
1467
+ endRow=10 # optional: specify row range
1468
+ )
1469
+ ```
1470
+
1471
+ #### `unique_sdk.AgenticTable.get_sheet_state`
1472
+
1473
+ Get the current state of a magic table sheet.
1474
+
1475
+ ```python
1476
+ state = await unique_sdk.AgenticTable.get_sheet_state(
1477
+ user_id=user_id,
1478
+ company_id=company_id,
1479
+ tableId="sheet_abc123"
1480
+ )
1481
+ # Returns: "PROCESSING", "IDLE", or "STOPPED_BY_USER"
1482
+ ```
1483
+
1484
+ #### `unique_sdk.AgenticTable.update_sheet_state`
1485
+
1486
+ Update the name or state of a magic table sheet.
1487
+
1488
+ ```python
1489
+ result = await unique_sdk.AgenticTable.update_sheet_state(
1490
+ user_id=user_id,
1491
+ company_id=company_id,
1492
+ tableId="sheet_abc123",
1493
+ name="Updated Sheet Name", # optional
1494
+ state="IDLE" # optional, one of: "PROCESSING", "IDLE", "STOPPED_BY_USER"
1495
+ )
1496
+ ```
1497
+
1498
+ #### `unique_sdk.AgenticTable.set_activity`
1499
+
1500
+ Set the status of an activity on the magic table sheet. This is useful for tracking long-running operations.
1501
+
1502
+ ```python
1503
+ result = await unique_sdk.AgenticTable.set_activity(
1504
+ user_id=user_id,
1505
+ company_id=company_id,
1506
+ tableId="sheet_abc123",
1507
+ activity="UpdateCell",
1508
+ # activity: one of "DeleteRow", "DeleteColumn", "UpdateCell", "AddQuestionText",
1509
+ # "AddMetaData", "GenerateArtifact", "SheetCompleted", "LibrarySheetRowVerified"
1510
+ status="IN_PROGRESS",
1511
+ # status: one of "IN_PROGRESS", "COMPLETED", "FAILED"
1512
+ text="Updating cells with AI-generated content"
1513
+ )
1514
+ ```
1515
+
1516
+ #### `unique_sdk.AgenticTable.set_artifact`
1517
+
1518
+ Attach an artifact (such as a generated document) to the magic table sheet.
1519
+
1520
+ ```python
1521
+ result = await unique_sdk.AgenticTable.set_artifact(
1522
+ user_id=user_id,
1523
+ company_id=company_id,
1524
+ tableId="sheet_abc123",
1525
+ name="Generated Report",
1526
+ contentId="cont_xyz789",
1527
+ mimeType="application/pdf",
1528
+ artifactType="FULL_REPORT" # One of: "QUESTIONS", "FULL_REPORT"
1529
+ )
1530
+ ```
1531
+
1532
+ #### `unique_sdk.AgenticTable.set_column_metadata`
1533
+
1534
+ Configure metadata for a specific column, including width, filters, and cell renderers.
1535
+
1536
+ ```python
1537
+ result = await unique_sdk.AgenticTable.set_column_metadata(
1538
+ user_id=user_id,
1539
+ company_id=company_id,
1540
+ tableId="sheet_abc123",
1541
+ columnOrder=2,
1542
+ columnWidth=200, # optional
1543
+ filter="ValueMatchFilter", # optional
1544
+ # filter: one of "ValueMatchFilter", "PartialMatchFilter", "ReferenceFilter",
1545
+ # "HallucinationFilter", "ReviewStatusFilter", "AssigneeFilter"
1546
+ cellRenderer="CheckboxLockCellRenderer", # optional
1547
+ # cellRenderer: one of "CheckboxLockCellRenderer", "CollaboratorDropdown",
1548
+ # "ReviewStatusDropdown", "CustomCellRenderer", "SelectableCellRenderer"
1549
+ editable=True # optional
1550
+ )
1551
+ ```
1552
+
1553
+ #### `unique_sdk.AgenticTable.set_cell_metadata`
1554
+
1555
+ Set metadata for a specific cell, including selection status and agreement status.
1556
+
1557
+ ```python
1558
+ result = await unique_sdk.AgenticTable.set_cell_metadata(
1559
+ user_id=user_id,
1560
+ company_id=company_id,
1561
+ tableId="sheet_abc123",
1562
+ rowOrder=0,
1563
+ columnOrder=1,
1564
+ selected=True, # optional
1565
+ selectionMethod="MANUAL", # optional, one of: "DEFAULT", "MANUAL"
1566
+ agreementStatus="MATCH" # optional, one of: "MATCH", "NO_MATCH"
1567
+ )
1568
+ ```
1569
+
1570
+ #### `unique_sdk.AgenticTable.bulk_update_status`
1571
+
1572
+ Update the verification status of multiple rows at once.
1573
+
1574
+ ```python
1575
+ result = await unique_sdk.AgenticTable.bulk_update_status(
1576
+ user_id=user_id,
1577
+ company_id=company_id,
1578
+ tableId="sheet_abc123",
1579
+ rowOrders=[0, 1, 2, 3, 4],
1580
+ status="VERIFIED"
1581
+ # status: one of "NEED_REVIEW", "READY_FOR_VERIFICATION", "VERIFIED"
1582
+ )
1583
+ ```
1584
+
1375
1585
  ## UniqueQL
1376
1586
 
1377
1587
  [UniqueQL](https://unique-ch.atlassian.net/wiki/x/coAXHQ) is an advanced query language designed to enhance search capabilities within various search modes such as Vector, Full-Text Search (FTS), and Combined. This query language enables users to perform detailed searches by filtering through metadata attributes like filenames, URLs, dates, and more. UniqueQL is versatile and can be translated into different query formats for various database systems, including PostgreSQL and Qdrant.
@@ -1769,6 +1979,24 @@ All notable changes to this project will be documented in this file.
1769
1979
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
1770
1980
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
1771
1981
 
1982
+ ## [0.10.38] - 2025-11-06
1983
+ - Add description property to Reference and Content.
1984
+
1985
+ ## [0.10.37] - 2025-11-04
1986
+ - Introduce local integration tests for Content API Resource
1987
+
1988
+ ## [0.10.36] - 2025-11-04
1989
+ - Introduce local integration tests for Folder API Resource
1990
+
1991
+ ## [0.10.35] - 2025-11-04
1992
+ - Inmprove folder get infos types.
1993
+
1994
+ ## [0.10.34] - 2025-10-29
1995
+ - Add documentation for agentic table.
1996
+
1997
+ ## [0.10.33] - 2025-10-27
1998
+ - Improve messagelog and message execution types.
1999
+
1772
2000
  ## [0.10.32] - 2025-10-14
1773
2001
  - Add function to stream to chat frontend.
1774
2002
 
@@ -24,6 +24,7 @@ The Unique Python SDK provides access to the public API of Unique AI. It also en
24
24
  - [Message Assessment](#message-assessment)
25
25
  - [Folder](#folder)
26
26
  - [Space](#space)
27
+ - [Agentic Table](#agentic-table)
27
28
  6. [UniqueQL](#uniqueql)
28
29
  - [Query Structure](#uniqueql-query-structure)
29
30
  - [Metadata Filtering](#metadata-filtering)
@@ -241,6 +242,7 @@ unique_sdk.Message.modify(
241
242
  - [Message Assessment](#message-assessment)
242
243
  - [Folder](#folder)
243
244
  - [Space](#space)
245
+ - [Agentic Table](#agentic-table)
244
246
 
245
247
  Most of the API services provide an asynchronous version of the method. The async methods are suffixed with `_async`.
246
248
 
@@ -457,6 +459,7 @@ def upload_file(
457
459
  path_to_file,
458
460
  displayed_filename,
459
461
  mimeType,
462
+ description=None,
460
463
  scope_or_unique_path,
461
464
  ingestion_config=None,
462
465
  metadata=None,
@@ -469,6 +472,7 @@ def upload_file(
469
472
  "key": displayed_filename,
470
473
  "title": displayed_filename,
471
474
  "mimeType": mimeType,
475
+ "description": description,
472
476
  "ingestionConfig": ingestionConfig,
473
477
  "metadata": metadata,
474
478
  },
@@ -495,6 +499,7 @@ def upload_file(
495
499
  "key": displayed_filename,
496
500
  "title": displayed_filename,
497
501
  "mimeType": mimeType,
502
+ "description": description,
498
503
  "byteSize": size,
499
504
  "ingestionConfig": ingestionConfig,
500
505
  "metadata": metadata,
@@ -872,10 +877,7 @@ msg_execution = unique_sdk.MessageExecution.create(
872
877
  user_id=user_id,
873
878
  company_id=company_id,
874
879
  messageId="msg_a0jgnt1jrqv143uzr750waxw",
875
- chatId="chat_nx21havszl1skchd7544oykh",
876
880
  type="DEEP_RESEARCH",
877
- secondsRemaining=None, # optional, number defining the seconds remaining
878
- percentageCompleted=None, # optional, number defining the percentage completed
879
881
  )
880
882
  ```
881
883
 
@@ -900,7 +902,7 @@ msg_execution = unique_sdk.MessageExecution.update(
900
902
  user_id=user_id,
901
903
  company_id=company_id,
902
904
  messageId="msg_a0jgnt1jrqv143uzr750waxw",
903
- status="COMPLETED", # one of: COMPLETED, FAILED
905
+ status="COMPLETED", # optional, one of: COMPLETED, FAILED - not specifying the status will have no effect over the status
904
906
  secondsRemaining=55, # optional, number defining the seconds remaining
905
907
  percentageCompleted=10, # optional, number defining the percentage completed
906
908
  )
@@ -1354,6 +1356,214 @@ unique_sdk.Space.delete_chat(
1354
1356
  )
1355
1357
  ```
1356
1358
 
1359
+ ### Agentic Table
1360
+
1361
+ The Agentic Table (Magic Table) API provides functionality for managing interactive tables with AI-powered cells, activity tracking, and metadata management.
1362
+
1363
+ #### `unique_sdk.AgenticTable.set_cell`
1364
+
1365
+ Set the content of a specific cell in the magic table. This method allows you to update cell text and optionally add log entries to track changes.
1366
+
1367
+ ```python
1368
+ cell = await unique_sdk.AgenticTable.set_cell(
1369
+ user_id=user_id,
1370
+ company_id=company_id,
1371
+ tableId="sheet_abc123",
1372
+ rowOrder=0,
1373
+ columnOrder=1,
1374
+ text="Updated cell content",
1375
+ logEntries=[ # optional
1376
+ {
1377
+ "text": "Cell updated by automation",
1378
+ "createdAt": "2024-01-01T00:00:00.000Z",
1379
+ "actorType": "SYSTEM", # One of: "USER", "SYSTEM", "ASSISTANT", "TOOL"
1380
+ "messageId": "msg_123", # optional
1381
+ "details": [ # optional
1382
+ {
1383
+ "text": "Processing completed",
1384
+ "messageId": "msg_456" # optional
1385
+ }
1386
+ ]
1387
+ }
1388
+ ]
1389
+ )
1390
+ ```
1391
+
1392
+ #### `unique_sdk.AgenticTable.get_cell`
1393
+
1394
+ Retrieve the content and metadata of a specific cell.
1395
+
1396
+ ```python
1397
+ cell = await unique_sdk.AgenticTable.get_cell(
1398
+ user_id=user_id,
1399
+ company_id=company_id,
1400
+ tableId="sheet_abc123",
1401
+ rowOrder=0,
1402
+ columnOrder=1,
1403
+ )
1404
+ ```
1405
+
1406
+ #### `unique_sdk.AgenticTable.set_multiple_cells`
1407
+
1408
+ Bulk update multiple cells in a single operation for better performance.
1409
+
1410
+ ```python
1411
+ result = await unique_sdk.AgenticTable.set_multiple_cells(
1412
+ user_id=user_id,
1413
+ company_id=company_id,
1414
+ tableId="sheet_abc123",
1415
+ cells=[
1416
+ {
1417
+ "rowOrder": 0,
1418
+ "columnOrder": 0,
1419
+ "text": "Cell A1"
1420
+ },
1421
+ {
1422
+ "rowOrder": 0,
1423
+ "columnOrder": 1,
1424
+ "text": "Cell B1"
1425
+ },
1426
+ {
1427
+ "rowOrder": 1,
1428
+ "columnOrder": 0,
1429
+ "text": "Cell A2"
1430
+ }
1431
+ ]
1432
+ )
1433
+ ```
1434
+
1435
+ #### `unique_sdk.AgenticTable.get_sheet_data`
1436
+
1437
+ Retrieve comprehensive data about a magic table sheet, including cells, log history, and metadata.
1438
+
1439
+ ```python
1440
+ sheet = await unique_sdk.AgenticTable.get_sheet_data(
1441
+ user_id=user_id,
1442
+ company_id=company_id,
1443
+ tableId="sheet_abc123",
1444
+ includeCells=True, # optional
1445
+ includeLogHistory=True, # optional
1446
+ includeRowCount=True, # optional
1447
+ includeCellMetaData=True, # optional
1448
+ startRow=0, # optional: specify row range
1449
+ endRow=10 # optional: specify row range
1450
+ )
1451
+ ```
1452
+
1453
+ #### `unique_sdk.AgenticTable.get_sheet_state`
1454
+
1455
+ Get the current state of a magic table sheet.
1456
+
1457
+ ```python
1458
+ state = await unique_sdk.AgenticTable.get_sheet_state(
1459
+ user_id=user_id,
1460
+ company_id=company_id,
1461
+ tableId="sheet_abc123"
1462
+ )
1463
+ # Returns: "PROCESSING", "IDLE", or "STOPPED_BY_USER"
1464
+ ```
1465
+
1466
+ #### `unique_sdk.AgenticTable.update_sheet_state`
1467
+
1468
+ Update the name or state of a magic table sheet.
1469
+
1470
+ ```python
1471
+ result = await unique_sdk.AgenticTable.update_sheet_state(
1472
+ user_id=user_id,
1473
+ company_id=company_id,
1474
+ tableId="sheet_abc123",
1475
+ name="Updated Sheet Name", # optional
1476
+ state="IDLE" # optional, one of: "PROCESSING", "IDLE", "STOPPED_BY_USER"
1477
+ )
1478
+ ```
1479
+
1480
+ #### `unique_sdk.AgenticTable.set_activity`
1481
+
1482
+ Set the status of an activity on the magic table sheet. This is useful for tracking long-running operations.
1483
+
1484
+ ```python
1485
+ result = await unique_sdk.AgenticTable.set_activity(
1486
+ user_id=user_id,
1487
+ company_id=company_id,
1488
+ tableId="sheet_abc123",
1489
+ activity="UpdateCell",
1490
+ # activity: one of "DeleteRow", "DeleteColumn", "UpdateCell", "AddQuestionText",
1491
+ # "AddMetaData", "GenerateArtifact", "SheetCompleted", "LibrarySheetRowVerified"
1492
+ status="IN_PROGRESS",
1493
+ # status: one of "IN_PROGRESS", "COMPLETED", "FAILED"
1494
+ text="Updating cells with AI-generated content"
1495
+ )
1496
+ ```
1497
+
1498
+ #### `unique_sdk.AgenticTable.set_artifact`
1499
+
1500
+ Attach an artifact (such as a generated document) to the magic table sheet.
1501
+
1502
+ ```python
1503
+ result = await unique_sdk.AgenticTable.set_artifact(
1504
+ user_id=user_id,
1505
+ company_id=company_id,
1506
+ tableId="sheet_abc123",
1507
+ name="Generated Report",
1508
+ contentId="cont_xyz789",
1509
+ mimeType="application/pdf",
1510
+ artifactType="FULL_REPORT" # One of: "QUESTIONS", "FULL_REPORT"
1511
+ )
1512
+ ```
1513
+
1514
+ #### `unique_sdk.AgenticTable.set_column_metadata`
1515
+
1516
+ Configure metadata for a specific column, including width, filters, and cell renderers.
1517
+
1518
+ ```python
1519
+ result = await unique_sdk.AgenticTable.set_column_metadata(
1520
+ user_id=user_id,
1521
+ company_id=company_id,
1522
+ tableId="sheet_abc123",
1523
+ columnOrder=2,
1524
+ columnWidth=200, # optional
1525
+ filter="ValueMatchFilter", # optional
1526
+ # filter: one of "ValueMatchFilter", "PartialMatchFilter", "ReferenceFilter",
1527
+ # "HallucinationFilter", "ReviewStatusFilter", "AssigneeFilter"
1528
+ cellRenderer="CheckboxLockCellRenderer", # optional
1529
+ # cellRenderer: one of "CheckboxLockCellRenderer", "CollaboratorDropdown",
1530
+ # "ReviewStatusDropdown", "CustomCellRenderer", "SelectableCellRenderer"
1531
+ editable=True # optional
1532
+ )
1533
+ ```
1534
+
1535
+ #### `unique_sdk.AgenticTable.set_cell_metadata`
1536
+
1537
+ Set metadata for a specific cell, including selection status and agreement status.
1538
+
1539
+ ```python
1540
+ result = await unique_sdk.AgenticTable.set_cell_metadata(
1541
+ user_id=user_id,
1542
+ company_id=company_id,
1543
+ tableId="sheet_abc123",
1544
+ rowOrder=0,
1545
+ columnOrder=1,
1546
+ selected=True, # optional
1547
+ selectionMethod="MANUAL", # optional, one of: "DEFAULT", "MANUAL"
1548
+ agreementStatus="MATCH" # optional, one of: "MATCH", "NO_MATCH"
1549
+ )
1550
+ ```
1551
+
1552
+ #### `unique_sdk.AgenticTable.bulk_update_status`
1553
+
1554
+ Update the verification status of multiple rows at once.
1555
+
1556
+ ```python
1557
+ result = await unique_sdk.AgenticTable.bulk_update_status(
1558
+ user_id=user_id,
1559
+ company_id=company_id,
1560
+ tableId="sheet_abc123",
1561
+ rowOrders=[0, 1, 2, 3, 4],
1562
+ status="VERIFIED"
1563
+ # status: one of "NEED_REVIEW", "READY_FOR_VERIFICATION", "VERIFIED"
1564
+ )
1565
+ ```
1566
+
1357
1567
  ## UniqueQL
1358
1568
 
1359
1569
  [UniqueQL](https://unique-ch.atlassian.net/wiki/x/coAXHQ) is an advanced query language designed to enhance search capabilities within various search modes such as Vector, Full-Text Search (FTS), and Combined. This query language enables users to perform detailed searches by filtering through metadata attributes like filenames, URLs, dates, and more. UniqueQL is versatile and can be translated into different query formats for various database systems, including PostgreSQL and Qdrant.
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "unique_sdk"
3
- version = "0.10.32"
3
+ version = "0.10.38"
4
4
  description = ""
5
5
  authors = [
6
6
  "Martin Fadler <martin.fadler@unique.ch>",
@@ -28,6 +28,8 @@ pyright = "^1.1.341"
28
28
  pytest-cov = "^4.1.0"
29
29
  pytest-asyncio = "^0.24.0"
30
30
  python-dotenv = "^1.1.0"
31
+ httpx = "^0.28.1"
32
+ ipykernel = "^7.1.0"
31
33
 
32
34
  [tool.poetry.extras]
33
35
  openai = ["openai"]
@@ -20,6 +20,16 @@ from unique_sdk._request_options import RequestOptions
20
20
  class Content(APIResource["Content"]):
21
21
  OBJECT_NAME: ClassVar[Literal["content.search"]] = "content.search"
22
22
 
23
+ id: str
24
+ key: str
25
+ url: Optional[str]
26
+ title: Optional[str]
27
+ updatedAt: str
28
+ chunks: Optional[List["Content.Chunk"]]
29
+ metadata: Optional[Dict[str, Any]]
30
+ writeUrl: Optional[str]
31
+ readUrl: Optional[str]
32
+
23
33
  class QueryMode(Enum):
24
34
  Default = "default"
25
35
  Insensitive = "insensitive"
@@ -127,6 +137,7 @@ class Content(APIResource["Content"]):
127
137
  key: str
128
138
  title: Optional[str]
129
139
  mimeType: str
140
+ description: NotRequired[str | None]
130
141
  ownerType: NotRequired[str | None]
131
142
  ownerId: NotRequired[str | None]
132
143
  byteSize: NotRequired[int | None]
@@ -168,6 +179,7 @@ class Content(APIResource["Content"]):
168
179
  title: str | None
169
180
  metadata: Dict[str, Any] | None
170
181
  mimeType: str
182
+ description: str | None
171
183
  byteSize: int
172
184
  ownerId: str
173
185
  createdAt: str
@@ -192,16 +204,6 @@ class Content(APIResource["Content"]):
192
204
  class DeleteResponse(TypedDict):
193
205
  id: str
194
206
 
195
- id: str
196
- key: str
197
- url: Optional[str]
198
- title: Optional[str]
199
- updatedAt: str
200
- chunks: List[Chunk]
201
- metadata: Optional[Dict[str, Any]]
202
- writeUrl: str
203
- readUrl: str
204
-
205
207
  class MagicTableSheetTableColumn(TypedDict):
206
208
  columnId: str
207
209
  columnName: str
@@ -83,6 +83,10 @@ class Folder(APIResource["Folder"]):
83
83
  parentId: str | None
84
84
  externalId: str | None
85
85
 
86
+ class FolderInfos(TypedDict):
87
+ folderInfos: List["Folder.FolderInfo"]
88
+ totalCount: int
89
+
86
90
  id: str
87
91
  name: str
88
92
  scopeAccess: List[ScopeAccess]
@@ -212,12 +216,12 @@ class Folder(APIResource["Folder"]):
212
216
  @classmethod
213
217
  def get_infos(
214
218
  cls, user_id: str, company_id: str, **params: Unpack["Folder.GetInfosParams"]
215
- ) -> "List[Folder.FolderInfo]":
219
+ ) -> "Folder.FolderInfos":
216
220
  """
217
221
  Get paginated folders based on parentId. If the parentId is not defined, the root folders will be returned.
218
222
  """
219
223
  return cast(
220
- "List[Folder.FolderInfo]",
224
+ "Folder.FolderInfos",
221
225
  cls._static_request(
222
226
  "get",
223
227
  "/folder/infos",
@@ -230,12 +234,12 @@ class Folder(APIResource["Folder"]):
230
234
  @classmethod
231
235
  async def get_infos_async(
232
236
  cls, user_id: str, company_id: str, **params: Unpack["Folder.GetInfosParams"]
233
- ) -> "List[Folder.FolderInfo]":
237
+ ) -> "Folder.FolderInfos":
234
238
  """
235
239
  Async get paginated folders based on parentId. If the parentId is not defined, the root folders will be returned.
236
240
  """
237
241
  return cast(
238
- "List[Folder.FolderInfo]",
242
+ "Folder.FolderInfos",
239
243
  await cls._static_request_async(
240
244
  "get",
241
245
  "/folder/infos",
@@ -29,8 +29,10 @@ class Message(APIResource["Message"]):
29
29
 
30
30
  class Reference(TypedDict):
31
31
  name: str
32
+ description: Optional[str]
32
33
  url: Optional[str]
33
34
  sequenceNumber: int
35
+ originalIndex: Optional[list[int]]
34
36
  sourceId: str
35
37
  source: str
36
38
 
@@ -8,16 +8,18 @@ class MessageExecution(APIResource["MessageExecution"]):
8
8
  OBJECT_NAME: ClassVar[Literal["message_execution"]] = "message_execution"
9
9
  RESOURCE_URL = "/message-execution"
10
10
 
11
+ TypeLiteral = Literal["DEEP_RESEARCH"]
12
+ StatusLiteral = Literal["PENDING", "RUNNING", "COMPLETED", "FAILED"]
13
+ # Only COMPLETED and FAILED statuses are allowed for update
14
+ UpdateStatusLiteral = Literal["COMPLETED", "FAILED"]
15
+
11
16
  class CreateMessageExecutionParams(RequestOptions):
12
17
  """
13
18
  Parameters for creating a message execution.
14
19
  """
15
20
 
16
21
  messageId: str
17
- chatId: str
18
- type: Literal["DEEP_RESEARCH"]
19
- secondsRemaining: NotRequired[int | None]
20
- percentageCompleted: NotRequired[int | None]
22
+ type: "MessageExecution.TypeLiteral"
21
23
 
22
24
  class GetMessageExecutionParams(RequestOptions):
23
25
  """
@@ -32,18 +34,19 @@ class MessageExecution(APIResource["MessageExecution"]):
32
34
  """
33
35
 
34
36
  messageId: str
35
- status: Literal["COMPLETED", "FAILED"]
37
+ status: NotRequired["MessageExecution.UpdateStatusLiteral | None"]
36
38
  secondsRemaining: NotRequired[int | None]
37
39
  percentageCompleted: NotRequired[int | None]
38
40
 
39
- messageExecutionId: str | None
40
- messageId: str | None
41
- status: Literal["PENDING", "RUNNING", "COMPLETED", "FAILED"]
42
- type: Literal["DEEP_RESEARCH"] = "DEEP_RESEARCH"
41
+ id: str
42
+ messageId: str
43
+ status: "MessageExecution.StatusLiteral"
44
+ type: "MessageExecution.TypeLiteral"
43
45
  secondsRemaining: int | None
44
46
  percentageCompleted: int | None
47
+ positionInQueue: int | None
45
48
  createdAt: str
46
- updatedAt: str | None
49
+ updatedAt: str
47
50
 
48
51
  @classmethod
49
52
  def create(
@@ -1,4 +1,4 @@
1
- from typing import ClassVar, Literal, NotRequired, TypedDict, Unpack, cast
1
+ from typing import ClassVar, Literal, NotRequired, Optional, TypedDict, Unpack, cast
2
2
 
3
3
  from unique_sdk._api_resource import APIResource
4
4
  from unique_sdk._request_options import RequestOptions
@@ -8,11 +8,14 @@ class MessageLog(APIResource["MessageLog"]):
8
8
  OBJECT_NAME: ClassVar[Literal["message_log"]] = "message_log"
9
9
  RESOURCE_URL = "/message-log"
10
10
 
11
+ StatusLiteral = Literal["RUNNING", "COMPLETED", "FAILED"]
12
+
11
13
  class Reference(TypedDict):
12
14
  name: str
13
- url: str | None
15
+ description: Optional[str]
16
+ url: Optional[str]
14
17
  sequenceNumber: int
15
- originalIndex: list[int] | None
18
+ originalIndex: Optional[list[int]]
16
19
  sourceId: str
17
20
  source: str
18
21
 
@@ -23,7 +26,7 @@ class MessageLog(APIResource["MessageLog"]):
23
26
 
24
27
  messageId: str
25
28
  text: str
26
- status: Literal["RUNNING", "COMPLETED", "FAILED"]
29
+ status: "MessageLog.StatusLiteral"
27
30
  order: int
28
31
  details: NotRequired[dict | None]
29
32
  uncitedReferences: NotRequired[dict | None]
@@ -35,21 +38,21 @@ class MessageLog(APIResource["MessageLog"]):
35
38
  """
36
39
 
37
40
  text: NotRequired[str | None]
38
- status: NotRequired[Literal["RUNNING", "COMPLETED", "FAILED"] | None]
41
+ status: NotRequired["MessageLog.StatusLiteral | None"]
39
42
  order: NotRequired[int | None]
40
43
  details: NotRequired[dict | None]
41
44
  uncitedReferences: NotRequired[dict | None]
42
45
  references: NotRequired[list["MessageLog.Reference"] | None]
43
46
 
44
- messageLogId: str | None
45
- messageId: str | None
46
- status: Literal["RUNNING", "COMPLETED", "FAILED"]
47
- text: str | None
47
+ id: str
48
+ messageId: str
49
+ status: "MessageLog.StatusLiteral"
50
+ text: str
48
51
  details: dict
49
52
  uncitedReferences: dict
50
53
  order: int
51
54
  createdAt: str
52
- updatedAt: str | None
55
+ updatedAt: str
53
56
 
54
57
  @classmethod
55
58
  def create(
@@ -35,9 +35,10 @@ class Space(APIResource["Space"]):
35
35
  """
36
36
 
37
37
  name: str
38
- url: str | None
38
+ description: Optional[str]
39
+ url: Optional[str]
39
40
  sequenceNumber: int
40
- originalIndex: List[int] | None
41
+ originalIndex: Optional[list[int]]
41
42
  sourceId: str
42
43
  source: str
43
44
 
@@ -69,7 +70,7 @@ class Space(APIResource["Space"]):
69
70
  chatId: str
70
71
  text: str | None
71
72
  originalText: str | None
72
- role: Literal["system", "user", "assistant"]
73
+ role: Literal["SYSTEM", "USER", "ASSISTANT"]
73
74
  debugInfo: Optional[Dict[str, Any]]
74
75
  completedAt: str | None
75
76
  createdAt: str | None
@@ -38,6 +38,7 @@ def upload_file(
38
38
  path_to_file,
39
39
  displayed_filename,
40
40
  mime_type,
41
+ description: Optional[str] = None,
41
42
  scope_or_unique_path=None,
42
43
  chat_id=None,
43
44
  ingestion_config: Optional[Content.IngestionConfig] = None,
@@ -55,6 +56,7 @@ def upload_file(
55
56
  "key": displayed_filename,
56
57
  "title": displayed_filename,
57
58
  "mimeType": mime_type,
59
+ "description": description,
58
60
  "ingestionConfig": ingestion_config,
59
61
  "metadata": metadata,
60
62
  },
@@ -83,6 +85,7 @@ def upload_file(
83
85
  "key": displayed_filename,
84
86
  "title": displayed_filename,
85
87
  "mimeType": mime_type,
88
+ "description": description,
86
89
  "byteSize": size,
87
90
  "ingestionConfig": ingestion_config,
88
91
  "metadata": metadata,
@@ -98,6 +101,7 @@ def upload_file(
98
101
  "key": displayed_filename,
99
102
  "title": displayed_filename,
100
103
  "mimeType": mime_type,
104
+ "description": description,
101
105
  "byteSize": size,
102
106
  "ingestionConfig": ingestion_config,
103
107
  "metadata": metadata,
File without changes