unique-toolkit 2026.20.0.dev28__tar.gz → 2026.20.0.dev30__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 (365) hide show
  1. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/PKG-INFO +2 -2
  2. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/pyproject.toml +2 -2
  3. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +9 -1
  4. unique_toolkit-2026.20.0.dev30/unique_toolkit/_common/metadata_filter_scope.py +47 -0
  5. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/pydantic_helpers.py +6 -1
  6. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/history_manager/history_manager.py +1 -5
  7. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/app/schemas.py +21 -0
  8. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/components/__init__.py +3 -0
  9. unique_toolkit-2026.20.0.dev30/unique_toolkit/experimental/components/_base.py +147 -0
  10. unique_toolkit-2026.20.0.dev30/unique_toolkit/experimental/components/internal_search/__init__.py +97 -0
  11. unique_toolkit-2026.20.0.dev30/unique_toolkit/experimental/components/internal_search/base/__init__.py +37 -0
  12. unique_toolkit-2026.20.0.dev30/unique_toolkit/experimental/components/internal_search/base/config.py +72 -0
  13. unique_toolkit-2026.20.0.dev30/unique_toolkit/experimental/components/internal_search/base/schemas.py +56 -0
  14. unique_toolkit-2026.20.0.dev30/unique_toolkit/experimental/components/internal_search/base/service.py +189 -0
  15. unique_toolkit-2026.20.0.dev30/unique_toolkit/experimental/components/internal_search/base/utils.py +183 -0
  16. unique_toolkit-2026.20.0.dev30/unique_toolkit/experimental/components/internal_search/chat/__init__.py +9 -0
  17. unique_toolkit-2026.20.0.dev30/unique_toolkit/experimental/components/internal_search/chat/config.py +27 -0
  18. unique_toolkit-2026.20.0.dev30/unique_toolkit/experimental/components/internal_search/chat/schemas.py +15 -0
  19. unique_toolkit-2026.20.0.dev30/unique_toolkit/experimental/components/internal_search/chat/service.py +61 -0
  20. unique_toolkit-2026.20.0.dev30/unique_toolkit/experimental/components/internal_search/knowledge_base/__init__.py +15 -0
  21. unique_toolkit-2026.20.0.dev30/unique_toolkit/experimental/components/internal_search/knowledge_base/config.py +61 -0
  22. unique_toolkit-2026.20.0.dev30/unique_toolkit/experimental/components/internal_search/knowledge_base/schemas.py +41 -0
  23. unique_toolkit-2026.20.0.dev30/unique_toolkit/experimental/components/internal_search/knowledge_base/service.py +119 -0
  24. unique_toolkit-2026.20.0.dev30/unique_toolkit/experimental/components/internal_search/post_processing/__init__.py +52 -0
  25. unique_toolkit-2026.20.0.dev30/unique_toolkit/experimental/components/internal_search/post_processing/config.py +61 -0
  26. unique_toolkit-2026.20.0.dev30/unique_toolkit/experimental/components/internal_search/post_processing/service.py +199 -0
  27. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/services/chat_service.py +67 -0
  28. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/services/factory.py +21 -5
  29. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/services/knowledge_base.py +38 -34
  30. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/README.md +0 -0
  31. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/__init__.py +0 -0
  32. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/__init__.py +0 -0
  33. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/_base_service.py +0 -0
  34. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/_time_utils.py +0 -0
  35. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  36. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  37. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  38. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  39. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  40. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  41. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/config_checker/README.md +0 -0
  42. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/config_checker/__init__.py +0 -0
  43. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/config_checker/__main__.py +0 -0
  44. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/config_checker/cli.py +0 -0
  45. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/config_checker/differ.py +0 -0
  46. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/config_checker/exporter.py +0 -0
  47. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/config_checker/models.py +0 -0
  48. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/config_checker/registry.py +0 -0
  49. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/config_checker/validator.py +0 -0
  50. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/default_language_model.py +0 -0
  51. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
  52. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/docx_generator/config.py +0 -0
  53. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
  54. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
  55. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/docx_generator/service.py +0 -0
  56. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
  57. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/endpoint_builder.py +0 -0
  58. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  59. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/event_bus.py +0 -0
  60. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/exception.py +0 -0
  61. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/execution.py +0 -0
  62. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
  63. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
  64. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
  65. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
  66. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
  67. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
  68. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
  69. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
  70. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
  71. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
  72. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
  73. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
  74. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
  75. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
  76. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
  77. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
  78. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
  79. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
  80. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
  81. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
  82. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
  83. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
  84. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
  85. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
  86. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
  87. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
  88. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
  89. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  90. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  91. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/referencing.py +0 -0
  92. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/string_utilities.py +0 -0
  93. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/tests/test_referencing.py +0 -0
  94. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
  95. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/token/__init__.py +0 -0
  96. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  97. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/token/token_counting.py +0 -0
  98. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
  99. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
  100. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/utils/__init__.py +0 -0
  101. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/utils/files.py +0 -0
  102. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/utils/image/encode.py +0 -0
  103. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
  104. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/utils/jinja/render.py +0 -0
  105. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
  106. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
  107. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  108. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  109. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  110. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/validate_required_values.py +0 -0
  111. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/_common/validators.py +0 -0
  112. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/__init__.py +0 -0
  113. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
  114. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
  115. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/config.py +0 -0
  116. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
  117. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
  118. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
  119. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  120. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
  121. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
  122. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  123. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  124. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
  125. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
  126. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
  127. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
  128. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  129. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
  130. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  131. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
  132. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
  133. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
  134. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  135. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
  136. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -0
  137. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  138. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
  139. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/evaluation/utils.py +0 -0
  140. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
  141. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/feature_flags/feature_flags.py +0 -0
  142. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  143. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
  144. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  145. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/loop_runner/__init__.py +0 -0
  146. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
  147. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
  148. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
  149. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
  150. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/loop_runner/base.py +0 -0
  151. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
  152. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
  153. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +0 -0
  154. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
  155. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
  156. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
  157. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
  158. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
  159. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
  160. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
  161. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
  162. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
  163. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
  164. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/message_log_order.py +0 -0
  165. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
  166. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  167. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
  168. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
  169. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
  170. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
  171. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  172. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  173. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/__init__.py +0 -0
  174. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  175. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  176. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  177. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  178. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  179. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
  180. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  181. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  182. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  183. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
  184. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
  185. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  186. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
  187. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
  188. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  189. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
  190. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
  191. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  192. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
  193. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
  194. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  195. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  196. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  197. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  198. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  199. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
  200. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  201. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/config.py +0 -0
  202. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/experimental/__init__.py +0 -0
  203. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/experimental/open_file_tool/__init__.py +0 -0
  204. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/experimental/open_file_tool/config.py +0 -0
  205. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/experimental/open_file_tool/runtime.py +0 -0
  206. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/experimental/open_file_tool/tool.py +0 -0
  207. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/__init__.py +0 -0
  208. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/config.py +0 -0
  209. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/tool.py +0 -0
  210. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/experimental/todo/__init__.py +0 -0
  211. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/experimental/todo/config.py +0 -0
  212. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/experimental/todo/prompts/__init__.py +0 -0
  213. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/experimental/todo/prompts/execution_reminder.j2 +0 -0
  214. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/experimental/todo/prompts/system_prompt.j2 +0 -0
  215. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/experimental/todo/prompts/tool_description.j2 +0 -0
  216. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/experimental/todo/prompts/verification_nudge.j2 +0 -0
  217. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/experimental/todo/schemas.py +0 -0
  218. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/experimental/todo/service.py +0 -0
  219. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/factory.py +0 -0
  220. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  221. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  222. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  223. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
  224. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
  225. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
  226. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
  227. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
  228. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
  229. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +0 -0
  230. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +0 -0
  231. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +0 -0
  232. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +0 -0
  233. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
  234. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/schemas.py +0 -0
  235. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  236. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  237. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/tool.py +0 -0
  238. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
  239. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  240. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  241. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  242. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  243. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  244. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  245. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic_table/__init__.py +0 -0
  246. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic_table/schemas.py +0 -0
  247. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/agentic_table/service.py +0 -0
  248. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/app/__init__.py +0 -0
  249. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/app/chat_event_filter_options_settings.py +0 -0
  250. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/app/dev_util.py +0 -0
  251. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/app/fast_api_factory.py +0 -0
  252. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/app/feature_flags.py +0 -0
  253. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/app/find_env_file.py +0 -0
  254. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/app/init_logging.py +0 -0
  255. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/app/init_sdk.py +0 -0
  256. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/app/performance/async_tasks.py +0 -0
  257. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  258. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/app/unique_settings.py +0 -0
  259. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/app/verification.py +0 -0
  260. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/app/webhook.py +0 -0
  261. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/chat/__init__.py +0 -0
  262. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/chat/cancellation.py +0 -0
  263. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/chat/constants.py +0 -0
  264. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/chat/deprecated/service.py +0 -0
  265. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/chat/functions.py +0 -0
  266. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/chat/rendering.py +0 -0
  267. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/chat/responses_api.py +0 -0
  268. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/chat/schemas.py +0 -0
  269. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/chat/service.py +0 -0
  270. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/chat/state.py +0 -0
  271. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/chat/utils.py +0 -0
  272. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/content/__init__.py +0 -0
  273. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/content/constants.py +0 -0
  274. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/content/functions.py +0 -0
  275. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/content/schemas.py +0 -0
  276. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/content/service.py +0 -0
  277. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/content/smart_rules.py +0 -0
  278. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/content/utils.py +0 -0
  279. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/data_extraction/README.md +0 -0
  280. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/data_extraction/__init__.py +0 -0
  281. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
  282. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/data_extraction/augmented/service.py +0 -0
  283. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/data_extraction/base.py +0 -0
  284. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
  285. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/data_extraction/basic/config.py +0 -0
  286. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
  287. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/data_extraction/basic/service.py +0 -0
  288. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/elicitation/__init__.py +0 -0
  289. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/elicitation/constants.py +0 -0
  290. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/elicitation/exceptions.py +0 -0
  291. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/elicitation/functions.py +0 -0
  292. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/elicitation/schemas.py +0 -0
  293. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/elicitation/service.py +0 -0
  294. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/embedding/__init__.py +0 -0
  295. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/embedding/constants.py +0 -0
  296. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/embedding/functions.py +0 -0
  297. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/embedding/schemas.py +0 -0
  298. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/embedding/service.py +0 -0
  299. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/embedding/utils.py +0 -0
  300. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/README.md +0 -0
  301. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/__init__.py +0 -0
  302. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/_internal/__init__.py +0 -0
  303. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/components/content_tree/__init__.py +0 -0
  304. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/components/content_tree/functions.py +0 -0
  305. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/components/content_tree/schemas.py +0 -0
  306. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/components/content_tree/service.py +0 -0
  307. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/content_tree/__init__.py +0 -0
  308. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/identity/__init__.py +0 -0
  309. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/integrations/__init__.py +0 -0
  310. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/__init__.py +0 -0
  311. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/content_folder/__init__.py +0 -0
  312. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/content_folder/functions.py +0 -0
  313. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/content_folder/schemas.py +0 -0
  314. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/content_folder/service.py +0 -0
  315. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/facades/__init__.py +0 -0
  316. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/facades/identity/__init__.py +0 -0
  317. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/facades/identity/service.py +0 -0
  318. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/group/__init__.py +0 -0
  319. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/group/functions.py +0 -0
  320. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/group/schemas.py +0 -0
  321. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/group/service.py +0 -0
  322. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/scheduled_task/__init__.py +0 -0
  323. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/scheduled_task/cron.py +0 -0
  324. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/scheduled_task/functions.py +0 -0
  325. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/scheduled_task/schemas.py +0 -0
  326. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/scheduled_task/service.py +0 -0
  327. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/user/__init__.py +0 -0
  328. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/user/functions.py +0 -0
  329. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/user/schemas.py +0 -0
  330. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/resources/user/service.py +0 -0
  331. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/experimental/testing/__init__.py +0 -0
  332. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/framework_utilities/__init__.py +0 -0
  333. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
  334. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  335. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  336. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  337. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  338. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  339. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/framework_utilities/utils.py +0 -0
  340. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/language_model/__init__.py +0 -0
  341. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
  342. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/language_model/builder.py +0 -0
  343. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/language_model/constants.py +0 -0
  344. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/language_model/default_language_model.py +0 -0
  345. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/language_model/functions.py +0 -0
  346. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/language_model/infos.py +0 -0
  347. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/language_model/prompt.py +0 -0
  348. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/language_model/reference.py +0 -0
  349. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/language_model/schemas.py +0 -0
  350. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/language_model/service.py +0 -0
  351. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/language_model/stream_transform.py +0 -0
  352. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/language_model/utils.py +0 -0
  353. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/monitoring/__init__.py +0 -0
  354. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/monitoring/middleware.py +0 -0
  355. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/monitoring/registry.py +0 -0
  356. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/protocols/support.py +0 -0
  357. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/services/__init__.py +0 -0
  358. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/short_term_memory/__init__.py +0 -0
  359. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/short_term_memory/constants.py +0 -0
  360. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/short_term_memory/functions.py +0 -0
  361. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/short_term_memory/schemas.py +0 -0
  362. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/short_term_memory/service.py +0 -0
  363. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/smart_rules/__init__.py +0 -0
  364. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/unique_toolkit/smart_rules/compile.py +0 -0
  365. {unique_toolkit-2026.20.0.dev28 → unique_toolkit-2026.20.0.dev30}/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.20.0.dev28
3
+ Version: 2026.20.0.dev30
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.20.0.dev23,<2026.20.0rc0
19
+ Requires-Dist: unique-sdk>=2026.20.0.dev25,<2026.20.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.20.0.dev28"
3
+ version = "2026.20.0.dev30"
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.20.0.dev23,<2026.20.0rc0",
31
+ "unique-sdk>=2026.20.0.dev25,<2026.20.0rc0",
32
32
  "jambo>=0.1.2,<0.2",
33
33
  "jinja2>=3.1.6,<4",
34
34
  "docxtpl>=0.20.1,<0.21",
@@ -3,7 +3,7 @@ import time
3
3
  from collections import Counter
4
4
  from typing import Any, overload
5
5
 
6
- from typing_extensions import deprecated
6
+ from typing_extensions import Self, deprecated
7
7
 
8
8
  from unique_toolkit._common.chunk_relevancy_sorter.config import (
9
9
  ChunkRelevancySortConfig,
@@ -39,6 +39,7 @@ from unique_toolkit.agentic.evaluation.schemas import (
39
39
  )
40
40
  from unique_toolkit.app.performance.async_tasks import run_async_tasks_parallel
41
41
  from unique_toolkit.app.schemas import BaseEvent, ChatEvent
42
+ from unique_toolkit.app.unique_settings import UniqueSettings
42
43
  from unique_toolkit.content.schemas import ContentChunk
43
44
  from unique_toolkit.language_model.infos import LanguageModelInfo
44
45
 
@@ -84,6 +85,13 @@ class ChunkRelevancySorter:
84
85
  def from_event(cls, event: ChatEvent | BaseEvent[Any]):
85
86
  return cls(company_id=event.company_id, user_id=event.user_id)
86
87
 
88
+ @classmethod
89
+ def from_settings(cls, settings: UniqueSettings) -> Self:
90
+ return cls(
91
+ company_id=settings.authcontext.get_confidential_company_id(),
92
+ user_id=settings.authcontext.get_confidential_user_id(),
93
+ )
94
+
87
95
  async def run(
88
96
  self,
89
97
  input_text: str,
@@ -0,0 +1,47 @@
1
+ """UniqueQL helpers for KB ``folderId`` / ``metadata_filter`` scoping."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Mapping
6
+ from typing import Any
7
+
8
+ from unique_toolkit.content.smart_rules import (
9
+ Operator,
10
+ Statement,
11
+ )
12
+
13
+ _UQL_AND = "and"
14
+
15
+
16
+ def build_folder_id_in_clause(scope_ids: list[str]) -> dict[str, Any]:
17
+ """UniqueQL for selected folders using ``folderId in [scope_ids]``.
18
+
19
+ Equivalent to passing ``scope_ids`` directly to the wire-level search API.
20
+ """
21
+ if not scope_ids:
22
+ raise ValueError("scope_ids must be a non-empty list")
23
+ return Statement(
24
+ operator=Operator.IN,
25
+ path=["folderId"],
26
+ value=scope_ids,
27
+ ).model_dump(mode="json")
28
+
29
+
30
+ def merge_scope_clause_into_metadata_filter(
31
+ scope_clause: Mapping[str, Any],
32
+ metadata_filter: dict[str, Any] | None,
33
+ ) -> dict[str, Any]:
34
+ """AND-merge *scope_clause* with *metadata_filter*, flattening a top-level ``and``."""
35
+ scope_dict = dict(scope_clause)
36
+ if not metadata_filter:
37
+ return scope_dict
38
+ inner_and = metadata_filter.get(_UQL_AND)
39
+ if isinstance(inner_and, list):
40
+ return {_UQL_AND: [scope_dict, *inner_and]}
41
+ return {_UQL_AND: [scope_dict, dict(metadata_filter)]}
42
+
43
+
44
+ __all__ = [
45
+ "build_folder_id_in_clause",
46
+ "merge_scope_clause_into_metadata_filter",
47
+ ]
@@ -1,6 +1,6 @@
1
1
  import logging
2
2
  import warnings
3
- from typing import Any, TypeVar, Unpack
3
+ from typing import Annotated, Any, TypeVar, Unpack
4
4
 
5
5
  import humps
6
6
  from pydantic import BaseModel, BeforeValidator, ConfigDict, Field, create_model
@@ -33,6 +33,11 @@ BeforeValidator to replace an incoming None with the field's declared default.
33
33
  """
34
34
  NoneToDefault = BeforeValidator(_none_to_default)
35
35
 
36
+ DeactivatedNone = Annotated[
37
+ None,
38
+ Field(title="Deactivated", description="None"),
39
+ ]
40
+
36
41
 
37
42
  def get_configuration_dict(**kwargs: Unpack[ConfigDict]) -> ConfigDict:
38
43
  base: dict[str, object] = {
@@ -8,6 +8,7 @@ from pydantic import BaseModel, Field
8
8
  from unique_toolkit._common.feature_flags.schema import (
9
9
  FeatureExtendedSourceSerialization,
10
10
  )
11
+ from unique_toolkit._common.pydantic_helpers import DeactivatedNone
11
12
  from unique_toolkit._common.validators import LMI
12
13
  from unique_toolkit.agentic.history_manager.loop_token_reducer import LoopTokenReducer
13
14
  from unique_toolkit.agentic.history_manager.utils import (
@@ -30,11 +31,6 @@ from unique_toolkit.language_model.schemas import (
30
31
  LanguageModelToolMessage,
31
32
  )
32
33
 
33
- DeactivatedNone = Annotated[
34
- None,
35
- Field(title="Deactivated", description="None"),
36
- ]
37
-
38
34
 
39
35
  class UploadedContentConfig(BaseModel):
40
36
  model_config = get_configuration_dict()
@@ -215,6 +215,20 @@ class Correlation(BaseModel):
215
215
  parent_assistant_id: str
216
216
 
217
217
 
218
+ class ChatEventSkillChoice(BaseModel):
219
+ model_config = model_config
220
+
221
+ name: str = Field(default="", description="Skill name.")
222
+ scope_id: str = Field(
223
+ default="",
224
+ description="Knowledge base scope ID that contains the skill file.",
225
+ )
226
+ content_id: str = Field(
227
+ default="",
228
+ description="Knowledge base content ID of the ``SKILL.md`` file.",
229
+ )
230
+
231
+
218
232
  class ChatEventPayload(BaseModel):
219
233
  model_config = model_config
220
234
 
@@ -234,6 +248,13 @@ class ChatEventPayload(BaseModel):
234
248
  default_factory=list,
235
249
  description="A list containing the tool names the user has chosen to be activated.",
236
250
  )
251
+ skill_choices: list[ChatEventSkillChoice] = Field(
252
+ default_factory=list,
253
+ description=(
254
+ "A list containing selected skills with ``scope_id``, "
255
+ "``content_id``, and ``name``."
256
+ ),
257
+ )
237
258
  disabled_tools: list[str] = Field(
238
259
  default_factory=list,
239
260
  description="A list containing the tool names of tools that are disabled at the company level",
@@ -24,4 +24,7 @@ Planned contents (current home → new home):
24
24
  (re-export: :mod:`unique_toolkit.experimental.content_tree`); a derived
25
25
  tree/fuzzy-search view over the ``content`` resource; does not wrap an SDK
26
26
  endpoint of its own
27
+ * ``internal_search`` ← :mod:`unique_toolkit.experimental.components.internal_search`
28
+ (UN-19039 / UN-20075); pure-retrieval KB and chat search services plus an
29
+ optional post-processing pipeline (:class:`InternalSearchPostProcessor`)
27
30
  """
@@ -0,0 +1,147 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ from abc import ABC, abstractmethod
5
+ from functools import cached_property
6
+ from pathlib import Path
7
+ from typing import Generic, TypeVar
8
+
9
+ from pydantic import BaseModel
10
+ from typing_extensions import Self
11
+
12
+ from unique_toolkit._common.event_bus import TypedEventBus
13
+ from unique_toolkit.app.unique_settings import UniqueContext, UniqueSettings
14
+
15
+ RunResult = TypeVar("RunResult", bound=BaseModel)
16
+ Config = TypeVar("Config", bound=BaseModel)
17
+ Context = TypeVar("Context")
18
+ ServiceState = TypeVar("ServiceState")
19
+ ProgressMessage = TypeVar("ProgressMessage")
20
+ Deps = TypeVar("Deps")
21
+
22
+
23
+ class _RunMixin(ABC, Generic[RunResult]):
24
+ @abstractmethod
25
+ async def run(self) -> RunResult: ...
26
+
27
+
28
+ class _ConfigMixin(ABC, Generic[Config]):
29
+ """Subclasses must set ``_config_model_cls`` so ``from_json`` can deserialize."""
30
+
31
+ _config_model_cls: type[Config]
32
+
33
+ @classmethod
34
+ @abstractmethod
35
+ def from_config(cls, config: Config) -> Self: ...
36
+
37
+ @property
38
+ @abstractmethod
39
+ def config(self) -> Config: ...
40
+
41
+ @classmethod
42
+ def from_json(cls, file_path: Path) -> Self:
43
+ parsed = cls._config_model_cls.model_validate_json(file_path.read_text())
44
+ return cls.from_config(parsed)
45
+
46
+
47
+ class _ContextMixin(ABC, Generic[Context]):
48
+ @property
49
+ @abstractmethod
50
+ def context(self) -> Context: ...
51
+
52
+
53
+ class _StateMixin(ABC, Generic[ServiceState]):
54
+ @property
55
+ @abstractmethod
56
+ def state(self) -> ServiceState: ...
57
+
58
+ @abstractmethod
59
+ def reset_state(self) -> None: ...
60
+
61
+
62
+ class _ProgressMixin(Generic[ProgressMessage]):
63
+ """Concrete by default — no-op bus unless something subscribes."""
64
+
65
+ def __init__(self) -> None:
66
+ super().__init__()
67
+ self._progress_publisher: TypedEventBus[ProgressMessage] = TypedEventBus()
68
+
69
+ @property
70
+ def progress_publisher(self) -> TypedEventBus[ProgressMessage]:
71
+ return self._progress_publisher
72
+
73
+ async def post_progress_message(self, message: ProgressMessage) -> None:
74
+ await self.progress_publisher.publish_and_wait_async(message)
75
+
76
+
77
+ class _DependenciesMixin(ABC, Generic[Deps]):
78
+ @property
79
+ @abstractmethod
80
+ def dependencies(self) -> Deps: ...
81
+
82
+
83
+ class BaseService( # pyright: ignore[reportImplicitAbstractClass]
84
+ _RunMixin[RunResult],
85
+ _ConfigMixin[Config],
86
+ _ContextMixin[UniqueContext],
87
+ _StateMixin[ServiceState],
88
+ _ProgressMixin[ProgressMessage],
89
+ _DependenciesMixin[Deps],
90
+ Generic[RunResult, Config, ServiceState, ProgressMessage, Deps],
91
+ ):
92
+ """
93
+ Two-step init: from_config() at startup, bind_settings() per request.
94
+
95
+ service = MyService.from_config(config) # startup
96
+ service = service.bind_settings(settings) # per request
97
+ # or in one shot:
98
+ service = MyService.from_settings(settings, config=config)
99
+ """
100
+
101
+ _config: Config
102
+ _context: UniqueContext
103
+ _state: ServiceState
104
+ _dependencies: Deps
105
+
106
+ @abstractmethod
107
+ def bind_settings(self, settings: UniqueSettings) -> Self: ...
108
+
109
+ @classmethod
110
+ def from_settings(cls, settings: UniqueSettings, **kwargs) -> Self:
111
+ config = kwargs.pop("config")
112
+ return cls.from_config(config).bind_settings(settings)
113
+
114
+ @property
115
+ def config(self) -> Config:
116
+ return self._config # type: ignore[attr-defined]
117
+
118
+ @property
119
+ def context(self) -> UniqueContext:
120
+ return self._context # type: ignore[attr-defined]
121
+
122
+ @context.setter
123
+ def context(self, value: UniqueContext) -> None:
124
+ self._context = value
125
+
126
+ @property
127
+ def state(self) -> ServiceState:
128
+ return self._state # type: ignore[attr-defined]
129
+
130
+ @state.setter
131
+ def state(self, value: ServiceState) -> None:
132
+ self._state = value
133
+
134
+ @property
135
+ def dependencies(self) -> Deps:
136
+ return self._dependencies # type: ignore[attr-defined]
137
+
138
+ @dependencies.setter
139
+ def dependencies(self, value: Deps) -> None:
140
+ self._dependencies = value
141
+
142
+ @cached_property
143
+ def logger(self) -> logging.Logger:
144
+ return logging.getLogger(f"{type(self).__module__}.{type(self).__qualname__}")
145
+
146
+
147
+ __all__ = ["BaseService"]
@@ -0,0 +1,97 @@
1
+ """Internal search component — retrieval services and post-processing pipeline.
2
+
3
+ !!! warning "Experimental"
4
+ This subpackage lives under :mod:`unique_toolkit.experimental` and its
5
+ API may change between minor releases.
6
+
7
+ Provides framework-agnostic knowledge-base and chat search services, plus an
8
+ optional post-processing pipeline for reranking and token-budget windowing.
9
+
10
+ The search services are pure retrieval primitives: they return all matching
11
+ chunks up to the configured ``limit``. Post-retrieval steps (reranking, token
12
+ windowing, sorting) are handled separately by
13
+ :class:`InternalSearchPostProcessor`.
14
+
15
+ Typical usage::
16
+
17
+ from unique_toolkit.experimental.components.internal_search import (
18
+ KnowledgeBaseInternalSearchService,
19
+ KnowledgeBaseInternalSearchConfig,
20
+ InternalSearchFilterConfig,
21
+ InternalSearchPostProcessor,
22
+ PostProcessorConfig,
23
+ )
24
+
25
+ search_config = KnowledgeBaseInternalSearchConfig(
26
+ filtering=InternalSearchFilterConfig(limit=200),
27
+ ...,
28
+ )
29
+ post_config = PostProcessorConfig(max_tokens_for_sources=30_000, ...)
30
+
31
+ search_service = KnowledgeBaseInternalSearchService.from_config(search_config)
32
+ processor = InternalSearchPostProcessor.from_settings(settings, config=post_config)
33
+
34
+ search_service.bind_settings(settings)
35
+ search_service.state.search_queries = ["my query"]
36
+ result = await search_service.run()
37
+
38
+ chunks = await processor.process(
39
+ result,
40
+ query_text="my query",
41
+ model_info=model_info,
42
+ )
43
+ """
44
+
45
+ from unique_toolkit.experimental.components.internal_search.base import (
46
+ DEFAULT_LIMIT,
47
+ InternalSearchBaseService,
48
+ InternalSearchConfig,
49
+ InternalSearchProgressMessage,
50
+ InternalSearchResult,
51
+ InternalSearchStage,
52
+ InternalSearchState,
53
+ SearchStringResult,
54
+ TInternalSearchDeps,
55
+ )
56
+ from unique_toolkit.experimental.components.internal_search.chat import (
57
+ ChatInternalSearchConfig,
58
+ ChatInternalSearchDeps,
59
+ ChatInternalSearchService,
60
+ )
61
+ from unique_toolkit.experimental.components.internal_search.knowledge_base import (
62
+ UNSET,
63
+ KnowledgeBaseInternalSearchConfig,
64
+ KnowledgeBaseInternalSearchDeps,
65
+ KnowledgeBaseInternalSearchService,
66
+ KnowledgeBaseInternalSearchState,
67
+ )
68
+ from unique_toolkit.experimental.components.internal_search.post_processing import (
69
+ InternalSearchPostProcessor,
70
+ PostProcessorConfig,
71
+ )
72
+
73
+ __all__ = [
74
+ # base
75
+ "DEFAULT_LIMIT",
76
+ "InternalSearchBaseService",
77
+ "InternalSearchConfig",
78
+ "InternalSearchProgressMessage",
79
+ "InternalSearchResult",
80
+ "InternalSearchStage",
81
+ "InternalSearchState",
82
+ "SearchStringResult",
83
+ "TInternalSearchDeps",
84
+ # chat
85
+ "ChatInternalSearchConfig",
86
+ "ChatInternalSearchDeps",
87
+ "ChatInternalSearchService",
88
+ # knowledge base
89
+ "KnowledgeBaseInternalSearchConfig",
90
+ "KnowledgeBaseInternalSearchDeps",
91
+ "KnowledgeBaseInternalSearchService",
92
+ "KnowledgeBaseInternalSearchState",
93
+ "UNSET",
94
+ # post-processing
95
+ "InternalSearchPostProcessor",
96
+ "PostProcessorConfig",
97
+ ]
@@ -0,0 +1,37 @@
1
+ from .config import (
2
+ DEFAULT_LIMIT,
3
+ InternalSearchConfig,
4
+ InternalSearchFilterConfig,
5
+ InternalSearchSearchConfig,
6
+ )
7
+ from .schemas import (
8
+ InternalSearchProgressMessage,
9
+ InternalSearchResult,
10
+ InternalSearchStage,
11
+ InternalSearchState,
12
+ SearchStringResult,
13
+ TInternalSearchDeps,
14
+ )
15
+ from .service import InternalSearchBaseService
16
+ from .utils import (
17
+ append_metadata_in_chunks,
18
+ clean_search_string,
19
+ interleave_search_results_round_robin,
20
+ )
21
+
22
+ __all__ = [
23
+ "append_metadata_in_chunks",
24
+ "clean_search_string",
25
+ "DEFAULT_LIMIT",
26
+ "InternalSearchBaseService",
27
+ "InternalSearchConfig",
28
+ "InternalSearchFilterConfig",
29
+ "InternalSearchProgressMessage",
30
+ "InternalSearchResult",
31
+ "InternalSearchSearchConfig",
32
+ "InternalSearchStage",
33
+ "InternalSearchState",
34
+ "interleave_search_results_round_robin",
35
+ "SearchStringResult",
36
+ "TInternalSearchDeps",
37
+ ]
@@ -0,0 +1,72 @@
1
+ from pydantic import BaseModel, Field
2
+
3
+ from unique_toolkit._common.config_checker import register_config
4
+ from unique_toolkit.agentic.tools.config import get_configuration_dict
5
+ from unique_toolkit.content.schemas import ContentSearchType
6
+
7
+ # 200 matches the tool's sort-enabled default — conservative by design.
8
+ # Callers who need higher recall (e.g. multi-query with post-processing) should set
9
+ # limit explicitly in config. The service does not cap by token budget; that is the
10
+ # post-processor's job via pick_content_chunks_for_token_window.
11
+ DEFAULT_LIMIT = 200
12
+
13
+
14
+ class InternalSearchSearchConfig(BaseModel):
15
+ model_config = get_configuration_dict()
16
+
17
+ search_type: ContentSearchType = Field(
18
+ default=ContentSearchType.COMBINED,
19
+ description="The type of search to perform. Two possible values: `COMBINED` or `VECTOR`.",
20
+ )
21
+ search_language: str = Field(
22
+ default="english",
23
+ description="The language to use for the search.",
24
+ )
25
+ max_search_strings: int = Field(
26
+ default=10,
27
+ ge=1,
28
+ description="The maximum number of search strings to perform in a single tool call.",
29
+ )
30
+
31
+
32
+ class InternalSearchFilterConfig(BaseModel):
33
+ model_config = get_configuration_dict()
34
+
35
+ score_threshold: float = Field(
36
+ default=0.0,
37
+ ge=0.0,
38
+ le=1.0,
39
+ description="Score threshold to filter chunks on relevancy.",
40
+ )
41
+ limit: int = Field(
42
+ default=DEFAULT_LIMIT,
43
+ description=(
44
+ "Maximum number of chunks to return per search query. "
45
+ "Default is 200 — the conservative baseline. Increase for higher recall "
46
+ "when a post-processor with token windowing follows."
47
+ ),
48
+ )
49
+
50
+
51
+ @register_config()
52
+ class InternalSearchConfig(BaseModel):
53
+ """Retrieval-only config. Token budgeting, reranking and sorting live in PostProcessorConfig."""
54
+
55
+ model_config = get_configuration_dict()
56
+
57
+ search: InternalSearchSearchConfig = Field(
58
+ default_factory=InternalSearchSearchConfig,
59
+ description="Search-related configuration such as query mode, language, and multi-query settings.",
60
+ )
61
+ filtering: InternalSearchFilterConfig = Field(
62
+ default_factory=InternalSearchFilterConfig,
63
+ description="Result filtering configuration such as retrieval limit and score threshold.",
64
+ )
65
+
66
+
67
+ __all__ = [
68
+ "InternalSearchConfig",
69
+ "DEFAULT_LIMIT",
70
+ "InternalSearchFilterConfig",
71
+ "InternalSearchSearchConfig",
72
+ ]
@@ -0,0 +1,56 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from enum import StrEnum
5
+ from typing import Any
6
+
7
+ from pydantic import BaseModel, Field
8
+ from typing_extensions import TypeVar
9
+
10
+ from unique_toolkit.chat.schemas import MessageLogStatus
11
+ from unique_toolkit.content.schemas import ContentChunk
12
+
13
+
14
+ class SearchStringResult(BaseModel):
15
+ query: str
16
+ chunks: list[ContentChunk]
17
+
18
+
19
+ class InternalSearchStage(StrEnum):
20
+ RETRIEVING = "retrieving"
21
+ POSTPROCESSING = "postprocessing"
22
+ COMPLETED = "completed"
23
+
24
+
25
+ class InternalSearchProgressMessage(BaseModel):
26
+ stage: InternalSearchStage
27
+ status: MessageLogStatus
28
+ search_queries: list[str]
29
+ chunks: list[ContentChunk] | None = None
30
+
31
+
32
+ TInternalSearchDeps = TypeVar("TInternalSearchDeps")
33
+
34
+
35
+ @dataclass
36
+ class InternalSearchState:
37
+ search_queries: list[str]
38
+ content_ids: list[str] | None = None
39
+
40
+
41
+ class InternalSearchResult(BaseModel):
42
+ chunks: list[ContentChunk]
43
+ """Interleaved flat chunk list — for callers that skip the post-processor."""
44
+ debug_info: dict[str, Any]
45
+ search_string_results: list[SearchStringResult] = Field(default_factory=list)
46
+ """Per-query results before interleaving — for the post-processor's per-query rerank."""
47
+
48
+
49
+ __all__ = [
50
+ "InternalSearchProgressMessage",
51
+ "InternalSearchResult",
52
+ "InternalSearchStage",
53
+ "InternalSearchState",
54
+ "SearchStringResult",
55
+ "TInternalSearchDeps",
56
+ ]