unique_toolkit 1.11.4__tar.gz → 1.12.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.11.4 → unique_toolkit-1.12.0}/CHANGELOG.md +5 -2
  2. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/PKG-INFO +6 -3
  3. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/pyproject.toml +1 -1
  4. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/framework_utilities/openai/message_builder.py +85 -1
  5. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/LICENSE +0 -0
  6. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/README.md +0 -0
  7. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/__init__.py +0 -0
  8. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/_base_service.py +0 -0
  9. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/_time_utils.py +0 -0
  10. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  11. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  12. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  13. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  14. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  15. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  16. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  17. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/default_language_model.py +0 -0
  18. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/endpoint_builder.py +0 -0
  19. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  20. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/exception.py +0 -0
  21. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  22. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  23. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  24. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/string_utilities.py +0 -0
  25. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  26. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/token/token_counting.py +0 -0
  27. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/utils/__init__.py +0 -0
  28. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/utils/files.py +0 -0
  29. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  30. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  31. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  32. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/validate_required_values.py +0 -0
  33. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/_common/validators.py +0 -0
  34. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/__init__.py +0 -0
  35. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
  36. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/evaluation/config.py +0 -0
  37. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts.py +0 -0
  38. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  39. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
  40. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
  41. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  42. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  43. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
  44. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/evaluation/hallucination/prompts.py +0 -0
  45. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  46. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
  47. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  48. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
  49. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  50. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  51. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  52. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  53. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
  54. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  55. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
  56. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  57. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/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.0}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  59. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/__init__.py +0 -0
  60. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  61. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  62. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  63. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  64. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  65. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
  66. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  67. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  68. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  69. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/postprocessing/_display.py +0 -0
  70. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/postprocessing/_utils.py +0 -0
  71. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  72. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/postprocessing/postprocessor.py +0 -0
  73. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_consolidate_references.py +0 -0
  74. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  75. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_postprocessor_reference_functions.py +0 -0
  76. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  77. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  78. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  79. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  80. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  81. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  82. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  83. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/config.py +0 -0
  84. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/factory.py +0 -0
  85. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  86. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  87. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  88. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
  89. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/schemas.py +0 -0
  90. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  91. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  92. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/tool.py +0 -0
  93. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
  94. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  95. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  96. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/utils/execution/__init__.py +0 -0
  97. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/utils/execution/execution.py +0 -0
  98. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  99. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  100. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  101. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  102. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/app/__init__.py +0 -0
  103. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/app/dev_util.py +0 -0
  104. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/app/init_logging.py +0 -0
  105. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/app/init_sdk.py +0 -0
  106. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/app/performance/async_tasks.py +0 -0
  107. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  108. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/app/schemas.py +0 -0
  109. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/app/unique_settings.py +0 -0
  110. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/app/verification.py +0 -0
  111. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/chat/__init__.py +0 -0
  112. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/chat/constants.py +0 -0
  113. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/chat/deprecated/service.py +0 -0
  114. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/chat/functions.py +0 -0
  115. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/chat/schemas.py +0 -0
  116. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/chat/service.py +0 -0
  117. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/chat/state.py +0 -0
  118. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/chat/utils.py +0 -0
  119. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/content/__init__.py +0 -0
  120. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/content/constants.py +0 -0
  121. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/content/functions.py +0 -0
  122. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/content/schemas.py +0 -0
  123. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/content/service.py +0 -0
  124. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/content/smart_rules.py +0 -0
  125. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/content/utils.py +0 -0
  126. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/embedding/__init__.py +0 -0
  127. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/embedding/constants.py +0 -0
  128. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/embedding/functions.py +0 -0
  129. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/embedding/schemas.py +0 -0
  130. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/embedding/service.py +0 -0
  131. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/embedding/utils.py +0 -0
  132. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/framework_utilities/__init__.py +0 -0
  133. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  134. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  135. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  136. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  137. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/framework_utilities/utils.py +0 -0
  138. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/knowledge_base.py +0 -0
  139. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/language_model/__init__.py +0 -0
  140. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/language_model/builder.py +0 -0
  141. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/language_model/constants.py +0 -0
  142. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/language_model/functions.py +0 -0
  143. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/language_model/infos.py +0 -0
  144. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/language_model/prompt.py +0 -0
  145. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/language_model/reference.py +0 -0
  146. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/language_model/schemas.py +0 -0
  147. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/language_model/service.py +0 -0
  148. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/language_model/utils.py +0 -0
  149. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/protocols/support.py +0 -0
  150. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/short_term_memory/__init__.py +0 -0
  151. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/short_term_memory/constants.py +0 -0
  152. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/short_term_memory/functions.py +0 -0
  153. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/short_term_memory/schemas.py +0 -0
  154. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/short_term_memory/service.py +0 -0
  155. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/smart_rules/__init__.py +0 -0
  156. {unique_toolkit-1.11.4 → unique_toolkit-1.12.0}/unique_toolkit/smart_rules/compile.py +0 -0
@@ -5,11 +5,14 @@ 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.0] - 2026-10-07
9
+ - Add the `OpenAIUserMessageBuilder` for complex user messages with images
10
+ - More examples with documents/images on the chat
8
11
 
9
- ## [1.11.4] - 2026-10-06
12
+ ## [1.11.4] - 2026-10-07
10
13
  - Make newer `MessageExecution` and `MessageLog` method keyword only
11
14
 
12
- ## [1.11.3] - 2026-10-06
15
+ ## [1.11.3] - 2026-10-07
13
16
  - Move smart rules to content
14
17
  - Add to documentation
15
18
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: unique_toolkit
3
- Version: 1.11.4
3
+ Version: 1.12.0
4
4
  Summary:
5
5
  License: Proprietary
6
6
  Author: Cedric Klinkert
@@ -118,11 +118,14 @@ 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.0] - 2026-10-07
122
+ - Add the `OpenAIUserMessageBuilder` for complex user messages with images
123
+ - More examples with documents/images on the chat
121
124
 
122
- ## [1.11.4] - 2026-10-06
125
+ ## [1.11.4] - 2026-10-07
123
126
  - Make newer `MessageExecution` and `MessageLog` method keyword only
124
127
 
125
- ## [1.11.3] - 2026-10-06
128
+ ## [1.11.3] - 2026-10-07
126
129
  - Move smart rules to content
127
130
  - Add to documentation
128
131
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "unique_toolkit"
3
- version = "1.11.4"
3
+ version = "1.12.0"
4
4
  description = ""
5
5
  authors = [
6
6
  "Cedric Klinkert <cedric.klinkert@unique.ch>",
@@ -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