unique_orchestrator 2026.42.0.dev1__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.dev1 → unique_orchestrator-2026.42.0.dev2}/PKG-INFO +3 -3
  2. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/pyproject.toml +3 -3
  3. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/_builders/history_manager.py +41 -7
  4. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/README.md +0 -0
  5. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/__init__.py +0 -0
  6. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/_builders/__init__.py +0 -0
  7. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/_builders/inject_tool_reminders.py +0 -0
  8. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/_builders/loop_iteration_runner.py +0 -0
  9. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/_builders/open_file_setup.py +0 -0
  10. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/_builders/skill_setup.py +0 -0
  11. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/config.py +0 -0
  12. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/prompts/generic_reference_prompt.jinja2 +0 -0
  13. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/prompts/system_prompt.jinja2 +0 -0
  14. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/prompts/user_message_prompt.jinja2 +0 -0
  15. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/settings.py +0 -0
  16. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_agent_config_rjsf_ui_schema.py +0 -0
  17. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_build_loop_iteration_runner.py +0 -0
  18. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_config_services_validators.py +0 -0
  19. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_qwen_max_loop_iterations.py +0 -0
  20. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_register_code_interpreter_postprocessors.py +0 -0
  21. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_unique_ai_async_modify.py +0 -0
  22. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_unique_ai_execution_timing.py +0 -0
  23. {unique_orchestrator-2026.42.0.dev1 → 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.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_unique_ai_log_tool_calls.py +0 -0
  25. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_unique_ai_loop_debug_params.py +0 -0
  26. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_unique_ai_persist_tool_calls.py +0 -0
  27. {unique_orchestrator-2026.42.0.dev1 → 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.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_unique_ai_reference_order.py +0 -0
  29. {unique_orchestrator-2026.42.0.dev1 → 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.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_unique_ai_token_usage.py +0 -0
  31. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/tests/test_utils_resolve_other_options.py +0 -0
  32. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/unique_ai.py +0 -0
  33. {unique_orchestrator-2026.42.0.dev1 → unique_orchestrator-2026.42.0.dev2}/unique_orchestrator/unique_ai_builder.py +0 -0
  34. {unique_orchestrator-2026.42.0.dev1 → 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.dev1
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.dev1,<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.dev1"
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.dev1,<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)