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.
Files changed (33) hide show
  1. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/PKG-INFO +3 -3
  2. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/pyproject.toml +3 -3
  3. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/config.py +16 -9
  4. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_config_services_validators.py +34 -19
  5. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_unique_ai_loop_debug_params.py +8 -0
  6. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/unique_ai.py +3 -4
  7. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/README.md +0 -0
  8. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/__init__.py +0 -0
  9. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/_builders/__init__.py +0 -0
  10. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/_builders/history_manager.py +0 -0
  11. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/_builders/inject_tool_reminders.py +0 -0
  12. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/_builders/loop_iteration_runner.py +0 -0
  13. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/_builders/open_file_setup.py +0 -0
  14. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/_builders/skill_setup.py +0 -0
  15. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/prompts/generic_reference_prompt.jinja2 +0 -0
  16. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/prompts/system_prompt.jinja2 +0 -0
  17. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/prompts/user_message_prompt.jinja2 +0 -0
  18. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/settings.py +0 -0
  19. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_agent_config_rjsf_ui_schema.py +0 -0
  20. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_build_loop_iteration_runner.py +0 -0
  21. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_qwen_max_loop_iterations.py +0 -0
  22. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_register_code_interpreter_postprocessors.py +0 -0
  23. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_unique_ai_async_modify.py +0 -0
  24. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_unique_ai_execution_timing.py +0 -0
  25. {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
  26. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_unique_ai_log_tool_calls.py +0 -0
  27. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_unique_ai_persist_tool_calls.py +0 -0
  28. {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
  29. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_unique_ai_reference_order.py +0 -0
  30. {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
  31. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/tests/test_utils_resolve_other_options.py +0 -0
  32. {unique_orchestrator-2026.30.0.dev2 → unique_orchestrator-2026.30.0.dev4}/unique_orchestrator/unique_ai_builder.py +0 -0
  33. {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.dev2
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.dev13,<2026.30.0rc0
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.dev2,<2026.30.0rc0
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.dev2"
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.dev13,<2026.30.0rc0",
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.dev2,<2026.30.0rc0",
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 enable_responses_api_for_gpt_55_and_gpt_55_pro(self) -> "UniqueAIConfig":
550
- """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).
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: gpt-5.5-2026-04-24 and gpt-5.5-pro-2026-04-24 reject requests that combine `tools` with
553
- `reasoning_effort` on /v1/chat/completions and demands /v1/responses.
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
- self.space.language_model.name == LanguageModelName.AZURE_GPT_55_2026_0424
560
- or self.space.language_model.name
561
- == LanguageModelName.AZURE_GPT_55_PRO_2026_0424
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 TestUniqueAIConfigGpt55ResponsesApiValidator:
297
- """Test suite for UniqueAIConfig.enable_responses_api_for_gpt_55_and_gpt_55_pro validator.
298
-
299
- GPT-5.5 (AZURE_GPT_55_2026_0424) and GPT-5.5-Pro (AZURE_GPT_55_PRO_2026_0424)
300
- reject requests that combine `tools` with `reasoning_effort` on
301
- /v1/chat/completions and demand /v1/responses. The validator forces the
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
- """When the selected model is GPT-5.5 or GPT-5.5-Pro, the validator must
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 auto-enable must apply even when tools other than Code Interpreter
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
- """When the selected model is neither GPT-5.5 nor GPT-5.5-Pro, the
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
- """When use_responses_api is already True for an affected model, the
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._debug_info_manager.add(
320
- "skills",
321
- self._get_activated_skills_debug_info(),
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"]