unique_toolkit 1.15.0__tar.gz → 1.16.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 (174) hide show
  1. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/CHANGELOG.md +7 -0
  2. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/PKG-INFO +8 -1
  3. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/pyproject.toml +1 -1
  4. unique_toolkit-1.16.1/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +28 -0
  5. unique_toolkit-1.16.1/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +278 -0
  6. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +50 -11
  7. unique_toolkit-1.16.1/unique_toolkit/agentic/responses_api/__init__.py +19 -0
  8. unique_toolkit-1.16.1/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +63 -0
  9. unique_toolkit-1.16.1/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +145 -0
  10. unique_toolkit-1.16.1/unique_toolkit/agentic/responses_api/stream_handler.py +15 -0
  11. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/factory.py +4 -0
  12. unique_toolkit-1.16.1/unique_toolkit/agentic/tools/openai_builtin/__init__.py +11 -0
  13. unique_toolkit-1.16.1/unique_toolkit/agentic/tools/openai_builtin/base.py +30 -0
  14. unique_toolkit-1.16.1/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +8 -0
  15. unique_toolkit-1.16.1/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +57 -0
  16. unique_toolkit-1.16.1/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +230 -0
  17. unique_toolkit-1.16.1/unique_toolkit/agentic/tools/openai_builtin/manager.py +62 -0
  18. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/tool_manager.py +290 -125
  19. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/chat/functions.py +15 -6
  20. unique_toolkit-1.16.1/unique_toolkit/chat/responses_api.py +461 -0
  21. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/language_model/functions.py +25 -9
  22. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/language_model/schemas.py +222 -27
  23. unique_toolkit-1.16.1/unique_toolkit/protocols/support.py +145 -0
  24. unique_toolkit-1.16.1/unique_toolkit/services/__init__.py +7 -0
  25. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/services/chat_service.py +139 -7
  26. unique_toolkit-1.15.0/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -18
  27. unique_toolkit-1.15.0/unique_toolkit/protocols/support.py +0 -63
  28. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/LICENSE +0 -0
  29. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/README.md +0 -0
  30. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/__init__.py +0 -0
  31. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/_base_service.py +0 -0
  32. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/_time_utils.py +0 -0
  33. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  34. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  35. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  36. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  37. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  38. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  39. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  40. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/default_language_model.py +0 -0
  41. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/endpoint_builder.py +0 -0
  42. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  43. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/exception.py +0 -0
  44. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  45. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  46. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  47. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/string_utilities.py +0 -0
  48. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  49. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/token/token_counting.py +0 -0
  50. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/utils/__init__.py +0 -0
  51. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/utils/files.py +0 -0
  52. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  53. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  54. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  55. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/validate_required_values.py +0 -0
  56. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/_common/validators.py +0 -0
  57. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/__init__.py +0 -0
  58. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/evaluation/config.py +0 -0
  59. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts.py +0 -0
  60. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  61. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
  62. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
  63. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  64. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  65. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
  66. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/evaluation/hallucination/prompts.py +0 -0
  67. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  68. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
  69. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  70. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
  71. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  72. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  73. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  74. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  75. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
  76. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  77. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  78. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  79. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  80. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/__init__.py +0 -0
  81. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  82. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  83. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  84. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  85. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  86. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
  87. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  88. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  89. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  90. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/postprocessing/_display.py +0 -0
  91. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/postprocessing/_utils.py +0 -0
  92. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  93. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/postprocessing/postprocessor.py +0 -0
  94. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_consolidate_references.py +0 -0
  95. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  96. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_postprocessor_reference_functions.py +0 -0
  97. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  98. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  99. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  100. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  101. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  102. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  103. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  104. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/config.py +0 -0
  105. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  106. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  107. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  108. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
  109. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/schemas.py +0 -0
  110. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  111. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  112. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/tool.py +0 -0
  113. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  114. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  115. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/utils/execution/__init__.py +0 -0
  116. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/utils/execution/execution.py +0 -0
  117. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  118. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  119. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  120. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  121. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/app/__init__.py +0 -0
  122. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/app/dev_util.py +0 -0
  123. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/app/init_logging.py +0 -0
  124. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/app/init_sdk.py +0 -0
  125. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/app/performance/async_tasks.py +0 -0
  126. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  127. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/app/schemas.py +0 -0
  128. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/app/unique_settings.py +0 -0
  129. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/app/verification.py +0 -0
  130. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/chat/__init__.py +0 -0
  131. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/chat/constants.py +0 -0
  132. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/chat/deprecated/service.py +0 -0
  133. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/chat/schemas.py +0 -0
  134. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/chat/service.py +0 -0
  135. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/chat/state.py +0 -0
  136. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/chat/utils.py +0 -0
  137. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/content/__init__.py +0 -0
  138. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/content/constants.py +0 -0
  139. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/content/functions.py +0 -0
  140. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/content/schemas.py +0 -0
  141. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/content/service.py +0 -0
  142. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/content/smart_rules.py +0 -0
  143. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/content/utils.py +0 -0
  144. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/embedding/__init__.py +0 -0
  145. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/embedding/constants.py +0 -0
  146. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/embedding/functions.py +0 -0
  147. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/embedding/schemas.py +0 -0
  148. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/embedding/service.py +0 -0
  149. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/embedding/utils.py +0 -0
  150. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/framework_utilities/__init__.py +0 -0
  151. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  152. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  153. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  154. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  155. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  156. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/framework_utilities/utils.py +0 -0
  157. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/language_model/__init__.py +0 -0
  158. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/language_model/builder.py +0 -0
  159. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/language_model/constants.py +0 -0
  160. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/language_model/default_language_model.py +0 -0
  161. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/language_model/infos.py +0 -0
  162. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/language_model/prompt.py +0 -0
  163. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/language_model/reference.py +0 -0
  164. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/language_model/service.py +0 -0
  165. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/language_model/utils.py +0 -0
  166. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/services/knowledge_base.py +0 -0
  167. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/short_term_memory/__init__.py +0 -0
  168. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/short_term_memory/constants.py +0 -0
  169. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/short_term_memory/functions.py +0 -0
  170. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/short_term_memory/schemas.py +0 -0
  171. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/short_term_memory/service.py +0 -0
  172. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/smart_rules/__init__.py +0 -0
  173. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/smart_rules/compile.py +0 -0
  174. {unique_toolkit-1.15.0 → unique_toolkit-1.16.1}/unique_toolkit/test_utilities/events.py +0 -0
@@ -5,6 +5,13 @@ 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.16.1] - 2025-10-16
9
+ - Update debug info for better tool call tracking
10
+
11
+ ## [1.16.0] - 2025-10-16
12
+ - Add responses api support.
13
+ - Add utilities for code execution.
14
+
8
15
  ## [1.15.0] - 2025-10-15
9
16
  - Enable to distinguish between environment and modifiable payload parameters in human verification
10
17
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: unique_toolkit
3
- Version: 1.15.0
3
+ Version: 1.16.1
4
4
  Summary:
5
5
  License: Proprietary
6
6
  Author: Cedric Klinkert
@@ -118,6 +118,13 @@ 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.16.1] - 2025-10-16
122
+ - Update debug info for better tool call tracking
123
+
124
+ ## [1.16.0] - 2025-10-16
125
+ - Add responses api support.
126
+ - Add utilities for code execution.
127
+
121
128
  ## [1.15.0] - 2025-10-15
122
129
  - Enable to distinguish between environment and modifiable payload parameters in human verification
123
130
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "unique_toolkit"
3
- version = "1.15.0"
3
+ version = "1.16.1"
4
4
  description = ""
5
5
  authors = [
6
6
  "Cedric Klinkert <cedric.klinkert@unique.ch>",
@@ -0,0 +1,28 @@
1
+ from typing import Any
2
+
3
+ from unique_toolkit.agentic.tools.schemas import ToolCallResponse
4
+
5
+
6
+ class DebugInfoManager:
7
+ def __init__(self):
8
+ self.debug_info = {"tools": []}
9
+
10
+ def extract_tool_debug_info(
11
+ self,
12
+ tool_call_responses: list[ToolCallResponse],
13
+ loop_iteration_index: int | None = None,
14
+ ):
15
+ for tool_call_response in tool_call_responses:
16
+ tool_info = {
17
+ "name": tool_call_response.name,
18
+ "info": tool_call_response.debug_info,
19
+ }
20
+ if loop_iteration_index is not None:
21
+ tool_info["info"]["loop_iteration"] = loop_iteration_index
22
+ self.debug_info["tools"].append(tool_info)
23
+
24
+ def add(self, key: str, value: Any) -> None:
25
+ self.debug_info = self.debug_info | {key: value}
26
+
27
+ def get(self) -> dict[str, Any]:
28
+ return self.debug_info
@@ -0,0 +1,278 @@
1
+ """
2
+ Test suite for DebugInfoManager class.
3
+
4
+ This test suite validates the DebugInfoManager's ability to:
5
+ 1. Initialize with empty debug info
6
+ 2. Extract tool debug info from ToolCallResponse objects
7
+ 3. Handle loop iteration indices
8
+ 4. Add arbitrary key-value pairs to debug info
9
+ 5. Retrieve the complete debug info dictionary
10
+ """
11
+
12
+ from unique_toolkit.agentic.debug_info_manager.debug_info_manager import (
13
+ DebugInfoManager,
14
+ )
15
+ from unique_toolkit.agentic.tools.schemas import ToolCallResponse
16
+
17
+
18
+ class TestDebugInfoManager:
19
+ """Test suite for DebugInfoManager functionality."""
20
+
21
+ def test_init__initializes_empty_debug_info__on_creation(self):
22
+ """Test that DebugInfoManager initializes with empty tools list."""
23
+ manager = DebugInfoManager()
24
+
25
+ assert manager.debug_info == {"tools": []}
26
+ assert manager.get() == {"tools": []}
27
+
28
+ def test_extract_tool_debug_info__adds_single_tool__with_valid_response(self):
29
+ """Test extracting debug info from a single ToolCallResponse."""
30
+ manager = DebugInfoManager()
31
+ tool_call_response = ToolCallResponse(
32
+ id="tool_1",
33
+ name="TestTool",
34
+ debug_info={"execution_time": "100ms", "status": "success"},
35
+ )
36
+
37
+ manager.extract_tool_debug_info([tool_call_response])
38
+
39
+ debug_info = manager.get()
40
+ assert len(debug_info["tools"]) == 1
41
+ assert debug_info["tools"][0]["name"] == "TestTool"
42
+ assert debug_info["tools"][0]["info"]["execution_time"] == "100ms"
43
+ assert debug_info["tools"][0]["info"]["status"] == "success"
44
+
45
+ def test_extract_tool_debug_info__adds_multiple_tools__with_multiple_responses(
46
+ self,
47
+ ):
48
+ """Test extracting debug info from multiple ToolCallResponse objects."""
49
+ manager = DebugInfoManager()
50
+ tool_call_responses = [
51
+ ToolCallResponse(
52
+ id="tool_1",
53
+ name="SearchTool",
54
+ debug_info={"query": "test query", "results": 5},
55
+ ),
56
+ ToolCallResponse(
57
+ id="tool_2",
58
+ name="CalculatorTool",
59
+ debug_info={"operation": "add", "result": 42},
60
+ ),
61
+ ToolCallResponse(
62
+ id="tool_3",
63
+ name="WeatherTool",
64
+ debug_info={"location": "New York", "temperature": "72F"},
65
+ ),
66
+ ]
67
+
68
+ manager.extract_tool_debug_info(tool_call_responses)
69
+
70
+ debug_info = manager.get()
71
+ assert len(debug_info["tools"]) == 3
72
+ assert debug_info["tools"][0]["name"] == "SearchTool"
73
+ assert debug_info["tools"][1]["name"] == "CalculatorTool"
74
+ assert debug_info["tools"][2]["name"] == "WeatherTool"
75
+
76
+ def test_extract_tool_debug_info__preserves_order__with_sequential_calls(self):
77
+ """Test that multiple calls to extract_tool_debug_info preserve order."""
78
+ manager = DebugInfoManager()
79
+
80
+ # First call
81
+ manager.extract_tool_debug_info(
82
+ [ToolCallResponse(id="tool_1", name="Tool1", debug_info={"step": 1})]
83
+ )
84
+
85
+ # Second call
86
+ manager.extract_tool_debug_info(
87
+ [ToolCallResponse(id="tool_2", name="Tool2", debug_info={"step": 2})]
88
+ )
89
+
90
+ # Third call
91
+ manager.extract_tool_debug_info(
92
+ [ToolCallResponse(id="tool_3", name="Tool3", debug_info={"step": 3})]
93
+ )
94
+
95
+ debug_info = manager.get()
96
+ assert len(debug_info["tools"]) == 3
97
+ assert debug_info["tools"][0]["info"]["step"] == 1
98
+ assert debug_info["tools"][1]["info"]["step"] == 2
99
+ assert debug_info["tools"][2]["info"]["step"] == 3
100
+
101
+ def test_extract_tool_debug_info__adds_loop_iteration__when_index_provided(self):
102
+ """Test that loop_iteration_index is added to debug info when provided."""
103
+ manager = DebugInfoManager()
104
+ tool_call_response = ToolCallResponse(
105
+ id="tool_1", name="IterativeTool", debug_info={"status": "processing"}
106
+ )
107
+
108
+ manager.extract_tool_debug_info([tool_call_response], loop_iteration_index=3)
109
+
110
+ debug_info = manager.get()
111
+ assert debug_info["tools"][0]["info"]["loop_iteration"] == 3
112
+ assert debug_info["tools"][0]["info"]["status"] == "processing"
113
+
114
+ def test_extract_tool_debug_info__omits_loop_iteration__when_index_is_none(self):
115
+ """Test that loop_iteration is not added when index is None."""
116
+ manager = DebugInfoManager()
117
+ tool_call_response = ToolCallResponse(
118
+ id="tool_1", name="SingleRunTool", debug_info={"status": "complete"}
119
+ )
120
+
121
+ manager.extract_tool_debug_info([tool_call_response], loop_iteration_index=None)
122
+
123
+ debug_info = manager.get()
124
+ assert "loop_iteration" not in debug_info["tools"][0]["info"]
125
+ assert debug_info["tools"][0]["info"]["status"] == "complete"
126
+
127
+ def test_extract_tool_debug_info__handles_empty_debug_info__gracefully(self):
128
+ """Test extracting from ToolCallResponse with empty debug_info dict."""
129
+ manager = DebugInfoManager()
130
+ tool_call_response = ToolCallResponse(
131
+ id="tool_1", name="MinimalTool", debug_info={}
132
+ )
133
+
134
+ manager.extract_tool_debug_info([tool_call_response])
135
+
136
+ debug_info = manager.get()
137
+ assert len(debug_info["tools"]) == 1
138
+ assert debug_info["tools"][0]["name"] == "MinimalTool"
139
+ assert debug_info["tools"][0]["info"] == {}
140
+
141
+ def test_extract_tool_debug_info__handles_empty_list__without_error(self):
142
+ """Test that passing an empty list doesn't cause errors."""
143
+ manager = DebugInfoManager()
144
+
145
+ manager.extract_tool_debug_info([])
146
+
147
+ debug_info = manager.get()
148
+ assert debug_info["tools"] == []
149
+
150
+ def test_add__adds_new_key_value_pair__to_debug_info(self):
151
+ """Test adding a new key-value pair to debug_info."""
152
+ manager = DebugInfoManager()
153
+
154
+ manager.add("execution_summary", {"total_time": "500ms", "total_calls": 5})
155
+
156
+ debug_info = manager.get()
157
+ assert "execution_summary" in debug_info
158
+ assert debug_info["execution_summary"]["total_time"] == "500ms"
159
+ assert debug_info["execution_summary"]["total_calls"] == 5
160
+
161
+ def test_add__preserves_tools_list__when_adding_new_keys(self):
162
+ """Test that add() preserves the tools list."""
163
+ manager = DebugInfoManager()
164
+ manager.extract_tool_debug_info(
165
+ [
166
+ ToolCallResponse(
167
+ id="tool_1", name="TestTool", debug_info={"test": "data"}
168
+ )
169
+ ]
170
+ )
171
+
172
+ manager.add("metadata", {"version": "1.0"})
173
+
174
+ debug_info = manager.get()
175
+ assert len(debug_info["tools"]) == 1
176
+ assert debug_info["tools"][0]["name"] == "TestTool"
177
+ assert debug_info["metadata"]["version"] == "1.0"
178
+
179
+ def test_add__overwrites_existing_key__when_key_exists(self):
180
+ """Test that add() overwrites an existing key."""
181
+ manager = DebugInfoManager()
182
+ manager.add("status", "in_progress")
183
+ manager.add("status", "completed")
184
+
185
+ debug_info = manager.get()
186
+ assert debug_info["status"] == "completed"
187
+
188
+ def test_add__adds_multiple_keys__with_sequential_calls(self):
189
+ """Test adding multiple key-value pairs with sequential calls."""
190
+ manager = DebugInfoManager()
191
+
192
+ manager.add("key1", "value1")
193
+ manager.add("key2", {"nested": "value2"})
194
+ manager.add("key3", [1, 2, 3])
195
+
196
+ debug_info = manager.get()
197
+ assert debug_info["key1"] == "value1"
198
+ assert debug_info["key2"]["nested"] == "value2"
199
+ assert debug_info["key3"] == [1, 2, 3]
200
+
201
+ def test_get__returns_complete_debug_info__with_mixed_data(self):
202
+ """Test get() returns complete debug info with tools and custom keys."""
203
+ manager = DebugInfoManager()
204
+
205
+ # Add tool debug info
206
+ manager.extract_tool_debug_info(
207
+ [ToolCallResponse(id="tool_1", name="Tool1", debug_info={"data": "test"})],
208
+ loop_iteration_index=0,
209
+ )
210
+
211
+ # Add custom keys
212
+ manager.add("start_time", "2025-10-16T10:00:00")
213
+ manager.add("end_time", "2025-10-16T10:01:00")
214
+
215
+ debug_info = manager.get()
216
+
217
+ assert "tools" in debug_info
218
+ assert "start_time" in debug_info
219
+ assert "end_time" in debug_info
220
+ assert len(debug_info["tools"]) == 1
221
+ assert debug_info["start_time"] == "2025-10-16T10:00:00"
222
+
223
+ def test_integration__complete_workflow__with_all_operations(self):
224
+ """Integration test: complete workflow using all DebugInfoManager methods."""
225
+ manager = DebugInfoManager()
226
+
227
+ # Initial state
228
+ assert manager.get() == {"tools": []}
229
+
230
+ # Add some metadata
231
+ manager.add("session_id", "abc-123")
232
+ manager.add("user_id", "user-456")
233
+
234
+ # First tool call (loop iteration 0)
235
+ manager.extract_tool_debug_info(
236
+ [
237
+ ToolCallResponse(
238
+ id="tool_1",
239
+ name="SearchTool",
240
+ debug_info={"query": "AI research", "hits": 100},
241
+ )
242
+ ],
243
+ loop_iteration_index=0,
244
+ )
245
+
246
+ # Second tool call (loop iteration 1)
247
+ manager.extract_tool_debug_info(
248
+ [
249
+ ToolCallResponse(
250
+ id="tool_2",
251
+ name="AnalysisTool",
252
+ debug_info={"processed": 50, "relevant": 10},
253
+ ),
254
+ ToolCallResponse(
255
+ id="tool_3",
256
+ name="SummaryTool",
257
+ debug_info={"paragraphs": 3, "words": 250},
258
+ ),
259
+ ],
260
+ loop_iteration_index=1,
261
+ )
262
+
263
+ # Add final summary
264
+ manager.add("summary", {"total_tools": 3, "total_iterations": 2})
265
+
266
+ # Verify complete debug info
267
+ debug_info = manager.get()
268
+
269
+ assert debug_info["session_id"] == "abc-123"
270
+ assert debug_info["user_id"] == "user-456"
271
+ assert len(debug_info["tools"]) == 3
272
+ assert debug_info["tools"][0]["name"] == "SearchTool"
273
+ assert debug_info["tools"][0]["info"]["loop_iteration"] == 0
274
+ assert debug_info["tools"][1]["name"] == "AnalysisTool"
275
+ assert debug_info["tools"][1]["info"]["loop_iteration"] == 1
276
+ assert debug_info["tools"][2]["name"] == "SummaryTool"
277
+ assert debug_info["tools"][2]["info"]["loop_iteration"] == 1
278
+ assert debug_info["summary"]["total_tools"] == 3
@@ -6,6 +6,7 @@ from unique_toolkit.agentic.tools.utils.execution.execution import SafeTaskExecu
6
6
  from unique_toolkit.chat.service import ChatService
7
7
  from unique_toolkit.language_model.schemas import (
8
8
  LanguageModelStreamResponse,
9
+ ResponsesLanguageModelStreamResponse,
9
10
  )
10
11
 
11
12
 
@@ -26,7 +27,30 @@ class Postprocessor(ABC):
26
27
  "Subclasses must implement this method to apply post-processing to the response."
27
28
  )
28
29
 
29
- async def remove_from_text(self, text) -> str:
30
+ async def remove_from_text(self, text: str) -> str:
31
+ raise NotImplementedError(
32
+ "Subclasses must implement this method to remove post-processing from the message."
33
+ )
34
+
35
+
36
+ class ResponsesApiPostprocessor(ABC):
37
+ def __init__(self, name: str):
38
+ self.name = name
39
+
40
+ def get_name(self) -> str:
41
+ return self.name
42
+
43
+ async def run(self, loop_response: ResponsesLanguageModelStreamResponse) -> None:
44
+ raise NotImplementedError("Subclasses must implement this method.")
45
+
46
+ def apply_postprocessing_to_response(
47
+ self, loop_response: ResponsesLanguageModelStreamResponse
48
+ ) -> bool:
49
+ raise NotImplementedError(
50
+ "Subclasses must implement this method to apply post-processing to the response."
51
+ )
52
+
53
+ async def remove_from_text(self, text: str) -> str:
30
54
  raise NotImplementedError(
31
55
  "Subclasses must implement this method to remove post-processing from the message."
32
56
  )
@@ -59,12 +83,16 @@ class PostprocessorManager:
59
83
  ):
60
84
  self._logger = logger
61
85
  self._chat_service = chat_service
62
- self._postprocessors: list[Postprocessor] = []
86
+ self._postprocessors: list[Postprocessor | ResponsesApiPostprocessor] = []
63
87
 
64
- def add_postprocessor(self, postprocessor: Postprocessor):
88
+ def add_postprocessor(
89
+ self, postprocessor: Postprocessor | ResponsesApiPostprocessor
90
+ ):
65
91
  self._postprocessors.append(postprocessor)
66
92
 
67
- def get_postprocessors(self, name: str) -> list[Postprocessor]:
93
+ def get_postprocessors(
94
+ self, name: str
95
+ ) -> list[Postprocessor | ResponsesApiPostprocessor]:
68
96
  return self._postprocessors
69
97
 
70
98
  async def run_postprocessors(
@@ -75,25 +103,36 @@ class PostprocessorManager:
75
103
  logger=self._logger,
76
104
  )
77
105
 
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
+ ]
114
+
78
115
  tasks = [
79
116
  task_executor.execute_async(
80
117
  self.execute_postprocessors,
81
118
  loop_response=loop_response,
82
119
  postprocessor_instance=postprocessor,
83
120
  )
84
- for postprocessor in self._postprocessors
121
+ for postprocessor in postprocessors
85
122
  ]
86
123
  postprocessor_results = await asyncio.gather(*tasks)
87
124
 
88
- for i, result in enumerate(postprocessor_results):
125
+ for postprocessor, result in zip(postprocessors, postprocessor_results):
89
126
  if not result.success:
90
127
  self._logger.warning(
91
- f"Postprocessor {self._postprocessors[i].get_name()} failed to run."
128
+ "Postprocessor %s failed to run.",
129
+ postprocessor.get_name(),
130
+ exc_info=result.exception,
92
131
  )
93
132
 
94
133
  modification_results = [
95
- postprocessor.apply_postprocessing_to_response(loop_response)
96
- for postprocessor in self._postprocessors
134
+ postprocessor.apply_postprocessing_to_response(loop_response) # type: ignore
135
+ for postprocessor in postprocessors
97
136
  ]
98
137
 
99
138
  has_been_modified = any(modification_results)
@@ -108,9 +147,9 @@ class PostprocessorManager:
108
147
  async def execute_postprocessors(
109
148
  self,
110
149
  loop_response: LanguageModelStreamResponse,
111
- postprocessor_instance: Postprocessor,
150
+ postprocessor_instance: Postprocessor | ResponsesApiPostprocessor,
112
151
  ) -> None:
113
- await postprocessor_instance.run(loop_response)
152
+ await postprocessor_instance.run(loop_response) # type: ignore
114
153
 
115
154
  async def remove_from_text(
116
155
  self,
@@ -0,0 +1,19 @@
1
+ from unique_toolkit.agentic.responses_api.postprocessors.code_display import (
2
+ ShowExecutedCodePostprocessor,
3
+ ShowExecutedCodePostprocessorConfig,
4
+ )
5
+ from unique_toolkit.agentic.responses_api.postprocessors.generated_files import (
6
+ DisplayCodeInterpreterFilesPostProcessor,
7
+ DisplayCodeInterpreterFilesPostProcessorConfig,
8
+ )
9
+ from unique_toolkit.agentic.responses_api.stream_handler import (
10
+ ResponsesStreamingHandler,
11
+ )
12
+
13
+ __all__ = [
14
+ "ShowExecutedCodePostprocessor",
15
+ "ShowExecutedCodePostprocessorConfig",
16
+ "DisplayCodeInterpreterFilesPostProcessorConfig",
17
+ "DisplayCodeInterpreterFilesPostProcessor",
18
+ "ResponsesStreamingHandler",
19
+ ]
@@ -0,0 +1,63 @@
1
+ import logging
2
+ import re
3
+ from typing import override
4
+
5
+ from pydantic import BaseModel, Field
6
+
7
+ from unique_toolkit.agentic.postprocessor.postprocessor_manager import (
8
+ ResponsesApiPostprocessor,
9
+ )
10
+ from unique_toolkit.agentic.tools.config import get_configuration_dict
11
+ from unique_toolkit.language_model.schemas import ResponsesLanguageModelStreamResponse
12
+
13
+ _TEMPLATE = """
14
+ <details><summary>Code Interpreter Call</summary>
15
+
16
+ ```python
17
+ {code}
18
+ ```
19
+
20
+ </details>
21
+ </br>
22
+
23
+ """.lstrip()
24
+
25
+ logger = logging.getLogger(__name__)
26
+
27
+
28
+ class ShowExecutedCodePostprocessorConfig(BaseModel):
29
+ model_config = get_configuration_dict()
30
+ remove_from_history: bool = Field(
31
+ default=False,
32
+ description="If set, the code interpreter call will be removed from the history on subsequent calls to the assistant.",
33
+ )
34
+
35
+
36
+ class ShowExecutedCodePostprocessor(ResponsesApiPostprocessor):
37
+ def __init__(self, config: ShowExecutedCodePostprocessorConfig):
38
+ super().__init__(self.__class__.__name__)
39
+ self._config = config
40
+
41
+ @override
42
+ async def run(self, loop_response: ResponsesLanguageModelStreamResponse) -> None:
43
+ return None
44
+
45
+ @override
46
+ def apply_postprocessing_to_response(
47
+ self, loop_response: ResponsesLanguageModelStreamResponse
48
+ ) -> bool:
49
+ prepended_text = ""
50
+ for output in loop_response.code_interpreter_calls:
51
+ prepended_text += _TEMPLATE.format(code=output.code)
52
+
53
+ loop_response.message.text = prepended_text + loop_response.message.text
54
+
55
+ return prepended_text != ""
56
+
57
+ @override
58
+ async def remove_from_text(self, text) -> str:
59
+ if not self._config.remove_from_history:
60
+ return text
61
+ # Remove code interpreter blocks using regex
62
+ pattern = r"<details><summary>Code Interpreter Call</summary>.*?</details>"
63
+ return re.sub(pattern, "", text, flags=re.DOTALL)