unique_toolkit 1.30.0__tar.gz → 1.31.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 (196) hide show
  1. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/CHANGELOG.md +6 -0
  2. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/PKG-INFO +7 -1
  3. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/pyproject.toml +1 -1
  4. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +16 -5
  5. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +12 -4
  6. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +19 -32
  7. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +6 -6
  8. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/language_model/infos.py +22 -1
  9. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/LICENSE +0 -0
  10. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/README.md +0 -0
  11. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/__init__.py +0 -0
  12. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/_base_service.py +0 -0
  13. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/_time_utils.py +0 -0
  14. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  15. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  16. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  17. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  18. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  19. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  20. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  21. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/default_language_model.py +0 -0
  22. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
  23. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/docx_generator/config.py +0 -0
  24. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
  25. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/docx_generator/service.py +0 -0
  26. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
  27. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/endpoint_builder.py +0 -0
  28. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  29. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/exception.py +0 -0
  30. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
  31. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
  32. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  33. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  34. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  35. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/referencing.py +0 -0
  36. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/string_utilities.py +0 -0
  37. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/tests/test_referencing.py +0 -0
  38. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
  39. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  40. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/token/token_counting.py +0 -0
  41. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/utils/__init__.py +0 -0
  42. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/utils/files.py +0 -0
  43. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/utils/image/encode.py +0 -0
  44. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
  45. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/utils/jinja/render.py +0 -0
  46. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
  47. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
  48. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  49. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  50. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  51. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/validate_required_values.py +0 -0
  52. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/_common/validators.py +0 -0
  53. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/__init__.py +0 -0
  54. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
  55. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
  56. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/evaluation/config.py +0 -0
  57. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts.py +0 -0
  58. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  59. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
  60. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
  61. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  62. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  63. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
  64. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/evaluation/hallucination/prompts.py +0 -0
  65. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  66. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
  67. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  68. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
  69. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  70. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  71. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  72. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  73. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
  74. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  75. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
  76. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
  77. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
  78. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  79. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
  80. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
  81. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
  82. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
  83. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  84. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  85. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/__init__.py +0 -0
  86. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  87. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  88. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  89. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  90. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  91. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
  92. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  93. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  94. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  95. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
  96. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
  97. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
  98. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  99. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
  100. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
  101. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  102. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  103. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  104. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  105. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  106. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  107. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/config.py +0 -0
  108. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/factory.py +0 -0
  109. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  110. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  111. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  112. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
  113. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
  114. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
  115. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
  116. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
  117. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +0 -0
  118. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
  119. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/schemas.py +0 -0
  120. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  121. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/test/test_tool_manager.py +0 -0
  122. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  123. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/tool.py +0 -0
  124. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
  125. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  126. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  127. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/utils/execution/__init__.py +0 -0
  128. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/utils/execution/execution.py +0 -0
  129. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  130. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  131. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  132. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  133. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/app/__init__.py +0 -0
  134. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/app/dev_util.py +0 -0
  135. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/app/fast_api_factory.py +0 -0
  136. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/app/init_logging.py +0 -0
  137. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/app/init_sdk.py +0 -0
  138. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/app/performance/async_tasks.py +0 -0
  139. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  140. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/app/schemas.py +0 -0
  141. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/app/unique_settings.py +0 -0
  142. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/app/verification.py +0 -0
  143. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/app/webhook.py +0 -0
  144. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/chat/__init__.py +0 -0
  145. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/chat/constants.py +0 -0
  146. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/chat/deprecated/service.py +0 -0
  147. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/chat/functions.py +0 -0
  148. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/chat/rendering.py +0 -0
  149. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/chat/responses_api.py +0 -0
  150. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/chat/schemas.py +0 -0
  151. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/chat/service.py +0 -0
  152. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/chat/state.py +0 -0
  153. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/chat/utils.py +0 -0
  154. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/content/__init__.py +0 -0
  155. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/content/constants.py +0 -0
  156. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/content/functions.py +0 -0
  157. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/content/schemas.py +0 -0
  158. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/content/service.py +0 -0
  159. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/content/smart_rules.py +0 -0
  160. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/content/utils.py +0 -0
  161. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/embedding/__init__.py +0 -0
  162. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/embedding/constants.py +0 -0
  163. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/embedding/functions.py +0 -0
  164. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/embedding/schemas.py +0 -0
  165. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/embedding/service.py +0 -0
  166. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/embedding/utils.py +0 -0
  167. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/framework_utilities/__init__.py +0 -0
  168. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  169. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  170. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  171. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  172. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  173. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/framework_utilities/utils.py +0 -0
  174. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/language_model/__init__.py +0 -0
  175. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
  176. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/language_model/builder.py +0 -0
  177. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/language_model/constants.py +0 -0
  178. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/language_model/default_language_model.py +0 -0
  179. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/language_model/functions.py +0 -0
  180. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/language_model/prompt.py +0 -0
  181. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/language_model/reference.py +0 -0
  182. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/language_model/schemas.py +0 -0
  183. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/language_model/service.py +0 -0
  184. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/language_model/utils.py +0 -0
  185. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/protocols/support.py +0 -0
  186. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/services/__init__.py +0 -0
  187. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/services/chat_service.py +0 -0
  188. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/services/knowledge_base.py +0 -0
  189. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/short_term_memory/__init__.py +0 -0
  190. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/short_term_memory/constants.py +0 -0
  191. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/short_term_memory/functions.py +0 -0
  192. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/short_term_memory/schemas.py +0 -0
  193. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/short_term_memory/service.py +0 -0
  194. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/smart_rules/__init__.py +0 -0
  195. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/smart_rules/compile.py +0 -0
  196. {unique_toolkit-1.30.0 → unique_toolkit-1.31.1}/unique_toolkit/test_utilities/events.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.31.1] - 2025-11-27
9
+ - Various fixes to sub agent answers.
10
+
11
+ ## [1.31.0] - 2025-11-20
12
+ - Adding model `litellm:anthropic-claude-opus-4-5` to `language_model/info.py`
13
+
8
14
  ## [1.30.0] - 2025-11-26
9
15
  - Add option to only display parts of sub agent responses.
10
16
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: unique_toolkit
3
- Version: 1.30.0
3
+ Version: 1.31.1
4
4
  Summary:
5
5
  License: Proprietary
6
6
  Author: Cedric Klinkert
@@ -121,6 +121,12 @@ All notable changes to this project will be documented in this file.
121
121
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
122
122
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
123
123
 
124
+ ## [1.31.1] - 2025-11-27
125
+ - Various fixes to sub agent answers.
126
+
127
+ ## [1.31.0] - 2025-11-20
128
+ - Adding model `litellm:anthropic-claude-opus-4-5` to `language_model/info.py`
129
+
124
130
  ## [1.30.0] - 2025-11-26
125
131
  - Add option to only display parts of sub agent responses.
126
132
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "unique_toolkit"
3
- version = "1.30.0"
3
+ version = "1.31.1"
4
4
  description = ""
5
5
  authors = [
6
6
  "Cedric Klinkert <cedric.klinkert@unique.ch>",
@@ -1,6 +1,7 @@
1
1
  import re
2
2
  from typing import Literal, NamedTuple
3
3
 
4
+ from unique_toolkit._common.utils.jinja.render import render_template
4
5
  from unique_toolkit.agentic.tools.a2a.postprocessing.config import (
5
6
  SubAgentDisplayConfig,
6
7
  SubAgentResponseDisplayMode,
@@ -84,6 +85,12 @@ def _prepare_title_template(
84
85
  return display_title_template.replace("{}", "{%s}" % display_name_placeholder)
85
86
 
86
87
 
88
+ def _clean_linebreaks(text: str) -> str:
89
+ text = text.strip()
90
+ text = re.sub(r"^(<br>)*|(<br>)*$", "", text)
91
+ return text
92
+
93
+
87
94
  def _get_display_template(
88
95
  mode: SubAgentResponseDisplayMode,
89
96
  add_quote_border: bool,
@@ -126,7 +133,7 @@ def _get_display_template(
126
133
  if add_block_border:
127
134
  template = _wrap_with_block_border(template)
128
135
 
129
- return template.strip()
136
+ return _clean_linebreaks(template)
130
137
 
131
138
 
132
139
  def _get_display_removal_re(
@@ -167,8 +174,7 @@ def get_sub_agent_answer_parts(
167
174
 
168
175
  substrings = []
169
176
  for config in display_config.answer_substrings_config:
170
- match = re.search(config.regexp, answer)
171
- if match is not None:
177
+ for match in config.regexp.finditer(answer):
172
178
  text = match.group(0)
173
179
  substrings.append(
174
180
  SubAgentAnswerPart(
@@ -183,7 +189,7 @@ def get_sub_agent_answer_parts(
183
189
  def get_sub_agent_answer_display(
184
190
  display_name: str,
185
191
  display_config: SubAgentDisplayConfig,
186
- answer: str | list[str],
192
+ answer: str | list[SubAgentAnswerPart],
187
193
  assistant_id: str,
188
194
  ) -> str:
189
195
  template = _get_display_template(
@@ -194,7 +200,12 @@ def get_sub_agent_answer_display(
194
200
  )
195
201
 
196
202
  if isinstance(answer, list):
197
- answer = display_config.answer_substrings_separator.join(answer)
203
+ answer = render_template(
204
+ display_config.answer_substrings_jinja_template,
205
+ {
206
+ "substrings": [answer.formatted_text for answer in answer],
207
+ },
208
+ )
198
209
 
199
210
  return template.format(
200
211
  display_name=display_name, answer=answer, assistant_id=assistant_id
@@ -1,3 +1,4 @@
1
+ import re
1
2
  from enum import StrEnum
2
3
  from typing import Literal
3
4
 
@@ -16,7 +17,7 @@ class SubAgentResponseDisplayMode(StrEnum):
16
17
  class SubAgentAnswerSubstringConfig(BaseModel):
17
18
  model_config = get_configuration_dict()
18
19
 
19
- regexp: str = Field(
20
+ regexp: re.Pattern[str] = Field(
20
21
  description="The regular expression to use to extract the substring. The first capture group will always be used.",
21
22
  )
22
23
  display_template: str = Field(
@@ -25,6 +26,13 @@ class SubAgentAnswerSubstringConfig(BaseModel):
25
26
  )
26
27
 
27
28
 
29
+ _ANSWER_SUBSTRINGS_JINJA_TEMPLATE = """
30
+ {% for substring in substrings %}
31
+ {{ substring }}
32
+ {% endfor %}
33
+ """.strip()
34
+
35
+
28
36
  class SubAgentDisplayConfig(BaseModel):
29
37
  model_config = get_configuration_dict()
30
38
 
@@ -64,7 +72,7 @@ class SubAgentDisplayConfig(BaseModel):
64
72
  default=[],
65
73
  description="If set, only parts of the answer matching the provided regular expressions will be displayed.",
66
74
  )
67
- answer_substrings_separator: str = Field(
68
- default="\n",
69
- description="The separator to use between the substrings.",
75
+ answer_substrings_jinja_template: str = Field(
76
+ default=_ANSWER_SUBSTRINGS_JINJA_TEMPLATE,
77
+ description="The template to use in order to format the different answer substrings, if any.",
70
78
  )
@@ -7,6 +7,7 @@ import unique_sdk
7
7
  from pydantic import BaseModel, Field
8
8
 
9
9
  from unique_toolkit._common.pydantic_helpers import get_configuration_dict
10
+ from unique_toolkit._common.utils.jinja.render import render_template
10
11
  from unique_toolkit.agentic.postprocessor.postprocessor_manager import Postprocessor
11
12
  from unique_toolkit.agentic.tools.a2a.postprocessing._display_utils import (
12
13
  get_sub_agent_answer_display,
@@ -38,20 +39,22 @@ class SubAgentDisplaySpec(NamedTuple):
38
39
  display_config: SubAgentDisplayConfig
39
40
 
40
41
 
42
+ _ANSWERS_JINJA_TEMPLATE = """
43
+ {% for answer in answers %}
44
+ {{ answer }}
45
+ {% endfor %}
46
+ """.strip()
47
+
48
+
41
49
  class SubAgentResponsesPostprocessorConfig(BaseModel):
42
50
  model_config = get_configuration_dict()
43
51
 
44
52
  sleep_time_before_update: float = Field(
45
- default=1, description="Time to sleep before updating the main agent message."
53
+ default=0, description="Time to sleep before updating the main agent message."
46
54
  )
47
-
48
- remove_duplicate_answers: bool = Field(
49
- default=False,
50
- description="If set, duplicate answers will only be displayed once. If sub agent is configured to display only substrings, this will remove duplicate substrings across different responses.",
51
- )
52
- answer_separator: str = Field(
53
- default="",
54
- description="The separator to use between the different sub agent answers.",
55
+ answers_jinja_template: str = Field(
56
+ default=_ANSWERS_JINJA_TEMPLATE,
57
+ description="The template to use to display the sub agent answers.",
55
58
  )
56
59
 
57
60
 
@@ -106,8 +109,6 @@ class SubAgentResponsesDisplayPostprocessor(Postprocessor):
106
109
  answers_displayed_before = []
107
110
  answers_displayed_after = []
108
111
 
109
- all_answers_displayed = set()
110
-
111
112
  for assistant_id, responses in displayed_sub_agent_responses.items():
112
113
  for response in responses:
113
114
  message = response.message
@@ -130,34 +131,20 @@ class SubAgentResponsesDisplayPostprocessor(Postprocessor):
130
131
  assistant_id,
131
132
  response.sequence_number,
132
133
  )
133
-
134
- message_text = message["text"] or ""
134
+ continue
135
135
 
136
136
  answer_parts = get_sub_agent_answer_parts(
137
- answer=message_text,
137
+ answer=message["text"],
138
138
  display_config=tool_info.display_config,
139
139
  )
140
140
 
141
141
  if len(answer_parts) == 0:
142
142
  continue
143
143
 
144
- answer_display_texts = []
145
- if self._config.remove_duplicate_answers:
146
- for answer_part in answer_parts:
147
- if answer_part.matching_text in all_answers_displayed:
148
- continue
149
-
150
- all_answers_displayed.add(answer_part.matching_text)
151
- answer_display_texts.append(answer_part.formatted_text)
152
- else:
153
- answer_display_texts = [
154
- answer_part.formatted_text for answer_part in answer_parts
155
- ]
156
-
157
144
  answer = get_sub_agent_answer_display(
158
145
  display_name=display_name,
159
146
  display_config=tool_info.display_config,
160
- answer=answer_display_texts,
147
+ answer=answer_parts,
161
148
  assistant_id=assistant_id,
162
149
  )
163
150
 
@@ -170,7 +157,7 @@ class SubAgentResponsesDisplayPostprocessor(Postprocessor):
170
157
  text=loop_response.message.text,
171
158
  answers_before=answers_displayed_before,
172
159
  answers_after=answers_displayed_after,
173
- sep=self._config.answer_separator,
160
+ template=self._config.answers_jinja_template,
174
161
  )
175
162
 
176
163
  return True
@@ -211,12 +198,12 @@ def _get_final_answer_display(
211
198
  text: str,
212
199
  answers_before: list[str],
213
200
  answers_after: list[str],
214
- sep: str = "<br>\n\n",
201
+ template: str = _ANSWERS_JINJA_TEMPLATE,
215
202
  ) -> str:
216
203
  if len(answers_before) > 0:
217
- text = sep.join(answers_before) + sep + text
204
+ text = render_template(template, {"answers": answers_before}) + text
218
205
 
219
206
  if len(answers_after) > 0:
220
- text = text + sep + sep.join(answers_after)
207
+ text = text + render_template(template, {"answers": answers_after})
221
208
 
222
209
  return text.strip()
@@ -1492,9 +1492,7 @@ def test_get_sub_agent_answer_parts__returns_empty_list__when_no_matches() -> No
1492
1492
 
1493
1493
 
1494
1494
  @pytest.mark.ai
1495
- def test_get_sub_agent_answer_parts__extracts_first_match_only__for_each_regexp() -> (
1496
- None
1497
- ):
1495
+ def test_get_sub_agent_answer_parts__extracts_all_matches__for_each_regexp() -> None:
1498
1496
  """
1499
1497
  Purpose: Verify only first match per regexp is extracted.
1500
1498
  Why this matters: Function uses re.search which finds first occurrence.
@@ -1513,7 +1511,7 @@ def test_get_sub_agent_answer_parts__extracts_first_match_only__for_each_regexp(
1513
1511
  result = get_sub_agent_answer_parts(answer=answer, display_config=config)
1514
1512
 
1515
1513
  # Assert
1516
- assert len(result) == 1
1514
+ assert len(result) == 2
1517
1515
  assert result[0].matching_text == "42"
1518
1516
 
1519
1517
 
@@ -1661,10 +1659,12 @@ def test_get_sub_agent_answer_parts__preserves_order__of_configs_not_matches() -
1661
1659
  result = get_sub_agent_answer_parts(answer=answer, display_config=config)
1662
1660
 
1663
1661
  # Assert
1664
- assert len(result) == 2
1662
+ assert len(result) == 4
1665
1663
  # Results follow config order, not text order
1666
1664
  assert result[0].matching_text == "first"
1667
- assert result[1].matching_text == "123"
1665
+ assert result[1].matching_text == "then"
1666
+ assert result[2].matching_text == "abc"
1667
+ assert result[3].matching_text == "123"
1668
1668
 
1669
1669
 
1670
1670
  @pytest.mark.ai
@@ -47,6 +47,7 @@ class LanguageModelName(StrEnum):
47
47
  ANTHROPIC_CLAUDE_SONNET_4_5 = "litellm:anthropic-claude-sonnet-4-5"
48
48
  ANTHROPIC_CLAUDE_OPUS_4 = "litellm:anthropic-claude-opus-4"
49
49
  ANTHROPIC_CLAUDE_OPUS_4_1 = "litellm:anthropic-claude-opus-4-1"
50
+ ANTHROPIC_CLAUDE_OPUS_4_5 = "litellm:anthropic-claude-opus-4-5"
50
51
  GEMINI_2_0_FLASH = "litellm:gemini-2-0-flash"
51
52
  GEMINI_2_5_FLASH = "litellm:gemini-2-5-flash"
52
53
  GEMINI_2_5_FLASH_LITE = "litellm:gemini-2-5-flash-lite"
@@ -946,7 +947,7 @@ class LanguageModelInfo(BaseModel):
946
947
  ModelCapabilities.REASONING,
947
948
  ],
948
949
  provider=LanguageModelProvider.LITELLM,
949
- version="claude-opus-4",
950
+ version="claude-opus-4-1",
950
951
  encoder_name=EncoderName.O200K_BASE, # TODO: Update encoder with litellm
951
952
  token_limits=LanguageModelTokenLimits(
952
953
  # Input limit is 200_000, we leave 20_000 tokens as buffer due to tokenizer mismatch
@@ -956,6 +957,26 @@ class LanguageModelInfo(BaseModel):
956
957
  info_cutoff_at=date(2025, 3, 1),
957
958
  published_at=date(2025, 5, 1),
958
959
  )
960
+ case LanguageModelName.ANTHROPIC_CLAUDE_OPUS_4_5:
961
+ return cls(
962
+ name=model_name,
963
+ capabilities=[
964
+ ModelCapabilities.FUNCTION_CALLING,
965
+ ModelCapabilities.STREAMING,
966
+ ModelCapabilities.VISION,
967
+ ModelCapabilities.REASONING,
968
+ ],
969
+ provider=LanguageModelProvider.LITELLM,
970
+ version="claude-opus-4-5",
971
+ encoder_name=EncoderName.O200K_BASE, # TODO: Update encoder with litellm
972
+ token_limits=LanguageModelTokenLimits(
973
+ # Input limit is 200_000, we leave 20_000 tokens as buffer due to tokenizer mismatch
974
+ token_limit_input=180_000,
975
+ token_limit_output=64_000,
976
+ ),
977
+ info_cutoff_at=date(2025, 8, 1),
978
+ published_at=date(2025, 11, 13),
979
+ )
959
980
  case LanguageModelName.GEMINI_2_0_FLASH:
960
981
  return cls(
961
982
  name=model_name,
File without changes