unique_orchestrator 2026.20.0.dev4__tar.gz → 2026.20.0.dev6__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 (31) hide show
  1. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/PKG-INFO +9 -9
  2. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/pyproject.toml +9 -9
  3. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/config.py +19 -1
  4. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/tests/test_config_services_validators.py +93 -0
  5. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/README.md +0 -0
  6. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/__init__.py +0 -0
  7. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/_builders/__init__.py +0 -0
  8. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/_builders/inject_tool_reminders.py +0 -0
  9. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/_builders/loop_iteration_runner.py +0 -0
  10. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/_builders/open_file_setup.py +0 -0
  11. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/_builders/skill_setup.py +0 -0
  12. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/prompts/generic_reference_prompt.jinja2 +0 -0
  13. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/prompts/system_prompt.jinja2 +0 -0
  14. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/prompts/user_message_prompt.jinja2 +0 -0
  15. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/tests/test_build_loop_iteration_runner.py +0 -0
  16. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/tests/test_qwen_max_loop_iterations.py +0 -0
  17. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/tests/test_register_code_interpreter_postprocessors.py +0 -0
  18. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/tests/test_unique_ai_async_modify.py +0 -0
  19. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/tests/test_unique_ai_builder_selected_uploaded_files.py +0 -0
  20. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/tests/test_unique_ai_builder_uploaded_search.py +0 -0
  21. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/tests/test_unique_ai_execution_timing.py +0 -0
  22. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/tests/test_unique_ai_get_filtered_user_metadata.py +0 -0
  23. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/tests/test_unique_ai_log_tool_calls.py +0 -0
  24. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/tests/test_unique_ai_persist_tool_calls.py +0 -0
  25. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/tests/test_unique_ai_plan_or_execute_include.py +0 -0
  26. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/tests/test_unique_ai_reference_order.py +0 -0
  27. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/tests/test_unique_ai_render_system_prompt_user_instructions.py +0 -0
  28. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/tests/test_unique_ai_selected_uploaded_files.py +0 -0
  29. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/unique_ai.py +0 -0
  30. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/unique_orchestrator/unique_ai_builder.py +0 -0
  31. {unique_orchestrator-2026.20.0.dev4 → unique_orchestrator-2026.20.0.dev6}/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.dev4
3
+ Version: 2026.20.0.dev6
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.dev7
12
- Requires-Dist: unique-stock-ticker>=2026.20.0.dev4
13
- Requires-Dist: unique-follow-up-questions>=2026.20.0.dev4
14
- Requires-Dist: unique-internal-search>=2026.20.0.dev4
15
- Requires-Dist: unique-deep-research>=2026.20.0.dev4
16
- Requires-Dist: unique-web-search>=2026.20.0.dev5
17
- Requires-Dist: unique-swot>=2026.20.0.dev4
18
- Requires-Dist: unique-skill-tool>=2026.20.0.dev4
11
+ Requires-Dist: unique-toolkit>=2026.20.0.dev9
12
+ Requires-Dist: unique-stock-ticker>=2026.20.0.dev5
13
+ Requires-Dist: unique-follow-up-questions>=2026.20.0.dev5
14
+ Requires-Dist: unique-internal-search>=2026.20.0.dev5
15
+ Requires-Dist: unique-deep-research>=2026.20.0.dev5
16
+ Requires-Dist: unique-web-search>=2026.20.0.dev6
17
+ Requires-Dist: unique-swot>=2026.20.0.dev6
18
+ Requires-Dist: unique-skill-tool>=2026.20.0.dev5
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.dev4"
3
+ version = "2026.20.0.dev6"
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.dev7",
16
- "unique-stock-ticker>=2026.20.0.dev4",
17
- "unique-follow-up-questions>=2026.20.0.dev4",
18
- "unique-internal-search>=2026.20.0.dev4",
19
- "unique-deep-research>=2026.20.0.dev4",
20
- "unique-web-search>=2026.20.0.dev5",
21
- "unique-swot>=2026.20.0.dev4",
22
- "unique-skill-tool>=2026.20.0.dev4",
15
+ "unique-toolkit>=2026.20.0.dev9",
16
+ "unique-stock-ticker>=2026.20.0.dev5",
17
+ "unique-follow-up-questions>=2026.20.0.dev5",
18
+ "unique-internal-search>=2026.20.0.dev5",
19
+ "unique-deep-research>=2026.20.0.dev5",
20
+ "unique-web-search>=2026.20.0.dev6",
21
+ "unique-swot>=2026.20.0.dev6",
22
+ "unique-skill-tool>=2026.20.0.dev5",
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