unique_toolkit 1.12.0__tar.gz → 1.13.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 (156) hide show
  1. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/CHANGELOG.md +6 -0
  2. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/PKG-INFO +7 -1
  3. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/pyproject.toml +1 -1
  4. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/evaluation/evaluation_manager.py +9 -5
  5. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +9 -1
  6. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/content/functions.py +45 -1
  7. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/content/schemas.py +5 -0
  8. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/knowledge_base.py +127 -0
  9. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/LICENSE +0 -0
  10. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/README.md +0 -0
  11. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/__init__.py +0 -0
  12. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/_base_service.py +0 -0
  13. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/_time_utils.py +0 -0
  14. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  15. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  16. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  17. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  18. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  19. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  20. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  21. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/default_language_model.py +0 -0
  22. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/endpoint_builder.py +0 -0
  23. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  24. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/exception.py +0 -0
  25. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  26. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  27. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  28. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/string_utilities.py +0 -0
  29. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  30. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/token/token_counting.py +0 -0
  31. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/utils/__init__.py +0 -0
  32. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/utils/files.py +0 -0
  33. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  34. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  35. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  36. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/validate_required_values.py +0 -0
  37. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/_common/validators.py +0 -0
  38. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/__init__.py +0 -0
  39. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
  40. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/evaluation/config.py +0 -0
  41. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts.py +0 -0
  42. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  43. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
  44. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  45. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  46. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/evaluation/hallucination/prompts.py +0 -0
  47. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  48. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
  49. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  50. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
  51. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  52. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  53. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  54. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  55. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
  56. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  57. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
  58. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  59. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  60. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  61. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/__init__.py +0 -0
  62. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  63. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  64. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  65. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  66. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  67. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
  68. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  69. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  70. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  71. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/postprocessing/_display.py +0 -0
  72. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/postprocessing/_utils.py +0 -0
  73. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  74. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/postprocessing/postprocessor.py +0 -0
  75. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_consolidate_references.py +0 -0
  76. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  77. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_postprocessor_reference_functions.py +0 -0
  78. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  79. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  80. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  81. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  82. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  83. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  84. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  85. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/config.py +0 -0
  86. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/factory.py +0 -0
  87. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  88. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  89. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  90. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
  91. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/schemas.py +0 -0
  92. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  93. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  94. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/tool.py +0 -0
  95. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
  96. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  97. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  98. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/utils/execution/__init__.py +0 -0
  99. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/utils/execution/execution.py +0 -0
  100. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  101. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  102. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  103. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  104. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/app/__init__.py +0 -0
  105. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/app/dev_util.py +0 -0
  106. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/app/init_logging.py +0 -0
  107. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/app/init_sdk.py +0 -0
  108. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/app/performance/async_tasks.py +0 -0
  109. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  110. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/app/schemas.py +0 -0
  111. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/app/unique_settings.py +0 -0
  112. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/app/verification.py +0 -0
  113. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/chat/__init__.py +0 -0
  114. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/chat/constants.py +0 -0
  115. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/chat/deprecated/service.py +0 -0
  116. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/chat/functions.py +0 -0
  117. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/chat/schemas.py +0 -0
  118. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/chat/service.py +0 -0
  119. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/chat/state.py +0 -0
  120. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/chat/utils.py +0 -0
  121. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/content/__init__.py +0 -0
  122. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/content/constants.py +0 -0
  123. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/content/service.py +0 -0
  124. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/content/smart_rules.py +0 -0
  125. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/content/utils.py +0 -0
  126. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/embedding/__init__.py +0 -0
  127. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/embedding/constants.py +0 -0
  128. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/embedding/functions.py +0 -0
  129. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/embedding/schemas.py +0 -0
  130. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/embedding/service.py +0 -0
  131. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/embedding/utils.py +0 -0
  132. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/framework_utilities/__init__.py +0 -0
  133. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  134. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  135. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  136. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  137. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  138. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/framework_utilities/utils.py +0 -0
  139. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/language_model/__init__.py +0 -0
  140. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/language_model/builder.py +0 -0
  141. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/language_model/constants.py +0 -0
  142. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/language_model/functions.py +0 -0
  143. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/language_model/infos.py +0 -0
  144. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/language_model/prompt.py +0 -0
  145. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/language_model/reference.py +0 -0
  146. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/language_model/schemas.py +0 -0
  147. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/language_model/service.py +0 -0
  148. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/language_model/utils.py +0 -0
  149. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/protocols/support.py +0 -0
  150. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/short_term_memory/__init__.py +0 -0
  151. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/short_term_memory/constants.py +0 -0
  152. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/short_term_memory/functions.py +0 -0
  153. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/short_term_memory/schemas.py +0 -0
  154. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/short_term_memory/service.py +0 -0
  155. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/smart_rules/__init__.py +0 -0
  156. {unique_toolkit-1.12.0 → unique_toolkit-1.13.0}/unique_toolkit/smart_rules/compile.py +0 -0
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
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
7
 
8
+ ## [1.13.0] - 2025-10-07
9
+ - Delete contents with knowledge base service
10
+
11
+ ## [1.12.1] - 2025-10-07
12
+ - Fix bug where failed evaluations did not show an error to the user.
13
+
8
14
  ## [1.12.0] - 2026-10-07
9
15
  - Add the `OpenAIUserMessageBuilder` for complex user messages with images
10
16
  - More examples with documents/images on the chat
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: unique_toolkit
3
- Version: 1.12.0
3
+ Version: 1.13.0
4
4
  Summary:
5
5
  License: Proprietary
6
6
  Author: Cedric Klinkert
@@ -118,6 +118,12 @@ All notable changes to this project will be documented in this file.
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
120
 
121
+ ## [1.13.0] - 2025-10-07
122
+ - Delete contents with knowledge base service
123
+
124
+ ## [1.12.1] - 2025-10-07
125
+ - Fix bug where failed evaluations did not show an error to the user.
126
+
121
127
  ## [1.12.0] - 2026-10-07
122
128
  - Add the `OpenAIUserMessageBuilder` for complex user messages with images
123
129
  - More examples with documents/images on the chat
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "unique_toolkit"
3
- version = "1.12.0"
3
+ version = "1.13.0"
4
4
  description = ""
5
5
  authors = [
6
6
  "Cedric Klinkert <cedric.klinkert@unique.ch>",
@@ -123,6 +123,15 @@ class EvaluationManager:
123
123
  self._evaluation_passed = False
124
124
  evaluation_results_unpacked.append(unpacked_evaluation_result)
125
125
 
126
+ for evaluation_name, evaluation_result in zip(
127
+ selected_evaluation_names, evaluation_results_unpacked
128
+ ):
129
+ evaluation_instance = self.get_evaluation_by_name(evaluation_name)
130
+ if evaluation_instance:
131
+ await self._show_message_assessment(
132
+ evaluation_instance, evaluation_result, assistant_message_id
133
+ )
134
+
126
135
  return evaluation_results_unpacked
127
136
 
128
137
  async def execute_evaluation_call(
@@ -143,11 +152,6 @@ class EvaluationManager:
143
152
  evaluation_metric_result: EvaluationMetricResult = (
144
153
  await evaluation_instance.run(loop_response)
145
154
  )
146
- # show results to the user
147
- await self._show_message_assessment(
148
- evaluation_instance, evaluation_metric_result, assistant_message_id
149
- )
150
-
151
155
  return evaluation_metric_result
152
156
 
153
157
  return EvaluationMetricResult(
@@ -78,11 +78,19 @@ class HallucinationEvaluation(Evaluation):
78
78
  if not evaluation_result.error
79
79
  else ChatMessageAssessmentStatus.ERROR
80
80
  )
81
+ explanation = evaluation_result.reason
82
+
83
+ if status == ChatMessageAssessmentStatus.ERROR:
84
+ title = "Hallucination Check Error"
85
+ label = ChatMessageAssessmentLabel.RED
86
+ explanation = (
87
+ "An unrecoverable error occurred while evaluating the response."
88
+ )
81
89
 
82
90
  return EvaluationAssessmentMessage(
83
91
  status=status,
84
92
  title=title,
85
- explanation=evaluation_result.reason,
93
+ explanation=explanation,
86
94
  label=label,
87
95
  type=self.get_assessment_type(),
88
96
  )
@@ -16,6 +16,7 @@ from unique_toolkit.content.schemas import (
16
16
  ContentInfo,
17
17
  ContentRerankerConfig,
18
18
  ContentSearchType,
19
+ DeleteContentResponse,
19
20
  FolderInfo,
20
21
  PaginatedContentInfos,
21
22
  )
@@ -585,6 +586,7 @@ def download_content(
585
586
  def get_content_info(
586
587
  user_id: str,
587
588
  company_id: str,
589
+ *,
588
590
  metadata_filter: dict[str, Any] | None = None,
589
591
  skip: int | None = None,
590
592
  take: int | None = None,
@@ -610,7 +612,7 @@ def get_content_info(
610
612
  )
611
613
 
612
614
 
613
- def get_folder_info(user_id: str, company_id: str, scope_id: str) -> FolderInfo:
615
+ def get_folder_info(user_id: str, company_id: str, *, scope_id: str) -> FolderInfo:
614
616
  info = unique_sdk.Folder.get_info(
615
617
  user_id=user_id, company_id=company_id, scopeId=scope_id
616
618
  )
@@ -648,3 +650,45 @@ def update_content(
648
650
  user_id=user_id, company_id=company_id, **update_params
649
651
  )
650
652
  return ContentInfo.model_validate(content_info, by_alias=True, by_name=True)
653
+
654
+
655
+ def delete_content(
656
+ user_id: str,
657
+ company_id: str,
658
+ *,
659
+ content_id: str | None = None,
660
+ file_path: str | None = None,
661
+ ) -> DeleteContentResponse:
662
+ if content_id:
663
+ resp = unique_sdk.Content.delete(
664
+ user_id=user_id, company_id=company_id, contentId=content_id
665
+ )
666
+ elif file_path:
667
+ resp = unique_sdk.Content.delete(
668
+ user_id=user_id, company_id=company_id, filePath=file_path
669
+ )
670
+ else:
671
+ raise ValueError("content_id or file_path must be provided")
672
+
673
+ return DeleteContentResponse.model_validate(resp, by_alias=True, by_name=True)
674
+
675
+
676
+ async def delete_content_async(
677
+ user_id: str,
678
+ company_id: str,
679
+ *,
680
+ content_id: str | None = None,
681
+ file_path: str | None = None,
682
+ ) -> DeleteContentResponse:
683
+ if content_id:
684
+ resp = await unique_sdk.Content.delete_async(
685
+ user_id=user_id, company_id=company_id, contentId=content_id
686
+ )
687
+ elif file_path:
688
+ resp = await unique_sdk.Content.delete_async(
689
+ user_id=user_id, company_id=company_id, filePath=file_path
690
+ )
691
+ else:
692
+ raise ValueError("content_id or file_path must be provided")
693
+
694
+ return DeleteContentResponse.model_validate(resp, by_alias=True, by_name=True)
@@ -185,3 +185,8 @@ class FolderInfo(BaseModel):
185
185
  updatedAt: str | None
186
186
  parentId: str | None
187
187
  externalId: str | None
188
+
189
+
190
+ class DeleteContentResponse(BaseModel):
191
+ model_config = model_config
192
+ id: str
@@ -1,3 +1,4 @@
1
+ import asyncio
1
2
  import logging
2
3
  from pathlib import Path
3
4
  from typing import Any, overload
@@ -11,6 +12,8 @@ from unique_toolkit.content.constants import (
11
12
  DEFAULT_SEARCH_LANGUAGE,
12
13
  )
13
14
  from unique_toolkit.content.functions import (
15
+ delete_content,
16
+ delete_content_async,
14
17
  download_content_to_bytes,
15
18
  download_content_to_file_by_id,
16
19
  get_content_info,
@@ -29,6 +32,7 @@ from unique_toolkit.content.schemas import (
29
32
  ContentInfo,
30
33
  ContentRerankerConfig,
31
34
  ContentSearchType,
35
+ DeleteContentResponse,
32
36
  FolderInfo,
33
37
  PaginatedContentInfos,
34
38
  )
@@ -585,6 +589,129 @@ class KnowledgeBaseService:
585
589
 
586
590
  return self._resolve_visible_file_tree(content_infos=info.content_infos)
587
591
 
592
+ @overload
593
+ def delete_content(
594
+ self,
595
+ *,
596
+ content_id: str,
597
+ ) -> DeleteContentResponse: ...
598
+
599
+ """Delete content by id"""
600
+
601
+ @overload
602
+ def delete_content(
603
+ self,
604
+ *,
605
+ file_path: str,
606
+ ) -> DeleteContentResponse: ...
607
+
608
+ """Delete all content matching the file path"""
609
+
610
+ def delete_content(
611
+ self,
612
+ *,
613
+ content_id: str | None = None,
614
+ file_path: str | None = None,
615
+ metadata_filter: dict[str, Any] | None = None,
616
+ ) -> DeleteContentResponse:
617
+ """Delete content by id, file path or metadata filter"""
618
+ if metadata_filter:
619
+ infos = self.get_paginated_content_infos(
620
+ metadata_filter=metadata_filter,
621
+ )
622
+ for info in infos.content_infos:
623
+ delete_content(
624
+ user_id=self._user_id,
625
+ company_id=self._company_id,
626
+ content_id=info.id,
627
+ )
628
+
629
+ return delete_content(
630
+ user_id=self._user_id,
631
+ company_id=self._company_id,
632
+ content_id=content_id,
633
+ file_path=file_path,
634
+ )
635
+
636
+ def delete_contents(
637
+ self,
638
+ *,
639
+ metadata_filter: dict[str, Any],
640
+ ) -> list[DeleteContentResponse]:
641
+ """Delete all content matching the metadata filter"""
642
+ resp: list[DeleteContentResponse] = []
643
+
644
+ if metadata_filter:
645
+ infos = self.get_paginated_content_infos(
646
+ metadata_filter=metadata_filter,
647
+ )
648
+
649
+ for info in infos.content_infos:
650
+ resp.append(
651
+ delete_content(
652
+ user_id=self._user_id,
653
+ company_id=self._company_id,
654
+ content_id=info.id,
655
+ )
656
+ )
657
+
658
+ return resp
659
+
660
+ @overload
661
+ async def delete_content_async(
662
+ self,
663
+ *,
664
+ content_id: str,
665
+ ) -> DeleteContentResponse: ...
666
+
667
+ @overload
668
+ async def delete_content_async(
669
+ self,
670
+ *,
671
+ file_path: str,
672
+ ) -> DeleteContentResponse: ...
673
+
674
+ async def delete_content_async(
675
+ self,
676
+ *,
677
+ content_id: str | None = None,
678
+ file_path: str | None = None,
679
+ ) -> DeleteContentResponse:
680
+ return await delete_content_async(
681
+ user_id=self._user_id,
682
+ company_id=self._company_id,
683
+ content_id=content_id,
684
+ file_path=file_path,
685
+ )
686
+
687
+ async def delete_contents_async(
688
+ self,
689
+ *,
690
+ metadata_filter: dict[str, Any],
691
+ ) -> list[DeleteContentResponse]:
692
+ """Delete all content matching the metadata filter"""
693
+ if not metadata_filter:
694
+ return []
695
+
696
+ infos = self.get_paginated_content_infos(
697
+ metadata_filter=metadata_filter,
698
+ )
699
+
700
+ # Create all delete tasks without awaiting them
701
+ delete_tasks = [
702
+ delete_content_async(
703
+ user_id=self._user_id,
704
+ company_id=self._company_id,
705
+ content_id=info.id,
706
+ )
707
+ for info in infos.content_infos
708
+ ]
709
+
710
+ # Await all delete operations concurrently
711
+ resp = await asyncio.gather(*delete_tasks)
712
+
713
+ return list(resp)
714
+
588
715
 
589
716
  if __name__ == "__main__":
590
717
  kb_service = KnowledgeBaseService.from_settings()
File without changes