unique_toolkit 1.19.3__tar.gz → 1.20.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.

Potentially problematic release.


This version of unique_toolkit might be problematic. Click here for more details.

Files changed (173) hide show
  1. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/CHANGELOG.md +9 -0
  2. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/PKG-INFO +10 -1
  3. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/pyproject.toml +1 -1
  4. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +71 -19
  5. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +1 -1
  6. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/postprocessing/_display.py +19 -10
  7. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +12 -0
  8. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/postprocessing/postprocessor.py +28 -12
  9. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +71 -10
  10. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/utils/execution/execution.py +8 -4
  11. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/language_model/schemas.py +7 -8
  12. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/LICENSE +0 -0
  13. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/README.md +0 -0
  14. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/__init__.py +0 -0
  15. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/_base_service.py +0 -0
  16. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/_time_utils.py +0 -0
  17. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  18. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  19. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  20. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  21. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  22. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  23. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  24. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/default_language_model.py +0 -0
  25. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/endpoint_builder.py +0 -0
  26. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  27. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/exception.py +0 -0
  28. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  29. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  30. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  31. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/string_utilities.py +0 -0
  32. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  33. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/token/token_counting.py +0 -0
  34. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/utils/__init__.py +0 -0
  35. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/utils/files.py +0 -0
  36. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  37. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  38. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  39. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/validate_required_values.py +0 -0
  40. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/_common/validators.py +0 -0
  41. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/__init__.py +0 -0
  42. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
  43. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
  44. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/evaluation/config.py +0 -0
  45. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts.py +0 -0
  46. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  47. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
  48. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
  49. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  50. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  51. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
  52. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/evaluation/hallucination/prompts.py +0 -0
  53. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  54. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
  55. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  56. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
  57. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  58. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  59. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  60. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  61. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
  62. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  63. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  64. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
  65. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
  66. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
  67. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
  68. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  69. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  70. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/__init__.py +0 -0
  71. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  72. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  73. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  74. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  75. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  76. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  77. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  78. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  79. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/postprocessing/_utils.py +0 -0
  80. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_consolidate_references.py +0 -0
  81. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_postprocessor_reference_functions.py +0 -0
  82. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  83. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  84. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  85. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  86. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  87. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  88. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  89. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/config.py +0 -0
  90. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/factory.py +0 -0
  91. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  92. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  93. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  94. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
  95. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
  96. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
  97. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
  98. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
  99. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +0 -0
  100. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
  101. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/schemas.py +0 -0
  102. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  103. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  104. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/tool.py +0 -0
  105. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
  106. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  107. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  108. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/utils/execution/__init__.py +0 -0
  109. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  110. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  111. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  112. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  113. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/app/__init__.py +0 -0
  114. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/app/dev_util.py +0 -0
  115. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/app/init_logging.py +0 -0
  116. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/app/init_sdk.py +0 -0
  117. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/app/performance/async_tasks.py +0 -0
  118. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  119. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/app/schemas.py +0 -0
  120. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/app/unique_settings.py +0 -0
  121. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/app/verification.py +0 -0
  122. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/chat/__init__.py +0 -0
  123. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/chat/constants.py +0 -0
  124. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/chat/deprecated/service.py +0 -0
  125. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/chat/functions.py +0 -0
  126. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/chat/rendering.py +0 -0
  127. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/chat/responses_api.py +0 -0
  128. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/chat/schemas.py +0 -0
  129. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/chat/service.py +0 -0
  130. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/chat/state.py +0 -0
  131. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/chat/utils.py +0 -0
  132. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/content/__init__.py +0 -0
  133. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/content/constants.py +0 -0
  134. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/content/functions.py +0 -0
  135. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/content/schemas.py +0 -0
  136. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/content/service.py +0 -0
  137. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/content/smart_rules.py +0 -0
  138. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/content/utils.py +0 -0
  139. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/embedding/__init__.py +0 -0
  140. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/embedding/constants.py +0 -0
  141. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/embedding/functions.py +0 -0
  142. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/embedding/schemas.py +0 -0
  143. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/embedding/service.py +0 -0
  144. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/embedding/utils.py +0 -0
  145. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/framework_utilities/__init__.py +0 -0
  146. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  147. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  148. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  149. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  150. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  151. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/framework_utilities/utils.py +0 -0
  152. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/language_model/__init__.py +0 -0
  153. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/language_model/builder.py +0 -0
  154. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/language_model/constants.py +0 -0
  155. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/language_model/default_language_model.py +0 -0
  156. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/language_model/functions.py +0 -0
  157. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/language_model/infos.py +0 -0
  158. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/language_model/prompt.py +0 -0
  159. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/language_model/reference.py +0 -0
  160. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/language_model/service.py +0 -0
  161. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/language_model/utils.py +0 -0
  162. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/protocols/support.py +0 -0
  163. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/services/__init__.py +0 -0
  164. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/services/chat_service.py +0 -0
  165. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/services/knowledge_base.py +0 -0
  166. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/short_term_memory/__init__.py +0 -0
  167. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/short_term_memory/constants.py +0 -0
  168. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/short_term_memory/functions.py +0 -0
  169. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/short_term_memory/schemas.py +0 -0
  170. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/short_term_memory/service.py +0 -0
  171. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/smart_rules/__init__.py +0 -0
  172. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/smart_rules/compile.py +0 -0
  173. {unique_toolkit-1.19.3 → unique_toolkit-1.20.1}/unique_toolkit/test_utilities/events.py +0 -0
@@ -6,6 +6,14 @@ 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
8
 
9
+ ## [1.20.1] - 2025-10-30
10
+ - Fix typing issues in `LanguageModelFunction`.
11
+
12
+ ## [1.20.0] - 2025-10-30
13
+ - Fix bug where async tasks executed with `SafeTaskExecutor` did not log exceptions.
14
+ - Add option to customize sub agent response display title.
15
+ - Add option to display sub agent responses after the main agent response.
16
+ - Add option to specify postprocessors to run before or after the others in the `PostprocessorManager`.
9
17
 
10
18
  ## [1.19.3] - 2025-10-29
11
19
  - More documentation on advanced rendering
@@ -21,6 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
21
29
  ## [1.19.0] - 2025-10-28
22
30
  - Enable additional headers on openai and langchain client
23
31
 
32
+
24
33
  ## [1.18.1] - 2025-10-28
25
34
  - Fix bug where sub agent references were not properly displayed in the main agent response when the sub agent response was hidden.
26
35
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: unique_toolkit
3
- Version: 1.19.3
3
+ Version: 1.20.1
4
4
  Summary:
5
5
  License: Proprietary
6
6
  Author: Cedric Klinkert
@@ -119,6 +119,14 @@ 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
121
 
122
+ ## [1.20.1] - 2025-10-30
123
+ - Fix typing issues in `LanguageModelFunction`.
124
+
125
+ ## [1.20.0] - 2025-10-30
126
+ - Fix bug where async tasks executed with `SafeTaskExecutor` did not log exceptions.
127
+ - Add option to customize sub agent response display title.
128
+ - Add option to display sub agent responses after the main agent response.
129
+ - Add option to specify postprocessors to run before or after the others in the `PostprocessorManager`.
122
130
 
123
131
  ## [1.19.3] - 2025-10-29
124
132
  - More documentation on advanced rendering
@@ -134,6 +142,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
134
142
  ## [1.19.0] - 2025-10-28
135
143
  - Enable additional headers on openai and langchain client
136
144
 
145
+
137
146
  ## [1.18.1] - 2025-10-28
138
147
  - Fix bug where sub agent references were not properly displayed in the main agent response when the sub agent response was hidden.
139
148
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "unique_toolkit"
3
- version = "1.19.3"
3
+ version = "1.20.1"
4
4
  description = ""
5
5
  authors = [
6
6
  "Cedric Klinkert <cedric.klinkert@unique.ch>",
@@ -85,15 +85,39 @@ class PostprocessorManager:
85
85
  self._chat_service = chat_service
86
86
  self._postprocessors: list[Postprocessor | ResponsesApiPostprocessor] = []
87
87
 
88
+ # Allow to add postprocessors that should be run before or after the others.
89
+ self._first_postprocessor: Postprocessor | ResponsesApiPostprocessor | None = (
90
+ None
91
+ )
92
+ self._last_postprocessor: Postprocessor | ResponsesApiPostprocessor | None = (
93
+ None
94
+ )
95
+
88
96
  def add_postprocessor(
89
97
  self, postprocessor: Postprocessor | ResponsesApiPostprocessor
90
98
  ):
91
99
  self._postprocessors.append(postprocessor)
92
100
 
101
+ def set_first_postprocessor(
102
+ self, postprocessor: Postprocessor | ResponsesApiPostprocessor
103
+ ) -> None:
104
+ if self._first_postprocessor is not None:
105
+ raise ValueError("Cannot set first postprocessor if already set.")
106
+
107
+ self._first_postprocessor = postprocessor
108
+
109
+ def set_last_postprocessor(
110
+ self, postprocessor: Postprocessor | ResponsesApiPostprocessor
111
+ ) -> None:
112
+ if self._last_postprocessor is not None:
113
+ raise ValueError("Cannot set last postprocessor if already set.")
114
+
115
+ self._last_postprocessor = postprocessor
116
+
93
117
  def get_postprocessors(
94
118
  self, name: str
95
119
  ) -> list[Postprocessor | ResponsesApiPostprocessor]:
96
- return self._postprocessors
120
+ return self._get_all_postprocessors()
97
121
 
98
122
  async def run_postprocessors(
99
123
  self,
@@ -103,14 +127,7 @@ class PostprocessorManager:
103
127
  logger=self._logger,
104
128
  )
105
129
 
106
- if isinstance(loop_response, ResponsesLanguageModelStreamResponse):
107
- postprocessors = self._postprocessors
108
- else:
109
- postprocessors = [
110
- postprocessor
111
- for postprocessor in self._postprocessors
112
- if isinstance(postprocessor, Postprocessor)
113
- ]
130
+ postprocessors = self._get_valid_postprocessors_for_loop_response(loop_response)
114
131
 
115
132
  tasks = [
116
133
  task_executor.execute_async(
@@ -122,17 +139,14 @@ class PostprocessorManager:
122
139
  ]
123
140
  postprocessor_results = await asyncio.gather(*tasks)
124
141
 
125
- for postprocessor, result in zip(postprocessors, postprocessor_results):
126
- if not result.success:
127
- self._logger.warning(
128
- "Postprocessor %s failed to run.",
129
- postprocessor.get_name(),
130
- exc_info=result.exception,
131
- )
142
+ successful_postprocessors: list[Postprocessor | ResponsesApiPostprocessor] = []
143
+ for i in range(len(postprocessors)):
144
+ if postprocessor_results[i].success:
145
+ successful_postprocessors.append(postprocessors[i])
132
146
 
133
147
  modification_results = [
134
- postprocessor.apply_postprocessing_to_response(loop_response) # type: ignore
135
- for postprocessor in postprocessors
148
+ postprocessor.apply_postprocessing_to_response(loop_response) # type: ignore (checked in `get_valid_postprocessors_for_loop_response`)
149
+ for postprocessor in successful_postprocessors
136
150
  ]
137
151
 
138
152
  has_been_modified = any(modification_results)
@@ -155,6 +169,44 @@ class PostprocessorManager:
155
169
  self,
156
170
  text: str,
157
171
  ) -> str:
158
- for postprocessor in self._postprocessors:
172
+ for postprocessor in self._get_all_postprocessors():
159
173
  text = await postprocessor.remove_from_text(text)
160
174
  return text
175
+
176
+ def _get_all_postprocessors(
177
+ self,
178
+ ) -> list[Postprocessor | ResponsesApiPostprocessor]:
179
+ return [
180
+ postprocessor
181
+ for postprocessor in [
182
+ self._first_postprocessor,
183
+ *self._postprocessors,
184
+ self._last_postprocessor,
185
+ ]
186
+ if postprocessor is not None
187
+ ]
188
+
189
+ def _get_valid_postprocessors_for_loop_response(
190
+ self, loop_response: LanguageModelStreamResponse
191
+ ) -> list[Postprocessor | ResponsesApiPostprocessor]:
192
+ all_postprocessors = self._get_all_postprocessors()
193
+
194
+ postprocessors: list[Postprocessor | ResponsesApiPostprocessor] = []
195
+
196
+ if isinstance(loop_response, ResponsesLanguageModelStreamResponse):
197
+ """
198
+ All processore can be executed, since `ResponsesLanguageModelStreamResponse`
199
+ is a subclass of `LanguageModelStreamResponse`
200
+ """
201
+ postprocessors = all_postprocessors
202
+ else:
203
+ """
204
+ Cannot execute Responses API-specific postprocessors
205
+ """
206
+ postprocessors = [
207
+ postprocessor
208
+ for postprocessor in all_postprocessors
209
+ if isinstance(postprocessor, Postprocessor)
210
+ ]
211
+
212
+ return postprocessors
@@ -52,7 +52,7 @@ def _format_single_assessment_found(name: str, explanation: str) -> str:
52
52
  return _SingleAssessmentData(name=name, explanation=explanation).model_dump_json()
53
53
 
54
54
 
55
- @failsafe(failure_return_value=False)
55
+ @failsafe(failure_return_value=False, log_exceptions=False)
56
56
  def _is_single_assessment_found(value: str) -> bool:
57
57
  _ = _SingleAssessmentData.model_validate_json(value)
58
58
  return True
@@ -77,10 +77,17 @@ def _add_line_break(text: str, before: bool = True, after: bool = True) -> str:
77
77
  return _wrap_text(text, start_tag, end_tag)
78
78
 
79
79
 
80
+ def _prepare_title_template(
81
+ display_title_template: str, display_name_placeholder: str
82
+ ) -> str:
83
+ return display_title_template.replace("{}", "{%s}" % display_name_placeholder)
84
+
85
+
80
86
  def _get_display_template(
81
87
  mode: SubAgentResponseDisplayMode,
82
88
  add_quote_border: bool,
83
89
  add_block_border: bool,
90
+ display_title_template: str,
84
91
  answer_placeholder: str = "answer",
85
92
  assistant_id_placeholder: str = "assistant_id",
86
93
  display_name_placeholder: str = "display_name",
@@ -89,7 +96,9 @@ def _get_display_template(
89
96
  return ""
90
97
 
91
98
  assistant_id_placeholder = _wrap_hidden_div("{%s}" % assistant_id_placeholder)
92
- display_name_placeholder = _wrap_strong("{%s}" % display_name_placeholder)
99
+ title_template = _prepare_title_template(
100
+ display_title_template, display_name_placeholder
101
+ )
93
102
  template = _join_text_blocks(
94
103
  assistant_id_placeholder, "{%s}" % answer_placeholder, sep="\n\n"
95
104
  ) # Double line break is needed for markdown formatting
@@ -104,20 +113,14 @@ def _get_display_template(
104
113
  template = _wrap_with_details_tag(
105
114
  template,
106
115
  "open",
107
- display_name_placeholder,
116
+ title_template,
108
117
  )
109
118
  case SubAgentResponseDisplayMode.DETAILS_CLOSED:
110
- template = _wrap_with_details_tag(
111
- template, "closed", display_name_placeholder
112
- )
119
+ template = _wrap_with_details_tag(template, "closed", title_template)
113
120
  case SubAgentResponseDisplayMode.PLAIN:
114
- display_name_placeholder = _add_line_break(
115
- display_name_placeholder, before=False, after=True
116
- )
117
- template = _join_text_blocks(display_name_placeholder, template)
118
121
  # Add a hidden block border to seperate sub agent answers from the rest of the text.
119
122
  hidden_block_border = _wrap_hidden_div("sub_agent_answer_block")
120
- template = _join_text_blocks(template, hidden_block_border)
123
+ template = _join_text_blocks(title_template, template, hidden_block_border)
121
124
 
122
125
  if add_block_border:
123
126
  template = _wrap_with_block_border(template)
@@ -130,11 +133,13 @@ def _get_display_removal_re(
130
133
  mode: SubAgentResponseDisplayMode,
131
134
  add_quote_border: bool,
132
135
  add_block_border: bool,
136
+ display_title_template: str,
133
137
  ) -> re.Pattern[str]:
134
138
  template = _get_display_template(
135
139
  mode=mode,
136
140
  add_quote_border=add_quote_border,
137
141
  add_block_border=add_block_border,
142
+ display_title_template=display_title_template,
138
143
  )
139
144
 
140
145
  pattern = template.format(
@@ -147,6 +152,7 @@ def _get_display_removal_re(
147
152
  def _build_sub_agent_answer_display(
148
153
  display_name: str,
149
154
  display_mode: SubAgentResponseDisplayMode,
155
+ display_title_template: str,
150
156
  add_quote_border: bool,
151
157
  add_block_border: bool,
152
158
  answer: str,
@@ -156,6 +162,7 @@ def _build_sub_agent_answer_display(
156
162
  mode=display_mode,
157
163
  add_quote_border=add_quote_border,
158
164
  add_block_border=add_block_border,
165
+ display_title_template=display_title_template,
159
166
  )
160
167
  return template.format(
161
168
  display_name=display_name, answer=answer, assistant_id=assistant_id
@@ -168,11 +175,13 @@ def _remove_sub_agent_answer_from_text(
168
175
  add_block_border: bool,
169
176
  text: str,
170
177
  assistant_id: str,
178
+ display_title_template: str,
171
179
  ) -> str:
172
180
  pattern = _get_display_removal_re(
173
181
  assistant_id=assistant_id,
174
182
  mode=display_mode,
175
183
  add_quote_border=add_quote_border,
176
184
  add_block_border=add_block_border,
185
+ display_title_template=display_title_template,
177
186
  )
178
187
  return re.sub(pattern, "", text)
@@ -1,4 +1,5 @@
1
1
  from enum import StrEnum
2
+ from typing import Literal
2
3
 
3
4
  from pydantic import BaseModel, Field
4
5
 
@@ -31,3 +32,14 @@ class SubAgentDisplayConfig(BaseModel):
31
32
  default=False,
32
33
  description="If set, a block border is added around the sub agent response.",
33
34
  )
35
+ display_title_template: str = Field(
36
+ default="Answer from <strong>{}</strong>",
37
+ description=(
38
+ "The template to use for the display title of the sub agent response."
39
+ "If a placeholder '{}' is present, it will be replaced with the display name of the sub agent."
40
+ ),
41
+ )
42
+ position: Literal["before", "after"] = Field(
43
+ default="before",
44
+ description="The position of the sub agent response in the main agent response.",
45
+ )
@@ -116,7 +116,9 @@ class SubAgentResponsesPostprocessor(Postprocessor):
116
116
  list(displayed_sub_agent_infos.values()), existing_refs
117
117
  )
118
118
 
119
- answers = []
119
+ answers_displayed_before = []
120
+ answers_displayed_after = []
121
+
120
122
  for assistant_id in displayed_sub_agent_infos.keys():
121
123
  messages = self._assistant_id_to_tool_info[assistant_id]["responses"]
122
124
 
@@ -129,17 +131,23 @@ class SubAgentResponsesPostprocessor(Postprocessor):
129
131
  if len(messages) > 1:
130
132
  display_name += f" {sequence_number}"
131
133
 
132
- answers.append(
133
- _build_sub_agent_answer_display(
134
- display_name=display_name,
135
- assistant_id=assistant_id,
136
- display_mode=display_mode,
137
- answer=message["text"],
138
- add_quote_border=tool_info["display_config"].add_quote_border,
139
- add_block_border=tool_info["display_config"].add_block_border,
140
- )
134
+ answer = _build_sub_agent_answer_display(
135
+ display_name=display_name,
136
+ display_mode=display_mode,
137
+ add_quote_border=tool_info["display_config"].add_quote_border,
138
+ add_block_border=tool_info["display_config"].add_block_border,
139
+ answer=message["text"],
140
+ assistant_id=assistant_id,
141
+ display_title_template=tool_info[
142
+ "display_config"
143
+ ].display_title_template,
141
144
  )
142
145
 
146
+ if tool_info["display_config"].position == "before":
147
+ answers_displayed_before.append(answer)
148
+ else:
149
+ answers_displayed_after.append(answer)
150
+
143
151
  loop_response.message.references.extend(
144
152
  ContentReference(
145
153
  message_id=self._main_agent_message["id"],
@@ -152,13 +160,20 @@ class SubAgentResponsesPostprocessor(Postprocessor):
152
160
  for ref in message["references"]
153
161
  )
154
162
 
155
- if len(answers) > 0:
163
+ if len(answers_displayed_before) > 0:
156
164
  loop_response.message.text = (
157
- "<br>\n\n".join(answers)
165
+ "<br>\n\n".join(answers_displayed_before)
158
166
  + "<br>\n\n"
159
167
  + loop_response.message.text.strip()
160
168
  )
161
169
 
170
+ if len(answers_displayed_after) > 0:
171
+ loop_response.message.text = (
172
+ loop_response.message.text.strip()
173
+ + "<br>\n\n"
174
+ + "<br>\n\n".join(answers_displayed_after)
175
+ )
176
+
162
177
  return True
163
178
 
164
179
  @override
@@ -172,6 +187,7 @@ class SubAgentResponsesPostprocessor(Postprocessor):
172
187
  assistant_id=assistant_id,
173
188
  add_quote_border=display_config.add_quote_border,
174
189
  add_block_border=display_config.add_block_border,
190
+ display_title_template=display_config.display_title_template,
175
191
  )
176
192
  return text
177
193