unique-sdk 2026.34.0.dev3__tar.gz → 2026.34.0.dev5__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 (89) hide show
  1. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/PKG-INFO +1 -1
  2. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/pyproject.toml +1 -1
  3. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/__init__.py +4 -0
  4. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/_api_resource.py +12 -2
  5. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_chat_completion.py +4 -0
  6. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/utils/file_io.py +12 -3
  7. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/README.md +0 -0
  8. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/_api_requestor.py +0 -0
  9. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/_api_version.py +0 -0
  10. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/_error.py +0 -0
  11. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/_http_client.py +0 -0
  12. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/_list_object.py +0 -0
  13. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/_object_classes.py +0 -0
  14. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/_request_options.py +0 -0
  15. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/_unique_object.py +0 -0
  16. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/_unique_ql.py +0 -0
  17. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/_unique_response.py +0 -0
  18. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/_util.py +0 -0
  19. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/_version.py +0 -0
  20. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/_webhook.py +0 -0
  21. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/__init__.py +0 -0
  22. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_acronyms.py +0 -0
  23. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_agentic_table.py +0 -0
  24. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_analytics_order.py +0 -0
  25. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_benchmarking.py +0 -0
  26. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_briefing.py +0 -0
  27. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_content.py +0 -0
  28. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_elicitation.py +0 -0
  29. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_embedding.py +0 -0
  30. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_event.py +0 -0
  31. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_folder.py +0 -0
  32. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_group.py +0 -0
  33. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_integrated.py +0 -0
  34. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_llm_models.py +0 -0
  35. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_mcp.py +0 -0
  36. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_message.py +0 -0
  37. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_message_assessment.py +0 -0
  38. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_message_execution.py +0 -0
  39. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_message_log.py +0 -0
  40. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_message_tool.py +0 -0
  41. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_module.py +0 -0
  42. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_scheduled_task.py +0 -0
  43. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_search.py +0 -0
  44. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_search_string.py +0 -0
  45. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_short_term_memory.py +0 -0
  46. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_space.py +0 -0
  47. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_user.py +0 -0
  48. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/api_resources/_web_search.py +0 -0
  49. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/__init__.py +0 -0
  50. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/__main__.py +0 -0
  51. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/cli.py +0 -0
  52. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/commands/__init__.py +0 -0
  53. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/commands/_citation_manifest.py +0 -0
  54. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/commands/agentic_table.py +0 -0
  55. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/commands/agentic_table_write.py +0 -0
  56. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/commands/browser.py +0 -0
  57. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/commands/cite_file.py +0 -0
  58. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/commands/elicitation.py +0 -0
  59. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/commands/files.py +0 -0
  60. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/commands/folders.py +0 -0
  61. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/commands/mcp.py +0 -0
  62. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/commands/navigation.py +0 -0
  63. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/commands/read.py +0 -0
  64. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/commands/scheduled_tasks.py +0 -0
  65. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/commands/search.py +0 -0
  66. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/commands/subagent.py +0 -0
  67. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/commands/web_search.py +0 -0
  68. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/commands/web_search_config.py +0 -0
  69. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/config.py +0 -0
  70. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/formatting.py +0 -0
  71. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/identity.py +0 -0
  72. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/metadata_filter.py +0 -0
  73. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/shell.py +0 -0
  74. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/skills/unique-cli-agentic-table/SKILL.md +0 -0
  75. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/skills/unique-cli-elicitation/SKILL.md +0 -0
  76. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/skills/unique-cli-file-management/SKILL.md +0 -0
  77. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/skills/unique-cli-mcp/SKILL.md +0 -0
  78. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/skills/unique-cli-scheduled-tasks/SKILL.md +0 -0
  79. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/skills/unique-cli-search/SKILL.md +0 -0
  80. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/skills/unique-cli-subagent/SKILL.md +0 -0
  81. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/skills/unique-cli-uploaded-search/SKILL.md +0 -0
  82. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/skills/unique-cli-web-search/SKILL.md +0 -0
  83. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/cli/state.py +0 -0
  84. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/utils/analytics_order_run.py +0 -0
  85. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/utils/benchmarking_run.py +0 -0
  86. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/utils/chat_history.py +0 -0
  87. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/utils/chat_in_space.py +0 -0
  88. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/utils/sources.py +0 -0
  89. {unique_sdk-2026.34.0.dev3 → unique_sdk-2026.34.0.dev5}/unique_sdk/utils/token.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: unique-sdk
3
- Version: 2026.34.0.dev3
3
+ Version: 2026.34.0.dev5
4
4
  Summary:
5
5
  Author: Martin Fadler, Konstantin Krauss, Andreas Hauri
6
6
  Author-email: Martin Fadler <martin.fadler@unique.ch>, Konstantin Krauss <konstantin@unique.ch>, Andreas Hauri <andreas@unique.ch>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "unique_sdk"
3
- version = "2026.34.0.dev3"
3
+ version = "2026.34.0.dev5"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -15,6 +15,10 @@ api_verify_mode: bool = True
15
15
  default_http_client: "HTTPClient | None" = None
16
16
  ingestion_upload_api_url_internal: str | None = None
17
17
 
18
+ # Timeout (seconds) for the direct-to-blob requests in utils/file_io.py,
19
+ # which bypass _http_client. Defaults to match _http_client's own default.
20
+ blob_transfer_timeout: float = 600
21
+
18
22
  # Set to either 'debug' or 'info', controls console logging
19
23
  log: Literal["debug", "info"] | None = None
20
24
 
@@ -194,12 +194,16 @@ class APIResource(UniqueObject, Generic[T]):
194
194
  user_id: str | None = None,
195
195
  company_id: str | None = None,
196
196
  params=None,
197
+ supplied_headers: Mapping[str, str] | None = None,
197
198
  ):
198
199
  params = None if params is None else params.copy()
199
200
 
200
201
  requestor = APIRequestor(user_id=user_id, company_id=company_id)
201
202
 
202
- response = requestor.request(method_, url_, params)
203
+ if supplied_headers is None:
204
+ response = requestor.request(method_, url_, params)
205
+ else:
206
+ response = requestor.request(method_, url_, params, supplied_headers)
203
207
  return convert_to_unique_object(response, user_id, company_id, params)
204
208
 
205
209
  # The `method_` and `url_` arguments are suffixed with an underscore to
@@ -213,10 +217,16 @@ class APIResource(UniqueObject, Generic[T]):
213
217
  user_id: str | None = None,
214
218
  company_id: str | None = None,
215
219
  params=None,
220
+ supplied_headers: Mapping[str, str] | None = None,
216
221
  ):
217
222
  params = None if params is None else params.copy()
218
223
 
219
224
  requestor = APIRequestor(user_id=user_id, company_id=company_id)
220
225
 
221
- response = await requestor.request_async(method_, url_, params)
226
+ if supplied_headers is None:
227
+ response = await requestor.request_async(method_, url_, params)
228
+ else:
229
+ response = await requestor.request_async(
230
+ method_, url_, params, supplied_headers
231
+ )
222
232
  return convert_to_unique_object(response, user_id, company_id, params)
@@ -59,6 +59,7 @@ class ChatCompletion(APIResource["ChatCompletion"]):
59
59
  user_id: str | None = None,
60
60
  **params: Unpack["ChatCompletion.CreateParams"],
61
61
  ) -> "ChatCompletion":
62
+ supplied_headers = params.pop("headers", None)
62
63
  return cast(
63
64
  "ChatCompletion",
64
65
  cls._static_request(
@@ -67,6 +68,7 @@ class ChatCompletion(APIResource["ChatCompletion"]):
67
68
  company_id=company_id,
68
69
  user_id=user_id,
69
70
  params=params,
71
+ supplied_headers=supplied_headers,
70
72
  ),
71
73
  )
72
74
 
@@ -77,6 +79,7 @@ class ChatCompletion(APIResource["ChatCompletion"]):
77
79
  user_id: str | None = None,
78
80
  **params: Unpack["ChatCompletion.CreateParams"],
79
81
  ) -> "ChatCompletion":
82
+ supplied_headers = params.pop("headers", None)
80
83
  return cast(
81
84
  "ChatCompletion",
82
85
  await cls._static_request_async(
@@ -85,5 +88,6 @@ class ChatCompletion(APIResource["ChatCompletion"]):
85
88
  company_id=company_id,
86
89
  user_id=user_id,
87
90
  params=params,
91
+ supplied_headers=supplied_headers,
88
92
  ),
89
93
  )
@@ -46,7 +46,7 @@ def download_file(url: str, filename: str):
46
46
  file_path = Path(random_dir) / filename
47
47
 
48
48
  # Download the file and save it to the random directory
49
- response = requests.get(url)
49
+ response = requests.get(url, timeout=unique_sdk.blob_transfer_timeout)
50
50
  if response.status_code == 200:
51
51
  with open(file_path, "wb") as file:
52
52
  file.write(response.content)
@@ -100,6 +100,7 @@ def _put_preview_pdf(write_url: str, preview_pdf_path: str) -> None:
100
100
  "X-Ms-Blob-Content-Type": _PREVIEW_PDF_MIME_TYPE,
101
101
  "X-Ms-Blob-Type": "BlockBlob",
102
102
  },
103
+ timeout=unique_sdk.blob_transfer_timeout,
103
104
  )
104
105
  if response.status_code >= 400:
105
106
  raise RuntimeError(
@@ -219,13 +220,19 @@ def upload_file(
219
220
  raise ValueError("createdContent.writeUrl is None")
220
221
  uploadUrl = _apply_ingestion_upload_url_override(uploadUrl)
221
222
  with open(path_to_file, "rb") as file:
222
- requests.put(
223
+ response = requests.put(
223
224
  uploadUrl,
224
225
  data=file,
225
226
  headers={
226
227
  "X-Ms-Blob-Content-Type": mime_type,
227
228
  "X-Ms-Blob-Type": "BlockBlob",
228
229
  },
230
+ timeout=unique_sdk.blob_transfer_timeout,
231
+ )
232
+ if response.status_code >= 400:
233
+ raise RuntimeError(
234
+ f"Content upload failed with status {response.status_code}: "
235
+ f"{response.text[:500]}"
229
236
  )
230
237
 
231
238
  # Step 3 — finalize upsert: ``byteSize`` + ``fileUrl`` flip the row
@@ -362,7 +369,9 @@ def download_content(
362
369
  # Issue the request before resolving the destination. A non-200
363
370
  # response should never leave a half-created directory or empty
364
371
  # file behind for callers who supplied ``target_path``.
365
- response = requests.get(url, headers=headers)
372
+ response = requests.get(
373
+ url, headers=headers, timeout=unique_sdk.blob_transfer_timeout
374
+ )
366
375
  if response.status_code != 200:
367
376
  raise Exception(f"Error downloading file: Status code {response.status_code}")
368
377