unique_toolkit 1.13.0__tar.gz → 1.14.1__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 (157) hide show
  1. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/CHANGELOG.md +6 -0
  2. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/PKG-INFO +7 -1
  3. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/pyproject.toml +1 -1
  4. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/knowledge_base.py +133 -0
  5. unique_toolkit-1.14.1/unique_toolkit/test_utilities/events.py +195 -0
  6. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/LICENSE +0 -0
  7. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/README.md +0 -0
  8. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/__init__.py +0 -0
  9. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/_base_service.py +0 -0
  10. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/_time_utils.py +0 -0
  11. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  12. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  13. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  14. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  15. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  16. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  17. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  18. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/default_language_model.py +0 -0
  19. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/endpoint_builder.py +0 -0
  20. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  21. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/exception.py +0 -0
  22. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  23. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  24. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  25. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/string_utilities.py +0 -0
  26. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  27. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/token/token_counting.py +0 -0
  28. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/utils/__init__.py +0 -0
  29. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/utils/files.py +0 -0
  30. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  31. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  32. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  33. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/validate_required_values.py +0 -0
  34. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/_common/validators.py +0 -0
  35. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/__init__.py +0 -0
  36. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
  37. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/evaluation/config.py +0 -0
  38. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts.py +0 -0
  39. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  40. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
  41. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
  42. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  43. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  44. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
  45. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/evaluation/hallucination/prompts.py +0 -0
  46. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  47. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
  48. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  49. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
  50. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  51. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  52. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  53. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  54. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
  55. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  56. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
  57. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  58. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  59. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  60. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/__init__.py +0 -0
  61. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  62. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  63. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  64. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  65. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  66. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
  67. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  68. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  69. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  70. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/postprocessing/_display.py +0 -0
  71. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/postprocessing/_utils.py +0 -0
  72. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  73. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/postprocessing/postprocessor.py +0 -0
  74. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_consolidate_references.py +0 -0
  75. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  76. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_postprocessor_reference_functions.py +0 -0
  77. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  78. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  79. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  80. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  81. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  82. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  83. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  84. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/config.py +0 -0
  85. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/factory.py +0 -0
  86. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  87. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  88. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  89. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
  90. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/schemas.py +0 -0
  91. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  92. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  93. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/tool.py +0 -0
  94. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
  95. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  96. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  97. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/utils/execution/__init__.py +0 -0
  98. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/utils/execution/execution.py +0 -0
  99. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  100. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  101. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  102. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  103. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/app/__init__.py +0 -0
  104. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/app/dev_util.py +0 -0
  105. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/app/init_logging.py +0 -0
  106. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/app/init_sdk.py +0 -0
  107. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/app/performance/async_tasks.py +0 -0
  108. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  109. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/app/schemas.py +0 -0
  110. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/app/unique_settings.py +0 -0
  111. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/app/verification.py +0 -0
  112. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/chat/__init__.py +0 -0
  113. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/chat/constants.py +0 -0
  114. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/chat/deprecated/service.py +0 -0
  115. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/chat/functions.py +0 -0
  116. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/chat/schemas.py +0 -0
  117. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/chat/service.py +0 -0
  118. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/chat/state.py +0 -0
  119. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/chat/utils.py +0 -0
  120. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/content/__init__.py +0 -0
  121. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/content/constants.py +0 -0
  122. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/content/functions.py +0 -0
  123. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/content/schemas.py +0 -0
  124. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/content/service.py +0 -0
  125. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/content/smart_rules.py +0 -0
  126. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/content/utils.py +0 -0
  127. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/embedding/__init__.py +0 -0
  128. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/embedding/constants.py +0 -0
  129. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/embedding/functions.py +0 -0
  130. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/embedding/schemas.py +0 -0
  131. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/embedding/service.py +0 -0
  132. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/embedding/utils.py +0 -0
  133. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/framework_utilities/__init__.py +0 -0
  134. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  135. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  136. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  137. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  138. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  139. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/framework_utilities/utils.py +0 -0
  140. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/language_model/__init__.py +0 -0
  141. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/language_model/builder.py +0 -0
  142. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/language_model/constants.py +0 -0
  143. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/language_model/functions.py +0 -0
  144. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/language_model/infos.py +0 -0
  145. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/language_model/prompt.py +0 -0
  146. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/language_model/reference.py +0 -0
  147. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/language_model/schemas.py +0 -0
  148. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/language_model/service.py +0 -0
  149. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/language_model/utils.py +0 -0
  150. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/protocols/support.py +0 -0
  151. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/short_term_memory/__init__.py +0 -0
  152. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/short_term_memory/constants.py +0 -0
  153. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/short_term_memory/functions.py +0 -0
  154. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/short_term_memory/schemas.py +0 -0
  155. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/short_term_memory/service.py +0 -0
  156. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/unique_toolkit/smart_rules/__init__.py +0 -0
  157. {unique_toolkit-1.13.0 → unique_toolkit-1.14.1}/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.14.1] - 2025-10-08
9
+ - Add utilities for testing
10
+
11
+ ## [1.14.0] - 2025-10-07
12
+ - Manipulate Metadata with knowledge base service
13
+
8
14
  ## [1.13.0] - 2025-10-07
9
15
  - Delete contents with knowledge base service
10
16
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: unique_toolkit
3
- Version: 1.13.0
3
+ Version: 1.14.1
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.14.1] - 2025-10-08
122
+ - Add utilities for testing
123
+
124
+ ## [1.14.0] - 2025-10-07
125
+ - Manipulate Metadata with knowledge base service
126
+
121
127
  ## [1.13.0] - 2025-10-07
122
128
  - Delete contents with knowledge base service
123
129
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "unique_toolkit"
3
- version = "1.13.0"
3
+ version = "1.14.1"
4
4
  description = ""
5
5
  authors = [
6
6
  "Cedric Klinkert <cedric.klinkert@unique.ch>",
@@ -3,6 +3,7 @@ import logging
3
3
  from pathlib import Path
4
4
  from typing import Any, overload
5
5
 
6
+ import humps
6
7
  import unique_sdk
7
8
 
8
9
  from unique_toolkit._common.validate_required_values import validate_required_values
@@ -589,6 +590,138 @@ class KnowledgeBaseService:
589
590
 
590
591
  return self._resolve_visible_file_tree(content_infos=info.content_infos)
591
592
 
593
+ def _pop_forbidden_metadata_keys(self, metadata: dict[str, Any]) -> dict[str, Any]:
594
+ forbidden_keys = [
595
+ "key",
596
+ "url",
597
+ "title",
598
+ "folderId",
599
+ "mimeType",
600
+ "companyId",
601
+ "contentId",
602
+ "folderIdPath",
603
+ "externalFileOwner",
604
+ ]
605
+ for key in forbidden_keys:
606
+ metadata.pop(key, None)
607
+ return metadata
608
+
609
+ def update_content_metadata(
610
+ self,
611
+ *,
612
+ content_info: ContentInfo,
613
+ additional_metadata: dict[str, Any],
614
+ ) -> ContentInfo:
615
+ camelized_additional_metadata = humps.camelize(additional_metadata)
616
+ camelized_additional_metadata = self._pop_forbidden_metadata_keys(
617
+ camelized_additional_metadata
618
+ )
619
+
620
+ if content_info.metadata is not None:
621
+ content_info.metadata.update(camelized_additional_metadata)
622
+ else:
623
+ content_info.metadata = camelized_additional_metadata
624
+
625
+ return update_content(
626
+ user_id=self._user_id,
627
+ company_id=self._company_id,
628
+ content_id=content_info.id,
629
+ metadata=content_info.metadata,
630
+ )
631
+
632
+ def remove_content_metadata(
633
+ self,
634
+ *,
635
+ content_info: ContentInfo,
636
+ keys_to_remove: list[str],
637
+ ) -> ContentInfo:
638
+ """
639
+ Removes the specified keys irreversibly from the content metadata.
640
+ """
641
+
642
+ if content_info.metadata is None:
643
+ _LOGGER.warning(f"Content metadata is None for content {content_info.id}")
644
+ return content_info
645
+
646
+ for key in keys_to_remove:
647
+ content_info.metadata.pop(key, None)
648
+
649
+ return update_content(
650
+ user_id=self._user_id,
651
+ company_id=self._company_id,
652
+ content_id=content_info.id,
653
+ metadata=content_info.metadata or {},
654
+ )
655
+
656
+ @overload
657
+ def update_contents_metadata(
658
+ self,
659
+ *,
660
+ additional_metadata: dict[str, Any],
661
+ content_infos: list[ContentInfo],
662
+ ) -> list[ContentInfo]: ...
663
+
664
+ @overload
665
+ def update_contents_metadata(
666
+ self, *, additional_metadata: dict[str, Any], metadata_filter: dict[str, Any]
667
+ ) -> list[ContentInfo]: ...
668
+
669
+ def update_contents_metadata(
670
+ self,
671
+ *,
672
+ additional_metadata: dict[str, Any],
673
+ metadata_filter: dict[str, Any] | None = None,
674
+ content_infos: list[ContentInfo] | None = None,
675
+ ) -> list[ContentInfo]:
676
+ additional_metadata_camelized = humps.camelize(additional_metadata)
677
+ additional_metadata_camelized = self._pop_forbidden_metadata_keys(
678
+ additional_metadata_camelized
679
+ )
680
+
681
+ if content_infos is None:
682
+ content_infos = self.get_paginated_content_infos(
683
+ metadata_filter=metadata_filter,
684
+ ).content_infos
685
+
686
+ for info in content_infos:
687
+ self.update_content_metadata(
688
+ content_info=info, additional_metadata=additional_metadata_camelized
689
+ )
690
+
691
+ return content_infos
692
+
693
+ @overload
694
+ def remove_contents_metadata(
695
+ self,
696
+ *,
697
+ keys_to_remove: list[str],
698
+ content_infos: list[ContentInfo],
699
+ ) -> list[ContentInfo]: ...
700
+
701
+ @overload
702
+ def remove_contents_metadata(
703
+ self, *, keys_to_remove: list[str], metadata_filter: dict[str, Any]
704
+ ) -> list[ContentInfo]: ...
705
+
706
+ def remove_contents_metadata(
707
+ self,
708
+ *,
709
+ keys_to_remove: list[str],
710
+ metadata_filter: dict[str, Any] | None = None,
711
+ content_infos: list[ContentInfo] | None = None,
712
+ ) -> list[ContentInfo]:
713
+ if content_infos is None:
714
+ content_infos = self.get_paginated_content_infos(
715
+ metadata_filter=metadata_filter,
716
+ ).content_infos
717
+
718
+ for info in content_infos:
719
+ self.remove_content_metadata(
720
+ content_info=info, keys_to_remove=keys_to_remove
721
+ )
722
+
723
+ return content_infos
724
+
592
725
  @overload
593
726
  def delete_content(
594
727
  self,
@@ -0,0 +1,195 @@
1
+ import random
2
+ import string
3
+ from datetime import datetime
4
+ from typing import TYPE_CHECKING
5
+
6
+ from unique_toolkit.app.schemas import (
7
+ BaseEvent,
8
+ ChatEvent,
9
+ ChatEventAdditionalParameters,
10
+ ChatEventAssistantMessage,
11
+ ChatEventPayload,
12
+ ChatEventUserMessage,
13
+ EventName,
14
+ )
15
+
16
+ if TYPE_CHECKING:
17
+ from typing import Any
18
+
19
+ from unique_toolkit.app.unique_settings import UniqueSettings
20
+
21
+
22
+ def generated_numeric_string(length: int) -> str:
23
+ return "".join(random.choices(string.digits, k=length))
24
+
25
+
26
+ def generated_alphanumeric_string(length: int) -> str:
27
+ return "".join(random.choices(string.ascii_letters + string.digits, k=length))
28
+
29
+
30
+ def generated_chat_id() -> str:
31
+ return f"chat_{generated_alphanumeric_string(16)}"
32
+
33
+
34
+ def generated_assistant_id() -> str:
35
+ return f"assistant_{generated_alphanumeric_string(16)}"
36
+
37
+
38
+ def generated_user_message_id() -> str:
39
+ return f"msg_{generated_alphanumeric_string(16)}"
40
+
41
+
42
+ class TestEventFactory:
43
+ """Factory for creating test event objects with sensible defaults.
44
+
45
+ Simplifies test setup by providing convenient methods to generate
46
+ chat events, messages, and related objects for testing.
47
+ """
48
+
49
+ def __init__(self, settings: UniqueSettings | None = None) -> None:
50
+ self._settings = settings
51
+
52
+ def _get_user_id(self) -> str:
53
+ if self._settings is None:
54
+ return generated_numeric_string(16)
55
+ else:
56
+ return self._settings.auth.user_id.get_secret_value()
57
+
58
+ def _get_company_id(self) -> str:
59
+ if self._settings is None:
60
+ return generated_numeric_string(16)
61
+ else:
62
+ return self._settings.auth.company_id.get_secret_value()
63
+
64
+ def get_chat_event_user_message(
65
+ self,
66
+ text: str,
67
+ *,
68
+ created_at: datetime | None = None,
69
+ language: str = "DE",
70
+ original_text: str | None = None,
71
+ ) -> ChatEventUserMessage:
72
+ if created_at is None:
73
+ created_at = datetime.now()
74
+
75
+ return ChatEventUserMessage(
76
+ id=generated_user_message_id(),
77
+ text=text,
78
+ original_text=original_text or text,
79
+ created_at=created_at.isoformat(),
80
+ language=language,
81
+ )
82
+
83
+ def get_chat_event_assistant_message(
84
+ self, *, created_at: datetime | None = None
85
+ ) -> ChatEventAssistantMessage:
86
+ if created_at is None:
87
+ created_at = datetime.now()
88
+
89
+ return ChatEventAssistantMessage(
90
+ id=generated_assistant_id(), created_at=created_at.isoformat()
91
+ )
92
+
93
+ def get_chat_event_additional_parameters(
94
+ self,
95
+ *,
96
+ translate_to_language: str | None = None,
97
+ content_id_to_translate: str | None = None,
98
+ ) -> ChatEventAdditionalParameters:
99
+ return ChatEventAdditionalParameters(
100
+ translate_to_language=translate_to_language,
101
+ content_id_to_translate=content_id_to_translate,
102
+ )
103
+
104
+ def get_base_event(
105
+ self,
106
+ *,
107
+ event: EventName = EventName.EXTERNAL_MODULE_CHOSEN,
108
+ user_id: str | None = None,
109
+ company_id: str | None = None,
110
+ ) -> BaseEvent:
111
+ return BaseEvent(
112
+ id=generated_alphanumeric_string(16),
113
+ event=event,
114
+ user_id=user_id or self._get_user_id(),
115
+ company_id=company_id or self._get_company_id(),
116
+ )
117
+
118
+ def get_chat_event_payload(
119
+ self,
120
+ *,
121
+ name: str,
122
+ description: str,
123
+ user_message_text: str,
124
+ user_message_created_at: datetime | None = None,
125
+ user_message_language: str = "DE",
126
+ user_message_original_text: str | None = None,
127
+ assistant_message_created_at: datetime | None = None,
128
+ configuration: dict[str, Any] | None = None,
129
+ chat_id: str | None = None,
130
+ assistant_id: str | None = None,
131
+ ) -> ChatEventPayload:
132
+ if chat_id is None:
133
+ chat_id = generated_chat_id()
134
+
135
+ if assistant_id is None:
136
+ assistant_id = generated_assistant_id()
137
+
138
+ assistant_message = self.get_chat_event_assistant_message(
139
+ created_at=assistant_message_created_at or datetime.now()
140
+ )
141
+ user_message = self.get_chat_event_user_message(
142
+ text=user_message_text,
143
+ created_at=user_message_created_at or datetime.now(),
144
+ language=user_message_language,
145
+ original_text=user_message_original_text,
146
+ )
147
+ return ChatEventPayload(
148
+ name=name,
149
+ description=description,
150
+ configuration=configuration or {},
151
+ chat_id=chat_id,
152
+ assistant_id=assistant_id,
153
+ user_message=user_message,
154
+ assistant_message=assistant_message,
155
+ )
156
+
157
+ def get_chat_event(
158
+ self,
159
+ *,
160
+ name: str,
161
+ event_name: EventName = EventName.EXTERNAL_MODULE_CHOSEN,
162
+ description: str,
163
+ user_message_text: str,
164
+ user_message_created_at: datetime = datetime.now(),
165
+ user_message_language: str = "DE",
166
+ user_message_original_text: str | None = None,
167
+ assistant_message_created_at: datetime | None = None,
168
+ configuration: dict[str, Any] | None = None,
169
+ chat_id: str = generated_chat_id(),
170
+ assistant_id: str = generated_assistant_id(),
171
+ user_id: str | None = None,
172
+ company_id: str | None = None,
173
+ version: str = "1.0",
174
+ ) -> ChatEvent:
175
+ payload = self.get_chat_event_payload(
176
+ name=name,
177
+ description=description,
178
+ user_message_text=user_message_text,
179
+ user_message_created_at=user_message_created_at,
180
+ user_message_language=user_message_language,
181
+ user_message_original_text=user_message_original_text,
182
+ assistant_message_created_at=assistant_message_created_at,
183
+ configuration=configuration or {},
184
+ chat_id=chat_id,
185
+ assistant_id=assistant_id,
186
+ )
187
+ return ChatEvent(
188
+ id=generated_alphanumeric_string(16),
189
+ event=event_name,
190
+ user_id=user_id or self._get_user_id(),
191
+ company_id=company_id or self._get_company_id(),
192
+ payload=payload,
193
+ created_at=int(datetime.now().timestamp()),
194
+ version=version,
195
+ )
File without changes