unique_orchestrator 2026.42.0.dev0__tar.gz → 2026.42.0.dev2__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 (34) hide show
  1. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/PKG-INFO +3 -3
  2. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/pyproject.toml +3 -3
  3. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/_builders/history_manager.py +41 -7
  4. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/config.py +2 -0
  5. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_config_services_validators.py +6 -0
  6. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/README.md +0 -0
  7. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/__init__.py +0 -0
  8. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/_builders/__init__.py +0 -0
  9. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/_builders/inject_tool_reminders.py +0 -0
  10. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/_builders/loop_iteration_runner.py +0 -0
  11. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/_builders/open_file_setup.py +0 -0
  12. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/_builders/skill_setup.py +0 -0
  13. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/prompts/generic_reference_prompt.jinja2 +0 -0
  14. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/prompts/system_prompt.jinja2 +0 -0
  15. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/prompts/user_message_prompt.jinja2 +0 -0
  16. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/settings.py +0 -0
  17. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_agent_config_rjsf_ui_schema.py +0 -0
  18. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_build_loop_iteration_runner.py +0 -0
  19. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_qwen_max_loop_iterations.py +0 -0
  20. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_register_code_interpreter_postprocessors.py +0 -0
  21. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_unique_ai_async_modify.py +0 -0
  22. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_unique_ai_execution_timing.py +0 -0
  23. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_unique_ai_get_filtered_user_metadata.py +0 -0
  24. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_unique_ai_log_tool_calls.py +0 -0
  25. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_unique_ai_loop_debug_params.py +0 -0
  26. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_unique_ai_persist_tool_calls.py +0 -0
  27. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_unique_ai_plan_or_execute_include.py +0 -0
  28. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_unique_ai_reference_order.py +0 -0
  29. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_unique_ai_render_system_prompt_user_instructions.py +0 -0
  30. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_unique_ai_token_usage.py +0 -0
  31. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_utils_resolve_other_options.py +0 -0
  32. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/unique_ai.py +0 -0
  33. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/unique_ai_builder.py +0 -0
  34. {unique_orchestrator-2026.42.0.dev0 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: unique-orchestrator
3
- Version: 2026.42.0.dev0
3
+ Version: 2026.42.0.dev2
4
4
  Summary:
5
5
  Author: Andreas Hauri
6
6
  Author-email: Andreas Hauri <andreas.hauri@unique.ai>
@@ -9,12 +9,12 @@ Requires-Dist: pydantic>=2.8.2,<3
9
9
  Requires-Dist: pydantic-settings>=2.10.1,<3
10
10
  Requires-Dist: typing-extensions>=4.9.0,<5
11
11
  Requires-Dist: jinja2>=3.1.0,<4
12
- Requires-Dist: unique-toolkit>=2026.42.0.dev0,<2026.42.0rc0
12
+ Requires-Dist: unique-toolkit>=2026.42.0.dev12,<2026.42.0rc0
13
13
  Requires-Dist: unique-stock-ticker>=2026.42.0.dev0,<2026.42.0rc0
14
14
  Requires-Dist: unique-follow-up-questions>=2026.42.0.dev0,<2026.42.0rc0
15
15
  Requires-Dist: unique-internal-search>=2026.42.0.dev0,<2026.42.0rc0
16
16
  Requires-Dist: unique-deep-research>=2026.42.0.dev0,<2026.42.0rc0
17
- Requires-Dist: unique-web-search>=2026.42.0.dev0,<2026.42.0rc0
17
+ Requires-Dist: unique-web-search>=2026.42.0.dev1,<2026.42.0rc0
18
18
  Requires-Dist: unique-swot>=2026.42.0.dev0,<2026.42.0rc0
19
19
  Requires-Dist: unique-skill-tool>=2026.42.0.dev0,<2026.42.0rc0
20
20
  Requires-Dist: unique-user-memory>=2026.42.0.dev0,<2026.42.0rc0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "unique_orchestrator"
3
- version = "2026.42.0.dev0"
3
+ version = "2026.42.0.dev2"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  license = { text = "Proprietary" }
@@ -13,12 +13,12 @@ dependencies = [
13
13
  "pydantic-settings>=2.10.1,<3",
14
14
  "typing-extensions>=4.9.0,<5",
15
15
  "jinja2>=3.1.0,<4",
16
- "unique-toolkit>=2026.42.0.dev0,<2026.42.0rc0",
16
+ "unique-toolkit>=2026.42.0.dev12,<2026.42.0rc0",
17
17
  "unique-stock-ticker>=2026.42.0.dev0,<2026.42.0rc0",
18
18
  "unique-follow-up-questions>=2026.42.0.dev0,<2026.42.0rc0",
19
19
  "unique-internal-search>=2026.42.0.dev0,<2026.42.0rc0",
20
20
  "unique-deep-research>=2026.42.0.dev0,<2026.42.0rc0",
21
- "unique-web-search>=2026.42.0.dev0,<2026.42.0rc0",
21
+ "unique-web-search>=2026.42.0.dev1,<2026.42.0rc0",
22
22
  "unique-swot>=2026.42.0.dev0,<2026.42.0rc0",
23
23
  "unique-skill-tool>=2026.42.0.dev0,<2026.42.0rc0",
24
24
  "unique-user-memory>=2026.42.0.dev0,<2026.42.0rc0",
@@ -2,6 +2,7 @@ from functools import partial
2
2
  from logging import Logger
3
3
 
4
4
  from unique_internal_search.uploaded_search.service import UploadedSearchTool
5
+ from unique_toolkit._common.utils.files import is_image_content
5
6
  from unique_toolkit.agentic.history_manager import (
6
7
  history_manager as history_manager_module,
7
8
  )
@@ -36,17 +37,50 @@ def serialize_uploaded_file_for_history(
36
37
  uploaded_search_available: bool,
37
38
  code_interpreter_available: bool,
38
39
  ) -> str | None:
39
- """Serialize user-uploaded file metadata for model history."""
40
+ """Serialize user-uploaded file metadata for model history.
41
+
42
+ Every upload is listed, including images and files that were not (or not
43
+ yet, or unsuccessfully) ingested. "Not ingested" only means the file cannot
44
+ be searched with UploadedSearchTool; the raw file is still available to the
45
+ code execution container when that tool is active. Failed uploads are
46
+ neither attached nor copied into the code execution container.
47
+ """
40
48
  if load_code_execution_metadata(content) is not None:
41
49
  return None
42
50
 
43
- lines = [f"User uploaded file: {content.key} ({content.id})"]
44
- if (
45
- uploaded_search_available
46
- and content.is_ingested(default_if_unknown=True)
47
- and not content.is_expired()
48
- ):
51
+ is_image = is_image_content(content.key)
52
+ kind = "image" if is_image else "file"
53
+ lines = [f"User uploaded {kind}: {content.key} ({content.id})"]
54
+
55
+ if content.is_expired():
56
+ lines.append(
57
+ "- Expired due to company retention policy; content can no longer be accessed"
58
+ )
59
+ return "\n".join(lines)
60
+
61
+ not_searchable = (
62
+ "; not searchable using UploadedSearchTool" if uploaded_search_available else ""
63
+ )
64
+ if content.has_ingestion_failed():
65
+ lines.append(f"- Ingestion failed ({content.ingestion_state}){not_searchable}")
66
+ return "\n".join(lines)
67
+
68
+ if is_image:
69
+ lines.append("- Attached to this message as an image")
70
+ elif content.is_ingestion_in_progress():
71
+ not_yet_searchable = (
72
+ "; not yet searchable using UploadedSearchTool"
73
+ if uploaded_search_available
74
+ else ""
75
+ )
76
+ lines.append(f"- Ingestion still in progress{not_yet_searchable}")
77
+ elif not content.is_ingested(default_if_unknown=True):
78
+ lines.append(f"- Not ingested{not_searchable}")
79
+ elif uploaded_search_available:
49
80
  lines.append("- Searchable using UploadedSearchTool")
81
+
82
+ # The container path is only known after upload (it may carry a prefix),
83
+ # so it is not guessed here; the code execution tool prompt lists it.
50
84
  if code_interpreter_available:
51
85
  lines.append("- Available for processing in the code execution container")
52
86
  return "\n".join(lines)
@@ -530,6 +530,7 @@ GPT_FRONTIER_MODELS: frozenset[LanguageModelName] = frozenset(
530
530
  LanguageModelName.AZURE_GPT_6_ASTRA_2026_0903,
531
531
  LanguageModelName.AZURE_GPT_6_LUNA_2026_0922,
532
532
  LanguageModelName.AZURE_GPT_6_SOL_2026_0922,
533
+ LanguageModelName.AZURE_GPT_61_SOL_2026_0929,
533
534
  LanguageModelName.LITELLM_OPENAI_GPT_55,
534
535
  LanguageModelName.LITELLM_OPENAI_GPT_55_PRO,
535
536
  LanguageModelName.LITELLM_OPENAI_GPT_56_SOL,
@@ -538,6 +539,7 @@ GPT_FRONTIER_MODELS: frozenset[LanguageModelName] = frozenset(
538
539
  LanguageModelName.LITELLM_OPENAI_GPT_6_ASTRA,
539
540
  LanguageModelName.LITELLM_OPENAI_GPT_6_LUNA,
540
541
  LanguageModelName.LITELLM_OPENAI_GPT_6_SOL,
542
+ LanguageModelName.LITELLM_OPENAI_GPT_61_SOL,
541
543
  }
542
544
  )
543
545
 
@@ -313,6 +313,7 @@ class TestUniqueAIConfigGptFrontierModelsResponsesApiValidator:
313
313
  LanguageModelName.AZURE_GPT_6_ASTRA_2026_0903,
314
314
  LanguageModelName.AZURE_GPT_6_LUNA_2026_0922,
315
315
  LanguageModelName.AZURE_GPT_6_SOL_2026_0922,
316
+ LanguageModelName.AZURE_GPT_61_SOL_2026_0929,
316
317
  LanguageModelName.LITELLM_OPENAI_GPT_55,
317
318
  LanguageModelName.LITELLM_OPENAI_GPT_55_PRO,
318
319
  LanguageModelName.LITELLM_OPENAI_GPT_56_SOL,
@@ -321,6 +322,7 @@ class TestUniqueAIConfigGptFrontierModelsResponsesApiValidator:
321
322
  LanguageModelName.LITELLM_OPENAI_GPT_6_ASTRA,
322
323
  LanguageModelName.LITELLM_OPENAI_GPT_6_LUNA,
323
324
  LanguageModelName.LITELLM_OPENAI_GPT_6_SOL,
325
+ LanguageModelName.LITELLM_OPENAI_GPT_61_SOL,
324
326
  ],
325
327
  )
326
328
  def test_enables_responses_api_for_affected_models(
@@ -346,6 +348,7 @@ class TestUniqueAIConfigGptFrontierModelsResponsesApiValidator:
346
348
  LanguageModelName.AZURE_GPT_6_ASTRA_2026_0903,
347
349
  LanguageModelName.AZURE_GPT_6_LUNA_2026_0922,
348
350
  LanguageModelName.AZURE_GPT_6_SOL_2026_0922,
351
+ LanguageModelName.AZURE_GPT_61_SOL_2026_0929,
349
352
  LanguageModelName.LITELLM_OPENAI_GPT_55,
350
353
  LanguageModelName.LITELLM_OPENAI_GPT_55_PRO,
351
354
  LanguageModelName.LITELLM_OPENAI_GPT_56_SOL,
@@ -354,6 +357,7 @@ class TestUniqueAIConfigGptFrontierModelsResponsesApiValidator:
354
357
  LanguageModelName.LITELLM_OPENAI_GPT_6_ASTRA,
355
358
  LanguageModelName.LITELLM_OPENAI_GPT_6_LUNA,
356
359
  LanguageModelName.LITELLM_OPENAI_GPT_6_SOL,
360
+ LanguageModelName.LITELLM_OPENAI_GPT_61_SOL,
357
361
  ],
358
362
  )
359
363
  def test_enables_responses_api_for_affected_models_with_tools(
@@ -388,6 +392,7 @@ class TestUniqueAIConfigGptFrontierModelsResponsesApiValidator:
388
392
  LanguageModelName.AZURE_GPT_6_ASTRA_2026_0903,
389
393
  LanguageModelName.AZURE_GPT_6_LUNA_2026_0922,
390
394
  LanguageModelName.AZURE_GPT_6_SOL_2026_0922,
395
+ LanguageModelName.AZURE_GPT_61_SOL_2026_0929,
391
396
  LanguageModelName.LITELLM_OPENAI_GPT_55,
392
397
  LanguageModelName.LITELLM_OPENAI_GPT_55_PRO,
393
398
  LanguageModelName.LITELLM_OPENAI_GPT_56_SOL,
@@ -396,6 +401,7 @@ class TestUniqueAIConfigGptFrontierModelsResponsesApiValidator:
396
401
  LanguageModelName.LITELLM_OPENAI_GPT_6_ASTRA,
397
402
  LanguageModelName.LITELLM_OPENAI_GPT_6_LUNA,
398
403
  LanguageModelName.LITELLM_OPENAI_GPT_6_SOL,
404
+ LanguageModelName.LITELLM_OPENAI_GPT_61_SOL,
399
405
  ],
400
406
  )
401
407
  def test_keeps_responses_api_enabled_when_already_enabled(