unique_orchestrator 2026.36.0.dev2__tar.gz → 2026.36.0.dev3__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.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/PKG-INFO +4 -4
  2. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/pyproject.toml +4 -4
  3. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_unique_ai_async_modify.py +5 -38
  4. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_unique_ai_execution_timing.py +0 -5
  5. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_unique_ai_loop_debug_params.py +0 -4
  6. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_unique_ai_reference_order.py +1 -9
  7. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/unique_ai.py +0 -8
  8. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/README.md +0 -0
  9. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/__init__.py +0 -0
  10. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/_builders/__init__.py +0 -0
  11. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/_builders/history_manager.py +0 -0
  12. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/_builders/inject_tool_reminders.py +0 -0
  13. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/_builders/loop_iteration_runner.py +0 -0
  14. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/_builders/open_file_setup.py +0 -0
  15. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/_builders/skill_setup.py +0 -0
  16. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/config.py +0 -0
  17. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/prompts/generic_reference_prompt.jinja2 +0 -0
  18. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/prompts/system_prompt.jinja2 +0 -0
  19. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/prompts/user_message_prompt.jinja2 +0 -0
  20. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/settings.py +0 -0
  21. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_agent_config_rjsf_ui_schema.py +0 -0
  22. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_build_loop_iteration_runner.py +0 -0
  23. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_config_services_validators.py +0 -0
  24. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_qwen_max_loop_iterations.py +0 -0
  25. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_register_code_interpreter_postprocessors.py +0 -0
  26. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_unique_ai_get_filtered_user_metadata.py +0 -0
  27. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_unique_ai_log_tool_calls.py +0 -0
  28. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_unique_ai_persist_tool_calls.py +0 -0
  29. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_unique_ai_plan_or_execute_include.py +0 -0
  30. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_unique_ai_render_system_prompt_user_instructions.py +0 -0
  31. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_unique_ai_token_usage.py +0 -0
  32. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_utils_resolve_other_options.py +0 -0
  33. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/unique_ai_builder.py +0 -0
  34. {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: unique-orchestrator
3
- Version: 2026.36.0.dev2
3
+ Version: 2026.36.0.dev3
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.36.0.dev2,<2026.36.0rc0
12
+ Requires-Dist: unique-toolkit>=2026.36.0.dev3,<2026.36.0rc0
13
13
  Requires-Dist: unique-stock-ticker>=2026.36.0.dev0,<2026.36.0rc0
14
14
  Requires-Dist: unique-follow-up-questions>=2026.36.0.dev1,<2026.36.0rc0
15
- Requires-Dist: unique-internal-search>=2026.36.0.dev0,<2026.36.0rc0
15
+ Requires-Dist: unique-internal-search>=2026.36.0.dev1,<2026.36.0rc0
16
16
  Requires-Dist: unique-deep-research>=2026.36.0.dev0,<2026.36.0rc0
17
- Requires-Dist: unique-web-search>=2026.36.0.dev0,<2026.36.0rc0
17
+ Requires-Dist: unique-web-search>=2026.36.0.dev1,<2026.36.0rc0
18
18
  Requires-Dist: unique-swot>=2026.36.0.dev0,<2026.36.0rc0
19
19
  Requires-Dist: unique-skill-tool>=2026.36.0.dev0,<2026.36.0rc0
20
20
  Requires-Dist: unique-user-memory>=2026.36.0.dev0,<2026.36.0rc0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "unique_orchestrator"
3
- version = "2026.36.0.dev2"
3
+ version = "2026.36.0.dev3"
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.36.0.dev2,<2026.36.0rc0",
16
+ "unique-toolkit>=2026.36.0.dev3,<2026.36.0rc0",
17
17
  "unique-stock-ticker>=2026.36.0.dev0,<2026.36.0rc0",
18
18
  "unique-follow-up-questions>=2026.36.0.dev1,<2026.36.0rc0",
19
- "unique-internal-search>=2026.36.0.dev0,<2026.36.0rc0",
19
+ "unique-internal-search>=2026.36.0.dev1,<2026.36.0rc0",
20
20
  "unique-deep-research>=2026.36.0.dev0,<2026.36.0rc0",
21
- "unique-web-search>=2026.36.0.dev0,<2026.36.0rc0",
21
+ "unique-web-search>=2026.36.0.dev1,<2026.36.0rc0",
22
22
  "unique-swot>=2026.36.0.dev0,<2026.36.0rc0",
23
23
  "unique-skill-tool>=2026.36.0.dev0,<2026.36.0rc0",
24
24
  "unique-user-memory>=2026.36.0.dev0,<2026.36.0rc0",
@@ -10,15 +10,7 @@ from unique_toolkit.agentic.tools.openai_builtin.code_interpreter import (
10
10
  from unique_orchestrator.unique_ai import UniqueAI
11
11
 
12
12
 
13
- def _make_ua(monkeypatch, *, feature_flag_enabled: bool = False):
14
- mock_feature_flags = MagicMock()
15
- mock_feature_flags.enable_new_answers_ui_un_14411.is_enabled.return_value = (
16
- feature_flag_enabled
17
- )
18
- monkeypatch.setattr(
19
- "unique_orchestrator.unique_ai.feature_flags", mock_feature_flags
20
- )
21
-
13
+ def _make_ua():
22
14
  mock_cancellation = MagicMock()
23
15
  mock_cancellation.is_cancelled = False
24
16
  mock_cancellation.on_cancellation.subscribe = MagicMock(return_value=MagicMock())
@@ -101,32 +93,9 @@ def _make_ua(monkeypatch, *, feature_flag_enabled: bool = False):
101
93
 
102
94
  @pytest.mark.ai
103
95
  @pytest.mark.asyncio
104
- async def test_run_calls_modify_async_when_feature_flag_disabled(monkeypatch):
105
- """Line 198: modify_assistant_message_async is called when new answers UI is disabled."""
106
- ua = _make_ua(monkeypatch, feature_flag_enabled=False)
107
-
108
- empty_response = MagicMock()
109
- empty_response.message.original_text = None
110
- empty_response.message.text = ""
111
- empty_response.message.references = []
112
- empty_response.tool_calls = None
113
- empty_response.is_empty.return_value = True
114
- empty_response.usage = None
115
-
116
- ua._plan_or_execute = AsyncMock(return_value=empty_response)
117
-
118
- await ua.run()
119
-
120
- ua._chat_service.modify_assistant_message_async.assert_any_call(
121
- content="Starting agentic loop..."
122
- )
123
-
124
-
125
- @pytest.mark.ai
126
- @pytest.mark.asyncio
127
- async def test_process_plan_calls_modify_async_on_empty_response(monkeypatch):
96
+ async def test_process_plan_calls_modify_async_on_empty_response():
128
97
  """Line 361: modify_assistant_message_async is called with EMPTY_MESSAGE_WARNING."""
129
- ua = _make_ua(monkeypatch)
98
+ ua = _make_ua()
130
99
 
131
100
  empty_response = MagicMock()
132
101
  empty_response.is_empty.return_value = True
@@ -139,10 +108,8 @@ async def test_process_plan_calls_modify_async_on_empty_response(monkeypatch):
139
108
 
140
109
  @pytest.mark.ai
141
110
  @pytest.mark.asyncio
142
- async def test_handle_no_tool_calls_stores_returned_artifacts_for_analytics(
143
- monkeypatch,
144
- ):
145
- ua = _make_ua(monkeypatch)
111
+ async def test_handle_no_tool_calls_stores_returned_artifacts_for_analytics():
112
+ ua = _make_ua()
146
113
  artifacts = {"count": 1, "filetypes": ["csv"], "output_size": 0.25}
147
114
  ua._postprocessor_manager.run_postprocessors.return_value = {
148
115
  DisplayCodeInterpreterFilesPostProcessor.__name__: artifacts
@@ -620,11 +620,6 @@ class TestRunExecutionTimingIntegration:
620
620
  tool_took_control: bool = False,
621
621
  include_tool_calls: bool = False,
622
622
  ):
623
- mock_feature_flags = MagicMock()
624
- monkeypatch.setattr(
625
- "unique_orchestrator.unique_ai.feature_flags", mock_feature_flags
626
- )
627
-
628
623
  mock_cancellation = MagicMock()
629
624
  mock_cancellation.is_cancelled = False
630
625
  mock_cancellation.on_cancellation.subscribe = MagicMock(
@@ -242,10 +242,6 @@ class TestPlanOrExecuteLoopDebugParams:
242
242
 
243
243
  class TestRunLoopDebugParams:
244
244
  def _build_run_ua(self, monkeypatch):
245
- mock_feature_flags = MagicMock()
246
- monkeypatch.setattr(
247
- "unique_orchestrator.unique_ai.feature_flags", mock_feature_flags
248
- )
249
245
  monkeypatch.setattr(
250
246
  "unique_orchestrator.unique_ai.resolve_other_options",
251
247
  lambda *_args, **_kwargs: {"reasoning_effort": "high"},
@@ -4,18 +4,10 @@ import pytest
4
4
 
5
5
 
6
6
  @pytest.mark.asyncio
7
- async def test_history_updated_before_reference_extraction(monkeypatch):
7
+ async def test_history_updated_before_reference_extraction():
8
8
  # Lazy import to avoid heavy dependencies at module import time
9
9
  from unique_orchestrator.unique_ai import UniqueAI
10
10
 
11
- # Mock feature_flags to avoid calling the real implementation
12
- mock_feature_flags = MagicMock()
13
- mock_feature_flags.is_new_answers_ui_enabled = MagicMock(return_value=True)
14
- monkeypatch.setattr(
15
- "unique_orchestrator.unique_ai.feature_flags",
16
- mock_feature_flags,
17
- )
18
-
19
11
  # Create a minimal UniqueAI instance with mocked dependencies
20
12
  mock_logger = MagicMock()
21
13
 
@@ -13,7 +13,6 @@ from unique_toolkit.agentic.debug_info_manager.debug_info_manager import (
13
13
  )
14
14
  from unique_toolkit.agentic.evaluation.evaluation_manager import EvaluationManager
15
15
  from unique_toolkit.agentic.evaluation.schemas import EvaluationMetricName
16
- from unique_toolkit.agentic.feature_flags import feature_flags
17
16
  from unique_toolkit.agentic.history_manager.history_manager import HistoryManager
18
17
  from unique_toolkit.agentic.loop_runner import (
19
18
  LoopIterationRunner,
@@ -250,13 +249,6 @@ class UniqueAI:
250
249
  """
251
250
  self._logger.info("Start LoopAgent...")
252
251
 
253
- if not feature_flags.enable_new_answers_ui_un_14411.is_enabled(
254
- self._event.company_id
255
- ):
256
- await self._chat_service.modify_assistant_message_async(
257
- content="Starting agentic loop..." # TODO: this must be more informative
258
- )
259
-
260
252
  self._execution_times = []
261
253
  self._loop_debug_params = []
262
254
  # Reset per-run artifact analytics too: a later run that exits without