unique-sdk 2026.32.0.dev4__tar.gz → 2026.32.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 (91) hide show
  1. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/PKG-INFO +1 -1
  2. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/pyproject.toml +1 -1
  3. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_space.py +1 -0
  4. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/utils/chat_in_space.py +20 -0
  5. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/README.md +0 -0
  6. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/__init__.py +0 -0
  7. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/_api_requestor.py +0 -0
  8. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/_api_resource.py +0 -0
  9. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/_api_version.py +0 -0
  10. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/_error.py +0 -0
  11. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/_http_client.py +0 -0
  12. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/_list_object.py +0 -0
  13. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/_object_classes.py +0 -0
  14. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/_request_options.py +0 -0
  15. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/_unique_object.py +0 -0
  16. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/_unique_ql.py +0 -0
  17. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/_unique_response.py +0 -0
  18. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/_util.py +0 -0
  19. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/_version.py +0 -0
  20. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/_webhook.py +0 -0
  21. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/__init__.py +0 -0
  22. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_acronyms.py +0 -0
  23. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_agentic_table.py +0 -0
  24. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_analytics_order.py +0 -0
  25. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_benchmarking.py +0 -0
  26. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_briefing.py +0 -0
  27. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_chat_completion.py +0 -0
  28. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_content.py +0 -0
  29. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_dynamic_frontend.py +0 -0
  30. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_elicitation.py +0 -0
  31. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_embedding.py +0 -0
  32. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_event.py +0 -0
  33. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_folder.py +0 -0
  34. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_group.py +0 -0
  35. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_integrated.py +0 -0
  36. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_llm_models.py +0 -0
  37. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_mcp.py +0 -0
  38. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_message.py +0 -0
  39. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_message_assessment.py +0 -0
  40. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_message_execution.py +0 -0
  41. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_message_log.py +0 -0
  42. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_message_tool.py +0 -0
  43. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_module.py +0 -0
  44. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_scheduled_task.py +0 -0
  45. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_search.py +0 -0
  46. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_search_string.py +0 -0
  47. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_short_term_memory.py +0 -0
  48. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_user.py +0 -0
  49. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/api_resources/_web_search.py +0 -0
  50. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/__init__.py +0 -0
  51. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/__main__.py +0 -0
  52. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/cli.py +0 -0
  53. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/commands/__init__.py +0 -0
  54. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/commands/_citation_manifest.py +0 -0
  55. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/commands/agentic_table.py +0 -0
  56. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/commands/browser.py +0 -0
  57. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/commands/cite_file.py +0 -0
  58. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/commands/dynamic_frontend.py +0 -0
  59. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/commands/elicitation.py +0 -0
  60. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/commands/files.py +0 -0
  61. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/commands/folders.py +0 -0
  62. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/commands/mcp.py +0 -0
  63. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/commands/navigation.py +0 -0
  64. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/commands/read.py +0 -0
  65. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/commands/scheduled_tasks.py +0 -0
  66. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/commands/search.py +0 -0
  67. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/commands/subagent.py +0 -0
  68. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/commands/web_search.py +0 -0
  69. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/commands/web_search_config.py +0 -0
  70. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/config.py +0 -0
  71. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/formatting.py +0 -0
  72. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/identity.py +0 -0
  73. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/metadata_filter.py +0 -0
  74. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/shell.py +0 -0
  75. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/skills/unique-cli-agentic-table/SKILL.md +0 -0
  76. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/skills/unique-cli-dynamic-frontend/SKILL.md +0 -0
  77. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/skills/unique-cli-elicitation/SKILL.md +0 -0
  78. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/skills/unique-cli-file-management/SKILL.md +0 -0
  79. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/skills/unique-cli-mcp/SKILL.md +0 -0
  80. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/skills/unique-cli-scheduled-tasks/SKILL.md +0 -0
  81. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/skills/unique-cli-search/SKILL.md +0 -0
  82. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/skills/unique-cli-subagent/SKILL.md +0 -0
  83. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/skills/unique-cli-uploaded-search/SKILL.md +0 -0
  84. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/skills/unique-cli-web-search/SKILL.md +0 -0
  85. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/cli/state.py +0 -0
  86. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/utils/analytics_order_run.py +0 -0
  87. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/utils/benchmarking_run.py +0 -0
  88. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/utils/chat_history.py +0 -0
  89. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/utils/file_io.py +0 -0
  90. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.0.dev5}/unique_sdk/utils/sources.py +0 -0
  91. {unique_sdk-2026.32.0.dev4 → unique_sdk-2026.32.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.32.0.dev4
3
+ Version: 2026.32.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.32.0.dev4"
3
+ version = "2026.32.0.dev5"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -213,6 +213,7 @@ class Space(APIResource["Space"]):
213
213
  stoppedStreamingAt: str | None
214
214
  references: list["Space.Reference"] | None
215
215
  assessment: list["Space.Assessment"] | None
216
+ triggeringUserMessageId: NotRequired[str]
216
217
 
217
218
  class DeleteChatResponse(TypedDict):
218
219
  """
@@ -39,6 +39,7 @@ async def send_message_and_wait_for_completion(
39
39
  correlation: Space.Correlation | None = None,
40
40
  auto_approve_elicitation: bool | None = None,
41
41
  on_message_update: Callable[[Space.Message], Awaitable[None]] | None = None,
42
+ wait_for_invocations: bool = False,
42
43
  ) -> Space.Message:
43
44
  """
44
45
  Sends a prompt asynchronously and polls for completion. (until stoppedStreamingAt is not None)
@@ -68,6 +69,8 @@ async def send_message_and_wait_for_completion(
68
69
  the assistant run. Use for non-interactive automation where no user is present.
69
70
  on_message_update: Optional async callback called whenever the latest assistant
70
71
  message changes while waiting for completion.
72
+ wait_for_invocations: When True, briefly wait for the orchestrator's final
73
+ ``debugInfo.llm_invocations`` write after the visible response completes.
71
74
 
72
75
  Returns:
73
76
  The completed Space.Message.
@@ -94,7 +97,15 @@ async def send_message_and_wait_for_completion(
94
97
  message_id = response.get("id")
95
98
 
96
99
  max_attempts = int(max_wait // poll_interval)
100
+ # The final up-to-3 polls spent waiting for `llm_invocations_complete`
101
+ # happen after the stop condition is already met, so they must not eat
102
+ # into the same budget as the wait for the stop condition itself --
103
+ # otherwise a response that completes near the max_wait deadline would
104
+ # spuriously time out while only debugInfo bookkeeping is still pending.
105
+ if wait_for_invocations:
106
+ max_attempts += 3
97
107
  last_update_signature: tuple[str | None, str | None] | None = None
108
+ invocation_wait_attempts = 0
98
109
  for _ in range(max_attempts):
99
110
  answer = await Space.get_latest_message_async(user_id, company_id, chat_id)
100
111
  if (
@@ -121,6 +132,15 @@ async def send_message_and_wait_for_completion(
121
132
  )
122
133
  debug_info = user_message.get("debugInfo")
123
134
  answer["debugInfo"] = debug_info
135
+ answer["triggeringUserMessageId"] = message_id
136
+ if (
137
+ wait_for_invocations
138
+ and not (debug_info or {}).get("llm_invocations_complete", False)
139
+ and invocation_wait_attempts < 3
140
+ ):
141
+ invocation_wait_attempts += 1
142
+ await asyncio.sleep(poll_interval)
143
+ continue
124
144
  except Exception as e:
125
145
  print(f"Failed to load debug info from user message: {e}")
126
146