unique_orchestrator 2026.28.0.dev7__tar.gz → 2026.28.0.dev9__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 (32) hide show
  1. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/PKG-INFO +4 -4
  2. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/pyproject.toml +4 -4
  3. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/prompts/system_prompt.jinja2 +1 -1
  4. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/unique_ai_builder.py +22 -2
  5. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/README.md +0 -0
  6. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/__init__.py +0 -0
  7. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/_builders/__init__.py +0 -0
  8. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/_builders/inject_tool_reminders.py +0 -0
  9. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/_builders/loop_iteration_runner.py +0 -0
  10. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/_builders/open_file_setup.py +0 -0
  11. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/_builders/skill_setup.py +0 -0
  12. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/config.py +0 -0
  13. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/prompts/generic_reference_prompt.jinja2 +0 -0
  14. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/prompts/user_message_prompt.jinja2 +0 -0
  15. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/settings.py +0 -0
  16. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/tests/test_agent_config_rjsf_ui_schema.py +0 -0
  17. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/tests/test_build_loop_iteration_runner.py +0 -0
  18. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/tests/test_config_services_validators.py +0 -0
  19. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/tests/test_qwen_max_loop_iterations.py +0 -0
  20. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/tests/test_register_code_interpreter_postprocessors.py +0 -0
  21. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/tests/test_unique_ai_async_modify.py +0 -0
  22. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/tests/test_unique_ai_execution_timing.py +0 -0
  23. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/tests/test_unique_ai_get_filtered_user_metadata.py +0 -0
  24. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/tests/test_unique_ai_log_tool_calls.py +0 -0
  25. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/tests/test_unique_ai_loop_debug_params.py +0 -0
  26. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/tests/test_unique_ai_persist_tool_calls.py +0 -0
  27. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/tests/test_unique_ai_plan_or_execute_include.py +0 -0
  28. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/tests/test_unique_ai_reference_order.py +0 -0
  29. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/tests/test_unique_ai_render_system_prompt_user_instructions.py +0 -0
  30. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/tests/test_utils_resolve_other_options.py +0 -0
  31. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/unique_ai.py +0 -0
  32. {unique_orchestrator-2026.28.0.dev7 → unique_orchestrator-2026.28.0.dev9}/unique_orchestrator/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: unique-orchestrator
3
- Version: 2026.28.0.dev7
3
+ Version: 2026.28.0.dev9
4
4
  Summary:
5
5
  Author: Andreas Hauri
6
6
  Author-email: Andreas Hauri <andreas.hauri@unique.ai>
@@ -9,15 +9,15 @@ 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.28.0.dev14,<2026.28.0rc0
12
+ Requires-Dist: unique-toolkit>=2026.28.0.dev18,<2026.28.0rc0
13
13
  Requires-Dist: unique-stock-ticker>=2026.28.0.dev3,<2026.28.0rc0
14
14
  Requires-Dist: unique-follow-up-questions>=2026.28.0.dev3,<2026.28.0rc0
15
15
  Requires-Dist: unique-internal-search>=2026.28.0.dev4,<2026.28.0rc0
16
- Requires-Dist: unique-deep-research>=2026.28.0.dev4,<2026.28.0rc0
16
+ Requires-Dist: unique-deep-research>=2026.28.0.dev5,<2026.28.0rc0
17
17
  Requires-Dist: unique-web-search>=2026.28.0.dev5,<2026.28.0rc0
18
18
  Requires-Dist: unique-swot>=2026.28.0.dev3,<2026.28.0rc0
19
19
  Requires-Dist: unique-skill-tool>=2026.28.0.dev4,<2026.28.0rc0
20
- Requires-Dist: unique-user-memory>=2026.28.0.dev5,<2026.28.0rc0
20
+ Requires-Dist: unique-user-memory>=2026.28.0.dev6,<2026.28.0rc0
21
21
  Requires-Dist: openai>=1.109.1,<3
22
22
  Requires-Python: >=3.12, <4
23
23
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "unique_orchestrator"
3
- version = "2026.28.0.dev7"
3
+ version = "2026.28.0.dev9"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  license = { text = "Proprietary" }
@@ -13,15 +13,15 @@ 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.28.0.dev14,<2026.28.0rc0",
16
+ "unique-toolkit>=2026.28.0.dev18,<2026.28.0rc0",
17
17
  "unique-stock-ticker>=2026.28.0.dev3,<2026.28.0rc0",
18
18
  "unique-follow-up-questions>=2026.28.0.dev3,<2026.28.0rc0",
19
19
  "unique-internal-search>=2026.28.0.dev4,<2026.28.0rc0",
20
- "unique-deep-research>=2026.28.0.dev4,<2026.28.0rc0",
20
+ "unique-deep-research>=2026.28.0.dev5,<2026.28.0rc0",
21
21
  "unique-web-search>=2026.28.0.dev5,<2026.28.0rc0",
22
22
  "unique-swot>=2026.28.0.dev3,<2026.28.0rc0",
23
23
  "unique-skill-tool>=2026.28.0.dev4,<2026.28.0rc0",
24
- "unique-user-memory>=2026.28.0.dev5,<2026.28.0rc0",
24
+ "unique-user-memory>=2026.28.0.dev6,<2026.28.0rc0",
25
25
  "openai>=1.109.1,<3",
26
26
  ]
27
27
 
@@ -28,7 +28,7 @@ Here is some metadata about the user, which may help you write better queries, a
28
28
  {#- User Memory Section #}
29
29
  {% if user_memory and user_memory|length > 0 %}
30
30
  # What I know about you
31
- The following profile was distilled from past conversations with this user. Treat it as durable user context: adapt your tone, examples, and depth to it, but do not recite or quote it back verbatim, and do not treat it as authoritative for facts about the world.
31
+ The following profile was distilled from past conversations with this user. Treat it as durable user context: adapt your tone, examples, and depth to it. If the user asks what you know or remember about them, you may share this memory back to them, including verbatim if they request it. Do not treat it as authoritative for facts about the world.
32
32
 
33
33
  You can read this memory while answering. Memory updates happen only in a postprocessing step after your final answer, so do not claim that you can directly edit the memory during the main response.
34
34
 
@@ -319,11 +319,15 @@ async def _build_common(
319
319
  mcp_servers=event.payload.mcp_servers,
320
320
  event=event,
321
321
  tool_progress_reporter=tool_progress_reporter,
322
+ chat_service=chat_service,
323
+ language_model_service=llm_service,
322
324
  )
323
325
  a2a_manager = A2AManager(
324
326
  logger=logger,
325
327
  tool_progress_reporter=tool_progress_reporter,
326
328
  response_watcher=response_watcher,
329
+ chat_service=chat_service,
330
+ language_model_service=llm_service,
327
331
  )
328
332
 
329
333
  tool_manager_config = ToolManagerConfig(
@@ -361,16 +365,28 @@ async def _build_common(
361
365
 
362
366
  user_memory_text = ""
363
367
  if config.space.allow_user_memory:
368
+ user_memory_config = config.agent.services.user_memory_config
369
+ # The postprocessor consolidates memory with the orchestrator model or the
370
+ # configured one depending on this flag. Token capping at load time must use
371
+ # the same model so the loaded baseline matches what consolidation expects;
372
+ # otherwise a mismatched tokenizer can truncate memory.md differently.
373
+ memory_language_model = (
374
+ config.space.language_model
375
+ if user_memory_config.use_orchestrator_language_model
376
+ else user_memory_config.language_model
377
+ )
364
378
  user_memory_state = await load_user_memory(
365
379
  event=event,
366
- config=config.agent.services.user_memory_config,
380
+ config=user_memory_config,
381
+ language_model=memory_language_model,
367
382
  logger=logger,
368
383
  )
369
384
  if user_memory_state is not None:
370
385
  user_memory_text = user_memory_state.text
371
386
  postprocessor_manager.add_postprocessor(
372
387
  UserMemoryPostprocessor(
373
- config=config.agent.services.user_memory_config,
388
+ config=user_memory_config,
389
+ language_model=memory_language_model,
374
390
  event=event,
375
391
  state=user_memory_state,
376
392
  logger=logger,
@@ -516,6 +532,8 @@ async def _build_responses(
516
532
  mcp_manager=common_components.mcp_manager,
517
533
  a2a_manager=common_components.a2a_manager,
518
534
  builtin_tool_manager=builtin_tool_manager,
535
+ chat_service=common_components.chat_service,
536
+ language_model_service=common_components.llm_service,
519
537
  )
520
538
  if (
521
539
  not config.agent.experimental.open_file_tool_config.enabled
@@ -617,6 +635,8 @@ async def _build_completions(
617
635
  tool_progress_reporter=common_components.tool_progress_reporter,
618
636
  mcp_manager=common_components.mcp_manager,
619
637
  a2a_manager=common_components.a2a_manager,
638
+ chat_service=common_components.chat_service,
639
+ language_model_service=common_components.llm_service,
620
640
  )
621
641
  if force_uploaded_search:
622
642
  tool_manager.add_forced_tool(UploadedSearchTool.name)