unique_toolkit 1.11.1__tar.gz → 1.11.3__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 (156) hide show
  1. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/CHANGELOG.md +7 -0
  2. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/PKG-INFO +8 -1
  3. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/pyproject.toml +1 -1
  4. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/content/functions.py +20 -7
  5. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/content/schemas.py +16 -3
  6. unique_toolkit-1.11.1/unique_toolkit/smart_rules/compile.py → unique_toolkit-1.11.3/unique_toolkit/content/smart_rules.py +29 -29
  7. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/knowledge_base.py +81 -2
  8. unique_toolkit-1.11.3/unique_toolkit/smart_rules/compile.py +56 -0
  9. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/LICENSE +0 -0
  10. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/README.md +0 -0
  11. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/__init__.py +0 -0
  12. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/_base_service.py +0 -0
  13. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/_time_utils.py +0 -0
  14. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  15. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  16. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  17. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  18. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  19. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  20. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  21. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/default_language_model.py +0 -0
  22. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/endpoint_builder.py +0 -0
  23. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  24. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/exception.py +0 -0
  25. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  26. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  27. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  28. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/string_utilities.py +0 -0
  29. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  30. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/token/token_counting.py +0 -0
  31. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/utils/__init__.py +0 -0
  32. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/utils/files.py +0 -0
  33. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  34. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  35. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  36. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/validate_required_values.py +0 -0
  37. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/_common/validators.py +0 -0
  38. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/__init__.py +0 -0
  39. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
  40. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/evaluation/config.py +0 -0
  41. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/evaluation/context_relevancy/prompts.py +0 -0
  42. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  43. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
  44. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
  45. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  46. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  47. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
  48. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/evaluation/hallucination/prompts.py +0 -0
  49. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  50. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
  51. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  52. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
  53. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  54. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  55. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  56. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  57. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
  58. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  59. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
  60. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  61. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  62. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  63. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/__init__.py +0 -0
  64. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  65. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  66. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  67. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  68. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  69. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
  70. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  71. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  72. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  73. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/postprocessing/_display.py +0 -0
  74. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/postprocessing/_utils.py +0 -0
  75. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  76. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/postprocessing/postprocessor.py +0 -0
  77. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_consolidate_references.py +0 -0
  78. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  79. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_postprocessor_reference_functions.py +0 -0
  80. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  81. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  82. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  83. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  84. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  85. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  86. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  87. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/config.py +0 -0
  88. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/factory.py +0 -0
  89. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  90. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  91. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  92. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
  93. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/schemas.py +0 -0
  94. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  95. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  96. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/tool.py +0 -0
  97. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
  98. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  99. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  100. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/utils/execution/__init__.py +0 -0
  101. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/utils/execution/execution.py +0 -0
  102. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  103. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  104. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  105. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  106. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/app/__init__.py +0 -0
  107. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/app/dev_util.py +0 -0
  108. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/app/init_logging.py +0 -0
  109. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/app/init_sdk.py +0 -0
  110. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/app/performance/async_tasks.py +0 -0
  111. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  112. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/app/schemas.py +0 -0
  113. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/app/unique_settings.py +0 -0
  114. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/app/verification.py +0 -0
  115. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/chat/__init__.py +0 -0
  116. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/chat/constants.py +0 -0
  117. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/chat/deprecated/service.py +0 -0
  118. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/chat/functions.py +0 -0
  119. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/chat/schemas.py +0 -0
  120. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/chat/service.py +0 -0
  121. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/chat/state.py +0 -0
  122. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/chat/utils.py +0 -0
  123. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/content/__init__.py +0 -0
  124. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/content/constants.py +0 -0
  125. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/content/service.py +0 -0
  126. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/content/utils.py +0 -0
  127. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/embedding/__init__.py +0 -0
  128. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/embedding/constants.py +0 -0
  129. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/embedding/functions.py +0 -0
  130. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/embedding/schemas.py +0 -0
  131. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/embedding/service.py +0 -0
  132. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/embedding/utils.py +0 -0
  133. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/framework_utilities/__init__.py +0 -0
  134. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  135. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  136. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  137. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  138. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  139. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/framework_utilities/utils.py +0 -0
  140. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/language_model/__init__.py +0 -0
  141. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/language_model/builder.py +0 -0
  142. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/language_model/constants.py +0 -0
  143. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/language_model/functions.py +0 -0
  144. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/language_model/infos.py +0 -0
  145. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/language_model/prompt.py +0 -0
  146. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/language_model/reference.py +0 -0
  147. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/language_model/schemas.py +0 -0
  148. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/language_model/service.py +0 -0
  149. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/language_model/utils.py +0 -0
  150. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/protocols/support.py +0 -0
  151. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/short_term_memory/__init__.py +0 -0
  152. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/short_term_memory/constants.py +0 -0
  153. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/short_term_memory/functions.py +0 -0
  154. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/short_term_memory/schemas.py +0 -0
  155. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/short_term_memory/service.py +0 -0
  156. {unique_toolkit-1.11.1 → unique_toolkit-1.11.3}/unique_toolkit/smart_rules/__init__.py +0 -0
@@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+ ## [1.11.3] - 2026-10-06
8
+ - Move smart rules to content
9
+ - Add to documentation
10
+
11
+ ## [1.11.2] - 2025-10-07
12
+ - Fix for empty metadata filter at info retrieval
7
13
 
8
14
  ## [1.11.1] - 2025-10-07
9
15
  - Fix bug where hallucination check was taking all of the chunks as input instead of only the referenced ones.
@@ -19,6 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
19
25
  ## [1.9.1] - 2025-10-06
20
26
  - Switch default model used in evaluation service from `GPT-3.5-turbo (0125)` to `GPT-4o (1120)`
21
27
 
28
+
22
29
  ## [1.9.0] - 2026-10-04
23
30
  - Define the RequestContext and add aihttp/httpx requestors
24
31
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: unique_toolkit
3
- Version: 1.11.1
3
+ Version: 1.11.3
4
4
  Summary:
5
5
  License: Proprietary
6
6
  Author: Cedric Klinkert
@@ -117,6 +117,12 @@ All notable changes to this project will be documented in this file.
117
117
 
118
118
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
119
119
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
120
+ ## [1.11.3] - 2026-10-06
121
+ - Move smart rules to content
122
+ - Add to documentation
123
+
124
+ ## [1.11.2] - 2025-10-07
125
+ - Fix for empty metadata filter at info retrieval
120
126
 
121
127
  ## [1.11.1] - 2025-10-07
122
128
  - Fix bug where hallucination check was taking all of the chunks as input instead of only the referenced ones.
@@ -132,6 +138,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
132
138
  ## [1.9.1] - 2025-10-06
133
139
  - Switch default model used in evaluation service from `GPT-3.5-turbo (0125)` to `GPT-4o (1120)`
134
140
 
141
+
135
142
  ## [1.9.0] - 2026-10-04
136
143
  - Define the RequestContext and add aihttp/httpx requestors
137
144
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "unique_toolkit"
3
- version = "1.11.1"
3
+ version = "1.11.3"
4
4
  description = ""
5
5
  authors = [
6
6
  "Cedric Klinkert <cedric.klinkert@unique.ch>",
@@ -16,7 +16,8 @@ from unique_toolkit.content.schemas import (
16
16
  ContentInfo,
17
17
  ContentRerankerConfig,
18
18
  ContentSearchType,
19
- PaginatedContentInfo,
19
+ FolderInfo,
20
+ PaginatedContentInfos,
20
21
  )
21
22
  from unique_toolkit.content.utils import map_contents, map_to_content_chunks
22
23
 
@@ -590,21 +591,33 @@ def get_content_info(
590
591
  file_path: str | None = None,
591
592
  ):
592
593
  """Gets the info of a content."""
594
+
593
595
  get_info_params = unique_sdk.Content.ContentInfoParams(
594
- metadataFilter=metadata_filter,
595
- skip=skip,
596
- take=take,
597
- filePath=file_path,
596
+ metadataFilter=metadata_filter or None, # Dict cannot be empty
598
597
  )
598
+ if skip:
599
+ get_info_params["skip"] = skip
600
+ if take:
601
+ get_info_params["take"] = take
602
+ if file_path:
603
+ get_info_params["filePath"] = file_path
599
604
 
600
- content_info = unique_sdk.Content.get_info(
605
+ content_info = unique_sdk.Content.get_infos(
601
606
  user_id=user_id, company_id=company_id, **get_info_params
602
607
  )
603
- return PaginatedContentInfo.model_validate(
608
+ return PaginatedContentInfos.model_validate(
604
609
  content_info, by_alias=True, by_name=True
605
610
  )
606
611
 
607
612
 
613
+ def get_folder_info(user_id: str, company_id: str, scope_id: str) -> FolderInfo:
614
+ info = unique_sdk.Folder.get_info(
615
+ user_id=user_id, company_id=company_id, scopeId=scope_id
616
+ )
617
+
618
+ return FolderInfo.model_validate(info, by_alias=True, by_name=True)
619
+
620
+
608
621
  def update_content(
609
622
  user_id: str,
610
623
  company_id: str,
@@ -154,12 +154,13 @@ class ContentRerankerConfig(BaseModel):
154
154
  class ContentInfo(BaseModel):
155
155
  model_config = model_config
156
156
  id: str
157
+ object: str
157
158
  key: str
158
159
  url: str | None = None
159
160
  title: str | None = None
160
161
  metadata: dict[str, Any] | None = None
161
- mime_type: str
162
162
  byte_size: int
163
+ mime_type: str
163
164
  owner_id: str
164
165
  created_at: datetime
165
166
  updated_at: datetime
@@ -168,7 +169,19 @@ class ContentInfo(BaseModel):
168
169
  expired_at: datetime | None = None
169
170
 
170
171
 
171
- class PaginatedContentInfo(BaseModel):
172
+ class PaginatedContentInfos(BaseModel):
172
173
  model_config = model_config
173
- content_info: list[ContentInfo]
174
+ object: str
175
+ content_infos: list[ContentInfo]
174
176
  total_count: int
177
+
178
+
179
+ class FolderInfo(BaseModel):
180
+ model_config = model_config
181
+ id: str
182
+ name: str
183
+ ingestion_config: dict[str, Any]
184
+ createdAt: str | None
185
+ updatedAt: str | None
186
+ parentId: str | None
187
+ externalId: str | None
@@ -1,7 +1,7 @@
1
1
  import re
2
2
  from datetime import datetime, timedelta, timezone
3
3
  from enum import Enum
4
- from typing import Any, Dict, List, Self, Union
4
+ from typing import Any, Dict, List, Mapping, Self, Union
5
5
 
6
6
  from pydantic import AliasChoices, BaseModel, Field
7
7
  from pydantic.config import ConfigDict
@@ -30,8 +30,8 @@ class BaseStatement(BaseModel):
30
30
 
31
31
  def with_variables(
32
32
  self,
33
- user_metadata: Dict[str, Union[str, int, bool]],
34
- tool_parameters: Dict[str, Union[str, int, bool]],
33
+ user_metadata: Mapping[str, Union[str, int, bool]],
34
+ tool_parameters: Mapping[str, Union[str, int, bool]],
35
35
  ) -> Self:
36
36
  return self._fill_in_variables(user_metadata, tool_parameters)
37
37
 
@@ -49,8 +49,8 @@ class BaseStatement(BaseModel):
49
49
 
50
50
  def _fill_in_variables(
51
51
  self,
52
- user_metadata: Dict[str, Union[str, int, bool]],
53
- tool_parameters: Dict[str, Union[str, int, bool]],
52
+ user_metadata: Mapping[str, Union[str, int, bool]],
53
+ tool_parameters: Mapping[str, Union[str, int, bool]],
54
54
  ) -> Self:
55
55
  return self.model_copy()
56
56
 
@@ -62,8 +62,8 @@ class Statement(BaseStatement):
62
62
 
63
63
  def _fill_in_variables(
64
64
  self,
65
- user_metadata: Dict[str, Union[str, int, bool]],
66
- tool_parameters: Dict[str, Union[str, int, bool]],
65
+ user_metadata: Mapping[str, Union[str, int, bool]],
66
+ tool_parameters: Mapping[str, Union[str, int, bool]],
67
67
  ) -> Self:
68
68
  new_stmt = self.model_copy()
69
69
  new_stmt.value = eval_operator(self, user_metadata, tool_parameters)
@@ -72,13 +72,13 @@ class Statement(BaseStatement):
72
72
 
73
73
  class AndStatement(BaseStatement):
74
74
  and_list: List[Union["Statement", "AndStatement", "OrStatement"]] = Field(
75
- alias="and", validation_alias=AliasChoices("and", "and_list")
75
+ validation_alias=AliasChoices("and", "and_list"), serialization_alias="and"
76
76
  )
77
77
 
78
78
  def _fill_in_variables(
79
79
  self,
80
- user_metadata: Dict[str, Union[str, int, bool]],
81
- tool_parameters: Dict[str, Union[str, int, bool]],
80
+ user_metadata: Mapping[str, Union[str, int, bool]],
81
+ tool_parameters: Mapping[str, Union[str, int, bool]],
82
82
  ) -> Self:
83
83
  new_stmt = self.model_copy()
84
84
  new_stmt.and_list = [
@@ -90,13 +90,13 @@ class AndStatement(BaseStatement):
90
90
 
91
91
  class OrStatement(BaseStatement):
92
92
  or_list: List[Union["Statement", "AndStatement", "OrStatement"]] = Field(
93
- alias="or", validation_alias=AliasChoices("or", "or_list")
93
+ validation_alias=AliasChoices("or", "or_list"), serialization_alias="or"
94
94
  )
95
95
 
96
96
  def _fill_in_variables(
97
97
  self,
98
- user_metadata: Dict[str, Union[str, int, bool]],
99
- tool_parameters: Dict[str, Union[str, int, bool]],
98
+ user_metadata: Mapping[str, Union[str, int, bool]],
99
+ tool_parameters: Mapping[str, Union[str, int, bool]],
100
100
  ) -> Self:
101
101
  new_stmt = self.model_copy()
102
102
  new_stmt.or_list = [
@@ -121,8 +121,8 @@ def is_array_of_strings(value: Any) -> bool:
121
121
 
122
122
  def eval_operator(
123
123
  query: Statement,
124
- user_metadata: Dict[str, Union[str, int, bool]],
125
- tool_parameters: Dict[str, Union[str, int, bool]],
124
+ user_metadata: Mapping[str, Union[str, int, bool]],
125
+ tool_parameters: Mapping[str, Union[str, int, bool]],
126
126
  ) -> Any:
127
127
  if query.operator in [
128
128
  Operator.EQUALS,
@@ -149,8 +149,8 @@ def eval_operator(
149
149
 
150
150
  def eval_nested_operator(
151
151
  value: Any,
152
- user_metadata: Dict[str, Union[str, int, bool]],
153
- tool_parameters: Dict[str, Union[str, int, bool]],
152
+ user_metadata: Mapping[str, Union[str, int, bool]],
153
+ tool_parameters: Mapping[str, Union[str, int, bool]],
154
154
  ) -> Union[AndStatement, OrStatement]:
155
155
  if not isinstance(value, (AndStatement, OrStatement)):
156
156
  raise ValueError("Nested operator must be an AndStatement or OrStatement")
@@ -159,16 +159,16 @@ def eval_nested_operator(
159
159
 
160
160
  def binary_operator(
161
161
  value: Any,
162
- user_metadata: Dict[str, Union[str, int, bool]],
163
- tool_parameters: Dict[str, Union[str, int, bool]],
162
+ user_metadata: Mapping[str, Union[str, int, bool]],
163
+ tool_parameters: Mapping[str, Union[str, int, bool]],
164
164
  ) -> Any:
165
165
  return replace_variables(value, user_metadata, tool_parameters)
166
166
 
167
167
 
168
168
  def array_operator(
169
169
  value: Any,
170
- user_metadata: Dict[str, Union[str, int, bool]],
171
- tool_parameters: Dict[str, Union[str, int, bool]],
170
+ user_metadata: Mapping[str, Union[str, int, bool]],
171
+ tool_parameters: Mapping[str, Union[str, int, bool]],
172
172
  ) -> Any:
173
173
  if is_array_of_strings(value):
174
174
  return [
@@ -179,16 +179,16 @@ def array_operator(
179
179
 
180
180
  def null_operator(
181
181
  value: Any,
182
- user_metadata: Dict[str, Union[str, int, bool]],
183
- tool_parameters: Dict[str, Union[str, int, bool]],
182
+ user_metadata: Mapping[str, Union[str, int, bool]],
183
+ tool_parameters: Mapping[str, Union[str, int, bool]],
184
184
  ) -> Any:
185
185
  return value # do nothing for now. No variables to replace
186
186
 
187
187
 
188
188
  def empty_operator(
189
189
  operator: Operator,
190
- user_metadata: Dict[str, Union[str, int, bool]],
191
- tool_parameters: Dict[str, Union[str, int, bool]],
190
+ user_metadata: Mapping[str, Union[str, int, bool]],
191
+ tool_parameters: Mapping[str, Union[str, int, bool]],
192
192
  ) -> Any:
193
193
  """Handle IS_EMPTY and IS_NOT_EMPTY operators."""
194
194
  if operator == Operator.IS_EMPTY:
@@ -225,8 +225,8 @@ def calculate_later_date(input_str: str) -> str:
225
225
 
226
226
  def replace_variables(
227
227
  value: Any,
228
- user_metadata: Dict[str, Union[str, int, bool]],
229
- tool_parameters: Dict[str, Union[str, int, bool]],
228
+ user_metadata: Mapping[str, Union[str, int, bool]],
229
+ tool_parameters: Mapping[str, Union[str, int, bool]],
230
230
  ) -> Any:
231
231
  if isinstance(value, str):
232
232
  if "||" in value:
@@ -274,8 +274,8 @@ def replace_user_metadata_patterns(
274
274
 
275
275
  def get_fallback_values(
276
276
  value: str,
277
- user_metadata: Dict[str, Union[str, int, bool]],
278
- tool_parameters: Dict[str, Union[str, int, bool]],
277
+ user_metadata: Mapping[str, Union[str, int, bool]],
278
+ tool_parameters: Mapping[str, Union[str, int, bool]],
279
279
  ) -> Any:
280
280
  values = value.split("||")
281
281
  for val in values:
@@ -14,6 +14,7 @@ from unique_toolkit.content.functions import (
14
14
  download_content_to_bytes,
15
15
  download_content_to_file_by_id,
16
16
  get_content_info,
17
+ get_folder_info,
17
18
  search_content_chunks,
18
19
  search_content_chunks_async,
19
20
  search_contents,
@@ -28,7 +29,8 @@ from unique_toolkit.content.schemas import (
28
29
  ContentInfo,
29
30
  ContentRerankerConfig,
30
31
  ContentSearchType,
31
- PaginatedContentInfo,
32
+ FolderInfo,
33
+ PaginatedContentInfos,
32
34
  )
33
35
 
34
36
  _LOGGER = logging.getLogger(f"toolkit.knowledge_base.{__name__}")
@@ -483,7 +485,7 @@ class KnowledgeBaseService:
483
485
  skip: int | None = None,
484
486
  take: int | None = None,
485
487
  file_path: str | None = None,
486
- ) -> PaginatedContentInfo:
488
+ ) -> PaginatedContentInfos:
487
489
  return get_content_info(
488
490
  user_id=self._user_id,
489
491
  company_id=self._company_id,
@@ -493,6 +495,17 @@ class KnowledgeBaseService:
493
495
  file_path=file_path,
494
496
  )
495
497
 
498
+ def get_folder_info(
499
+ self,
500
+ *,
501
+ scope_id: str,
502
+ ) -> FolderInfo:
503
+ return get_folder_info(
504
+ user_id=self._user_id,
505
+ company_id=self._company_id,
506
+ scope_id=scope_id,
507
+ )
508
+
496
509
  def replace_content_metadata(
497
510
  self,
498
511
  *,
@@ -506,6 +519,72 @@ class KnowledgeBaseService:
506
519
  metadata=metadata,
507
520
  )
508
521
 
522
+ def _resolve_visible_file_tree(self, content_infos: list[ContentInfo]) -> list[str]:
523
+ # collect all scope ids
524
+ folder_id_paths: set[str] = set()
525
+ known_folder_paths: set[str] = set()
526
+ for content_info in content_infos:
527
+ if (
528
+ content_info.metadata
529
+ and content_info.metadata.get(r"{FullPath}") is not None
530
+ ):
531
+ known_folder_paths.add(str(content_info.metadata.get(r"{FullPath}")))
532
+ continue
533
+
534
+ if (
535
+ content_info.metadata
536
+ and content_info.metadata.get("folderIdPath") is not None
537
+ ):
538
+ folder_id_paths.add(str(content_info.metadata.get("folderIdPath")))
539
+
540
+ scope_ids: set[str] = set()
541
+ for fp in folder_id_paths:
542
+ scope_ids_list = set(fp.replace("uniquepathid://", "").split("/"))
543
+ scope_ids.update(scope_ids_list)
544
+
545
+ scope_id_to_folder_name: dict[str, str] = {}
546
+ for scope_id in scope_ids:
547
+ folder_info = self.get_folder_info(
548
+ scope_id=scope_id,
549
+ )
550
+ scope_id_to_folder_name[scope_id] = folder_info.name
551
+
552
+ folder_paths: set[str] = set()
553
+ for folder_id_path in folder_id_paths:
554
+ scope_ids_list = folder_id_path.replace("uniquepathid://", "").split("/")
555
+
556
+ if all(scope_id in scope_id_to_folder_name for scope_id in scope_ids_list):
557
+ folder_path = [
558
+ scope_id_to_folder_name[scope_id] for scope_id in scope_ids_list
559
+ ]
560
+ folder_paths.add("/".join(folder_path))
561
+
562
+ return [
563
+ p if p.startswith("/") else f"/{p}"
564
+ for p in folder_paths.union(known_folder_paths)
565
+ ]
566
+
567
+ def resolve_visible_file_tree(
568
+ self, *, metadata_filter: dict[str, Any] | None = None
569
+ ) -> list[str]:
570
+ """
571
+ Resolves the visible file tree for the knowledge base for the current user.
572
+
573
+ Args:
574
+ metadata_filter (dict[str, Any] | None): The metadata filter to use. Defaults to None.
575
+
576
+ Returns:
577
+ list[str]: The visible file tree.
578
+
579
+
580
+
581
+ """
582
+ info = self.get_paginated_content_infos(
583
+ metadata_filter=metadata_filter,
584
+ )
585
+
586
+ return self._resolve_visible_file_tree(content_infos=info.content_infos)
587
+
509
588
 
510
589
  if __name__ == "__main__":
511
590
  kb_service = KnowledgeBaseService.from_settings()
@@ -0,0 +1,56 @@
1
+ import warnings
2
+
3
+ from unique_toolkit.content.smart_rules import (
4
+ AndStatement,
5
+ BaseStatement,
6
+ Operator,
7
+ OrStatement,
8
+ Statement,
9
+ UniqueQL,
10
+ array_operator,
11
+ binary_operator,
12
+ calculate_current_date,
13
+ calculate_earlier_date,
14
+ calculate_later_date,
15
+ empty_operator,
16
+ eval_nested_operator,
17
+ eval_operator,
18
+ get_fallback_values,
19
+ is_array_of_strings,
20
+ null_operator,
21
+ parse_uniqueql,
22
+ replace_tool_parameters_patterns,
23
+ replace_user_metadata_patterns,
24
+ replace_variables,
25
+ )
26
+
27
+ warnings.warn(
28
+ "unique_toolkit.smart_rules.compile is deprecated. "
29
+ "Please use unique_toolkit.content.smart_rules instead.",
30
+ DeprecationWarning,
31
+ stacklevel=2,
32
+ )
33
+
34
+ __all__ = [
35
+ "AndStatement",
36
+ "BaseStatement",
37
+ "Operator",
38
+ "OrStatement",
39
+ "Statement",
40
+ "UniqueQL",
41
+ "array_operator",
42
+ "binary_operator",
43
+ "calculate_current_date",
44
+ "calculate_earlier_date",
45
+ "calculate_later_date",
46
+ "empty_operator",
47
+ "eval_nested_operator",
48
+ "eval_operator",
49
+ "get_fallback_values",
50
+ "is_array_of_strings",
51
+ "null_operator",
52
+ "parse_uniqueql",
53
+ "replace_tool_parameters_patterns",
54
+ "replace_user_metadata_patterns",
55
+ "replace_variables",
56
+ ]
File without changes