unique-sdk 2026.32.0.dev7__tar.gz → 2026.32.0.dev8__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.dev7 → unique_sdk-2026.32.0.dev8}/PKG-INFO +1 -1
  2. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/pyproject.toml +1 -1
  3. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/commands/web_search.py +39 -2
  4. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/README.md +0 -0
  5. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/__init__.py +0 -0
  6. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/_api_requestor.py +0 -0
  7. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/_api_resource.py +0 -0
  8. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/_api_version.py +0 -0
  9. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/_error.py +0 -0
  10. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/_http_client.py +0 -0
  11. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/_list_object.py +0 -0
  12. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/_object_classes.py +0 -0
  13. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/_request_options.py +0 -0
  14. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/_unique_object.py +0 -0
  15. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/_unique_ql.py +0 -0
  16. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/_unique_response.py +0 -0
  17. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/_util.py +0 -0
  18. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/_version.py +0 -0
  19. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/_webhook.py +0 -0
  20. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/__init__.py +0 -0
  21. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_acronyms.py +0 -0
  22. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_agentic_table.py +0 -0
  23. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_analytics_order.py +0 -0
  24. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_benchmarking.py +0 -0
  25. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_briefing.py +0 -0
  26. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_chat_completion.py +0 -0
  27. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_content.py +0 -0
  28. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_dynamic_frontend.py +0 -0
  29. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_elicitation.py +0 -0
  30. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_embedding.py +0 -0
  31. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_event.py +0 -0
  32. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_folder.py +0 -0
  33. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_group.py +0 -0
  34. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_integrated.py +0 -0
  35. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_llm_models.py +0 -0
  36. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_mcp.py +0 -0
  37. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_message.py +0 -0
  38. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_message_assessment.py +0 -0
  39. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_message_execution.py +0 -0
  40. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_message_log.py +0 -0
  41. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_message_tool.py +0 -0
  42. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_module.py +0 -0
  43. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_scheduled_task.py +0 -0
  44. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_search.py +0 -0
  45. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_search_string.py +0 -0
  46. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_short_term_memory.py +0 -0
  47. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_space.py +0 -0
  48. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_user.py +0 -0
  49. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/api_resources/_web_search.py +0 -0
  50. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/__init__.py +0 -0
  51. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/__main__.py +0 -0
  52. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/cli.py +0 -0
  53. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/commands/__init__.py +0 -0
  54. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/commands/_citation_manifest.py +0 -0
  55. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/commands/agentic_table.py +0 -0
  56. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/commands/browser.py +0 -0
  57. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/commands/cite_file.py +0 -0
  58. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/commands/dynamic_frontend.py +0 -0
  59. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/commands/elicitation.py +0 -0
  60. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/commands/files.py +0 -0
  61. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/commands/folders.py +0 -0
  62. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/commands/mcp.py +0 -0
  63. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/commands/navigation.py +0 -0
  64. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/commands/read.py +0 -0
  65. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/commands/scheduled_tasks.py +0 -0
  66. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/commands/search.py +0 -0
  67. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/commands/subagent.py +0 -0
  68. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/commands/web_search_config.py +0 -0
  69. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/config.py +0 -0
  70. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/formatting.py +0 -0
  71. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/identity.py +0 -0
  72. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/metadata_filter.py +0 -0
  73. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/shell.py +0 -0
  74. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/skills/unique-cli-agentic-table/SKILL.md +0 -0
  75. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/skills/unique-cli-dynamic-frontend/SKILL.md +0 -0
  76. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/skills/unique-cli-elicitation/SKILL.md +0 -0
  77. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/skills/unique-cli-file-management/SKILL.md +0 -0
  78. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/skills/unique-cli-mcp/SKILL.md +0 -0
  79. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/skills/unique-cli-scheduled-tasks/SKILL.md +0 -0
  80. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/skills/unique-cli-search/SKILL.md +0 -0
  81. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/skills/unique-cli-subagent/SKILL.md +0 -0
  82. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/skills/unique-cli-uploaded-search/SKILL.md +0 -0
  83. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/skills/unique-cli-web-search/SKILL.md +0 -0
  84. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/cli/state.py +0 -0
  85. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/utils/analytics_order_run.py +0 -0
  86. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/utils/benchmarking_run.py +0 -0
  87. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/utils/chat_history.py +0 -0
  88. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/utils/chat_in_space.py +0 -0
  89. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/utils/file_io.py +0 -0
  90. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/unique_sdk/utils/sources.py +0 -0
  91. {unique_sdk-2026.32.0.dev7 → unique_sdk-2026.32.0.dev8}/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.dev7
3
+ Version: 2026.32.0.dev8
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.dev7"
3
+ version = "2026.32.0.dev8"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -67,6 +67,29 @@ def _next_source_number(entries: list[dict[str, Any]]) -> int:
67
67
  return max(source_numbers, default=0) + 1
68
68
 
69
69
 
70
+ def _fetch_error_message(content: Any) -> str | None:
71
+ """Extract the failure message when ``content`` is a crawl-error payload.
72
+
73
+ The web-search backend reports per-URL fetch failures in-band: proxy
74
+ crawlers return ``"URL: <url>\\n\\nError: <message>"``, Tavily/Jina a
75
+ bare ``"Error: <message>"``. Returns the message for error payloads and
76
+ ``None`` for real page content.
77
+
78
+ Any leading ``URL: …`` line is skipped without matching it against the
79
+ result's own URL — redirects or normalization can make the reported URL
80
+ differ from the requested one.
81
+ """
82
+ if not isinstance(content, str):
83
+ return None
84
+ stripped = content.strip()
85
+ first_line, _, rest = stripped.partition("\n")
86
+ if first_line.startswith("URL:"):
87
+ stripped = rest.lstrip()
88
+ if stripped.startswith("Error:"):
89
+ return stripped[len("Error:") :].strip() or "unknown crawl error"
90
+ return None
91
+
92
+
70
93
  def _annotate_web_results_for_citations(
71
94
  payload: dict[str, Any],
72
95
  *,
@@ -78,6 +101,14 @@ def _annotate_web_results_for_citations(
78
101
  ``sourceNumber`` across consecutive ``search`` / ``crawl`` calls in
79
102
  the same turn, so the crawled-content row carries the same citation
80
103
  marker the search-snippet row already advertised.
104
+
105
+ Crawl-error payloads (``_fetch_error_message``) are kept out of the
106
+ manifest's ``content`` field and recorded under ``error`` instead: the
107
+ platform grounds the hallucination judge on manifest ``content``, so an
108
+ in-band fetch error stored as content turns a correctly cited,
109
+ snippet-verifiable source into a false "high hallucination" verdict
110
+ (UN-23356). The on-screen result still shows the error text so the
111
+ agent can react to the failed fetch.
81
112
  """
82
113
  refs_log_path = refs_log_path or (Path.cwd() / _WEB_REFS_LOG_RELATIVE_PATH)
83
114
  with _locked_turn_refs_manifest(
@@ -109,13 +140,19 @@ def _annotate_web_results_for_citations(
109
140
 
110
141
  result["sourceNumber"] = source_number
111
142
  result["citation"] = f"websource{source_number}"
143
+ content = result.get("content")
144
+ error = result.get("error")
145
+ fetch_error = _fetch_error_message(content)
146
+ if fetch_error is not None:
147
+ content = None
148
+ error = error or fetch_error
112
149
  manifest_entry = {
113
150
  "sourceNumber": source_number,
114
151
  "url": url,
115
152
  "title": result.get("title"),
116
153
  "snippet": result.get("snippet"),
117
- "content": result.get("content"),
118
- "error": result.get("error"),
154
+ "content": content,
155
+ "error": error,
119
156
  }
120
157
  _append_turn_refs_manifest_entry(refs_log_path, manifest_entry)
121
158
  annotated_results.append(result)