unique_toolkit 2026.28.0__tar.gz → 2026.28.0.dev1__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 (412) hide show
  1. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/PKG-INFO +2 -2
  2. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/pyproject.toml +2 -2
  3. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +1 -1
  4. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/pydantic/rjsf_tags.py +7 -16
  5. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +1 -1
  6. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -12
  7. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -11
  8. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/hallucination/utils.py +5 -46
  9. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/schemas.py +0 -10
  10. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -163
  11. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -16
  12. unique_toolkit-2026.28.0.dev1/unique_toolkit/agentic/tools/a2a/manager.py +55 -0
  13. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/tool/service.py +6 -14
  14. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/config.py +21 -69
  15. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/__init__.py +0 -6
  16. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/tool.py +1 -1
  17. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/todo/service.py +2 -18
  18. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/mcp/manager.py +8 -29
  19. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +7 -15
  20. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/tool.py +5 -57
  21. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/tool_manager.py +22 -207
  22. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic_table/schemas.py +24 -62
  23. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/schemas.py +15 -54
  24. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/unique_settings.py +1 -83
  25. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/functions.py +2 -40
  26. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/schemas.py +1 -9
  27. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/content/schemas.py +1 -22
  28. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/content/service.py +40 -79
  29. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/elicitation/service.py +0 -46
  30. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/message_persister.py +4 -14
  31. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/infos.py +0 -115
  32. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/service.py +21 -21
  33. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/settings.py +0 -1
  34. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/services/chat_service.py +0 -24
  35. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/services/factory.py +2 -10
  36. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/services/knowledge_base.py +2 -2
  37. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/short_term_memory/service.py +17 -27
  38. unique_toolkit-2026.28.0/unique_toolkit/agentic/evaluation/tests/test_hallucination_external_context.py +0 -122
  39. unique_toolkit-2026.28.0/unique_toolkit/agentic/reference_manager/tests/test_external_context.py +0 -35
  40. unique_toolkit-2026.28.0/unique_toolkit/agentic/tools/a2a/manager.py +0 -93
  41. unique_toolkit-2026.28.0/unique_toolkit/agentic/tools/experimental/ask_user_tool/__init__.py +0 -14
  42. unique_toolkit-2026.28.0/unique_toolkit/agentic/tools/experimental/ask_user_tool/config.py +0 -138
  43. unique_toolkit-2026.28.0/unique_toolkit/agentic/tools/experimental/ask_user_tool/tool.py +0 -165
  44. unique_toolkit-2026.28.0/unique_toolkit/agentic/tools/run_context.py +0 -24
  45. unique_toolkit-2026.28.0/unique_toolkit/agentic_table/synthetic_chat_event.py +0 -67
  46. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/README.md +0 -0
  47. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/__init__.py +0 -0
  48. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/__init__.py +0 -0
  49. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/_base_service.py +0 -0
  50. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/_time_utils.py +0 -0
  51. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  52. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  53. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  54. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  55. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  56. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  57. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/config_checker/README.md +0 -0
  58. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/config_checker/__init__.py +0 -0
  59. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/config_checker/__main__.py +0 -0
  60. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/config_checker/cli.py +0 -0
  61. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/config_checker/differ.py +0 -0
  62. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/config_checker/exporter.py +0 -0
  63. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/config_checker/models.py +0 -0
  64. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/config_checker/registry.py +0 -0
  65. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/config_checker/validator.py +0 -0
  66. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/default_language_model.py +0 -0
  67. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
  68. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/docx_generator/config.py +0 -0
  69. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
  70. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
  71. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/docx_generator/service.py +0 -0
  72. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
  73. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/endpoint_builder.py +0 -0
  74. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  75. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/event_bus.py +0 -0
  76. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/exception.py +0 -0
  77. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/execution.py +0 -0
  78. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
  79. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
  80. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
  81. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
  82. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
  83. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
  84. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
  85. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
  86. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
  87. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
  88. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
  89. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
  90. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
  91. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
  92. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
  93. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
  94. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
  95. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
  96. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
  97. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
  98. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
  99. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
  100. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
  101. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
  102. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
  103. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
  104. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
  105. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  106. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/metadata_filter_scope.py +0 -0
  107. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  108. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/referencing.py +0 -0
  109. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/string_utilities.py +0 -0
  110. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/tests/test_referencing.py +0 -0
  111. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
  112. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/token/__init__.py +0 -0
  113. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  114. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/token/token_counting.py +0 -0
  115. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
  116. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
  117. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/utils/__init__.py +0 -0
  118. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/utils/files.py +0 -0
  119. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/utils/image/encode.py +0 -0
  120. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
  121. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/utils/jinja/render.py +0 -0
  122. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
  123. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
  124. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  125. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  126. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  127. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/validate_required_values.py +0 -0
  128. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/validators.py +0 -0
  129. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/__init__.py +0 -0
  130. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
  131. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
  132. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/config.py +0 -0
  133. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
  134. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
  135. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
  136. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  137. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
  138. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  139. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
  140. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
  141. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
  142. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  143. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  144. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
  145. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
  146. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  147. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
  148. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  149. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
  150. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/utils.py +0 -0
  151. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
  152. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/feature_flags/feature_flags.py +0 -0
  153. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  154. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  155. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
  156. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/history_manager/settings.py +0 -0
  157. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  158. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/__init__.py +0 -0
  159. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
  160. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
  161. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
  162. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
  163. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/base.py +0 -0
  164. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
  165. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
  166. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +0 -0
  167. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
  168. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
  169. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
  170. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
  171. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
  172. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
  173. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
  174. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
  175. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
  176. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
  177. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/message_log_order.py +0 -0
  178. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
  179. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
  180. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
  181. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
  182. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
  183. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  184. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  185. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/__init__.py +0 -0
  186. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  187. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  188. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  189. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  190. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  191. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
  192. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  193. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  194. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
  195. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
  196. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  197. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
  198. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
  199. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  200. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
  201. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
  202. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_references.py +0 -0
  203. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  204. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
  205. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
  206. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  207. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  208. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  209. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  210. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
  211. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  212. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/open_file_tool/__init__.py +0 -0
  213. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/open_file_tool/config.py +0 -0
  214. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/open_file_tool/runtime.py +0 -0
  215. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/open_file_tool/tool.py +0 -0
  216. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/__init__.py +0 -0
  217. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/config.py +0 -0
  218. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/todo/__init__.py +0 -0
  219. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/todo/config.py +0 -0
  220. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/todo/prompts/__init__.py +0 -0
  221. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/todo/prompts/execution_reminder.j2 +0 -0
  222. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/todo/prompts/system_prompt.j2 +0 -0
  223. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/todo/prompts/tool_description.j2 +0 -0
  224. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/todo/prompts/verification_nudge.j2 +0 -0
  225. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/todo/schemas.py +0 -0
  226. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/factory.py +0 -0
  227. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  228. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  229. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/names.py +0 -0
  230. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
  231. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
  232. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
  233. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
  234. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
  235. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/artifacts.py +0 -0
  236. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +0 -0
  237. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +0 -0
  238. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +0 -0
  239. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +0 -0
  240. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
  241. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/schemas.py +0 -0
  242. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  243. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  244. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  245. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  246. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  247. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  248. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  249. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  250. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic_table/__init__.py +0 -0
  251. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic_table/service.py +0 -0
  252. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/__init__.py +0 -0
  253. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/chat_event_filter_options_settings.py +0 -0
  254. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/dev_util.py +0 -0
  255. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/fast_api_factory.py +0 -0
  256. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/feature_flags.py +0 -0
  257. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/find_env_file.py +0 -0
  258. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/init_logging.py +0 -0
  259. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/init_sdk.py +0 -0
  260. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/performance/async_tasks.py +0 -0
  261. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  262. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/verification.py +0 -0
  263. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/webhook.py +0 -0
  264. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/__init__.py +0 -0
  265. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/cancellation.py +0 -0
  266. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/constants.py +0 -0
  267. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/deprecated/service.py +0 -0
  268. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/rendering.py +0 -0
  269. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/responses_api.py +0 -0
  270. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/service.py +0 -0
  271. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/state.py +0 -0
  272. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/utils.py +0 -0
  273. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/content/__init__.py +0 -0
  274. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/content/constants.py +0 -0
  275. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/content/functions.py +0 -0
  276. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/content/smart_rules.py +0 -0
  277. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/content/utils.py +0 -0
  278. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/data_extraction/README.md +0 -0
  279. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/data_extraction/__init__.py +0 -0
  280. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
  281. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/data_extraction/augmented/service.py +0 -0
  282. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/data_extraction/base.py +0 -0
  283. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
  284. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/data_extraction/basic/config.py +0 -0
  285. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
  286. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/data_extraction/basic/service.py +0 -0
  287. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/elicitation/__init__.py +0 -0
  288. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/elicitation/constants.py +0 -0
  289. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/elicitation/exceptions.py +0 -0
  290. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/elicitation/functions.py +0 -0
  291. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/elicitation/schemas.py +0 -0
  292. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/embedding/__init__.py +0 -0
  293. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/embedding/constants.py +0 -0
  294. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/embedding/functions.py +0 -0
  295. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/embedding/schemas.py +0 -0
  296. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/embedding/service.py +0 -0
  297. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/embedding/utils.py +0 -0
  298. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/README.md +0 -0
  299. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/__init__.py +0 -0
  300. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/_internal/__init__.py +0 -0
  301. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/_internal/streaming/__init__.py +0 -0
  302. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/_internal/streaming/common.py +0 -0
  303. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/_internal/streaming/pattern_replacer.py +0 -0
  304. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/__init__.py +0 -0
  305. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/_base.py +0 -0
  306. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/content_tree/__init__.py +0 -0
  307. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/content_tree/functions.py +0 -0
  308. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/content_tree/schemas.py +0 -0
  309. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/content_tree/service.py +0 -0
  310. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/__init__.py +0 -0
  311. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/base/__init__.py +0 -0
  312. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/base/config.py +0 -0
  313. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/base/schemas.py +0 -0
  314. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/base/service.py +0 -0
  315. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/base/utils.py +0 -0
  316. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/chat/__init__.py +0 -0
  317. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/chat/config.py +0 -0
  318. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/chat/schemas.py +0 -0
  319. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/chat/service.py +0 -0
  320. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/knowledge_base/__init__.py +0 -0
  321. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/knowledge_base/config.py +0 -0
  322. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/knowledge_base/schemas.py +0 -0
  323. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/knowledge_base/service.py +0 -0
  324. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/post_processing/__init__.py +0 -0
  325. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/post_processing/config.py +0 -0
  326. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/post_processing/service.py +0 -0
  327. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/content_tree/__init__.py +0 -0
  328. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/identity/__init__.py +0 -0
  329. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/__init__.py +0 -0
  330. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/__init__.py +0 -0
  331. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/__init__.py +0 -0
  332. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/__init__.py +0 -0
  333. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/_async_bridge.py +0 -0
  334. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/__init__.py +0 -0
  335. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/complete_with_references.py +0 -0
  336. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/stream_event_router.py +0 -0
  337. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/text_event_handler.py +0 -0
  338. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/tool_call_event_handler.py +0 -0
  339. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/events.py +0 -0
  340. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/__init__.py +0 -0
  341. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/chat_completions.py +0 -0
  342. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/responses.py +0 -0
  343. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/__init__.py +0 -0
  344. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/code_interpreter_event_handler.py +0 -0
  345. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/complete_with_references.py +0 -0
  346. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/completed_event_handler.py +0 -0
  347. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/stream_event_router.py +0 -0
  348. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/text_delta_event_handler.py +0 -0
  349. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/tool_call_event_handler.py +0 -0
  350. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/__init__.py +0 -0
  351. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/progress_log_persister.py +0 -0
  352. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/__init__.py +0 -0
  353. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/content_folder/__init__.py +0 -0
  354. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/content_folder/functions.py +0 -0
  355. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/content_folder/schemas.py +0 -0
  356. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/content_folder/service.py +0 -0
  357. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/facades/__init__.py +0 -0
  358. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/facades/identity/__init__.py +0 -0
  359. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/facades/identity/service.py +0 -0
  360. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/feature_flags/README.md +0 -0
  361. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/feature_flags/__init__.py +0 -0
  362. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/feature_flags/_graphql_client.py +0 -0
  363. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/feature_flags/_ttl_cache.py +0 -0
  364. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/feature_flags/client.py +0 -0
  365. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/feature_flags/schemas.py +0 -0
  366. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/feature_flags/settings.py +0 -0
  367. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/group/__init__.py +0 -0
  368. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/group/functions.py +0 -0
  369. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/group/schemas.py +0 -0
  370. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/group/service.py +0 -0
  371. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/scheduled_task/__init__.py +0 -0
  372. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/scheduled_task/cron.py +0 -0
  373. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/scheduled_task/functions.py +0 -0
  374. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/scheduled_task/schemas.py +0 -0
  375. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/scheduled_task/service.py +0 -0
  376. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/user/__init__.py +0 -0
  377. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/user/functions.py +0 -0
  378. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/user/schemas.py +0 -0
  379. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/user/service.py +0 -0
  380. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/testing/__init__.py +0 -0
  381. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/framework_utilities/__init__.py +0 -0
  382. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
  383. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  384. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  385. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  386. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  387. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  388. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/framework_utilities/utils.py +0 -0
  389. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/__init__.py +0 -0
  390. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
  391. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/builder.py +0 -0
  392. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/constants.py +0 -0
  393. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/default_language_model.py +0 -0
  394. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/functions.py +0 -0
  395. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/prompt.py +0 -0
  396. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/reference.py +0 -0
  397. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/schemas.py +0 -0
  398. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/stream_transform.py +0 -0
  399. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/utils.py +0 -0
  400. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/monitoring/__init__.py +0 -0
  401. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/monitoring/gunicorn.py +0 -0
  402. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/monitoring/middleware.py +0 -0
  403. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/monitoring/registry.py +0 -0
  404. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/protocols/support.py +0 -0
  405. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/services/__init__.py +0 -0
  406. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/short_term_memory/__init__.py +0 -0
  407. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/short_term_memory/constants.py +0 -0
  408. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/short_term_memory/functions.py +0 -0
  409. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/short_term_memory/schemas.py +0 -0
  410. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/smart_rules/__init__.py +0 -0
  411. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/smart_rules/compile.py +0 -0
  412. {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/test_utilities/events.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: unique-toolkit
3
- Version: 2026.28.0
3
+ Version: 2026.28.0.dev1
4
4
  Summary:
5
5
  Author: Cedric Klinkert, Martin Fadler, Sadique Sheik, Fabian Schläpfer, Pascal Hauri, Ejiroghene Oki-Peter, Rami Azouz, Ricardo Visini, Sanzio Monti
6
6
  Author-email: Cedric Klinkert <cedric.klinkert@unique.ch>, Martin Fadler <martin.fadler@unique.ch>, Sadique Sheik <sadique@unique.ch>, Fabian Schläpfer <fabian@unique.ch>, Pascal Hauri <pascal@unique.ch>, Ejiroghene Oki-Peter <oki-peter.ejiroghene@unique.ai>, Rami Azouz <rami.ext@unique.ch>, Ricardo Visini <ricardo.visini@unique.ch>, Sanzio Monti <sanzio.monti@unique.ai>
@@ -16,7 +16,7 @@ Requires-Dist: sseclient>=0.0.27,<0.0.28
16
16
  Requires-Dist: openai>=1.105.0,<3
17
17
  Requires-Dist: platformdirs>=4.0.0,<5
18
18
  Requires-Dist: pillow>=12.1.1
19
- Requires-Dist: unique-sdk>=2026.28.0
19
+ Requires-Dist: unique-sdk>=2026.28.0.dev2,<2026.28.0rc0
20
20
  Requires-Dist: jambo>=0.1.2,<0.2
21
21
  Requires-Dist: jinja2>=3.1.6,<4
22
22
  Requires-Dist: docxtpl>=0.20.1,<0.21
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "unique_toolkit"
3
- version = "2026.28.0"
3
+ version = "2026.28.0.dev1"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -28,7 +28,7 @@ dependencies = [
28
28
  "openai>=1.105.0,<3",
29
29
  "platformdirs>=4.0.0,<5",
30
30
  "pillow>=12.1.1",
31
- "unique-sdk>=2026.28.0",
31
+ "unique-sdk>=2026.28.0.dev2,<2026.28.0rc0",
32
32
  "jambo>=0.1.2,<0.2",
33
33
  "jinja2>=3.1.6,<4",
34
34
  "docxtpl>=0.20.1,<0.21",
@@ -71,7 +71,7 @@ class ChunkRelevancySorter:
71
71
  company_id: str | None = None,
72
72
  user_id: str | None = None,
73
73
  ):
74
- if isinstance(event, BaseEvent):
74
+ if isinstance(event, (ChatEvent, BaseEvent)):
75
75
  self.chunk_relevancy_evaluator = ContextRelevancyEvaluator.from_event(event)
76
76
  else:
77
77
  [company_id, user_id] = validate_required_values([company_id, user_id])
@@ -928,7 +928,6 @@ def ui_schema_for_model(
928
928
  ui: dict[str, Any] = {}
929
929
 
930
930
  for fname in model_cls.model_fields:
931
- field_info = model_cls.model_fields[fname]
932
931
  ann = hints[fname]
933
932
  node: dict[str, Any] = {}
934
933
 
@@ -1020,21 +1019,13 @@ def ui_schema_for_model(
1020
1019
  _maybe_set_string_empty_value(branch, alt_b, default_string_empty_value)
1021
1020
  branches.append(branch)
1022
1021
  if branches:
1023
- # RJSF v6 selects the per-branch uiSchema using the SAME keyword
1024
- # the JSON schema uses for the union: ``schema.oneOf`` reads
1025
- # ``uiSchema.oneOf`` and ``schema.anyOf`` reads ``uiSchema.anyOf``
1026
- # (see @rjsf/core ``AnyOfField``). Pydantic emits ``oneOf`` for a
1027
- # *discriminated* union and ``anyOf`` otherwise, so the uiSchema
1028
- # branch key MUST match the schema keyword — a ``oneOf`` schema
1029
- # paired with an ``anyOf`` uiSchema makes RJSF silently drop every
1030
- # per-branch widget and fall back to default widgets.
1031
- branch_key = (
1032
- "oneOf" if field_info.discriminator is not None else "anyOf"
1033
- )
1034
- # Keep any branch structure already supplied by a composer
1035
- # (Optional/Union write their own ``anyOf`` into ``meta``).
1036
- if "anyOf" not in node and "oneOf" not in node:
1037
- node[branch_key] = branches
1022
+ # Check if the metadata already has an anyOf structure (from Union composer)
1023
+ if "anyOf" in node:
1024
+ # Use the anyOf from the metadata (from Union composer)
1025
+ pass # Keep the existing anyOf from the Union composer
1026
+ else:
1027
+ # Create anyOf structure for Union types
1028
+ node["anyOf"] = branches
1038
1029
 
1039
1030
  # Scalars: node already has metadata if any
1040
1031
  _maybe_set_string_empty_value(node, base, default_string_empty_value)
@@ -81,7 +81,7 @@ class ContextRelevancyEvaluator:
81
81
  company_id: str | None = None,
82
82
  user_id: str | None = None,
83
83
  ):
84
- if isinstance(event, BaseEvent):
84
+ if isinstance(event, (ChatEvent, BaseEvent)):
85
85
  self.language_model_service = LanguageModelService.from_event(event)
86
86
  else:
87
87
  [company_id, user_id] = validate_required_values([company_id, user_id])
@@ -52,18 +52,6 @@ class HallucinationConfig(EvaluationMetricConfig):
52
52
  default={},
53
53
  description="Additional options to pass to the language model.",
54
54
  )
55
- max_external_context_chars_per_source: SkipJsonSchema[int] = Field(
56
- default=20_000,
57
- ge=0,
58
- description=(
59
- "Per-source character cap applied to external (non-chunk) "
60
- "context texts, e.g. MCP tool output. Raw/large tool results "
61
- "inflate the judge prompt and the eval-LLM call; each external "
62
- "text is truncated to this many characters before being added "
63
- "to the context. 0 disables truncation. Does not affect "
64
- "chunk-derived context."
65
- ),
66
- )
67
55
  score_to_label: dict[str, str] = {
68
56
  "LOW": "GREEN",
69
57
  "MEDIUM": "YELLOW",
@@ -54,17 +54,6 @@ class HallucinationEvaluation(Evaluation):
54
54
  reference_pattern=self.config.reference_pattern,
55
55
  )
56
56
 
57
- # Append non-chunk groundedness context (e.g. MCP tool output). These
58
- # are added in full ("all retrieved output as context") rather than via
59
- # source-marker selection, since they carry no [sourceN] markers.
60
- external_context_texts = self._reference_manager.get_external_context_texts()
61
- max_chars = self.config.max_external_context_chars_per_source
62
- if max_chars > 0:
63
- external_context_texts = [
64
- text[:max_chars] for text in external_context_texts
65
- ]
66
- context_texts = context_texts + external_context_texts
67
-
68
57
  evaluation_result: EvaluationMetricResult = await check_hallucination(
69
58
  company_id=self._company_id,
70
59
  user_id=self._user_id,
@@ -16,8 +16,6 @@ from unique_toolkit.agentic.evaluation.schemas import (
16
16
  )
17
17
  from unique_toolkit.content import ContentReference
18
18
  from unique_toolkit.content.schemas import ContentChunk
19
- from unique_toolkit.language_model.builder import MessagesBuilder
20
- from unique_toolkit.language_model.infos import ModelCapabilities
21
19
  from unique_toolkit.language_model.schemas import (
22
20
  LanguageModelMessages,
23
21
  LanguageModelStreamResponse,
@@ -106,28 +104,19 @@ def _get_msgs(
106
104
  """
107
105
  Composes the messages for hallucination analysis based on the provided input and configuration.
108
106
 
109
- This method composes messages with or without context based on the availability of context texts,
110
- history message texts, and (for vision-capable models) context images in the input.
107
+ This method composes messages with or without context based on the availability of context texts
108
+ and history message texts in the input.
111
109
 
112
110
  Args:
113
- input (EvaluationMetricInput): The input data that includes context texts, history message texts,
114
- and context images for the analysis.
111
+ input (EvaluationMetricInput): The input data that includes context texts and history message texts
112
+ for the analysis.
115
113
  config (EvaluationMetricConfig): The configuration settings for composing messages.
116
114
  logger (Optional[logging.Logger], optional): The logger used for logging debug information.
117
115
 
118
116
  Returns:
119
117
  The composed messages as per the provided input and configuration.
120
118
  """
121
- # Context images only count as grounding when the model can actually consume
122
- # them; otherwise _compose_msgs drops them and the message would be text-only.
123
- model_supports_vision = (
124
- ModelCapabilities.VISION in config.language_model.capabilities
125
- )
126
- has_context = bool(
127
- input.context_texts
128
- or input.history_messages
129
- or (input.context_images and model_supports_vision)
130
- )
119
+ has_context = bool(input.context_texts or input.history_messages)
131
120
 
132
121
  if has_context:
133
122
  _LOGGER.debug("Using context / history for hallucination evaluation.")
@@ -176,36 +165,6 @@ def _compose_msgs(
176
165
  else None,
177
166
  output_text=input.output_text,
178
167
  )
179
-
180
- # When images are provided AND the configured model is vision-capable, build
181
- # a multimodal user message (rendered user text + one image part per data
182
- # URL) so the model can ground the check against the rendered pages. If the
183
- # model lacks VISION we drop the images and fall back to the text-only
184
- # message: attaching images to a non-vision model would make the LLM call
185
- # fail. Without images the message stays the exact text-only form, so
186
- # existing callers are unaffected.
187
- context_images = input.context_images or []
188
- model_supports_vision = (
189
- ModelCapabilities.VISION in config.language_model.capabilities
190
- )
191
- # When has_context is True for an images-only input, the caller already
192
- # confirmed the model is vision-capable, so this branch stays unreachable in
193
- # that case and only logs for a genuine non-vision misconfiguration.
194
- if context_images and not model_supports_vision:
195
- _LOGGER.warning(
196
- "Hallucination model %s lacks VISION capability; ignoring "
197
- "%d context image(s) and grounding on text only.",
198
- config.language_model.name,
199
- len(context_images),
200
- )
201
- if context_images and model_supports_vision:
202
- return (
203
- MessagesBuilder()
204
- .append(system_msg)
205
- .image_message_append(content=user_msg_content, images=context_images)
206
- .build()
207
- )
208
-
209
168
  user_msg = LanguageModelUserMessage(content=user_msg_content)
210
169
 
211
170
  return LanguageModelMessages([system_msg, user_msg])
@@ -34,16 +34,6 @@ class EvaluationMetricInput(BaseModel):
34
34
  context_texts: Optional[list[str]] = None
35
35
  history_messages: Optional[list[ChatMessage]] = None
36
36
  output_text: Optional[str] = None
37
- context_images: Optional[list[str]] = Field(
38
- default=None,
39
- description=(
40
- "Optional base64 data URLs (e.g. 'data:image/png;base64,...') of "
41
- "context the metric should evaluate against visually, in addition "
42
- "to context_texts. Used by metrics that support a multimodal "
43
- "(vision) check; ignored by metrics that do not. Defaults to None "
44
- "so existing text-only callers are unaffected."
45
- ),
46
- )
47
37
 
48
38
  def get_joined_context_texts(self, tag_name: str = "reference") -> str:
49
39
  """
@@ -20,10 +20,6 @@ from unique_toolkit.agentic.evaluation.schemas import EvaluationMetricInput
20
20
  from unique_toolkit.chat.schemas import ChatMessage
21
21
  from unique_toolkit.content import ContentReference
22
22
  from unique_toolkit.content.schemas import ContentChunk
23
- from unique_toolkit.language_model.infos import (
24
- LanguageModelName,
25
- ModelCapabilities,
26
- )
27
23
  from unique_toolkit.language_model.schemas import (
28
24
  LanguageModelMessageRole,
29
25
  LanguageModelMessages,
@@ -1017,162 +1013,3 @@ def test_compose_msgs__generates_non_empty_messages__from_config_prompts(
1017
1013
  # Assert
1018
1014
  assert len(result.root[0].content) > 0
1019
1015
  assert len(result.root[1].content) > 0
1020
-
1021
-
1022
- _IMAGE_DATA_URL = "data:image/png;base64,QQ=="
1023
-
1024
-
1025
- @pytest.mark.ai
1026
- def test_compose_msgs__builds_multimodal_user_message__with_context_images(
1027
- hallucination_config: HallucinationConfig,
1028
- ) -> None:
1029
- """
1030
- Purpose: Verify that context_images produce a multimodal user message.
1031
- Why this matters: Vision faithfulness needs the rendered pages as image parts.
1032
- Setup summary: Provide context_images, assert the user message carries text +
1033
- one image part per data URL.
1034
- """
1035
- # Arrange
1036
- input_data: EvaluationMetricInput = EvaluationMetricInput(
1037
- input_text="Question",
1038
- output_text="Output",
1039
- context_images=[_IMAGE_DATA_URL],
1040
- )
1041
-
1042
- # Act
1043
- result: LanguageModelMessages = _compose_msgs(
1044
- input_data, hallucination_config, has_context=True
1045
- )
1046
-
1047
- # Assert
1048
- assert len(result.root) == 2
1049
- user_content = result.root[1].content
1050
- assert isinstance(user_content, list)
1051
- text_parts = [p for p in user_content if p.get("type") == "text"]
1052
- image_parts = [p for p in user_content if p.get("type") == "image_url"]
1053
- assert len(text_parts) == 1
1054
- assert len(image_parts) == 1
1055
- assert image_parts[0]["imageUrl"]["url"] == _IMAGE_DATA_URL
1056
-
1057
-
1058
- @pytest.mark.ai
1059
- def test_compose_msgs__stays_text_only__without_context_images(
1060
- hallucination_config: HallucinationConfig,
1061
- ) -> None:
1062
- """
1063
- Purpose: Verify that omitting context_images keeps the exact text-only message.
1064
- Why this matters: Backward compatibility for all existing (non-vision) callers.
1065
- Setup summary: No context_images -> user message content is a plain string.
1066
- """
1067
- # Arrange
1068
- input_data: EvaluationMetricInput = EvaluationMetricInput(
1069
- input_text="Question",
1070
- context_texts=["Context 1"],
1071
- output_text="Output",
1072
- )
1073
-
1074
- # Act
1075
- result: LanguageModelMessages = _compose_msgs(
1076
- input_data, hallucination_config, has_context=True
1077
- )
1078
-
1079
- # Assert
1080
- assert isinstance(result.root[1].content, str)
1081
-
1082
-
1083
- @pytest.mark.ai
1084
- def test_compose_msgs__drops_images__when_model_lacks_vision() -> None:
1085
- """
1086
- Purpose: Verify images are dropped when the configured model is not vision-capable.
1087
- Why this matters: Attaching images to a non-vision model makes the LLM call fail;
1088
- we must degrade gracefully to a text-only message instead.
1089
- Setup summary: Configure a text-only model (no VISION capability) with
1090
- context_images, assert the user message content stays a plain string.
1091
- """
1092
- # Arrange
1093
- text_only_config = HallucinationConfig(
1094
- enabled=True,
1095
- language_model=LanguageModelName.AZURE_GPT_4_0613,
1096
- )
1097
- assert ModelCapabilities.VISION not in (
1098
- text_only_config.language_model.capabilities
1099
- )
1100
- input_data: EvaluationMetricInput = EvaluationMetricInput(
1101
- input_text="Question",
1102
- output_text="Output",
1103
- context_images=[_IMAGE_DATA_URL],
1104
- )
1105
-
1106
- # Act
1107
- result: LanguageModelMessages = _compose_msgs(
1108
- input_data, text_only_config, has_context=True
1109
- )
1110
-
1111
- # Assert
1112
- assert isinstance(result.root[1].content, str)
1113
-
1114
-
1115
- @pytest.mark.ai
1116
- def test_get_msgs__treats_context_images_as_context(
1117
- hallucination_config: HallucinationConfig,
1118
- ) -> None:
1119
- """
1120
- Purpose: Verify that context_images alone count as context in _get_msgs.
1121
- Why this matters: A vision-only turn must use the grounded (has_context) prompt
1122
- and build the multimodal message.
1123
- Setup summary: Provide only context_images; assert the system prompt matches the
1124
- has_context variant and the user message is multimodal.
1125
- """
1126
- # Arrange
1127
- image_only: EvaluationMetricInput = EvaluationMetricInput(
1128
- input_text="Question",
1129
- output_text="Output",
1130
- context_images=[_IMAGE_DATA_URL],
1131
- )
1132
- grounded: EvaluationMetricInput = EvaluationMetricInput(
1133
- input_text="Question",
1134
- context_texts=["Context 1"],
1135
- output_text="Output",
1136
- )
1137
-
1138
- # Act
1139
- result: LanguageModelMessages = _get_msgs(image_only, hallucination_config)
1140
- grounded_result: LanguageModelMessages = _get_msgs(grounded, hallucination_config)
1141
-
1142
- # Assert
1143
- assert result.root[0].content == grounded_result.root[0].content
1144
- assert isinstance(result.root[1].content, list)
1145
-
1146
-
1147
- @pytest.mark.ai
1148
- def test_get_msgs__ignores_context_images__when_model_lacks_vision() -> None:
1149
- """
1150
- Purpose: Verify image-only input is not treated as context for a non-vision model.
1151
- Why this matters: _compose_msgs drops the images for a non-vision model, so the
1152
- grounded prompt would otherwise claim references that are never sent. has_context
1153
- must reflect the message actually delivered.
1154
- Setup summary: Configure a text-only model with only context_images; assert the
1155
- system prompt matches the ungrounded variant and the user message is text-only.
1156
- """
1157
- # Arrange
1158
- text_only_config = HallucinationConfig(
1159
- enabled=True,
1160
- language_model=LanguageModelName.AZURE_GPT_4_0613,
1161
- )
1162
- image_only: EvaluationMetricInput = EvaluationMetricInput(
1163
- input_text="Question",
1164
- output_text="Output",
1165
- context_images=[_IMAGE_DATA_URL],
1166
- )
1167
- no_context: EvaluationMetricInput = EvaluationMetricInput(
1168
- input_text="Question",
1169
- output_text="Output",
1170
- )
1171
-
1172
- # Act
1173
- result: LanguageModelMessages = _get_msgs(image_only, text_only_config)
1174
- no_context_result: LanguageModelMessages = _get_msgs(no_context, text_only_config)
1175
-
1176
- # Assert
1177
- assert result.root[0].content == no_context_result.root[0].content
1178
- assert isinstance(result.root[1].content, str)
@@ -32,7 +32,6 @@ class ReferenceManager:
32
32
  self._tool_chunks: dict[str, tool_chunks] = {}
33
33
  self._chunks: list[ContentChunk] = []
34
34
  self._references: list[list[ContentReference]] = []
35
- self._external_context_texts: list[str] = []
36
35
 
37
36
  def extract_referenceable_chunks(
38
37
  self, tool_responses: list[ToolCallResponse]
@@ -48,21 +47,6 @@ class ReferenceManager:
48
47
  def get_chunks(self) -> list[ContentChunk]:
49
48
  return self._chunks
50
49
 
51
- def add_external_context_texts(self, texts: list[str]) -> None:
52
- """Register groundedness context that is not backed by ContentChunks.
53
-
54
- Some retrieval sources (e.g. MCP tool output) provide text the answer
55
- is built on but are deliberately *not* modelled as ContentChunks — they
56
- are a different entity from ingested document chunks and must not flow
57
- through the chunk/reference pipeline. They still need to ground the
58
- hallucination check, so they are stored here and appended to the
59
- evaluation context alongside the chunk-derived texts.
60
- """
61
- self._external_context_texts.extend(text for text in texts if text)
62
-
63
- def get_external_context_texts(self) -> list[str]:
64
- return self._external_context_texts
65
-
66
50
  def get_tool_chunks(self) -> dict[str, tool_chunks]:
67
51
  return self._tool_chunks
68
52
 
@@ -0,0 +1,55 @@
1
+ from logging import Logger
2
+
3
+ from unique_toolkit.agentic.tools.a2a.response_watcher import SubAgentResponseWatcher
4
+ from unique_toolkit.agentic.tools.a2a.tool import SubAgentTool, SubAgentToolConfig
5
+ from unique_toolkit.agentic.tools.config import ToolBuildConfig
6
+ from unique_toolkit.agentic.tools.tool_progress_reporter import ToolProgressReporter
7
+ from unique_toolkit.app.schemas import ChatEvent
8
+
9
+
10
+ class A2AManager:
11
+ def __init__(
12
+ self,
13
+ logger: Logger,
14
+ tool_progress_reporter: ToolProgressReporter,
15
+ response_watcher: SubAgentResponseWatcher,
16
+ ):
17
+ self._logger = logger
18
+ self._tool_progress_reporter = tool_progress_reporter
19
+ self._response_watcher = response_watcher
20
+
21
+ def get_all_sub_agents(
22
+ self,
23
+ tool_configs: list[ToolBuildConfig],
24
+ event: ChatEvent,
25
+ ) -> tuple[list[ToolBuildConfig], list[SubAgentTool]]:
26
+ sub_agents = []
27
+
28
+ for tool_config in tool_configs:
29
+ if not tool_config.is_sub_agent:
30
+ continue
31
+
32
+ if not isinstance(tool_config.configuration, SubAgentToolConfig):
33
+ self._logger.error(
34
+ "tool_config.configuration must be of type SubAgentToolConfig"
35
+ )
36
+ continue
37
+
38
+ sub_agent_tool_config = tool_config.configuration
39
+
40
+ sub_agents.append(
41
+ SubAgentTool(
42
+ configuration=sub_agent_tool_config,
43
+ event=event,
44
+ tool_progress_reporter=self._tool_progress_reporter,
45
+ name=tool_config.name,
46
+ display_name=tool_config.display_name,
47
+ response_watcher=self._response_watcher,
48
+ )
49
+ )
50
+
51
+ filtered_tool_config = [
52
+ tool_config for tool_config in tool_configs if not tool_config.is_sub_agent
53
+ ]
54
+
55
+ return filtered_tool_config, sub_agents
@@ -20,6 +20,7 @@ from unique_toolkit._common.referencing import (
20
20
  from unique_toolkit._common.utils.jinja.render import render_template
21
21
  from unique_toolkit.agentic.evaluation.schemas import EvaluationMetricName
22
22
  from unique_toolkit.agentic.feature_flags import feature_flags
23
+ from unique_toolkit.agentic.message_log_manager.service import MessageStepLogger
23
24
  from unique_toolkit.agentic.tools.a2a.response_watcher import SubAgentResponseWatcher
24
25
  from unique_toolkit.agentic.tools.a2a.tool._memory import (
25
26
  get_sub_agent_short_term_memory_manager,
@@ -52,7 +53,6 @@ from unique_toolkit.chat.service import ChatService
52
53
  from unique_toolkit.content import ContentChunk, ContentReference
53
54
  from unique_toolkit.language_model import (
54
55
  LanguageModelFunction,
55
- LanguageModelService,
56
56
  LanguageModelToolDescription,
57
57
  )
58
58
 
@@ -72,20 +72,12 @@ class SubAgentTool(Tool[SubAgentToolConfig]):
72
72
  name: str = "SubAgentTool",
73
73
  display_name: str = "SubAgentTool",
74
74
  response_watcher: SubAgentResponseWatcher | None = None,
75
- *,
76
- chat_service: ChatService | None = None,
77
- language_model_service: LanguageModelService | None = None,
78
75
  ) -> None:
79
- if chat_service is not None and language_model_service is not None:
80
- super().__init__(
81
- configuration,
82
- event,
83
- tool_progress_reporter=tool_progress_reporter,
84
- chat_service=chat_service,
85
- language_model_service=language_model_service,
86
- )
87
- else:
88
- super().__init__(configuration, event, tool_progress_reporter)
76
+ super().__init__(configuration)
77
+ self._event = event
78
+ self._tool_progress_reporter = tool_progress_reporter
79
+ self._chat_service = ChatService(event)
80
+ self._message_step_logger = MessageStepLogger(chat_service=self._chat_service)
89
81
  self._user_id = event.user_id
90
82
  self._company_id = event.company_id
91
83
 
@@ -1,4 +1,3 @@
1
- import logging
2
1
  from enum import StrEnum
3
2
  from typing import Annotated, Any, Generic
4
3
 
@@ -15,36 +14,9 @@ from typing_extensions import TypeVar
15
14
  from unique_toolkit._common.pydantic_helpers import get_configuration_dict
16
15
  from unique_toolkit.agentic.tools.schemas import BaseToolConfig
17
16
 
18
- logger = logging.getLogger(__name__)
19
-
20
17
  T = TypeVar("T", bound=BaseToolConfig, default=BaseToolConfig)
21
18
 
22
19
 
23
- def _ensure_base_tool_config(value: dict[str, Any]) -> None:
24
- """Make configuration parseable; disabled/demoted tools are never built at runtime."""
25
- configuration = value.get("configuration")
26
- if not isinstance(configuration, BaseToolConfig):
27
- value["configuration"] = BaseToolConfig()
28
-
29
-
30
- def _non_empty_str(value: dict[str, Any], snake_key: str, camel_key: str) -> str:
31
- raw = value.get(snake_key, value.get(camel_key, ""))
32
- if raw is None:
33
- return ""
34
- return str(raw)
35
-
36
-
37
- def _is_mcp_tool_payload(value: dict[str, Any]) -> bool:
38
- if _non_empty_str(value, "mcp_source_id", "mcpSourceId"):
39
- return True
40
-
41
- configuration = value.get("configuration", {})
42
- if isinstance(configuration, dict):
43
- if _non_empty_str(configuration, "mcp_source_id", "mcpSourceId"):
44
- return True
45
- return False
46
-
47
-
48
20
  class ToolIcon(StrEnum):
49
21
  ANALYTICS = "IconAnalytics"
50
22
  BOOK = "IconBook"
@@ -104,18 +76,11 @@ class ToolBuildConfig(BaseModel, Generic[T]):
104
76
  value: Any,
105
77
  info: ValidationInfo,
106
78
  ) -> Any:
107
- """Validate and resolve tool configuration based on tool type and name.
108
-
109
- Both enabled and disabled tools resolve to their concrete config type when
110
- the stored configuration is valid, so downstream consumers that key off the
111
- tool name keep seeing the expected config type regardless of the enabled
112
- flag. A tool whose configuration is invalid is demoted to disabled with a
113
- BaseToolConfig fallback instead of raising.
114
- """
79
+ """Check the given values for."""
115
80
  if not isinstance(value, dict):
116
81
  return value
117
82
 
118
- is_mcp_tool = _is_mcp_tool_payload(value)
83
+ is_mcp_tool = value.get("mcp_source_id", "") != ""
119
84
  mcp_configuration = value.get("configuration", {})
120
85
 
121
86
  # Import at runtime to avoid circular imports
@@ -137,39 +102,26 @@ class ToolBuildConfig(BaseModel, Generic[T]):
137
102
 
138
103
  configuration = value.get("configuration", {})
139
104
 
140
- try:
141
- if is_sub_agent_tool:
142
- from unique_toolkit.agentic.tools.a2a import ExtendedSubAgentToolConfig
143
-
144
- config = ExtendedSubAgentToolConfig.model_validate(configuration)
145
- elif isinstance(configuration, dict):
146
- # Local import to avoid circular import at module import time
147
- from unique_toolkit.agentic.tools.factory import ToolFactory
148
-
149
- config = ToolFactory.build_tool_config(
150
- value["name"],
151
- **configuration,
152
- )
153
- else:
154
- # Check that the type of config matches the tool name
155
- from unique_toolkit.agentic.tools.factory import ToolFactory
156
-
157
- assert isinstance(
158
- configuration,
159
- ToolFactory.tool_config_map[value["name"]], # pyright: ignore[reportArgumentType]
160
- )
161
- config = configuration
162
- except Exception:
163
- tool_name = value.get("name", "<unknown>")
164
- logger.warning(
165
- "Tool '%s' has invalid configuration and will be disabled.",
166
- tool_name,
167
- exc_info=True,
105
+ if is_sub_agent_tool:
106
+ from unique_toolkit.agentic.tools.a2a import ExtendedSubAgentToolConfig
107
+
108
+ config = ExtendedSubAgentToolConfig.model_validate(configuration)
109
+ elif isinstance(configuration, dict):
110
+ # Local import to avoid circular import at module import time
111
+ from unique_toolkit.agentic.tools.factory import ToolFactory
112
+
113
+ config = ToolFactory.build_tool_config(
114
+ value["name"],
115
+ **configuration,
168
116
  )
169
- value["is_enabled"] = False
170
- value["isEnabled"] = False
171
- _ensure_base_tool_config(value)
172
- return value
117
+ else:
118
+ # Check that the type of config matches the tool name
119
+ from unique_toolkit.agentic.tools.factory import ToolFactory
173
120
 
121
+ assert isinstance(
122
+ configuration,
123
+ ToolFactory.tool_config_map[value["name"]], # pyright: ignore[reportArgumentType]
124
+ )
125
+ config = configuration
174
126
  value["configuration"] = config
175
127
  return value
@@ -1,7 +1,3 @@
1
- from unique_toolkit.agentic.tools.experimental.ask_user_tool import (
2
- AskUserTool,
3
- AskUserToolConfig,
4
- )
5
1
  from unique_toolkit.agentic.tools.experimental.open_file_tool import (
6
2
  OpenFileTool,
7
3
  OpenFileToolRuntime,
@@ -23,8 +19,6 @@ from unique_toolkit.agentic.tools.experimental.todo import (
23
19
  )
24
20
 
25
21
  __all__ = [
26
- "AskUserTool",
27
- "AskUserToolConfig",
28
22
  "DisplayMode",
29
23
  "OpenFileTool",
30
24
  "OpenFileToolRuntime",