unique_toolkit 1.11.4__tar.gz → 1.12.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 (156) hide show
  1. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/CHANGELOG.md +8 -2
  2. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/PKG-INFO +9 -3
  3. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/pyproject.toml +1 -1
  4. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/evaluation/evaluation_manager.py +9 -5
  5. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +9 -1
  6. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/framework_utilities/openai/message_builder.py +85 -1
  7. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/LICENSE +0 -0
  8. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/README.md +0 -0
  9. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/__init__.py +0 -0
  10. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/_base_service.py +0 -0
  11. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/_time_utils.py +0 -0
  12. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  13. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  14. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  15. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  16. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  17. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  18. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  19. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/default_language_model.py +0 -0
  20. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/endpoint_builder.py +0 -0
  21. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  22. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/exception.py +0 -0
  23. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  24. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  25. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  26. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/string_utilities.py +0 -0
  27. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  28. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/token/token_counting.py +0 -0
  29. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/utils/__init__.py +0 -0
  30. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/utils/files.py +0 -0
  31. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  32. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  33. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  34. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/validate_required_values.py +0 -0
  35. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/_common/validators.py +0 -0
  36. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/__init__.py +0 -0
  37. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
  38. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/evaluation/config.py +0 -0
  39. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts.py +0 -0
  40. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  41. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
  42. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  43. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  44. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/evaluation/hallucination/prompts.py +0 -0
  45. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  46. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
  47. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  48. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
  49. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  50. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  51. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  52. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  53. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
  54. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  55. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
  56. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  57. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  58. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  59. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/__init__.py +0 -0
  60. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  61. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  62. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  63. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  64. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  65. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
  66. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  67. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  68. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  69. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/postprocessing/_display.py +0 -0
  70. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/postprocessing/_utils.py +0 -0
  71. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  72. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/postprocessing/postprocessor.py +0 -0
  73. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_consolidate_references.py +0 -0
  74. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  75. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_postprocessor_reference_functions.py +0 -0
  76. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  77. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  78. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  79. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  80. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  81. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  82. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  83. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/config.py +0 -0
  84. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/factory.py +0 -0
  85. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  86. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  87. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  88. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
  89. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/schemas.py +0 -0
  90. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  91. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  92. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/tool.py +0 -0
  93. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
  94. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  95. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  96. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/utils/execution/__init__.py +0 -0
  97. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/utils/execution/execution.py +0 -0
  98. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  99. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  100. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  101. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  102. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/app/__init__.py +0 -0
  103. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/app/dev_util.py +0 -0
  104. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/app/init_logging.py +0 -0
  105. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/app/init_sdk.py +0 -0
  106. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/app/performance/async_tasks.py +0 -0
  107. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  108. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/app/schemas.py +0 -0
  109. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/app/unique_settings.py +0 -0
  110. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/app/verification.py +0 -0
  111. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/chat/__init__.py +0 -0
  112. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/chat/constants.py +0 -0
  113. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/chat/deprecated/service.py +0 -0
  114. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/chat/functions.py +0 -0
  115. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/chat/schemas.py +0 -0
  116. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/chat/service.py +0 -0
  117. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/chat/state.py +0 -0
  118. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/chat/utils.py +0 -0
  119. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/content/__init__.py +0 -0
  120. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/content/constants.py +0 -0
  121. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/content/functions.py +0 -0
  122. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/content/schemas.py +0 -0
  123. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/content/service.py +0 -0
  124. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/content/smart_rules.py +0 -0
  125. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/content/utils.py +0 -0
  126. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/embedding/__init__.py +0 -0
  127. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/embedding/constants.py +0 -0
  128. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/embedding/functions.py +0 -0
  129. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/embedding/schemas.py +0 -0
  130. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/embedding/service.py +0 -0
  131. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/embedding/utils.py +0 -0
  132. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/framework_utilities/__init__.py +0 -0
  133. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  134. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  135. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  136. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  137. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/framework_utilities/utils.py +0 -0
  138. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/knowledge_base.py +0 -0
  139. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/language_model/__init__.py +0 -0
  140. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/language_model/builder.py +0 -0
  141. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/language_model/constants.py +0 -0
  142. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/language_model/functions.py +0 -0
  143. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/language_model/infos.py +0 -0
  144. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/language_model/prompt.py +0 -0
  145. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/language_model/reference.py +0 -0
  146. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/language_model/schemas.py +0 -0
  147. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/language_model/service.py +0 -0
  148. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/language_model/utils.py +0 -0
  149. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/protocols/support.py +0 -0
  150. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/short_term_memory/__init__.py +0 -0
  151. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/short_term_memory/constants.py +0 -0
  152. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/short_term_memory/functions.py +0 -0
  153. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/short_term_memory/schemas.py +0 -0
  154. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/short_term_memory/service.py +0 -0
  155. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/smart_rules/__init__.py +0 -0
  156. {unique_toolkit-1.11.4 → unique_toolkit-1.12.1}/unique_toolkit/smart_rules/compile.py +0 -0
@@ -5,11 +5,17 @@ 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.12.1] - 2025-10-07
9
+ - Fix bug where failed evaluations did not show an error to the user.
8
10
 
9
- ## [1.11.4] - 2026-10-06
11
+ ## [1.12.0] - 2026-10-07
12
+ - Add the `OpenAIUserMessageBuilder` for complex user messages with images
13
+ - More examples with documents/images on the chat
14
+
15
+ ## [1.11.4] - 2026-10-07
10
16
  - Make newer `MessageExecution` and `MessageLog` method keyword only
11
17
 
12
- ## [1.11.3] - 2026-10-06
18
+ ## [1.11.3] - 2026-10-07
13
19
  - Move smart rules to content
14
20
  - Add to documentation
15
21
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: unique_toolkit
3
- Version: 1.11.4
3
+ Version: 1.12.1
4
4
  Summary:
5
5
  License: Proprietary
6
6
  Author: Cedric Klinkert
@@ -118,11 +118,17 @@ 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.12.1] - 2025-10-07
122
+ - Fix bug where failed evaluations did not show an error to the user.
121
123
 
122
- ## [1.11.4] - 2026-10-06
124
+ ## [1.12.0] - 2026-10-07
125
+ - Add the `OpenAIUserMessageBuilder` for complex user messages with images
126
+ - More examples with documents/images on the chat
127
+
128
+ ## [1.11.4] - 2026-10-07
123
129
  - Make newer `MessageExecution` and `MessageLog` method keyword only
124
130
 
125
- ## [1.11.3] - 2026-10-06
131
+ ## [1.11.3] - 2026-10-07
126
132
  - Move smart rules to content
127
133
  - Add to documentation
128
134
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "unique_toolkit"
3
- version = "1.11.4"
3
+ version = "1.12.1"
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
  )
@@ -1,5 +1,8 @@
1
+ import base64
2
+ import mimetypes
1
3
  from collections.abc import Iterable
2
- from typing import Self
4
+ from pathlib import Path
5
+ from typing import Self, overload
3
6
 
4
7
  from openai.types.chat.chat_completion_assistant_message_param import (
5
8
  Audio,
@@ -7,6 +10,10 @@ from openai.types.chat.chat_completion_assistant_message_param import (
7
10
  ContentArrayOfContentPart,
8
11
  FunctionCall,
9
12
  )
13
+ from openai.types.chat.chat_completion_content_part_image_param import (
14
+ ChatCompletionContentPartImageParam,
15
+ ImageURL,
16
+ )
10
17
  from openai.types.chat.chat_completion_content_part_param import (
11
18
  ChatCompletionContentPartParam,
12
19
  )
@@ -32,6 +39,83 @@ from openai.types.chat.chat_completion_tool_message_param import (
32
39
  from openai.types.chat.chat_completion_user_message_param import (
33
40
  ChatCompletionUserMessageParam,
34
41
  )
42
+ from typing_extensions import Literal
43
+
44
+
45
+ class OpenAIUserMessageBuilder:
46
+ def __init__(
47
+ self,
48
+ ) -> None:
49
+ self._messages: list[ChatCompletionContentPartParam] = []
50
+
51
+ def append_text(self, content: str) -> Self:
52
+ part = ChatCompletionContentPartTextParam(
53
+ type="text",
54
+ text=content,
55
+ )
56
+ self._messages.append(part)
57
+ return self
58
+
59
+ @overload
60
+ def append_image(
61
+ self, *, url: str, detail: Literal["auto", "low", "high"] = "auto"
62
+ ) -> Self: ...
63
+
64
+ @overload
65
+ def append_image(
66
+ self, *, path: Path, detail: Literal["auto", "low", "high"] = "auto"
67
+ ) -> Self: ...
68
+
69
+ @overload
70
+ def append_image(
71
+ self,
72
+ *,
73
+ content: bytes,
74
+ mime_type: str,
75
+ detail: Literal["auto", "low", "high"] = "auto",
76
+ ) -> Self: ...
77
+
78
+ def append_image(
79
+ self,
80
+ *,
81
+ url: str | None = None,
82
+ path: Path | None = None,
83
+ content: bytes | None = None,
84
+ mime_type: str | None = None,
85
+ detail: Literal["auto", "low", "high"] = "auto",
86
+ ) -> Self:
87
+ if url is None and path is None and (content is None or mime_type is None):
88
+ raise ValueError("Either url or path must be provided")
89
+
90
+ if path is not None:
91
+ # Read image file and encode as base64 data URI
92
+ image_data = path.read_bytes()
93
+ base64_image = base64.b64encode(image_data).decode("utf-8")
94
+ mime_type = mimetypes.guess_type(str(path))[0] or "image/jpeg"
95
+ url = f"data:{mime_type};base64,{base64_image}"
96
+
97
+ if content is not None and mime_type is not None:
98
+ base64_image = base64.b64encode(content).decode("utf-8")
99
+ url = f"data:{mime_type};base64,{base64_image}"
100
+
101
+ image_url = ImageURL(url=url or "", detail=detail)
102
+ part = ChatCompletionContentPartImageParam(
103
+ type="image_url",
104
+ image_url=image_url,
105
+ )
106
+ self._messages.append(part)
107
+ return self
108
+
109
+ @property
110
+ def user_message(self) -> ChatCompletionUserMessageParam:
111
+ return ChatCompletionUserMessageParam(
112
+ content=self._messages,
113
+ role="user",
114
+ )
115
+
116
+ @property
117
+ def iterable_content(self) -> Iterable[ChatCompletionContentPartParam]:
118
+ return self._messages
35
119
 
36
120
 
37
121
  class OpenAIMessageBuilder:
File without changes