unique_orchestrator 2026.20.0.dev5__tar.gz → 2026.20.0.dev7__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.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/PKG-INFO +9 -9
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/pyproject.toml +9 -9
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/config.py +19 -1
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/tests/test_config_services_validators.py +93 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/README.md +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/__init__.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/_builders/__init__.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/_builders/inject_tool_reminders.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/_builders/loop_iteration_runner.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/_builders/open_file_setup.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/_builders/skill_setup.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/prompts/generic_reference_prompt.jinja2 +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/prompts/system_prompt.jinja2 +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/prompts/user_message_prompt.jinja2 +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/tests/test_build_loop_iteration_runner.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/tests/test_qwen_max_loop_iterations.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/tests/test_register_code_interpreter_postprocessors.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/tests/test_unique_ai_async_modify.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/tests/test_unique_ai_builder_selected_uploaded_files.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/tests/test_unique_ai_builder_uploaded_search.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/tests/test_unique_ai_execution_timing.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/tests/test_unique_ai_get_filtered_user_metadata.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/tests/test_unique_ai_log_tool_calls.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/tests/test_unique_ai_persist_tool_calls.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/tests/test_unique_ai_plan_or_execute_include.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/tests/test_unique_ai_reference_order.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/tests/test_unique_ai_render_system_prompt_user_instructions.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/tests/test_unique_ai_selected_uploaded_files.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/unique_ai.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/unique_ai_builder.py +0 -0
- {unique_orchestrator-2026.20.0.dev5 → unique_orchestrator-2026.20.0.dev7}/unique_orchestrator/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: unique-orchestrator
|
|
3
|
-
Version: 2026.20.0.
|
|
3
|
+
Version: 2026.20.0.dev7
|
|
4
4
|
Summary:
|
|
5
5
|
Author: Andreas Hauri
|
|
6
6
|
Author-email: Andreas Hauri <andreas.hauri@unique.ai>
|
|
@@ -8,14 +8,14 @@ License: Proprietary
|
|
|
8
8
|
Requires-Dist: pydantic>=2.8.2,<3
|
|
9
9
|
Requires-Dist: typing-extensions>=4.9.0,<5
|
|
10
10
|
Requires-Dist: jinja2>=3.1.0,<4
|
|
11
|
-
Requires-Dist: unique-toolkit>=2026.20.0.
|
|
12
|
-
Requires-Dist: unique-stock-ticker>=2026.20.0.
|
|
13
|
-
Requires-Dist: unique-follow-up-questions>=2026.20.0.
|
|
14
|
-
Requires-Dist: unique-internal-search>=2026.20.0.
|
|
15
|
-
Requires-Dist: unique-deep-research>=2026.20.0.
|
|
16
|
-
Requires-Dist: unique-web-search>=2026.20.0.
|
|
17
|
-
Requires-Dist: unique-swot>=2026.20.0.
|
|
18
|
-
Requires-Dist: unique-skill-tool>=2026.20.0.
|
|
11
|
+
Requires-Dist: unique-toolkit>=2026.20.0.dev11
|
|
12
|
+
Requires-Dist: unique-stock-ticker>=2026.20.0.dev6
|
|
13
|
+
Requires-Dist: unique-follow-up-questions>=2026.20.0.dev6
|
|
14
|
+
Requires-Dist: unique-internal-search>=2026.20.0.dev6
|
|
15
|
+
Requires-Dist: unique-deep-research>=2026.20.0.dev6
|
|
16
|
+
Requires-Dist: unique-web-search>=2026.20.0.dev7
|
|
17
|
+
Requires-Dist: unique-swot>=2026.20.0.dev7
|
|
18
|
+
Requires-Dist: unique-skill-tool>=2026.20.0.dev6
|
|
19
19
|
Requires-Dist: openai>=1.109.1,<3
|
|
20
20
|
Requires-Dist: python-frontmatter>=1.1.0,<2
|
|
21
21
|
Requires-Python: >=3.12, <4
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "unique_orchestrator"
|
|
3
|
-
version = "2026.20.0.
|
|
3
|
+
version = "2026.20.0.dev7"
|
|
4
4
|
description = ""
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = { text = "Proprietary" }
|
|
@@ -12,14 +12,14 @@ dependencies = [
|
|
|
12
12
|
"pydantic>=2.8.2,<3",
|
|
13
13
|
"typing-extensions>=4.9.0,<5",
|
|
14
14
|
"jinja2>=3.1.0,<4",
|
|
15
|
-
"unique-toolkit>=2026.20.0.
|
|
16
|
-
"unique-stock-ticker>=2026.20.0.
|
|
17
|
-
"unique-follow-up-questions>=2026.20.0.
|
|
18
|
-
"unique-internal-search>=2026.20.0.
|
|
19
|
-
"unique-deep-research>=2026.20.0.
|
|
20
|
-
"unique-web-search>=2026.20.0.
|
|
21
|
-
"unique-swot>=2026.20.0.
|
|
22
|
-
"unique-skill-tool>=2026.20.0.
|
|
15
|
+
"unique-toolkit>=2026.20.0.dev11",
|
|
16
|
+
"unique-stock-ticker>=2026.20.0.dev6",
|
|
17
|
+
"unique-follow-up-questions>=2026.20.0.dev6",
|
|
18
|
+
"unique-internal-search>=2026.20.0.dev6",
|
|
19
|
+
"unique-deep-research>=2026.20.0.dev6",
|
|
20
|
+
"unique-web-search>=2026.20.0.dev7",
|
|
21
|
+
"unique-swot>=2026.20.0.dev7",
|
|
22
|
+
"unique-skill-tool>=2026.20.0.dev6",
|
|
23
23
|
"openai>=1.109.1,<3",
|
|
24
24
|
"python-frontmatter>=1.1.0,<2",
|
|
25
25
|
]
|
|
@@ -46,7 +46,7 @@ from unique_toolkit.agentic.tools.tool_progress_reporter import (
|
|
|
46
46
|
ToolProgressReporterConfig,
|
|
47
47
|
)
|
|
48
48
|
from unique_toolkit.language_model.default_language_model import DEFAULT_GPT_4o
|
|
49
|
-
from unique_toolkit.language_model.infos import ModelCapabilities
|
|
49
|
+
from unique_toolkit.language_model.infos import LanguageModelName, ModelCapabilities
|
|
50
50
|
from unique_web_search.config import WebSearchConfig
|
|
51
51
|
from unique_web_search.service import WebSearchTool
|
|
52
52
|
|
|
@@ -416,6 +416,24 @@ class UniqueAIConfig(BaseToolConfig):
|
|
|
416
416
|
|
|
417
417
|
return self
|
|
418
418
|
|
|
419
|
+
@model_validator(mode="after")
|
|
420
|
+
def enable_responses_api_for_gpt_55_and_gpt_55_pro(self) -> "UniqueAIConfig":
|
|
421
|
+
"""Auto-enable the Responses API for GPT-5.5 (AZURE_GPT_55_2026_0424) and GPT-5.5-Pro (AZURE_GPT_55_PRO_2026_0424).
|
|
422
|
+
|
|
423
|
+
TEMP FIX: gpt-5.5-2026-04-24 and gpt-5.5-pro-2026-04-24 reject requests that combine `tools` with
|
|
424
|
+
`reasoning_effort` on /v1/chat/completions and demands /v1/responses.
|
|
425
|
+
Forcing the Responses API here avoids the OpenAI 400 error until the
|
|
426
|
+
runner can pick the right transport based on model capabilities.
|
|
427
|
+
Tracked in Jira: UN-20123.
|
|
428
|
+
"""
|
|
429
|
+
if (
|
|
430
|
+
self.space.language_model.name == LanguageModelName.AZURE_GPT_55_2026_0424
|
|
431
|
+
or self.space.language_model.name
|
|
432
|
+
== LanguageModelName.AZURE_GPT_55_PRO_2026_0424
|
|
433
|
+
):
|
|
434
|
+
self.agent.experimental.responses_api_config.use_responses_api = True
|
|
435
|
+
return self
|
|
436
|
+
|
|
419
437
|
@model_validator(mode="after")
|
|
420
438
|
def validate_open_file_tool_requires_responses_api(self) -> "UniqueAIConfig":
|
|
421
439
|
uses_responses_api = (
|
|
@@ -11,6 +11,7 @@ from unique_toolkit.agentic.tools.openai_builtin.code_interpreter.config import
|
|
|
11
11
|
from unique_toolkit.agentic.tools.tool import ToolBuildConfig
|
|
12
12
|
from unique_toolkit.language_model.infos import (
|
|
13
13
|
LanguageModelInfo,
|
|
14
|
+
LanguageModelName,
|
|
14
15
|
LanguageModelProvider,
|
|
15
16
|
ModelCapabilities,
|
|
16
17
|
)
|
|
@@ -242,3 +243,95 @@ class TestUniqueAIConfigOpenFileValidator:
|
|
|
242
243
|
)
|
|
243
244
|
|
|
244
245
|
assert config.agent.experimental.responses_api_config.use_responses_api is True
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
class TestUniqueAIConfigGpt55ResponsesApiValidator:
|
|
249
|
+
"""Test suite for UniqueAIConfig.enable_responses_api_for_gpt_55_and_gpt_55_pro validator.
|
|
250
|
+
|
|
251
|
+
GPT-5.5 (AZURE_GPT_55_2026_0424) and GPT-5.5-Pro (AZURE_GPT_55_PRO_2026_0424)
|
|
252
|
+
reject requests that combine `tools` with `reasoning_effort` on
|
|
253
|
+
/v1/chat/completions and demand /v1/responses. The validator forces the
|
|
254
|
+
Responses API on when either of these models is selected, regardless of
|
|
255
|
+
which tools are configured.
|
|
256
|
+
Tracked in Jira: UN-20123.
|
|
257
|
+
"""
|
|
258
|
+
|
|
259
|
+
@pytest.mark.parametrize(
|
|
260
|
+
"model_name",
|
|
261
|
+
[
|
|
262
|
+
LanguageModelName.AZURE_GPT_55_2026_0424,
|
|
263
|
+
LanguageModelName.AZURE_GPT_55_PRO_2026_0424,
|
|
264
|
+
],
|
|
265
|
+
)
|
|
266
|
+
def test_enables_responses_api_for_affected_models(
|
|
267
|
+
self, model_name: LanguageModelName
|
|
268
|
+
):
|
|
269
|
+
"""When the selected model is GPT-5.5 or GPT-5.5-Pro, the validator must
|
|
270
|
+
auto-enable use_responses_api so the runner routes to /v1/responses."""
|
|
271
|
+
model = LanguageModelInfo.from_name(model_name)
|
|
272
|
+
|
|
273
|
+
config = UniqueAIConfig(
|
|
274
|
+
space=UniqueAISpaceConfig(language_model=model, tools=[]),
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
assert config.agent.experimental.responses_api_config.use_responses_api is True
|
|
278
|
+
|
|
279
|
+
@pytest.mark.parametrize(
|
|
280
|
+
"model_name",
|
|
281
|
+
[
|
|
282
|
+
LanguageModelName.AZURE_GPT_55_2026_0424,
|
|
283
|
+
LanguageModelName.AZURE_GPT_55_PRO_2026_0424,
|
|
284
|
+
],
|
|
285
|
+
)
|
|
286
|
+
def test_enables_responses_api_for_affected_models_with_tools(
|
|
287
|
+
self, model_name: LanguageModelName
|
|
288
|
+
):
|
|
289
|
+
"""The auto-enable must apply even when tools other than Code Interpreter
|
|
290
|
+
are configured — the GPT-5.5(-Pro) transport requirement is independent
|
|
291
|
+
of the Code Interpreter validator above."""
|
|
292
|
+
model = LanguageModelInfo.from_name(model_name)
|
|
293
|
+
|
|
294
|
+
config = UniqueAIConfig(
|
|
295
|
+
space=UniqueAISpaceConfig(
|
|
296
|
+
language_model=model,
|
|
297
|
+
tools=[CODE_INTERPRETER_TOOL],
|
|
298
|
+
),
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
assert config.agent.experimental.responses_api_config.use_responses_api is True
|
|
302
|
+
|
|
303
|
+
def test_does_not_enable_responses_api_for_other_models(self):
|
|
304
|
+
"""When the selected model is neither GPT-5.5 nor GPT-5.5-Pro, the
|
|
305
|
+
validator must be a no-op even if the model supports the Responses API.
|
|
306
|
+
Otherwise the TEMP FIX could mask real configuration issues for
|
|
307
|
+
unaffected models."""
|
|
308
|
+
config = _make_config(tools=[], supports_responses_api=True)
|
|
309
|
+
|
|
310
|
+
assert config.agent.experimental.responses_api_config.use_responses_api is False
|
|
311
|
+
|
|
312
|
+
@pytest.mark.parametrize(
|
|
313
|
+
"model_name",
|
|
314
|
+
[
|
|
315
|
+
LanguageModelName.AZURE_GPT_55_2026_0424,
|
|
316
|
+
LanguageModelName.AZURE_GPT_55_PRO_2026_0424,
|
|
317
|
+
],
|
|
318
|
+
)
|
|
319
|
+
def test_keeps_responses_api_enabled_when_already_enabled(
|
|
320
|
+
self, model_name: LanguageModelName
|
|
321
|
+
):
|
|
322
|
+
"""When use_responses_api is already True for an affected model, the
|
|
323
|
+
validator must leave it True (i.e. it is idempotent for those models)."""
|
|
324
|
+
from unique_orchestrator.config import ExperimentalConfig, ResponsesApiConfig
|
|
325
|
+
|
|
326
|
+
model = LanguageModelInfo.from_name(model_name)
|
|
327
|
+
|
|
328
|
+
config = UniqueAIConfig(
|
|
329
|
+
space=UniqueAISpaceConfig(language_model=model, tools=[]),
|
|
330
|
+
agent={
|
|
331
|
+
"experimental": ExperimentalConfig(
|
|
332
|
+
responses_api_config=ResponsesApiConfig(use_responses_api=True),
|
|
333
|
+
)
|
|
334
|
+
},
|
|
335
|
+
)
|
|
336
|
+
|
|
337
|
+
assert config.agent.experimental.responses_api_config.use_responses_api is True
|
|
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
|