unique_orchestrator 2026.30.0.dev2__tar.gz → 2026.30.0.dev4__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.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/PKG-INFO +3 -3
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/pyproject.toml +3 -3
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/config.py +16 -9
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_config_services_validators.py +34 -19
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_unique_ai_loop_debug_params.py +8 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/unique_ai.py +3 -4
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/README.md +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/__init__.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/_builders/__init__.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/_builders/history_manager.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/_builders/inject_tool_reminders.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/_builders/loop_iteration_runner.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/_builders/open_file_setup.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/_builders/skill_setup.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/prompts/generic_reference_prompt.jinja2 +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/prompts/system_prompt.jinja2 +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/prompts/user_message_prompt.jinja2 +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/settings.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_agent_config_rjsf_ui_schema.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_build_loop_iteration_runner.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_qwen_max_loop_iterations.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_register_code_interpreter_postprocessors.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_unique_ai_async_modify.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_unique_ai_execution_timing.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_unique_ai_get_filtered_user_metadata.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_unique_ai_log_tool_calls.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_unique_ai_persist_tool_calls.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_unique_ai_plan_or_execute_include.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_unique_ai_reference_order.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_unique_ai_render_system_prompt_user_instructions.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_utils_resolve_other_options.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/unique_ai_builder.py +0 -0
- {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: unique-orchestrator
|
|
3
|
-
Version: 2026.30.0.
|
|
3
|
+
Version: 2026.30.0.dev4
|
|
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.30.0.
|
|
12
|
+
Requires-Dist: unique-toolkit>=2026.30.0.dev14,<2026.30.0rc0
|
|
13
13
|
Requires-Dist: unique-stock-ticker>=2026.30.0.dev0,<2026.30.0rc0
|
|
14
14
|
Requires-Dist: unique-follow-up-questions>=2026.30.0.dev0,<2026.30.0rc0
|
|
15
15
|
Requires-Dist: unique-internal-search>=2026.30.0.dev0,<2026.30.0rc0
|
|
16
16
|
Requires-Dist: unique-deep-research>=2026.30.0.dev0,<2026.30.0rc0
|
|
17
|
-
Requires-Dist: unique-web-search>=2026.30.0.
|
|
17
|
+
Requires-Dist: unique-web-search>=2026.30.0.dev3,<2026.30.0rc0
|
|
18
18
|
Requires-Dist: unique-swot>=2026.30.0.dev0,<2026.30.0rc0
|
|
19
19
|
Requires-Dist: unique-skill-tool>=2026.30.0.dev0,<2026.30.0rc0
|
|
20
20
|
Requires-Dist: unique-user-memory>=2026.30.0.dev0,<2026.30.0rc0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "unique_orchestrator"
|
|
3
|
-
version = "2026.30.0.
|
|
3
|
+
version = "2026.30.0.dev4"
|
|
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.30.0.
|
|
16
|
+
"unique-toolkit>=2026.30.0.dev14,<2026.30.0rc0",
|
|
17
17
|
"unique-stock-ticker>=2026.30.0.dev0,<2026.30.0rc0",
|
|
18
18
|
"unique-follow-up-questions>=2026.30.0.dev0,<2026.30.0rc0",
|
|
19
19
|
"unique-internal-search>=2026.30.0.dev0,<2026.30.0rc0",
|
|
20
20
|
"unique-deep-research>=2026.30.0.dev0,<2026.30.0rc0",
|
|
21
|
-
"unique-web-search>=2026.30.0.
|
|
21
|
+
"unique-web-search>=2026.30.0.dev3,<2026.30.0rc0",
|
|
22
22
|
"unique-swot>=2026.30.0.dev0,<2026.30.0rc0",
|
|
23
23
|
"unique-skill-tool>=2026.30.0.dev0,<2026.30.0rc0",
|
|
24
24
|
"unique-user-memory>=2026.30.0.dev0,<2026.30.0rc0",
|
|
@@ -546,20 +546,27 @@ class UniqueAIConfig(BaseToolConfig):
|
|
|
546
546
|
return self
|
|
547
547
|
|
|
548
548
|
@model_validator(mode="after")
|
|
549
|
-
def
|
|
550
|
-
"""Auto-enable the Responses API for GPT-5.5
|
|
549
|
+
def enable_responses_api_for_gpt_55_and_gpt_56_models(self) -> "UniqueAIConfig":
|
|
550
|
+
"""Auto-enable the Responses API for GPT-5.5 and GPT-5.6 models.
|
|
551
551
|
|
|
552
|
-
TEMP FIX:
|
|
553
|
-
`reasoning_effort` on /v1/chat/completions and
|
|
552
|
+
TEMP FIX: GPT-5.5 and GPT-5.6 reject requests that combine `tools` with
|
|
553
|
+
`reasoning_effort` on /v1/chat/completions and demand /v1/responses.
|
|
554
554
|
Forcing the Responses API here avoids the OpenAI 400 error until the
|
|
555
555
|
runner can pick the right transport based on model capabilities.
|
|
556
556
|
Tracked in Jira: UN-20123.
|
|
557
557
|
"""
|
|
558
|
-
if
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
558
|
+
if self.space.language_model.name in {
|
|
559
|
+
LanguageModelName.AZURE_GPT_55_2026_0424,
|
|
560
|
+
LanguageModelName.AZURE_GPT_55_PRO_2026_0424,
|
|
561
|
+
LanguageModelName.AZURE_GPT_56_SOL_2026_0709,
|
|
562
|
+
LanguageModelName.AZURE_GPT_56_TERRA_2026_0709,
|
|
563
|
+
LanguageModelName.AZURE_GPT_56_LUNA_2026_0709,
|
|
564
|
+
LanguageModelName.LITELLM_OPENAI_GPT_55,
|
|
565
|
+
LanguageModelName.LITELLM_OPENAI_GPT_55_PRO,
|
|
566
|
+
LanguageModelName.LITELLM_OPENAI_GPT_56_SOL,
|
|
567
|
+
LanguageModelName.LITELLM_OPENAI_GPT_56_TERRA,
|
|
568
|
+
LanguageModelName.LITELLM_OPENAI_GPT_56_LUNA,
|
|
569
|
+
}:
|
|
563
570
|
self.agent.experimental.responses_api_config.use_responses_api = True
|
|
564
571
|
return self
|
|
565
572
|
|
|
@@ -293,14 +293,12 @@ class TestUniqueAIConfigOpenFileValidator:
|
|
|
293
293
|
assert config.agent.experimental.responses_api_config.use_responses_api is True
|
|
294
294
|
|
|
295
295
|
|
|
296
|
-
class
|
|
297
|
-
"""
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
Responses API on when either of these models is selected, regardless of
|
|
303
|
-
which tools are configured.
|
|
296
|
+
class TestUniqueAIConfigGpt55AndGpt56ResponsesApiValidator:
|
|
297
|
+
"""Tests for the GPT-5.5 and GPT-5.6 Responses API validator.
|
|
298
|
+
|
|
299
|
+
These models reject requests that combine `tools` with `reasoning_effort`
|
|
300
|
+
on /v1/chat/completions and demand /v1/responses. The validator forces the
|
|
301
|
+
Responses API on regardless of which tools are configured.
|
|
304
302
|
Tracked in Jira: UN-20123.
|
|
305
303
|
"""
|
|
306
304
|
|
|
@@ -309,13 +307,20 @@ class TestUniqueAIConfigGpt55ResponsesApiValidator:
|
|
|
309
307
|
[
|
|
310
308
|
LanguageModelName.AZURE_GPT_55_2026_0424,
|
|
311
309
|
LanguageModelName.AZURE_GPT_55_PRO_2026_0424,
|
|
310
|
+
LanguageModelName.AZURE_GPT_56_SOL_2026_0709,
|
|
311
|
+
LanguageModelName.AZURE_GPT_56_TERRA_2026_0709,
|
|
312
|
+
LanguageModelName.AZURE_GPT_56_LUNA_2026_0709,
|
|
313
|
+
LanguageModelName.LITELLM_OPENAI_GPT_55,
|
|
314
|
+
LanguageModelName.LITELLM_OPENAI_GPT_55_PRO,
|
|
315
|
+
LanguageModelName.LITELLM_OPENAI_GPT_56_SOL,
|
|
316
|
+
LanguageModelName.LITELLM_OPENAI_GPT_56_TERRA,
|
|
317
|
+
LanguageModelName.LITELLM_OPENAI_GPT_56_LUNA,
|
|
312
318
|
],
|
|
313
319
|
)
|
|
314
320
|
def test_enables_responses_api_for_affected_models(
|
|
315
321
|
self, model_name: LanguageModelName
|
|
316
322
|
):
|
|
317
|
-
"""
|
|
318
|
-
auto-enable use_responses_api so the runner routes to /v1/responses."""
|
|
323
|
+
"""Affected models must route through /v1/responses."""
|
|
319
324
|
model = LanguageModelInfo.from_name(model_name)
|
|
320
325
|
|
|
321
326
|
config = UniqueAIConfig(
|
|
@@ -329,14 +334,20 @@ class TestUniqueAIConfigGpt55ResponsesApiValidator:
|
|
|
329
334
|
[
|
|
330
335
|
LanguageModelName.AZURE_GPT_55_2026_0424,
|
|
331
336
|
LanguageModelName.AZURE_GPT_55_PRO_2026_0424,
|
|
337
|
+
LanguageModelName.AZURE_GPT_56_SOL_2026_0709,
|
|
338
|
+
LanguageModelName.AZURE_GPT_56_TERRA_2026_0709,
|
|
339
|
+
LanguageModelName.AZURE_GPT_56_LUNA_2026_0709,
|
|
340
|
+
LanguageModelName.LITELLM_OPENAI_GPT_55,
|
|
341
|
+
LanguageModelName.LITELLM_OPENAI_GPT_55_PRO,
|
|
342
|
+
LanguageModelName.LITELLM_OPENAI_GPT_56_SOL,
|
|
343
|
+
LanguageModelName.LITELLM_OPENAI_GPT_56_TERRA,
|
|
344
|
+
LanguageModelName.LITELLM_OPENAI_GPT_56_LUNA,
|
|
332
345
|
],
|
|
333
346
|
)
|
|
334
347
|
def test_enables_responses_api_for_affected_models_with_tools(
|
|
335
348
|
self, model_name: LanguageModelName
|
|
336
349
|
):
|
|
337
|
-
"""The
|
|
338
|
-
are configured — the GPT-5.5(-Pro) transport requirement is independent
|
|
339
|
-
of the Code Interpreter validator above."""
|
|
350
|
+
"""The transport requirement is independent of configured tools."""
|
|
340
351
|
model = LanguageModelInfo.from_name(model_name)
|
|
341
352
|
|
|
342
353
|
config = UniqueAIConfig(
|
|
@@ -349,10 +360,7 @@ class TestUniqueAIConfigGpt55ResponsesApiValidator:
|
|
|
349
360
|
assert config.agent.experimental.responses_api_config.use_responses_api is True
|
|
350
361
|
|
|
351
362
|
def test_does_not_enable_responses_api_for_other_models(self):
|
|
352
|
-
"""
|
|
353
|
-
validator must be a no-op even if the model supports the Responses API.
|
|
354
|
-
Otherwise the TEMP FIX could mask real configuration issues for
|
|
355
|
-
unaffected models."""
|
|
363
|
+
"""The validator must not affect unrelated Responses-capable models."""
|
|
356
364
|
config = _make_config(tools=[], supports_responses_api=True)
|
|
357
365
|
|
|
358
366
|
assert config.agent.experimental.responses_api_config.use_responses_api is False
|
|
@@ -362,13 +370,20 @@ class TestUniqueAIConfigGpt55ResponsesApiValidator:
|
|
|
362
370
|
[
|
|
363
371
|
LanguageModelName.AZURE_GPT_55_2026_0424,
|
|
364
372
|
LanguageModelName.AZURE_GPT_55_PRO_2026_0424,
|
|
373
|
+
LanguageModelName.AZURE_GPT_56_SOL_2026_0709,
|
|
374
|
+
LanguageModelName.AZURE_GPT_56_TERRA_2026_0709,
|
|
375
|
+
LanguageModelName.AZURE_GPT_56_LUNA_2026_0709,
|
|
376
|
+
LanguageModelName.LITELLM_OPENAI_GPT_55,
|
|
377
|
+
LanguageModelName.LITELLM_OPENAI_GPT_55_PRO,
|
|
378
|
+
LanguageModelName.LITELLM_OPENAI_GPT_56_SOL,
|
|
379
|
+
LanguageModelName.LITELLM_OPENAI_GPT_56_TERRA,
|
|
380
|
+
LanguageModelName.LITELLM_OPENAI_GPT_56_LUNA,
|
|
365
381
|
],
|
|
366
382
|
)
|
|
367
383
|
def test_keeps_responses_api_enabled_when_already_enabled(
|
|
368
384
|
self, model_name: LanguageModelName
|
|
369
385
|
):
|
|
370
|
-
"""
|
|
371
|
-
validator must leave it True (i.e. it is idempotent for those models)."""
|
|
386
|
+
"""The validator must remain idempotent."""
|
|
372
387
|
from unique_orchestrator.config import ExperimentalConfig, ResponsesApiConfig
|
|
373
388
|
|
|
374
389
|
model = LanguageModelInfo.from_name(model_name)
|
|
@@ -353,6 +353,14 @@ class TestRunLoopDebugParams:
|
|
|
353
353
|
]
|
|
354
354
|
assert "loop_params" in keys_written
|
|
355
355
|
assert "skills" in keys_written
|
|
356
|
+
skills_call = next(
|
|
357
|
+
c
|
|
358
|
+
for c in ua._debug_info_manager.add.call_args_list
|
|
359
|
+
if c.args[0] == "skills"
|
|
360
|
+
)
|
|
361
|
+
ua._debug_info_manager.add_analytics.assert_called_once_with(
|
|
362
|
+
skills_call.args[1]
|
|
363
|
+
)
|
|
356
364
|
|
|
357
365
|
@pytest.mark.ai
|
|
358
366
|
@pytest.mark.asyncio
|
|
@@ -316,10 +316,9 @@ class UniqueAI:
|
|
|
316
316
|
},
|
|
317
317
|
)
|
|
318
318
|
self._debug_info_manager.add("loop_params", self._loop_debug_params)
|
|
319
|
-
self.
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
)
|
|
319
|
+
skills_debug_info = self._get_activated_skills_debug_info()
|
|
320
|
+
self._debug_info_manager.add("skills", skills_debug_info)
|
|
321
|
+
self._debug_info_manager.add_analytics(skills_debug_info)
|
|
323
322
|
|
|
324
323
|
tool_names = [
|
|
325
324
|
tool["name"] for tool in self._debug_info_manager.get()["tools"]
|
|
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
|