unique_toolkit 1.71.2__tar.gz → 1.72.0__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 (300) hide show
  1. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/PKG-INFO +1 -1
  2. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/pyproject.toml +1 -1
  3. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/app/__init__.py +2 -0
  4. unique_toolkit-1.72.0/unique_toolkit/app/chat_event_filter_options_settings.py +11 -0
  5. unique_toolkit-1.72.0/unique_toolkit/app/feature_flags.py +100 -0
  6. unique_toolkit-1.72.0/unique_toolkit/app/find_env_file.py +70 -0
  7. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/app/schemas.py +39 -0
  8. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/app/unique_settings.py +38 -58
  9. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/content/functions.py +43 -4
  10. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/services/knowledge_base.py +182 -45
  11. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/README.md +0 -0
  12. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/__init__.py +0 -0
  13. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/__init__.py +0 -0
  14. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/_base_service.py +0 -0
  15. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/_time_utils.py +0 -0
  16. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  17. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  18. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  19. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  20. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  21. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  22. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  23. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/config_checker/README.md +0 -0
  24. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/config_checker/__init__.py +0 -0
  25. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/config_checker/__main__.py +0 -0
  26. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/config_checker/cli.py +0 -0
  27. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/config_checker/differ.py +0 -0
  28. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/config_checker/exporter.py +0 -0
  29. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/config_checker/models.py +0 -0
  30. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/config_checker/registry.py +0 -0
  31. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/config_checker/validator.py +0 -0
  32. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/default_language_model.py +0 -0
  33. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
  34. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/docx_generator/config.py +0 -0
  35. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
  36. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
  37. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/docx_generator/service.py +0 -0
  38. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
  39. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/endpoint_builder.py +0 -0
  40. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  41. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/event_bus.py +0 -0
  42. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/exception.py +0 -0
  43. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/execution.py +0 -0
  44. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
  45. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
  46. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
  47. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
  48. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
  49. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
  50. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
  51. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
  52. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
  53. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
  54. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
  55. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
  56. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
  57. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
  58. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
  59. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
  60. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
  61. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
  62. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
  63. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
  64. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
  65. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
  66. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
  67. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
  68. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
  69. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
  70. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
  71. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  72. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  73. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  74. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/referencing.py +0 -0
  75. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/string_utilities.py +0 -0
  76. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/tests/test_referencing.py +0 -0
  77. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
  78. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/token/__init__.py +0 -0
  79. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  80. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/token/token_counting.py +0 -0
  81. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
  82. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
  83. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/utils/__init__.py +0 -0
  84. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/utils/files.py +0 -0
  85. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/utils/image/encode.py +0 -0
  86. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
  87. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/utils/jinja/render.py +0 -0
  88. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
  89. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
  90. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  91. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  92. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  93. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/validate_required_values.py +0 -0
  94. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/_common/validators.py +0 -0
  95. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/__init__.py +0 -0
  96. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
  97. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
  98. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/config.py +0 -0
  99. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
  100. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
  101. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
  102. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  103. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
  104. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
  105. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  106. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  107. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
  108. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
  109. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
  110. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
  111. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  112. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
  113. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  114. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
  115. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
  116. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
  117. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  118. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
  119. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -0
  120. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  121. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
  122. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/evaluation/utils.py +0 -0
  123. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
  124. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/feature_flags/feature_flags.py +0 -0
  125. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  126. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  127. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
  128. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  129. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/loop_runner/__init__.py +0 -0
  130. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
  131. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
  132. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
  133. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
  134. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/loop_runner/base.py +0 -0
  135. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
  136. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
  137. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +0 -0
  138. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
  139. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
  140. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
  141. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
  142. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
  143. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
  144. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
  145. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
  146. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
  147. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
  148. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
  149. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  150. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
  151. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
  152. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
  153. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
  154. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  155. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  156. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/__init__.py +0 -0
  157. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  158. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  159. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  160. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  161. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  162. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
  163. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  164. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  165. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  166. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
  167. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
  168. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  169. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
  170. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
  171. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  172. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
  173. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
  174. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  175. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
  176. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
  177. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  178. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  179. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  180. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  181. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  182. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
  183. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  184. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/config.py +0 -0
  185. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/experimental/__init__.py +0 -0
  186. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/__init__.py +0 -0
  187. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/config.py +0 -0
  188. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/runtime.py +0 -0
  189. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/tool.py +0 -0
  190. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/factory.py +0 -0
  191. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  192. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  193. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  194. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
  195. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
  196. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
  197. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
  198. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
  199. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
  200. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +0 -0
  201. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +0 -0
  202. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +0 -0
  203. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +0 -0
  204. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
  205. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/schemas.py +0 -0
  206. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  207. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  208. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/tool.py +0 -0
  209. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
  210. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  211. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  212. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  213. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  214. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  215. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  216. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic_table/__init__.py +0 -0
  217. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic_table/schemas.py +0 -0
  218. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/agentic_table/service.py +0 -0
  219. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/app/dev_util.py +0 -0
  220. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/app/fast_api_factory.py +0 -0
  221. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/app/init_logging.py +0 -0
  222. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/app/init_sdk.py +0 -0
  223. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/app/performance/async_tasks.py +0 -0
  224. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  225. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/app/verification.py +0 -0
  226. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/app/webhook.py +0 -0
  227. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/chat/__init__.py +0 -0
  228. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/chat/cancellation.py +0 -0
  229. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/chat/constants.py +0 -0
  230. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/chat/deprecated/service.py +0 -0
  231. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/chat/functions.py +0 -0
  232. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/chat/rendering.py +0 -0
  233. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/chat/responses_api.py +0 -0
  234. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/chat/schemas.py +0 -0
  235. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/chat/service.py +0 -0
  236. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/chat/state.py +0 -0
  237. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/chat/utils.py +0 -0
  238. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/content/__init__.py +0 -0
  239. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/content/constants.py +0 -0
  240. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/content/schemas.py +0 -0
  241. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/content/service.py +0 -0
  242. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/content/smart_rules.py +0 -0
  243. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/content/utils.py +0 -0
  244. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/data_extraction/README.md +0 -0
  245. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/data_extraction/__init__.py +0 -0
  246. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
  247. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/data_extraction/augmented/service.py +0 -0
  248. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/data_extraction/base.py +0 -0
  249. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
  250. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/data_extraction/basic/config.py +0 -0
  251. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
  252. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/data_extraction/basic/service.py +0 -0
  253. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/elicitation/__init__.py +0 -0
  254. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/elicitation/constants.py +0 -0
  255. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/elicitation/exceptions.py +0 -0
  256. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/elicitation/functions.py +0 -0
  257. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/elicitation/schemas.py +0 -0
  258. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/elicitation/service.py +0 -0
  259. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/embedding/__init__.py +0 -0
  260. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/embedding/constants.py +0 -0
  261. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/embedding/functions.py +0 -0
  262. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/embedding/schemas.py +0 -0
  263. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/embedding/service.py +0 -0
  264. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/embedding/utils.py +0 -0
  265. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/framework_utilities/__init__.py +0 -0
  266. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
  267. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  268. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  269. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  270. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  271. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  272. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/framework_utilities/utils.py +0 -0
  273. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/language_model/__init__.py +0 -0
  274. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
  275. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/language_model/builder.py +0 -0
  276. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/language_model/constants.py +0 -0
  277. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/language_model/default_language_model.py +0 -0
  278. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/language_model/functions.py +0 -0
  279. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/language_model/infos.py +0 -0
  280. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/language_model/prompt.py +0 -0
  281. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/language_model/reference.py +0 -0
  282. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/language_model/schemas.py +0 -0
  283. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/language_model/service.py +0 -0
  284. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/language_model/stream_transform.py +0 -0
  285. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/language_model/utils.py +0 -0
  286. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/monitoring/__init__.py +0 -0
  287. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/monitoring/middleware.py +0 -0
  288. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/monitoring/registry.py +0 -0
  289. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/protocols/support.py +0 -0
  290. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/services/__init__.py +0 -0
  291. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/services/chat_service.py +0 -0
  292. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/services/factory.py +0 -0
  293. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/short_term_memory/__init__.py +0 -0
  294. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/short_term_memory/constants.py +0 -0
  295. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/short_term_memory/functions.py +0 -0
  296. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/short_term_memory/schemas.py +0 -0
  297. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/short_term_memory/service.py +0 -0
  298. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/smart_rules/__init__.py +0 -0
  299. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/unique_toolkit/smart_rules/compile.py +0 -0
  300. {unique_toolkit-1.71.2 → unique_toolkit-1.72.0}/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: 1.71.2
3
+ Version: 1.72.0
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>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "unique_toolkit"
3
- version = "1.71.2"
3
+ version = "1.72.0"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -1,3 +1,5 @@
1
+ from .find_env_file import EnvFileNotFoundError as EnvFileNotFoundError
2
+ from .find_env_file import find_env_file as find_env_file
1
3
  from .init_logging import init_logging as init_logging
2
4
  from .init_sdk import get_endpoint_secret as get_endpoint_secret
3
5
  from .init_sdk import init_sdk as init_sdk
@@ -0,0 +1,11 @@
1
+ from pydantic_settings import SettingsConfigDict
2
+
3
+ from unique_toolkit.app.find_env_file import find_env_file
4
+
5
+ CHAT_EVENT_FILTER_OPTIONS_SETTINGS = SettingsConfigDict(
6
+ env_prefix="unique_chat_event_filter_options_",
7
+ env_file_encoding="utf-8",
8
+ case_sensitive=False,
9
+ extra="ignore",
10
+ env_file=find_env_file("unique.env", ".env", required=False),
11
+ )
@@ -0,0 +1,100 @@
1
+ from typing import Annotated
2
+
3
+ from pydantic import BeforeValidator, Field
4
+ from pydantic_settings import BaseSettings, SettingsConfigDict
5
+
6
+
7
+ class FeatureFlag:
8
+ """A feature flag that can be enabled globally or for specific company IDs.
9
+
10
+ Examples:
11
+ >>> flag = FeatureFlag(True)
12
+ >>> flag.is_enabled("any_company")
13
+ True
14
+
15
+ >>> flag = FeatureFlag(["company1", "company2"])
16
+ >>> flag.is_enabled("company1")
17
+ True
18
+ >>> flag.is_enabled("company3")
19
+ False
20
+ """
21
+
22
+ def __init__(self, *, value: list[str] | bool):
23
+ self._value = value
24
+
25
+ def is_enabled(self, *, company_id: str | None = None) -> bool:
26
+ """Check if the feature is enabled for the given company.
27
+
28
+ Args:
29
+ company_id: The company ID to check. Required if flag is a list.
30
+
31
+ Returns:
32
+ True if the feature is enabled, False otherwise.
33
+ """
34
+
35
+ if isinstance(self._value, bool):
36
+ return self._value
37
+
38
+ if isinstance(self._value, list):
39
+ return company_id in self._value if company_id else False
40
+
41
+ return False
42
+
43
+ def __repr__(self) -> str:
44
+ return f"FeatureFlag({self._value})"
45
+
46
+
47
+ def parse_feature_flag(v: FeatureFlag | str | bool | list[str]) -> FeatureFlag:
48
+ """Parse all feature flag fields from environment variables.
49
+
50
+ Args:
51
+ v: Can be a string ("true", "false", or comma-separated IDs),
52
+ a boolean, a list of IDs, or already a FeatureFlag instance.
53
+
54
+ Returns:
55
+ A FeatureFlag instance.
56
+ """
57
+ if isinstance(v, FeatureFlag):
58
+ return v
59
+
60
+ if isinstance(v, str):
61
+ v_lower = v.lower().strip()
62
+ if v_lower in ("true", "1", "yes"):
63
+ return FeatureFlag(value=True)
64
+ elif v_lower in ("false", "0", "no", ""):
65
+ return FeatureFlag(value=False)
66
+ else:
67
+ # Comma-separated company IDs
68
+ return FeatureFlag(value=[id.strip() for id in v.split(",") if id.strip()])
69
+
70
+ if isinstance(v, bool):
71
+ return FeatureFlag(value=v)
72
+
73
+ if isinstance(v, list):
74
+ return FeatureFlag(value=v)
75
+
76
+ # Default to disabled (this handles default factory functions too)
77
+ return FeatureFlag(value=False)
78
+
79
+
80
+ ValidatedFeatureFlag = Annotated[FeatureFlag, BeforeValidator(parse_feature_flag)]
81
+
82
+
83
+ class _UniqueToolkitFeatureFlags(BaseSettings):
84
+ un_18894_freeze_unique_settings: ValidatedFeatureFlag = Field(
85
+ default=FeatureFlag(value=False),
86
+ frozen=True,
87
+ description="Freeze unique settings (UN-18894)",
88
+ )
89
+
90
+ model_config = SettingsConfigDict(
91
+ extra="ignore",
92
+ env_prefix="FEATURE_FLAG_",
93
+ case_sensitive=False,
94
+ env_file=".env",
95
+ env_file_encoding="utf-8",
96
+ frozen=True,
97
+ )
98
+
99
+
100
+ UNIQUE_TOOLKIT_FEATURE_FLAGS = _UniqueToolkitFeatureFlags()
@@ -0,0 +1,70 @@
1
+ import os
2
+ from pathlib import Path
3
+
4
+ from platformdirs import user_config_dir
5
+
6
+
7
+ class EnvFileNotFoundError(FileNotFoundError):
8
+ """Raised when no environment file can be found in any of the expected locations."""
9
+
10
+
11
+ def find_env_file(
12
+ *filenames: str,
13
+ app_name: str = "unique",
14
+ app_author: str = "unique",
15
+ required: bool = False,
16
+ ) -> Path | None:
17
+ """Find environment files using cross-platform fallback locations.
18
+
19
+ Search order for each filename:
20
+ 1. ENVIRONMENT_FILE_PATH environment variable
21
+ 2. Current working directory
22
+ 3. User config directory (cross-platform via platformdirs)
23
+
24
+ If no filenames are given, defaults to ``".env"``.
25
+
26
+ Args:
27
+ *filenames: Names of the environment files to search for.
28
+ app_name: Application name for user config directory (default: 'unique')
29
+ app_author: Application author for user config directory (default: 'unique')
30
+ required: If True, raise EnvFileNotFoundError when file is not found.
31
+ If False, return None when file is not found (default: True).
32
+
33
+ Returns:
34
+ Path to the environment file, or None if not found and required=False.
35
+
36
+ Raises:
37
+ EnvFileNotFoundError: If no environment file is found and required=True.
38
+ """
39
+ if not filenames:
40
+ filenames = (".env",)
41
+
42
+ locations = []
43
+ if env_path := os.environ.get("ENVIRONMENT_FILE_PATH"):
44
+ locations.append(Path(env_path))
45
+ else:
46
+ for filename in filenames:
47
+ locations.append(Path.cwd() / filename)
48
+ locations.append(
49
+ Path(user_config_dir(appname=app_name, appauthor=app_author)) / filename
50
+ )
51
+
52
+ for location in locations:
53
+ if location and location.exists() and location.is_file():
54
+ return location
55
+
56
+ # If no file found, either return None or raise error
57
+ if not required:
58
+ return None
59
+
60
+ # If required, provide helpful error message
61
+ searched_locations = [str(loc) for loc in locations if loc is not None]
62
+ raise EnvFileNotFoundError(
63
+ "\n".join(
64
+ [
65
+ f"Environment file '{filename}' not found. Searched locations:\n"
66
+ + "\n".join(f" - {loc}" for loc in searched_locations)
67
+ for filename in filenames
68
+ ]
69
+ )
70
+ )
@@ -12,6 +12,9 @@ from pydantic_settings import BaseSettings
12
12
  from typing_extensions import deprecated
13
13
 
14
14
  from unique_toolkit._common.exception import ConfigurationException
15
+ from unique_toolkit.app.chat_event_filter_options_settings import (
16
+ CHAT_EVENT_FILTER_OPTIONS_SETTINGS,
17
+ )
15
18
  from unique_toolkit.app.unique_settings import UniqueChatEventFilterOptions
16
19
  from unique_toolkit.smart_rules.compile import UniqueQL, parse_uniqueql
17
20
 
@@ -55,6 +58,9 @@ class BaseEvent(BaseModel, Generic[FilterOptionsT]):
55
58
  data = json.load(f)
56
59
  return cls.model_validate(data)
57
60
 
61
+ def filter(self) -> bool:
62
+ return False
63
+
58
64
  def filter_event(self, *, filter_options: FilterOptionsT | None = None) -> bool:
59
65
  """Determine if event should be filtered out and be neglected."""
60
66
  return False
@@ -284,6 +290,18 @@ class ChatEvent(BaseEvent):
284
290
  created_at: Optional[int] = None
285
291
  version: Optional[str] = None
286
292
 
293
+ class FilterOptions(BaseSettings):
294
+ assistant_ids: list[str] = Field(
295
+ default=[],
296
+ description="The assistant ids (space) to filter by. Default is all assistants.",
297
+ )
298
+ references_in_code: list[str] = Field(
299
+ default=[],
300
+ description="The module (reference) names in code to filter by. Default is all modules.",
301
+ )
302
+
303
+ model_config = CHAT_EVENT_FILTER_OPTIONS_SETTINGS
304
+
287
305
  @classmethod
288
306
  def from_json_file(cls, file_path: Path) -> ChatEvent:
289
307
  if not file_path.exists():
@@ -303,6 +321,27 @@ class ChatEvent(BaseEvent):
303
321
  "assistant": {"id": self.payload.assistant_id},
304
322
  }
305
323
 
324
+ @override
325
+ def filter(self) -> bool:
326
+ """Filter the chat event based on the assistant id and reference in code."""
327
+
328
+ options = ChatEvent.FilterOptions()
329
+
330
+ # Empty lists mean "do not filter by this criterion" (same as filter_event).
331
+ if (
332
+ options.assistant_ids
333
+ and self.payload.assistant_id not in options.assistant_ids
334
+ ):
335
+ return True
336
+
337
+ if (
338
+ options.references_in_code
339
+ and self.payload.name not in options.references_in_code
340
+ ):
341
+ return True
342
+
343
+ return False
344
+
306
345
  @override
307
346
  def filter_event(
308
347
  self, *, filter_options: UniqueChatEventFilterOptions | None = None
@@ -1,13 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
- import os
4
3
  from logging import getLogger
5
4
  from pathlib import Path
6
5
  from typing import TYPE_CHECKING, Any, Self, TypeVar
7
6
  from urllib.parse import ParseResult, urlparse, urlunparse
8
7
 
9
8
  import unique_sdk
10
- from platformdirs import user_config_dir
11
9
  from pydantic import (
12
10
  AliasChoices,
13
11
  BaseModel,
@@ -20,6 +18,11 @@ from pydantic_settings import BaseSettings, SettingsConfigDict
20
18
  from typing_extensions import Protocol, deprecated
21
19
 
22
20
  from unique_toolkit._common.config_checker import register_config
21
+ from unique_toolkit.app.chat_event_filter_options_settings import (
22
+ CHAT_EVENT_FILTER_OPTIONS_SETTINGS,
23
+ )
24
+ from unique_toolkit.app.feature_flags import UNIQUE_TOOLKIT_FEATURE_FLAGS
25
+ from unique_toolkit.app.find_env_file import EnvFileNotFoundError, find_env_file
23
26
 
24
27
  if TYPE_CHECKING:
25
28
  from unique_toolkit.app.schemas import BaseEvent, ChatEvent
@@ -61,8 +64,16 @@ class AuthContextProtocol(Protocol):
61
64
 
62
65
 
63
66
  class AuthContext(BaseModel):
64
- company_id: SecretStr = Field(..., description="The company ID.")
65
- user_id: SecretStr = Field(..., description="The user ID.")
67
+ company_id: SecretStr = Field(
68
+ ...,
69
+ description="The company ID.",
70
+ frozen=UNIQUE_TOOLKIT_FEATURE_FLAGS.un_18894_freeze_unique_settings.is_enabled(),
71
+ )
72
+ user_id: SecretStr = Field(
73
+ ...,
74
+ description="The user ID.",
75
+ frozen=UNIQUE_TOOLKIT_FEATURE_FLAGS.un_18894_freeze_unique_settings.is_enabled(),
76
+ )
66
77
 
67
78
  def get_confidential_company_id(self) -> str:
68
79
  return self.company_id.get_secret_value()
@@ -88,12 +99,14 @@ class UniqueAuth(BaseSettings):
88
99
  "UNIQUE_AUTH_COMPANY_ID",
89
100
  "COMPANY_ID",
90
101
  ),
102
+ frozen=UNIQUE_TOOLKIT_FEATURE_FLAGS.un_18894_freeze_unique_settings.is_enabled(),
91
103
  )
92
104
  user_id: SecretStr = Field(
93
105
  default=SecretStr("dummy_user_id"),
94
106
  validation_alias=AliasChoices(
95
107
  "unique_auth_user_id", "user_id", "UNIQUE_AUTH_USER_ID", "USER_ID"
96
108
  ),
109
+ frozen=UNIQUE_TOOLKIT_FEATURE_FLAGS.un_18894_freeze_unique_settings.is_enabled(),
97
110
  )
98
111
 
99
112
  model_config = SettingsConfigDict(
@@ -101,6 +114,8 @@ class UniqueAuth(BaseSettings):
101
114
  env_file_encoding="utf-8",
102
115
  case_sensitive=False,
103
116
  extra="ignore",
117
+ frozen=UNIQUE_TOOLKIT_FEATURE_FLAGS.un_18894_freeze_unique_settings.is_enabled(),
118
+ env_file=find_env_file("unique.env", ".env", required=False),
104
119
  )
105
120
 
106
121
  def get_confidential_company_id(self) -> str:
@@ -146,8 +161,16 @@ class ChatContextProtocol(Protocol):
146
161
 
147
162
 
148
163
  class ChatContext(BaseModel):
149
- chat_id: str = Field(..., description="The chat ID.")
150
- assistant_id: str = Field(..., description="The assistant ID.")
164
+ chat_id: str = Field(
165
+ ...,
166
+ description="The chat ID.",
167
+ frozen=UNIQUE_TOOLKIT_FEATURE_FLAGS.un_18894_freeze_unique_settings.is_enabled(),
168
+ )
169
+ assistant_id: str = Field(
170
+ ...,
171
+ description="The assistant ID.",
172
+ frozen=UNIQUE_TOOLKIT_FEATURE_FLAGS.un_18894_freeze_unique_settings.is_enabled(),
173
+ )
151
174
 
152
175
  _last_assistant_message_id: str | None = PrivateAttr(default=None)
153
176
  _last_user_message_id: str | None = PrivateAttr(default=None)
@@ -254,6 +277,7 @@ class UniqueApp(BaseSettings):
254
277
  default="http://localhost:8092/",
255
278
  deprecated="Use UniqueApi.base_url instead",
256
279
  )
280
+
257
281
  endpoint: str = Field(default="dummy")
258
282
 
259
283
  endpoint_secret: SecretStr = Field(
@@ -273,8 +297,12 @@ class UniqueApp(BaseSettings):
273
297
  model_config = SettingsConfigDict(
274
298
  env_prefix="unique_app_",
275
299
  env_file_encoding="utf-8",
300
+ env_file=find_env_file("unique.env", ".env", required=False),
276
301
  case_sensitive=False,
277
302
  extra="ignore",
303
+ validate_by_name=True,
304
+ validate_by_alias=True,
305
+ frozen=UNIQUE_TOOLKIT_FEATURE_FLAGS.un_18894_freeze_unique_settings.is_enabled(),
278
306
  )
279
307
 
280
308
 
@@ -305,8 +333,10 @@ class UniqueApi(BaseSettings):
305
333
  model_config = SettingsConfigDict(
306
334
  env_prefix="unique_api_",
307
335
  env_file_encoding="utf-8",
336
+ env_file=find_env_file("unique.env", ".env", required=False),
308
337
  case_sensitive=False,
309
338
  extra="ignore",
339
+ frozen=UNIQUE_TOOLKIT_FEATURE_FLAGS.un_18894_freeze_unique_settings.is_enabled(),
310
340
  )
311
341
 
312
342
  @model_validator(mode="after")
@@ -366,22 +396,13 @@ class UniqueChatEventFilterOptions(BaseSettings):
366
396
  description="The module (reference) names in code to filter by. Default is all modules.",
367
397
  )
368
398
 
369
- model_config = SettingsConfigDict(
370
- env_prefix="unique_chat_event_filter_options_",
371
- env_file_encoding="utf-8",
372
- case_sensitive=False,
373
- extra="ignore",
374
- )
399
+ model_config = CHAT_EVENT_FILTER_OPTIONS_SETTINGS
375
400
 
376
401
  @model_validator(mode="after")
377
402
  def _warn_about_defaults(self) -> Self:
378
403
  return warn_about_defaults(self)
379
404
 
380
405
 
381
- class EnvFileNotFoundError(FileNotFoundError):
382
- """Raised when no environment file can be found in any of the expected locations."""
383
-
384
-
385
406
  class UniqueEnvironment:
386
407
  """
387
408
  Contains all settings that come exclusively from the environment.
@@ -474,47 +495,6 @@ class UniqueSettings:
474
495
  env_file if (env_file and env_file.exists()) else None
475
496
  )
476
497
 
477
- @classmethod
478
- def _find_env_file(cls, filename: str = "unique.env") -> Path:
479
- """Find environment file using cross-platform fallback locations.
480
-
481
- Search order:
482
- 1. UNIQUE_ENV_FILE environment variable
483
- 2. Current working directory
484
- 3. User config directory (cross-platform via platformdirs)
485
-
486
- Args:
487
- filename: Name of the environment file (default: 'unique.env')
488
-
489
- Returns:
490
- Path to the environment file.
491
-
492
- Raises:
493
- EnvFileNotFoundError: If no environment file is found in any location.
494
- """
495
- locations = [
496
- # 1. Explicit environment variable
497
- Path(env_path) if (env_path := os.environ.get("UNIQUE_ENV_FILE")) else None,
498
- # 2. Current working directory
499
- Path.cwd() / filename,
500
- # 3. User config directory (cross-platform)
501
- Path(user_config_dir("unique", "unique-toolkit")) / filename,
502
- ]
503
-
504
- for location in locations:
505
- if location and location.exists() and location.is_file():
506
- return location
507
-
508
- # If no file found, provide helpful error message
509
- searched_locations = [str(loc) for loc in locations if loc is not None]
510
- raise EnvFileNotFoundError(
511
- f"Environment file '{filename}' not found. Searched locations:\n"
512
- + "\n".join(f" - {loc}" for loc in searched_locations)
513
- + "\n\nTo fix this:\n"
514
- + f" 1. Create {filename} in one of the above locations, or\n"
515
- + f" 2. Set UNIQUE_ENV_FILE environment variable to point to your {filename} file"
516
- )
517
-
518
498
  @classmethod
519
499
  def from_env(
520
500
  cls,
@@ -563,7 +543,7 @@ class UniqueSettings:
563
543
  UniqueSettings instance with values loaded from found env file or environment variables.
564
544
  """
565
545
  try:
566
- env_file = cls._find_env_file(filename)
546
+ env_file = find_env_file(filename)
567
547
  logger.info(f"Environment file found at {env_file}")
568
548
  return cls.from_env(env_file=env_file)
569
549
  except EnvFileNotFoundError:
@@ -876,17 +876,17 @@ def get_content_info(
876
876
  skip: int | None = None,
877
877
  take: int | None = None,
878
878
  file_path: str | None = None,
879
- ):
879
+ ) -> PaginatedContentInfos:
880
880
  """Gets the info of a content."""
881
881
 
882
882
  get_info_params = unique_sdk.Content.ContentInfoParams(
883
883
  metadataFilter=metadata_filter or None, # Dict cannot be empty
884
884
  )
885
- if skip:
885
+ if skip is not None:
886
886
  get_info_params["skip"] = skip
887
- if take:
887
+ if take is not None:
888
888
  get_info_params["take"] = take
889
- if file_path:
889
+ if file_path is not None:
890
890
  get_info_params["filePath"] = file_path
891
891
 
892
892
  content_info = unique_sdk.Content.get_infos(
@@ -897,6 +897,35 @@ def get_content_info(
897
897
  )
898
898
 
899
899
 
900
+ async def get_content_info_async(
901
+ user_id: str,
902
+ company_id: str,
903
+ *,
904
+ metadata_filter: dict[str, Any] | None = None,
905
+ skip: int | None = None,
906
+ take: int | None = None,
907
+ file_path: str | None = None,
908
+ ) -> PaginatedContentInfos:
909
+ """Gets the info of a content."""
910
+
911
+ get_info_params = unique_sdk.Content.ContentInfoParams(
912
+ metadataFilter=metadata_filter or None, # Dict cannot be empty
913
+ )
914
+ if skip is not None:
915
+ get_info_params["skip"] = skip
916
+ if take is not None:
917
+ get_info_params["take"] = take
918
+ if file_path is not None:
919
+ get_info_params["filePath"] = file_path
920
+
921
+ content_info = unique_sdk.Content.get_infos_async(
922
+ user_id=user_id, company_id=company_id, **get_info_params
923
+ )
924
+ return PaginatedContentInfos.model_validate(
925
+ await content_info, by_alias=True, by_name=True
926
+ )
927
+
928
+
900
929
  def get_folder_info(user_id: str, company_id: str, *, scope_id: str) -> FolderInfo:
901
930
  info = unique_sdk.Folder.get_info(
902
931
  user_id=user_id, company_id=company_id, scopeId=scope_id
@@ -905,6 +934,16 @@ def get_folder_info(user_id: str, company_id: str, *, scope_id: str) -> FolderIn
905
934
  return FolderInfo.model_validate(info, by_alias=True, by_name=True)
906
935
 
907
936
 
937
+ async def get_folder_info_async(
938
+ user_id: str, company_id: str, *, scope_id: str
939
+ ) -> FolderInfo:
940
+ info = unique_sdk.Folder.get_info_async(
941
+ user_id=user_id, company_id=company_id, scopeId=scope_id
942
+ )
943
+
944
+ return FolderInfo.model_validate(await info, by_alias=True, by_name=True)
945
+
946
+
908
947
  def update_content(
909
948
  user_id: str,
910
949
  company_id: str,