unique_orchestrator 2026.38.0.dev2__tar.gz → 2026.38.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.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/PKG-INFO +3 -3
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/pyproject.toml +3 -3
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/tests/test_register_code_interpreter_postprocessors.py +7 -28
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/unique_ai_builder.py +4 -4
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/README.md +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/__init__.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/_builders/__init__.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/_builders/history_manager.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/_builders/inject_tool_reminders.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/_builders/loop_iteration_runner.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/_builders/open_file_setup.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/_builders/skill_setup.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/config.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/prompts/generic_reference_prompt.jinja2 +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/prompts/system_prompt.jinja2 +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/prompts/user_message_prompt.jinja2 +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/settings.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/tests/test_agent_config_rjsf_ui_schema.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/tests/test_build_loop_iteration_runner.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/tests/test_config_services_validators.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/tests/test_qwen_max_loop_iterations.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/tests/test_unique_ai_async_modify.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/tests/test_unique_ai_execution_timing.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/tests/test_unique_ai_get_filtered_user_metadata.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/tests/test_unique_ai_log_tool_calls.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/tests/test_unique_ai_loop_debug_params.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/tests/test_unique_ai_persist_tool_calls.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/tests/test_unique_ai_plan_or_execute_include.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/tests/test_unique_ai_reference_order.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/tests/test_unique_ai_render_system_prompt_user_instructions.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/tests/test_unique_ai_token_usage.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/tests/test_utils_resolve_other_options.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.0.dev3}/unique_orchestrator/unique_ai.py +0 -0
- {unique_orchestrator-2026.38.0.dev2 → unique_orchestrator-2026.38.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.38.0.
|
|
3
|
+
Version: 2026.38.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.38.0.
|
|
12
|
+
Requires-Dist: unique-toolkit>=2026.38.0.dev13,<2026.38.0rc0
|
|
13
13
|
Requires-Dist: unique-stock-ticker>=2026.38.0.dev1,<2026.38.0rc0
|
|
14
14
|
Requires-Dist: unique-follow-up-questions>=2026.38.0.dev1,<2026.38.0rc0
|
|
15
15
|
Requires-Dist: unique-internal-search>=2026.38.0.dev1,<2026.38.0rc0
|
|
16
16
|
Requires-Dist: unique-deep-research>=2026.38.0.dev1,<2026.38.0rc0
|
|
17
|
-
Requires-Dist: unique-web-search>=2026.38.0.
|
|
17
|
+
Requires-Dist: unique-web-search>=2026.38.0.dev2,<2026.38.0rc0
|
|
18
18
|
Requires-Dist: unique-swot>=2026.38.0.dev1,<2026.38.0rc0
|
|
19
19
|
Requires-Dist: unique-skill-tool>=2026.38.0.dev1,<2026.38.0rc0
|
|
20
20
|
Requires-Dist: unique-user-memory>=2026.38.0.dev1,<2026.38.0rc0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "unique_orchestrator"
|
|
3
|
-
version = "2026.38.0.
|
|
3
|
+
version = "2026.38.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.38.0.
|
|
16
|
+
"unique-toolkit>=2026.38.0.dev13,<2026.38.0rc0",
|
|
17
17
|
"unique-stock-ticker>=2026.38.0.dev1,<2026.38.0rc0",
|
|
18
18
|
"unique-follow-up-questions>=2026.38.0.dev1,<2026.38.0rc0",
|
|
19
19
|
"unique-internal-search>=2026.38.0.dev1,<2026.38.0rc0",
|
|
20
20
|
"unique-deep-research>=2026.38.0.dev1,<2026.38.0rc0",
|
|
21
|
-
"unique-web-search>=2026.38.0.
|
|
21
|
+
"unique-web-search>=2026.38.0.dev2,<2026.38.0rc0",
|
|
22
22
|
"unique-swot>=2026.38.0.dev1,<2026.38.0rc0",
|
|
23
23
|
"unique-skill-tool>=2026.38.0.dev1,<2026.38.0rc0",
|
|
24
24
|
"unique-user-memory>=2026.38.0.dev1,<2026.38.0rc0",
|
|
@@ -194,7 +194,7 @@ class TestConfigPassthrough:
|
|
|
194
194
|
)
|
|
195
195
|
|
|
196
196
|
custom_code_display_config = ShowExecutedCodePostprocessorConfig(
|
|
197
|
-
|
|
197
|
+
remove_from_history=False
|
|
198
198
|
)
|
|
199
199
|
ci_config = CodeInterpreterExtendedConfig(
|
|
200
200
|
executed_code_display_config=custom_code_display_config
|
|
@@ -217,27 +217,6 @@ class TestConfigPassthrough:
|
|
|
217
217
|
)
|
|
218
218
|
assert postprocessor._config is custom_code_display_config
|
|
219
219
|
|
|
220
|
-
@pytest.mark.ai
|
|
221
|
-
def test_show_executed_code_postprocessor_receives_company_id(self):
|
|
222
|
-
"""ShowExecutedCodePostprocessor must receive company_id for fence FF checks (UN-17972)."""
|
|
223
|
-
mgr = _make_postprocessor_manager()
|
|
224
|
-
|
|
225
|
-
_register_code_interpreter_postprocessors(
|
|
226
|
-
tools=[_make_code_interpreter_tool()],
|
|
227
|
-
postprocessor_manager=mgr,
|
|
228
|
-
client=MagicMock(),
|
|
229
|
-
content_service=MagicMock(),
|
|
230
|
-
user_id="u1",
|
|
231
|
-
company_id="company-fence",
|
|
232
|
-
chat_id="ch1",
|
|
233
|
-
chat_service=MagicMock(),
|
|
234
|
-
)
|
|
235
|
-
|
|
236
|
-
postprocessor: ShowExecutedCodePostprocessor = (
|
|
237
|
-
mgr.add_postprocessor.call_args_list[0][0][0]
|
|
238
|
-
)
|
|
239
|
-
assert postprocessor._company_id == "company-fence"
|
|
240
|
-
|
|
241
220
|
@pytest.mark.ai
|
|
242
221
|
def test_display_files_postprocessor_receives_client_and_company_id(self):
|
|
243
222
|
"""DisplayCodeInterpreterFilesPostProcessor must receive the client and company_id."""
|
|
@@ -281,12 +260,12 @@ class TestFirstMatchWins:
|
|
|
281
260
|
|
|
282
261
|
first_config = CodeInterpreterExtendedConfig(
|
|
283
262
|
executed_code_display_config=ShowExecutedCodePostprocessorConfig(
|
|
284
|
-
|
|
263
|
+
remove_from_history=False
|
|
285
264
|
)
|
|
286
265
|
)
|
|
287
266
|
second_config = CodeInterpreterExtendedConfig(
|
|
288
267
|
executed_code_display_config=ShowExecutedCodePostprocessorConfig(
|
|
289
|
-
|
|
268
|
+
remove_from_history=True
|
|
290
269
|
)
|
|
291
270
|
)
|
|
292
271
|
mgr = _make_postprocessor_manager()
|
|
@@ -308,7 +287,7 @@ class TestFirstMatchWins:
|
|
|
308
287
|
postprocessor: ShowExecutedCodePostprocessor = (
|
|
309
288
|
mgr.add_postprocessor.call_args_list[0][0][0]
|
|
310
289
|
)
|
|
311
|
-
assert postprocessor._config
|
|
290
|
+
assert postprocessor._config is first_config.executed_code_display_config
|
|
312
291
|
|
|
313
292
|
@pytest.mark.ai
|
|
314
293
|
def test_skips_disabled_tool_and_uses_next_enabled_code_interpreter(self):
|
|
@@ -319,12 +298,12 @@ class TestFirstMatchWins:
|
|
|
319
298
|
|
|
320
299
|
disabled_config = CodeInterpreterExtendedConfig(
|
|
321
300
|
executed_code_display_config=ShowExecutedCodePostprocessorConfig(
|
|
322
|
-
|
|
301
|
+
remove_from_history=True
|
|
323
302
|
)
|
|
324
303
|
)
|
|
325
304
|
enabled_config = CodeInterpreterExtendedConfig(
|
|
326
305
|
executed_code_display_config=ShowExecutedCodePostprocessorConfig(
|
|
327
|
-
|
|
306
|
+
remove_from_history=False
|
|
328
307
|
)
|
|
329
308
|
)
|
|
330
309
|
mgr = _make_postprocessor_manager()
|
|
@@ -346,4 +325,4 @@ class TestFirstMatchWins:
|
|
|
346
325
|
postprocessor: ShowExecutedCodePostprocessor = (
|
|
347
326
|
mgr.add_postprocessor.call_args_list[0][0][0]
|
|
348
327
|
)
|
|
349
|
-
assert postprocessor._config
|
|
328
|
+
assert postprocessor._config is enabled_config.executed_code_display_config
|
|
@@ -489,9 +489,10 @@ def _register_code_interpreter_postprocessors(
|
|
|
489
489
|
) -> None:
|
|
490
490
|
"""Find the first enabled Code Interpreter tool and register its postprocessors.
|
|
491
491
|
|
|
492
|
-
When a CODE_INTERPRETER tool is present and enabled, both the
|
|
493
|
-
|
|
494
|
-
|
|
492
|
+
When a CODE_INTERPRETER tool is present and enabled, both the generated-files
|
|
493
|
+
postprocessor (which turns produced files into codeExecution fences) and the
|
|
494
|
+
legacy code-display postprocessor (which only strips old `<details>` blocks
|
|
495
|
+
from the history) are registered.
|
|
495
496
|
"""
|
|
496
497
|
code_interpreter_config = None
|
|
497
498
|
for tool in tools:
|
|
@@ -507,7 +508,6 @@ def _register_code_interpreter_postprocessors(
|
|
|
507
508
|
postprocessor_manager.add_postprocessor(
|
|
508
509
|
ShowExecutedCodePostprocessor(
|
|
509
510
|
config=code_interpreter_config.executed_code_display_config,
|
|
510
|
-
company_id=company_id,
|
|
511
511
|
)
|
|
512
512
|
)
|
|
513
513
|
postprocessor_manager.add_postprocessor(
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|