unique_sdk 0.9.41__tar.gz → 0.10.0__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.

Potentially problematic release.


This version of unique_sdk might be problematic. Click here for more details.

Files changed (40) hide show
  1. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/CHANGELOG.md +6 -0
  2. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/PKG-INFO +19 -6
  3. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/README.md +12 -5
  4. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/pyproject.toml +1 -1
  5. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/__init__.py +1 -0
  6. unique_sdk-0.10.0/unique_sdk/api_resources/_mcp.py +118 -0
  7. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/LICENSE +0 -0
  8. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/_api_requestor.py +0 -0
  9. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/_api_resource.py +0 -0
  10. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/_api_version.py +0 -0
  11. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/_error.py +0 -0
  12. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/_http_client.py +0 -0
  13. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/_list_object.py +0 -0
  14. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/_object_classes.py +0 -0
  15. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/_request_options.py +0 -0
  16. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/_unique_object.py +0 -0
  17. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/_unique_ql.py +0 -0
  18. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/_unique_response.py +0 -0
  19. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/_util.py +0 -0
  20. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/_version.py +0 -0
  21. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/_webhook.py +0 -0
  22. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/api_resources/__init__.py +0 -0
  23. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/api_resources/_acronyms.py +0 -0
  24. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/api_resources/_chat_completion.py +0 -0
  25. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/api_resources/_content.py +0 -0
  26. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/api_resources/_embedding.py +0 -0
  27. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/api_resources/_event.py +0 -0
  28. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/api_resources/_folder.py +0 -0
  29. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/api_resources/_integrated.py +0 -0
  30. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/api_resources/_message.py +0 -0
  31. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/api_resources/_message_assessment.py +0 -0
  32. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/api_resources/_search.py +0 -0
  33. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/api_resources/_search_string.py +0 -0
  34. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/api_resources/_short_term_memory.py +0 -0
  35. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/api_resources/_space.py +0 -0
  36. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/utils/chat_history.py +0 -0
  37. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/utils/chat_in_space.py +0 -0
  38. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/utils/file_io.py +0 -0
  39. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/utils/sources.py +0 -0
  40. {unique_sdk-0.9.41 → unique_sdk-0.10.0}/unique_sdk/utils/token.py +0 -0
@@ -5,6 +5,12 @@ 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.0] - 2025-08-04
9
+ - Add MCP support
10
+
11
+ ## [0.9.42] - 2025-07-31
12
+ - Fix wrong chat in space example.
13
+
8
14
  ## [0.9.41] - 2025-07-31
9
15
  - Fix double-slash error in open ai proxy script.
10
16
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: unique_sdk
3
- Version: 0.9.41
3
+ Version: 0.10.0
4
4
  Summary:
5
5
  License: MIT
6
6
  Author: Martin Fadler
@@ -905,7 +905,7 @@ unique_sdk.Folder.add_access(
905
905
 
906
906
  #### `unique_sdk.Folder.remove_access`
907
907
 
908
- Allows you to delete access from a folder and apply to the subfolders or not: `
908
+ Allows you to delete access from a folder and apply to the subfolders or not:
909
909
 
910
910
  - `scopeAccesses`
911
911
  - `applyToSubScopes`
@@ -1227,8 +1227,8 @@ The following script enables you to chat within a space using an assistant. You
1227
1227
  The script sends a prompt asynchronously and continuously polls for completion, which is determined when the `stoppedStreamingAt` field of the message becomes non-null.
1228
1228
 
1229
1229
  **Optional parameters:**
1230
- - `tool_choices`: A list of tool names to be used for the message (e.g., `["WebSearch"]`). If not provided, no tools will be used.
1231
- - `scope_rules`: A dictionary specifying scope rules for the message, allowing you to restrict the context or data sources available to the assistant.
1230
+ - `tool_choices`: A list of tool names to be used for the message (e.g., `["WebSearch"]`). If not provided, no tools will be used. The tools supported right now are `WebSearch` and `InternalSearch`.
1231
+ - `scope_rules`: A filter to specify the scope rules for the message, allowing you to restrict the context or data sources available to the assistant. The filter is written in UniqueQL language. Find out more about the language in the UniqueQL section.
1232
1232
  - `chat_id`: The ID of the chat where the message should be sent. If omitted, a new chat will be created.
1233
1233
  - `poll_interval`: The number of seconds to wait between polling attempts (default: `1` second).
1234
1234
  - `max_wait`: The maximum number of seconds to wait for the message to complete (default: `60` seconds).
@@ -1236,12 +1236,12 @@ The script sends a prompt asynchronously and continuously polls for completion,
1236
1236
  The script ensures you can flexibly interact with spaces in new or ongoing chats, with fine-grained control over tools, context, and polling behavior.
1237
1237
 
1238
1238
  ```python
1239
- latest_message = unique_sdk.utils.send_message_and_wait_for_completion(
1239
+ latest_message = await unique_sdk.utils.chat_in_space.send_message_and_wait_for_completion(
1240
1240
  user_id=user_id,
1241
1241
  company_id=company_id,
1242
1242
  assistant_id=assistant_id,
1243
1243
  text="Tell me a short story.",
1244
- chat_id=chat_id, # Optional - if no chat id is specified, a new chat will be created
1244
+ chat_id=chat_id, # Optional - if no chat id is specified, a new chat will be created
1245
1245
  tool_choices=["WebSearch"],
1246
1246
  scope_rules={
1247
1247
  "or": [
@@ -1253,6 +1253,13 @@ latest_message = unique_sdk.utils.send_message_and_wait_for_completion(
1253
1253
  "value": [
1254
1254
  "cont_u888z7cazxxm4lugfdjq7pks"
1255
1255
  ]
1256
+ },
1257
+ {
1258
+ "operator": "contains",
1259
+ "path": [
1260
+ "folderIdPath"
1261
+ ],
1262
+ "value": "uniquepathid://scope_btfo28b3eeelwh5obwgea71bl/scope_fn56ta67knd6w4medgq3028fx"
1256
1263
  }
1257
1264
  ]
1258
1265
  },
@@ -1276,6 +1283,12 @@ All notable changes to this project will be documented in this file.
1276
1283
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
1277
1284
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
1278
1285
 
1286
+ ## [0.10.0] - 2025-08-04
1287
+ - Add MCP support
1288
+
1289
+ ## [0.9.42] - 2025-07-31
1290
+ - Fix wrong chat in space example.
1291
+
1279
1292
  ## [0.9.41] - 2025-07-31
1280
1293
  - Fix double-slash error in open ai proxy script.
1281
1294
 
@@ -889,7 +889,7 @@ unique_sdk.Folder.add_access(
889
889
 
890
890
  #### `unique_sdk.Folder.remove_access`
891
891
 
892
- Allows you to delete access from a folder and apply to the subfolders or not: `
892
+ Allows you to delete access from a folder and apply to the subfolders or not:
893
893
 
894
894
  - `scopeAccesses`
895
895
  - `applyToSubScopes`
@@ -1211,8 +1211,8 @@ The following script enables you to chat within a space using an assistant. You
1211
1211
  The script sends a prompt asynchronously and continuously polls for completion, which is determined when the `stoppedStreamingAt` field of the message becomes non-null.
1212
1212
 
1213
1213
  **Optional parameters:**
1214
- - `tool_choices`: A list of tool names to be used for the message (e.g., `["WebSearch"]`). If not provided, no tools will be used.
1215
- - `scope_rules`: A dictionary specifying scope rules for the message, allowing you to restrict the context or data sources available to the assistant.
1214
+ - `tool_choices`: A list of tool names to be used for the message (e.g., `["WebSearch"]`). If not provided, no tools will be used. The tools supported right now are `WebSearch` and `InternalSearch`.
1215
+ - `scope_rules`: A filter to specify the scope rules for the message, allowing you to restrict the context or data sources available to the assistant. The filter is written in UniqueQL language. Find out more about the language in the UniqueQL section.
1216
1216
  - `chat_id`: The ID of the chat where the message should be sent. If omitted, a new chat will be created.
1217
1217
  - `poll_interval`: The number of seconds to wait between polling attempts (default: `1` second).
1218
1218
  - `max_wait`: The maximum number of seconds to wait for the message to complete (default: `60` seconds).
@@ -1220,12 +1220,12 @@ The script sends a prompt asynchronously and continuously polls for completion,
1220
1220
  The script ensures you can flexibly interact with spaces in new or ongoing chats, with fine-grained control over tools, context, and polling behavior.
1221
1221
 
1222
1222
  ```python
1223
- latest_message = unique_sdk.utils.send_message_and_wait_for_completion(
1223
+ latest_message = await unique_sdk.utils.chat_in_space.send_message_and_wait_for_completion(
1224
1224
  user_id=user_id,
1225
1225
  company_id=company_id,
1226
1226
  assistant_id=assistant_id,
1227
1227
  text="Tell me a short story.",
1228
- chat_id=chat_id, # Optional - if no chat id is specified, a new chat will be created
1228
+ chat_id=chat_id, # Optional - if no chat id is specified, a new chat will be created
1229
1229
  tool_choices=["WebSearch"],
1230
1230
  scope_rules={
1231
1231
  "or": [
@@ -1237,6 +1237,13 @@ latest_message = unique_sdk.utils.send_message_and_wait_for_completion(
1237
1237
  "value": [
1238
1238
  "cont_u888z7cazxxm4lugfdjq7pks"
1239
1239
  ]
1240
+ },
1241
+ {
1242
+ "operator": "contains",
1243
+ "path": [
1244
+ "folderIdPath"
1245
+ ],
1246
+ "value": "uniquepathid://scope_btfo28b3eeelwh5obwgea71bl/scope_fn56ta67knd6w4medgq3028fx"
1240
1247
  }
1241
1248
  ]
1242
1249
  },
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "unique_sdk"
3
- version = "0.9.41"
3
+ version = "0.10.0"
4
4
  description = ""
5
5
  authors = [
6
6
  "Martin Fadler <martin.fadler@unique.ch>",
@@ -87,6 +87,7 @@ from unique_sdk.api_resources._message_assessment import (
87
87
  MessageAssessment as MessageAssessment,
88
88
  )
89
89
  from unique_sdk.api_resources._space import Space as Space
90
+ from unique_sdk.api_resources._mcp import MCP as MCP
90
91
 
91
92
  # Unique QL
92
93
  from unique_sdk._unique_ql import UQLOperator as UQLOperator
@@ -0,0 +1,118 @@
1
+ from typing import (
2
+ Any,
3
+ ClassVar,
4
+ Dict,
5
+ List,
6
+ Literal,
7
+ Optional,
8
+ TypedDict,
9
+ Union,
10
+ Unpack,
11
+ cast,
12
+ )
13
+
14
+ from typing_extensions import NotRequired
15
+
16
+ from unique_sdk._api_resource import APIResource
17
+ from unique_sdk._request_options import RequestOptions
18
+
19
+
20
+ class CallToolTextResourceDto(TypedDict):
21
+ """Text resource containing URI, optional MIME type, and text content."""
22
+ uri: str
23
+ mimeType: Optional[str]
24
+ text: str
25
+
26
+
27
+ class CallToolBlobResourceDto(TypedDict):
28
+ """Blob resource containing URI, optional MIME type, and base64-encoded content."""
29
+ uri: str
30
+ mimeType: Optional[str]
31
+ blob: str
32
+
33
+
34
+ class CallToolContentDto(TypedDict):
35
+ """Content returned by an MCP tool call."""
36
+ type: Literal["text", "image", "audio", "resource_link", "resource"]
37
+
38
+ # Optional fields for different content types
39
+ text: NotRequired[Optional[str]] # For type: "text"
40
+ data: NotRequired[Optional[str]] # Base64 data for type: "image" or "audio"
41
+ mimeType: NotRequired[Optional[str]] # For type: "image", "audio", or "resource_link"
42
+ uri: NotRequired[Optional[str]] # For type: "resource_link"
43
+ name: NotRequired[Optional[str]] # For type: "resource_link"
44
+ description: NotRequired[Optional[str]] # For type: "resource_link"
45
+ resource: NotRequired[Optional[Union[CallToolTextResourceDto, CallToolBlobResourceDto]]] # For type: "resource"
46
+
47
+
48
+ class MCP(APIResource["MCP"]):
49
+ OBJECT_NAME: ClassVar[Literal["mcp.call_tool"]] = "mcp.call_tool"
50
+
51
+ class CallToolParams(RequestOptions):
52
+ """Parameters for calling an MCP tool."""
53
+ name: str
54
+ arguments: Dict[str, Any]
55
+
56
+ # Response fields
57
+ content: List[CallToolContentDto]
58
+ isError: bool
59
+ mcpServerId: str
60
+ name: str
61
+
62
+ @classmethod
63
+ def call_tool(
64
+ cls,
65
+ user_id: str,
66
+ company_id: str,
67
+ **params: Unpack["MCP.CallToolParams"],
68
+ ) -> "MCP":
69
+ """
70
+ Call an MCP tool with the specified name and arguments.
71
+
72
+ Args:
73
+ user_id: The ID of the user making the request
74
+ company_id: The ID of the company
75
+ **params: Tool parameters including name and arguments
76
+
77
+ Returns:
78
+ MCP: The response from the MCP tool call
79
+ """
80
+ return cast(
81
+ "MCP",
82
+ cls._static_request(
83
+ "post",
84
+ "/mcp/call-tool",
85
+ user_id,
86
+ company_id,
87
+ params=params,
88
+ ),
89
+ )
90
+
91
+ @classmethod
92
+ async def call_tool_async(
93
+ cls,
94
+ user_id: str,
95
+ company_id: str,
96
+ **params: Unpack["MCP.CallToolParams"],
97
+ ) -> "MCP":
98
+ """
99
+ Asynchronously call an MCP tool with the specified name and arguments.
100
+
101
+ Args:
102
+ user_id: The ID of the user making the request
103
+ company_id: The ID of the company
104
+ **params: Tool parameters including name and arguments
105
+
106
+ Returns:
107
+ MCP: The response from the MCP tool call
108
+ """
109
+ return cast(
110
+ "MCP",
111
+ await cls._static_request_async(
112
+ "post",
113
+ "/mcp/call-tool",
114
+ user_id,
115
+ company_id,
116
+ params=params,
117
+ ),
118
+ )
File without changes