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.
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/PKG-INFO +4 -4
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/pyproject.toml +4 -4
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_unique_ai_async_modify.py +5 -38
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_unique_ai_execution_timing.py +0 -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
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_unique_ai_reference_order.py +1 -9
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/unique_ai.py +0 -8
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/README.md +0 -0
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/__init__.py +0 -0
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/_builders/__init__.py +0 -0
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/_builders/history_manager.py +0 -0
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/_builders/inject_tool_reminders.py +0 -0
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/_builders/loop_iteration_runner.py +0 -0
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/_builders/open_file_setup.py +0 -0
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/_builders/skill_setup.py +0 -0
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/config.py +0 -0
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/prompts/generic_reference_prompt.jinja2 +0 -0
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/prompts/system_prompt.jinja2 +0 -0
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/prompts/user_message_prompt.jinja2 +0 -0
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/settings.py +0 -0
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_agent_config_rjsf_ui_schema.py +0 -0
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_build_loop_iteration_runner.py +0 -0
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_config_services_validators.py +0 -0
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_qwen_max_loop_iterations.py +0 -0
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_register_code_interpreter_postprocessors.py +0 -0
- {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
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_unique_ai_log_tool_calls.py +0 -0
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_unique_ai_persist_tool_calls.py +0 -0
- {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
- {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
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_unique_ai_token_usage.py +0 -0
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/tests/test_utils_resolve_other_options.py +0 -0
- {unique_orchestrator-2026.36.0.dev2 → unique_orchestrator-2026.36.0.dev3}/unique_orchestrator/unique_ai_builder.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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(
|
|
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
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|