unique_toolkit 2026.28.4__tar.gz → 2026.30.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/PKG-INFO +3 -2
  2. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/pyproject.toml +3 -2
  3. unique_toolkit-2026.30.0/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +245 -0
  4. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +81 -11
  5. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/evaluation_manager.py +17 -0
  6. unique_toolkit-2026.30.0/unique_toolkit/agentic/evaluation/exception.py +23 -0
  7. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/hallucination/utils.py +36 -4
  8. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/schemas.py +2 -0
  9. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +71 -0
  10. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +33 -47
  11. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/history_manager/history_manager.py +5 -1
  12. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +102 -29
  13. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/loop_runner/__init__.py +2 -0
  14. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +2 -0
  15. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +5 -1
  16. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/loop_runner/base.py +15 -1
  17. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +32 -0
  18. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +37 -5
  19. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +41 -6
  20. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +8 -7
  21. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -10
  22. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +13 -3
  23. unique_toolkit-2026.30.0/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/activator/__init__.py +11 -0
  24. unique_toolkit-2026.30.0/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/activator/config.py +23 -0
  25. unique_toolkit-2026.30.0/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/activator/service.py +110 -0
  26. unique_toolkit-2026.30.0/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/__init__.py +5 -0
  27. unique_toolkit-2026.30.0/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/_container.py +50 -0
  28. unique_toolkit-2026.30.0/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/_files.py +202 -0
  29. unique_toolkit-2026.30.0/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/_memory.py +35 -0
  30. unique_toolkit-2026.30.0/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/builder.py +182 -0
  31. unique_toolkit-2026.30.0/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +67 -0
  32. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +2 -0
  33. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +79 -2
  34. unique_toolkit-2026.30.0/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/tool/__init__.py +11 -0
  35. {unique_toolkit-2026.28.4/unique_toolkit/agentic/tools/openai_builtin/code_interpreter → unique_toolkit-2026.30.0/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/tool}/config.py +14 -41
  36. unique_toolkit-2026.30.0/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/tool/service.py +111 -0
  37. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/openai_builtin/manager.py +43 -29
  38. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/schemas.py +5 -0
  39. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/tool_manager.py +71 -8
  40. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic_table/__init__.py +19 -1
  41. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic_table/schemas.py +51 -0
  42. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic_table/service.py +312 -0
  43. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/app/__init__.py +3 -0
  44. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/app/init_logging.py +3 -1
  45. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/app/schemas.py +43 -0
  46. unique_toolkit-2026.30.0/unique_toolkit/chat/__init__.py +37 -0
  47. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/chat/cancellation.py +10 -0
  48. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/chat/functions.py +12 -0
  49. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/content_tree/service.py +51 -14
  50. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/complete_with_references.py +16 -0
  51. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/text_event_handler.py +1 -5
  52. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/code_interpreter_event_handler.py +55 -31
  53. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/completed_event_handler.py +1 -5
  54. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/message_persister.py +13 -7
  55. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/language_model/__init__.py +4 -0
  56. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/language_model/functions.py +8 -0
  57. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/language_model/infos.py +92 -0
  58. unique_toolkit-2026.30.0/unique_toolkit/language_model/invocation_stats.py +70 -0
  59. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/language_model/schemas.py +151 -2
  60. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/services/chat_service.py +24 -4
  61. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/services/knowledge_base.py +8 -8
  62. unique_toolkit-2026.30.0/unique_toolkit/smart_rules/__init__.py +0 -0
  63. unique_toolkit-2026.28.4/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -92
  64. unique_toolkit-2026.28.4/unique_toolkit/agentic/evaluation/exception.py +0 -5
  65. unique_toolkit-2026.28.4/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +0 -449
  66. unique_toolkit-2026.28.4/unique_toolkit/chat/__init__.py +0 -20
  67. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/README.md +0 -0
  68. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/__init__.py +0 -0
  69. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/__init__.py +0 -0
  70. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/_base_service.py +0 -0
  71. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/_time_utils.py +0 -0
  72. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  73. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  74. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  75. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  76. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  77. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  78. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  79. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/config_checker/README.md +0 -0
  80. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/config_checker/__init__.py +0 -0
  81. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/config_checker/__main__.py +0 -0
  82. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/config_checker/cli.py +0 -0
  83. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/config_checker/differ.py +0 -0
  84. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/config_checker/exporter.py +0 -0
  85. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/config_checker/models.py +0 -0
  86. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/config_checker/registry.py +0 -0
  87. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/config_checker/validator.py +0 -0
  88. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/default_language_model.py +0 -0
  89. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
  90. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/docx_generator/config.py +0 -0
  91. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
  92. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
  93. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/docx_generator/service.py +0 -0
  94. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
  95. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/endpoint_builder.py +0 -0
  96. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  97. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/event_bus.py +0 -0
  98. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/exception.py +0 -0
  99. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/execution.py +0 -0
  100. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
  101. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
  102. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
  103. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
  104. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
  105. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
  106. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
  107. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
  108. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
  109. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
  110. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
  111. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
  112. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
  113. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
  114. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
  115. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
  116. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
  117. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
  118. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
  119. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
  120. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
  121. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
  122. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
  123. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
  124. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
  125. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
  126. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
  127. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  128. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/metadata_filter_scope.py +0 -0
  129. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  130. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  131. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/referencing.py +0 -0
  132. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/string_utilities.py +0 -0
  133. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/tests/test_referencing.py +0 -0
  134. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
  135. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/token/__init__.py +0 -0
  136. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  137. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/token/token_counting.py +0 -0
  138. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
  139. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
  140. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/utils/__init__.py +0 -0
  141. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/utils/files.py +0 -0
  142. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/utils/image/encode.py +0 -0
  143. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
  144. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/utils/jinja/render.py +0 -0
  145. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
  146. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
  147. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  148. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  149. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  150. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/validate_required_values.py +0 -0
  151. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/_common/validators.py +0 -0
  152. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/__init__.py +0 -0
  153. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
  154. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/config.py +0 -0
  155. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
  156. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
  157. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
  158. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  159. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  160. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
  161. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
  162. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
  163. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
  164. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  165. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  166. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
  167. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
  168. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
  169. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/tests/test_hallucination_external_context.py +0 -0
  170. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -0
  171. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  172. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
  173. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/evaluation/utils.py +0 -0
  174. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
  175. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/feature_flags/feature_flags.py +0 -0
  176. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/history_manager/settings.py +0 -0
  177. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  178. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
  179. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
  180. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
  181. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
  182. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
  183. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
  184. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
  185. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
  186. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
  187. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
  188. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
  189. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
  190. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
  191. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
  192. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/message_log_order.py +0 -0
  193. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  194. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/reference_manager/tests/test_external_context.py +0 -0
  195. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
  196. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
  197. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
  198. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
  199. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  200. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  201. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/__init__.py +0 -0
  202. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  203. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  204. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  205. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  206. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  207. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  208. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  209. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  210. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
  211. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
  212. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  213. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
  214. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
  215. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  216. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
  217. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
  218. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_references.py +0 -0
  219. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  220. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
  221. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
  222. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  223. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  224. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  225. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  226. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  227. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
  228. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  229. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/config.py +0 -0
  230. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/experimental/__init__.py +0 -0
  231. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/experimental/ask_user_tool/__init__.py +0 -0
  232. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/experimental/ask_user_tool/config.py +0 -0
  233. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/experimental/ask_user_tool/tool.py +0 -0
  234. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/__init__.py +0 -0
  235. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/config.py +0 -0
  236. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/runtime.py +0 -0
  237. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/tool.py +0 -0
  238. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/__init__.py +0 -0
  239. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/config.py +0 -0
  240. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/tool.py +0 -0
  241. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/experimental/todo/__init__.py +0 -0
  242. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/experimental/todo/config.py +0 -0
  243. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/experimental/todo/prompts/__init__.py +0 -0
  244. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/experimental/todo/prompts/execution_reminder.j2 +0 -0
  245. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/experimental/todo/prompts/system_prompt.j2 +0 -0
  246. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/experimental/todo/prompts/tool_description.j2 +0 -0
  247. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/experimental/todo/prompts/verification_nudge.j2 +0 -0
  248. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/experimental/todo/schemas.py +0 -0
  249. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/experimental/todo/service.py +0 -0
  250. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/factory.py +0 -0
  251. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  252. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  253. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  254. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/names.py +0 -0
  255. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
  256. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/artifacts.py +0 -0
  257. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +0 -0
  258. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +0 -0
  259. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/run_context.py +0 -0
  260. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  261. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  262. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/tool.py +0 -0
  263. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  264. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  265. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  266. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  267. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  268. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  269. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/agentic_table/synthetic_chat_event.py +0 -0
  270. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/app/chat_event_filter_options_settings.py +0 -0
  271. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/app/dev_util.py +0 -0
  272. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/app/fast_api_factory.py +0 -0
  273. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/app/feature_flags.py +0 -0
  274. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/app/find_env_file.py +0 -0
  275. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/app/init_sdk.py +0 -0
  276. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/app/performance/async_tasks.py +0 -0
  277. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  278. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/app/unique_settings.py +0 -0
  279. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/app/verification.py +0 -0
  280. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/app/webhook.py +0 -0
  281. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/chat/constants.py +0 -0
  282. {unique_toolkit-2026.28.4/unique_toolkit/smart_rules → unique_toolkit-2026.30.0/unique_toolkit/chat/deprecated}/__init__.py +0 -0
  283. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/chat/deprecated/service.py +0 -0
  284. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/chat/rendering.py +0 -0
  285. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/chat/responses_api.py +0 -0
  286. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/chat/schemas.py +0 -0
  287. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/chat/service.py +0 -0
  288. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/chat/state.py +0 -0
  289. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/chat/utils.py +0 -0
  290. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/content/__init__.py +0 -0
  291. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/content/constants.py +0 -0
  292. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/content/functions.py +0 -0
  293. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/content/schemas.py +0 -0
  294. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/content/service.py +0 -0
  295. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/content/smart_rules.py +0 -0
  296. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/content/utils.py +0 -0
  297. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/data_extraction/README.md +0 -0
  298. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/data_extraction/__init__.py +0 -0
  299. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
  300. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/data_extraction/augmented/service.py +0 -0
  301. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/data_extraction/base.py +0 -0
  302. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
  303. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/data_extraction/basic/config.py +0 -0
  304. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
  305. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/data_extraction/basic/service.py +0 -0
  306. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/elicitation/__init__.py +0 -0
  307. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/elicitation/constants.py +0 -0
  308. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/elicitation/exceptions.py +0 -0
  309. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/elicitation/functions.py +0 -0
  310. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/elicitation/schemas.py +0 -0
  311. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/elicitation/service.py +0 -0
  312. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/embedding/__init__.py +0 -0
  313. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/embedding/constants.py +0 -0
  314. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/embedding/functions.py +0 -0
  315. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/embedding/schemas.py +0 -0
  316. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/embedding/service.py +0 -0
  317. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/embedding/utils.py +0 -0
  318. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/README.md +0 -0
  319. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/__init__.py +0 -0
  320. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/_internal/__init__.py +0 -0
  321. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/_internal/streaming/__init__.py +0 -0
  322. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/_internal/streaming/common.py +0 -0
  323. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/_internal/streaming/pattern_replacer.py +0 -0
  324. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/__init__.py +0 -0
  325. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/_base.py +0 -0
  326. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/content_tree/__init__.py +0 -0
  327. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/content_tree/functions.py +0 -0
  328. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/content_tree/schemas.py +0 -0
  329. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/internal_search/__init__.py +0 -0
  330. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/internal_search/base/__init__.py +0 -0
  331. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/internal_search/base/config.py +0 -0
  332. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/internal_search/base/schemas.py +0 -0
  333. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/internal_search/base/service.py +0 -0
  334. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/internal_search/base/utils.py +0 -0
  335. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/internal_search/chat/__init__.py +0 -0
  336. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/internal_search/chat/config.py +0 -0
  337. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/internal_search/chat/schemas.py +0 -0
  338. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/internal_search/chat/service.py +0 -0
  339. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/internal_search/knowledge_base/__init__.py +0 -0
  340. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/internal_search/knowledge_base/config.py +0 -0
  341. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/internal_search/knowledge_base/schemas.py +0 -0
  342. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/internal_search/knowledge_base/service.py +0 -0
  343. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/internal_search/post_processing/__init__.py +0 -0
  344. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/internal_search/post_processing/config.py +0 -0
  345. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/components/internal_search/post_processing/service.py +0 -0
  346. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/content_tree/__init__.py +0 -0
  347. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/identity/__init__.py +0 -0
  348. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/__init__.py +0 -0
  349. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/__init__.py +0 -0
  350. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/__init__.py +0 -0
  351. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/__init__.py +0 -0
  352. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/_async_bridge.py +0 -0
  353. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/__init__.py +0 -0
  354. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/stream_event_router.py +0 -0
  355. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/tool_call_event_handler.py +0 -0
  356. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/events.py +0 -0
  357. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/__init__.py +0 -0
  358. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/chat_completions.py +0 -0
  359. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/responses.py +0 -0
  360. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/__init__.py +0 -0
  361. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/complete_with_references.py +0 -0
  362. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/stream_event_router.py +0 -0
  363. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/text_delta_event_handler.py +0 -0
  364. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/tool_call_event_handler.py +0 -0
  365. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/__init__.py +0 -0
  366. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/progress_log_persister.py +0 -0
  367. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/__init__.py +0 -0
  368. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/content_folder/__init__.py +0 -0
  369. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/content_folder/functions.py +0 -0
  370. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/content_folder/schemas.py +0 -0
  371. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/content_folder/service.py +0 -0
  372. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/facades/__init__.py +0 -0
  373. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/facades/identity/__init__.py +0 -0
  374. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/facades/identity/service.py +0 -0
  375. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/feature_flags/README.md +0 -0
  376. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/feature_flags/__init__.py +0 -0
  377. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/feature_flags/_graphql_client.py +0 -0
  378. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/feature_flags/_ttl_cache.py +0 -0
  379. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/feature_flags/client.py +0 -0
  380. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/feature_flags/schemas.py +0 -0
  381. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/feature_flags/settings.py +0 -0
  382. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/group/__init__.py +0 -0
  383. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/group/functions.py +0 -0
  384. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/group/schemas.py +0 -0
  385. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/group/service.py +0 -0
  386. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/scheduled_task/__init__.py +0 -0
  387. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/scheduled_task/cron.py +0 -0
  388. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/scheduled_task/functions.py +0 -0
  389. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/scheduled_task/schemas.py +0 -0
  390. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/scheduled_task/service.py +0 -0
  391. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/user/__init__.py +0 -0
  392. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/user/functions.py +0 -0
  393. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/user/schemas.py +0 -0
  394. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/resources/user/service.py +0 -0
  395. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/experimental/testing/__init__.py +0 -0
  396. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/framework_utilities/__init__.py +0 -0
  397. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
  398. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  399. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  400. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  401. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  402. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  403. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/framework_utilities/utils.py +0 -0
  404. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
  405. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/language_model/builder.py +0 -0
  406. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/language_model/constants.py +0 -0
  407. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/language_model/default_language_model.py +0 -0
  408. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/language_model/prompt.py +0 -0
  409. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/language_model/reference.py +0 -0
  410. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/language_model/service.py +0 -0
  411. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/language_model/settings.py +0 -0
  412. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/language_model/stream_transform.py +0 -0
  413. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/language_model/utils.py +0 -0
  414. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/monitoring/__init__.py +0 -0
  415. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/monitoring/gunicorn.py +0 -0
  416. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/monitoring/middleware.py +0 -0
  417. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/monitoring/registry.py +0 -0
  418. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/protocols/support.py +0 -0
  419. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/services/__init__.py +0 -0
  420. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/services/factory.py +0 -0
  421. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/short_term_memory/__init__.py +0 -0
  422. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/short_term_memory/constants.py +0 -0
  423. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/short_term_memory/functions.py +0 -0
  424. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/short_term_memory/schemas.py +0 -0
  425. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/short_term_memory/service.py +0 -0
  426. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/smart_rules/compile.py +0 -0
  427. {unique_toolkit-2026.28.4 → unique_toolkit-2026.30.0}/unique_toolkit/test_utilities/events.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: unique-toolkit
3
- Version: 2026.28.4
3
+ Version: 2026.30.0
4
4
  Summary:
5
5
  Author: Cedric Klinkert, Martin Fadler, Sadique Sheik, Fabian Schläpfer, Pascal Hauri, Ejiroghene Oki-Peter, Rami Azouz, Ricardo Visini, Sanzio Monti
6
6
  Author-email: Cedric Klinkert <cedric.klinkert@unique.ch>, Martin Fadler <martin.fadler@unique.ch>, Sadique Sheik <sadique@unique.ch>, Fabian Schläpfer <fabian@unique.ch>, Pascal Hauri <pascal@unique.ch>, Ejiroghene Oki-Peter <oki-peter.ejiroghene@unique.ai>, Rami Azouz <rami.ext@unique.ch>, Ricardo Visini <ricardo.visini@unique.ch>, Sanzio Monti <sanzio.monti@unique.ai>
@@ -16,7 +16,7 @@ Requires-Dist: sseclient>=0.0.27,<0.0.28
16
16
  Requires-Dist: openai>=1.105.0,<3
17
17
  Requires-Dist: platformdirs>=4.0.0,<5
18
18
  Requires-Dist: pillow>=12.1.1
19
- Requires-Dist: unique-sdk>=2026.28.4
19
+ Requires-Dist: unique-sdk>=2026.30.0
20
20
  Requires-Dist: jambo>=0.1.2,<0.2
21
21
  Requires-Dist: jinja2>=3.1.6,<4
22
22
  Requires-Dist: docxtpl>=0.20.1,<0.21
@@ -32,6 +32,7 @@ Requires-Dist: pypandoc>=1.16.2,<2
32
32
  Requires-Dist: tenacity>=9.1.4
33
33
  Requires-Dist: pydantic-core>=2.41.5
34
34
  Requires-Dist: cachetools>=5.0,<6
35
+ Requires-Dist: rapidfuzz>=3.0,<4
35
36
  Requires-Dist: fastapi>=0.121.0,<0.122 ; extra == 'fastapi'
36
37
  Requires-Dist: starlette>=0.49.1 ; extra == 'fastapi'
37
38
  Requires-Dist: uvicorn>=0.37.0,<0.38 ; extra == 'fastapi'
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "unique_toolkit"
3
- version = "2026.28.4"
3
+ version = "2026.30.0"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -28,7 +28,7 @@ dependencies = [
28
28
  "openai>=1.105.0,<3",
29
29
  "platformdirs>=4.0.0,<5",
30
30
  "pillow>=12.1.1",
31
- "unique-sdk>=2026.28.4",
31
+ "unique-sdk>=2026.30.0",
32
32
  "jambo>=0.1.2,<0.2",
33
33
  "jinja2>=3.1.6,<4",
34
34
  "docxtpl>=0.20.1,<0.21",
@@ -44,6 +44,7 @@ dependencies = [
44
44
  "tenacity>=9.1.4",
45
45
  "pydantic-core>=2.41.5",
46
46
  "cachetools>=5.0,<6",
47
+ "rapidfuzz>=3.0,<4",
47
48
  ]
48
49
 
49
50
  [project.optional-dependencies]
@@ -0,0 +1,245 @@
1
+ from typing import Any, Required, TypedDict
2
+
3
+ from unique_toolkit.agentic.tools.openai_builtin import OpenAICodeInterpreterTool
4
+ from unique_toolkit.agentic.tools.openai_builtin.base import OpenAIBuiltInToolName
5
+ from unique_toolkit.agentic.tools.openai_builtin.code_interpreter.postprocessors.generated_files import (
6
+ ArtifactsDebugInfo,
7
+ )
8
+ from unique_toolkit.agentic.tools.schemas import ToolCallResponse
9
+ from unique_toolkit.agentic.tools.tool_manager import ToolManager
10
+ from unique_toolkit.language_model.schemas import (
11
+ LanguageModelStreamResponse,
12
+ ResponsesLanguageModelStreamResponse,
13
+ )
14
+
15
+
16
+ class AnalyticsTool(TypedDict, total=False):
17
+ name: Required[str]
18
+ display_name: Required[str]
19
+ is_forced: bool
20
+ is_exclusive: bool
21
+ is_sub_agent: bool
22
+ is_mcp: bool
23
+ loop_iteration: int
24
+
25
+
26
+ class AnalyticsSkill(TypedDict):
27
+ name: str
28
+ content_id: str
29
+ is_forced: bool
30
+
31
+
32
+ class AnalyticsLanguageModel(TypedDict):
33
+ name: str
34
+ family: str
35
+ provider: str
36
+
37
+
38
+ class AnalyticsToolName(TypedDict):
39
+ name: str
40
+ display_name: str
41
+
42
+
43
+ class Analytics(TypedDict):
44
+ answer_length: int
45
+ artifacts_created_count: int | None
46
+ artifacts_created_filetype: list[str] | None
47
+ context_memory_updated: bool | None
48
+ language_model: AnalyticsLanguageModel
49
+ loop_iteration_count: int
50
+ mcp_tool_names_used: list[AnalyticsToolName]
51
+ # Total size of artifacts/files created this turn, in MiB. None when Code
52
+ # Interpreter did not run; 0.0 when it ran but produced nothing.
53
+ output_size: float | None
54
+ references_count: int
55
+ skills_used: list[AnalyticsSkill]
56
+ subagent_names_used: list[AnalyticsToolName]
57
+ tool_call_count: int
58
+ tools_used: list[AnalyticsTool]
59
+ total_time_to_answer_ms: int | None
60
+ user_prompt_length: int
61
+
62
+
63
+ class DebugInfoManager:
64
+ def __init__(self):
65
+ self.debug_info: dict[str, Any] = {"tools": []}
66
+
67
+ def extract_tool_debug_info(
68
+ self,
69
+ tool_call_responses: list[ToolCallResponse],
70
+ loop_iteration_index: int | None = None,
71
+ ) -> None:
72
+ for tool_call_response in tool_call_responses:
73
+ debug_info = (
74
+ tool_call_response.debug_info.copy()
75
+ if tool_call_response.debug_info
76
+ else {}
77
+ )
78
+ tool_info: dict[str, Any] = {
79
+ "name": tool_call_response.name,
80
+ "info": debug_info,
81
+ }
82
+ if debug_info.get("mcp_server"):
83
+ tool_info["mcp_server"] = debug_info["mcp_server"]
84
+ if loop_iteration_index is not None:
85
+ tool_info["info"]["loop_iteration"] = loop_iteration_index
86
+ self.debug_info["tools"].append(tool_info)
87
+
88
+ def extract_builtin_tool_debug_info(
89
+ self,
90
+ stream_response: LanguageModelStreamResponse,
91
+ tool_manager: ToolManager,
92
+ loop_iteration_index: int | None = None,
93
+ ) -> None:
94
+ self.debug_info["tools"].extend(
95
+ _extract_tool_calls_from_stream_response(
96
+ stream_response, tool_manager, loop_iteration_index
97
+ )
98
+ )
99
+
100
+ def add(self, key: str, value: Any) -> None:
101
+ self.debug_info = self.debug_info | {key: value}
102
+
103
+ def get(self) -> dict[str, Any]:
104
+ return self.debug_info
105
+
106
+ def add_analytics(
107
+ self,
108
+ skills: list[dict[str, Any]],
109
+ language_model: AnalyticsLanguageModel,
110
+ tool_display_names: dict[str, str],
111
+ references: int = 0,
112
+ user_prompt_length: int = 0,
113
+ answer_length: int = 0,
114
+ loop_iteration_count: int = 0,
115
+ total_time_to_answer_ms: int | None = None,
116
+ artifacts: ArtifactsDebugInfo | None = None,
117
+ context_memory_updated: bool | None = None,
118
+ ) -> None:
119
+ """Add a stable 'analytics' snapshot for downstream ROI/usage reporting.
120
+
121
+ Copies the current `tools` list (with each tool's info reduced to
122
+ attribution fields only), the given `skills` list, usage counts, prompt
123
+ and answer lengths, and language-model attribution into a new
124
+ `analytics` key. Later appends to `debug_info["tools"]` (e.g. from
125
+ extract_tool_debug_info) can't leak into the frozen snapshot. Existing
126
+ top-level keys (`tools`, `skills`, ...) are left untouched, so this is
127
+ additive for consumers reading the old shape.
128
+ """
129
+ analytics_tools = [
130
+ _to_analytics_tool_entry(tool, tool_display_names)
131
+ for tool in self.debug_info.get("tools", [])
132
+ ]
133
+ # Artifacts are recorded at the postprocessor seam (Code Interpreter's
134
+ # DisplayCodeInterpreterFilesPostProcessor) into debug_info["artifacts"].
135
+ # Absent when no Code Interpreter ran this turn → artifact fields stay
136
+ # None, preserving the always-present, null-when-unknown contract.
137
+ analytics = Analytics(
138
+ tools_used=analytics_tools,
139
+ tool_call_count=len(analytics_tools),
140
+ skills_used=[
141
+ AnalyticsSkill(
142
+ name=skill["name"],
143
+ content_id=skill["content_id"],
144
+ is_forced=skill["is_forced"],
145
+ )
146
+ for skill in skills
147
+ ],
148
+ references_count=references,
149
+ user_prompt_length=user_prompt_length,
150
+ answer_length=answer_length,
151
+ language_model=language_model.copy(),
152
+ loop_iteration_count=loop_iteration_count,
153
+ subagent_names_used=_unique_tool_names(analytics_tools, "is_sub_agent"),
154
+ mcp_tool_names_used=_unique_tool_names(analytics_tools, "is_mcp"),
155
+ total_time_to_answer_ms=total_time_to_answer_ms,
156
+ artifacts_created_count=artifacts["count"] if artifacts else None,
157
+ artifacts_created_filetype=artifacts["filetypes"] if artifacts else None,
158
+ output_size=artifacts["output_size"] if artifacts else None,
159
+ # None when the user-memory postprocessor is not activated for this
160
+ # turn; True/False when it ran and did/didn't update the profile.
161
+ context_memory_updated=context_memory_updated,
162
+ )
163
+ self.add("analytics", analytics)
164
+
165
+
166
+ def _unique_tool_names(
167
+ analytics_tools: list[AnalyticsTool], flag: str
168
+ ) -> list[AnalyticsToolName]:
169
+ """Dedupe the tools carrying `flag` into `{name, display_name}` entries.
170
+
171
+ Keyed on the stable `name` so downstream reporting can join on a stable
172
+ identifier while still carrying the user-facing `display_name` for labels.
173
+ """
174
+ unique: dict[str, AnalyticsToolName] = {}
175
+ for tool in analytics_tools:
176
+ if tool.get(flag) and tool["name"] not in unique:
177
+ unique[tool["name"]] = AnalyticsToolName(
178
+ name=tool["name"],
179
+ display_name=tool["display_name"],
180
+ )
181
+ return list(unique.values())
182
+
183
+
184
+ def _to_analytics_tool_entry(
185
+ tool: dict[str, Any], tool_display_names: dict[str, str]
186
+ ) -> AnalyticsTool:
187
+ """Return an analytics-safe copy of a tool debug-info entry.
188
+
189
+ Keeps only tool attribution fields.
190
+ """
191
+ info = tool.get("info") or {}
192
+ name = tool["name"]
193
+ analytics_tool = AnalyticsTool(
194
+ name=name,
195
+ display_name=tool_display_names.get(name) or name,
196
+ )
197
+ if "is_forced" in info:
198
+ analytics_tool["is_forced"] = info["is_forced"]
199
+ if "is_exclusive" in info:
200
+ analytics_tool["is_exclusive"] = info["is_exclusive"]
201
+ if info.get("is_sub_agent"):
202
+ analytics_tool["is_sub_agent"] = True
203
+ if info.get("is_mcp") or tool.get("mcp_server"):
204
+ analytics_tool["is_mcp"] = True
205
+ if "loop_iteration" in info:
206
+ analytics_tool["loop_iteration"] = info["loop_iteration"]
207
+ return analytics_tool
208
+
209
+
210
+ def _extract_tool_calls_from_stream_response(
211
+ stream_response: LanguageModelStreamResponse,
212
+ tool_manager: ToolManager,
213
+ loop_iteration_index: int | None = None,
214
+ ) -> list[dict[str, Any]]:
215
+ if not isinstance(stream_response, ResponsesLanguageModelStreamResponse):
216
+ return []
217
+
218
+ seen = set()
219
+ tool_infos = []
220
+
221
+ for code_interpreter_call in stream_response.code_interpreter_calls:
222
+ if code_interpreter_call.id in seen:
223
+ continue
224
+
225
+ seen.add(code_interpreter_call.id)
226
+ tool_name = OpenAIBuiltInToolName.CODE_INTERPRETER
227
+
228
+ is_exclusive = tool_name in tool_manager.get_exclusive_tools()
229
+ is_forced = tool_name in tool_manager.get_tool_choices()
230
+
231
+ debug_info = OpenAICodeInterpreterTool.get_debug_info(code_interpreter_call)
232
+
233
+ if loop_iteration_index is not None:
234
+ debug_info["loop_iteration"] = loop_iteration_index
235
+ debug_info["is_exclusive"] = is_exclusive
236
+ debug_info["is_forced"] = is_forced
237
+
238
+ tool_infos.append(
239
+ {
240
+ "name": tool_name,
241
+ "info": debug_info,
242
+ }
243
+ )
244
+
245
+ return tool_infos
@@ -32,6 +32,9 @@ from unique_toolkit.language_model.infos import (
32
32
  LanguageModelInfo,
33
33
  ModelCapabilities,
34
34
  )
35
+ from unique_toolkit.language_model.invocation_stats import (
36
+ LanguageModelInvocationStats,
37
+ )
35
38
  from unique_toolkit.language_model.schemas import (
36
39
  LanguageModelMessages,
37
40
  LanguageModelSystemMessage,
@@ -145,6 +148,10 @@ class ContextRelevancyEvaluator:
145
148
  # Handle regular output
146
149
  return await self._handle_regular_output(input, config)
147
150
 
151
+ except EvaluatorException:
152
+ # Already carries whatever invocation_stats were captured before
153
+ # the failure -- don't re-wrap it and lose them.
154
+ raise
148
155
  except Exception as e:
149
156
  error_message = (
150
157
  "Unknown error occurred during context relevancy metric analysis"
@@ -172,21 +179,49 @@ class ContextRelevancyEvaluator:
172
179
  other_options=config.additional_llm_options,
173
180
  )
174
181
 
182
+ # Captured as soon as the (billable) LLM call returns, so a validation
183
+ # failure below can still report it instead of losing it.
184
+ invocation_stats = (
185
+ [
186
+ LanguageModelInvocationStats.from_usage(
187
+ config.language_model.name,
188
+ result.usage,
189
+ source="context_relevancy",
190
+ )
191
+ ]
192
+ if result.usage is not None
193
+ else []
194
+ )
195
+
175
196
  try:
176
197
  result_content = EvaluationSchemaStructuredOutput.model_validate(
177
198
  result.choices[0].message.parsed
178
199
  )
200
+ evaluation_result = parse_eval_metric_result_structured_output(
201
+ result_content, EvaluationMetricName.CONTEXT_RELEVANCY
202
+ )
179
203
  except ValidationError as e:
180
204
  error_message = "Error occurred during structured output validation of the context relevancy evaluation."
181
205
  raise EvaluatorException(
182
206
  error_message=error_message,
183
207
  user_message=error_message,
184
208
  exception=e,
209
+ invocation_stats=invocation_stats,
210
+ )
211
+ except Exception as e:
212
+ # Catches anything else reading the response (e.g. an empty
213
+ # `choices` list) -- must still carry invocation_stats, not just
214
+ # the validation-specific failure above.
215
+ error_message = "Error occurred while reading the structured output response for context relevancy evaluation."
216
+ raise EvaluatorException(
217
+ error_message=f"{error_message}: {e}",
218
+ user_message=error_message,
219
+ exception=e,
220
+ invocation_stats=invocation_stats,
185
221
  )
186
222
 
187
- return parse_eval_metric_result_structured_output(
188
- result_content, EvaluationMetricName.CONTEXT_RELEVANCY
189
- )
223
+ evaluation_result.invocation_stats = invocation_stats
224
+ return evaluation_result
190
225
 
191
226
  async def _handle_regular_output(
192
227
  self,
@@ -201,17 +236,52 @@ class ContextRelevancyEvaluator:
201
236
  other_options=config.additional_llm_options,
202
237
  )
203
238
 
204
- result_content = result.choices[0].message.content
205
- if not result_content or not isinstance(result_content, str):
206
- error_message = "Context relevancy evaluation did not return a result."
239
+ # Captured as soon as the (billable) LLM call returns, so a failure
240
+ # below can still report it instead of losing it.
241
+ invocation_stats = (
242
+ [
243
+ LanguageModelInvocationStats.from_usage(
244
+ config.language_model.name,
245
+ result.usage,
246
+ source="context_relevancy",
247
+ )
248
+ ]
249
+ if result.usage is not None
250
+ else []
251
+ )
252
+
253
+ try:
254
+ result_content = result.choices[0].message.content
255
+ if not result_content or not isinstance(result_content, str):
256
+ error_message = "Context relevancy evaluation did not return a result."
257
+ raise EvaluatorException(
258
+ error_message=error_message,
259
+ user_message=error_message,
260
+ invocation_stats=invocation_stats,
261
+ )
262
+ evaluation_result = parse_eval_metric_result(
263
+ result_content, EvaluationMetricName.CONTEXT_RELEVANCY
264
+ )
265
+ except EvaluatorException as e:
266
+ # Covers both the raise above and parse_eval_metric_result's own
267
+ # EvaluatorException (which has no invocation_stats, since it has
268
+ # no usage context) -- attach ours if it didn't already carry
269
+ # stats, instead of letting it propagate stats-less.
270
+ if not e.invocation_stats:
271
+ e.invocation_stats = invocation_stats
272
+ raise
273
+ except Exception as e:
274
+ # Catches anything else reading the response (e.g. an empty
275
+ # `choices` list).
276
+ error_message = "Error occurred while reading the context relevancy evaluation response."
207
277
  raise EvaluatorException(
208
- error_message=error_message,
278
+ error_message=f"{error_message}: {e}",
209
279
  user_message=error_message,
280
+ exception=e,
281
+ invocation_stats=invocation_stats,
210
282
  )
211
-
212
- return parse_eval_metric_result(
213
- result_content, EvaluationMetricName.CONTEXT_RELEVANCY
214
- )
283
+ evaluation_result.invocation_stats = invocation_stats
284
+ return evaluation_result
215
285
 
216
286
  def _compose_msgs(
217
287
  self,
@@ -7,6 +7,7 @@ from unique_toolkit._common.execution import (
7
7
  Result,
8
8
  SafeTaskExecutor,
9
9
  )
10
+ from unique_toolkit.agentic.evaluation.exception import EvaluatorException
10
11
  from unique_toolkit.agentic.evaluation.schemas import (
11
12
  EvaluationAssessmentMessage,
12
13
  EvaluationMetricName,
@@ -17,6 +18,9 @@ from unique_toolkit.chat.schemas import (
17
18
  ChatMessageAssessmentType,
18
19
  )
19
20
  from unique_toolkit.chat.service import ChatService
21
+ from unique_toolkit.language_model.invocation_stats import (
22
+ LanguageModelInvocationStats,
23
+ )
20
24
  from unique_toolkit.language_model.schemas import (
21
25
  LanguageModelStreamResponse,
22
26
  )
@@ -88,6 +92,7 @@ class EvaluationManager:
88
92
  self._evaluations: dict[EvaluationMetricName, Evaluation] = {}
89
93
  self._evaluation_passed: bool = True
90
94
  self._execution_times: dict[str, float] = {}
95
+ self._invocation_stats: list[LanguageModelInvocationStats] = []
91
96
 
92
97
  def add_evaluation(self, evaluation: Evaluation):
93
98
  self._evaluations[evaluation.get_name()] = evaluation
@@ -102,6 +107,7 @@ class EvaluationManager:
102
107
  assistant_message_id: str,
103
108
  ) -> list[EvaluationMetricResult]:
104
109
  self._execution_times = {}
110
+ self._invocation_stats = []
105
111
 
106
112
  task_executor = SafeTaskExecutor(
107
113
  logger=self._logger,
@@ -125,6 +131,7 @@ class EvaluationManager:
125
131
  )
126
132
  if not unpacked_evaluation_result.is_positive:
127
133
  self._evaluation_passed = False
134
+ self._invocation_stats.extend(unpacked_evaluation_result.invocation_stats)
128
135
  evaluation_results_unpacked.append(unpacked_evaluation_result)
129
136
 
130
137
  for evaluation_name, evaluation_result in zip(
@@ -141,6 +148,10 @@ class EvaluationManager:
141
148
  def get_execution_times(self) -> dict[str, float]:
142
149
  return self._execution_times.copy()
143
150
 
151
+ def get_invocation_stats(self) -> list[LanguageModelInvocationStats]:
152
+ """Per-LLM-call stats from every evaluation that made its own LLM call."""
153
+ return list(self._invocation_stats)
154
+
144
155
  async def execute_evaluation_call(
145
156
  self,
146
157
  evaluation_name: EvaluationMetricName,
@@ -178,12 +189,18 @@ class EvaluationManager:
178
189
  evaluation_name: EvaluationMetricName,
179
190
  ) -> EvaluationMetricResult:
180
191
  if not result.success:
192
+ invocation_stats = (
193
+ result.exception.invocation_stats
194
+ if isinstance(result.exception, EvaluatorException)
195
+ else []
196
+ )
181
197
  return EvaluationMetricResult(
182
198
  name=evaluation_name,
183
199
  is_positive=True,
184
200
  value="RED",
185
201
  reason=str(result.exception),
186
202
  error=Exception("Evaluation result is not successful"),
203
+ invocation_stats=invocation_stats,
187
204
  )
188
205
  return result.unpack()
189
206
 
@@ -0,0 +1,23 @@
1
+ from unique_toolkit._common.exception import CommonException
2
+ from unique_toolkit.language_model.invocation_stats import LanguageModelInvocationStats
3
+
4
+
5
+ class EvaluatorException(CommonException):
6
+ def __init__(
7
+ self,
8
+ user_message: str,
9
+ error_message: str,
10
+ exception: Exception | None = None,
11
+ invocation_stats: list[LanguageModelInvocationStats] | None = None,
12
+ ) -> None:
13
+ super().__init__(
14
+ user_message=user_message,
15
+ error_message=error_message,
16
+ exception=exception,
17
+ )
18
+ # Carries whatever usage was already captured before the failure, so a
19
+ # successful (billable) LLM call isn't silently dropped from the report
20
+ # just because something after it (parsing, validation) raised.
21
+ self.invocation_stats: list[LanguageModelInvocationStats] = (
22
+ invocation_stats or []
23
+ )
@@ -18,6 +18,9 @@ from unique_toolkit.content import ContentReference
18
18
  from unique_toolkit.content.schemas import ContentChunk
19
19
  from unique_toolkit.language_model.builder import MessagesBuilder
20
20
  from unique_toolkit.language_model.infos import ModelCapabilities
21
+ from unique_toolkit.language_model.invocation_stats import (
22
+ LanguageModelInvocationStats,
23
+ )
21
24
  from unique_toolkit.language_model.schemas import (
22
25
  LanguageModelMessages,
23
26
  LanguageModelStreamResponse,
@@ -73,29 +76,58 @@ async def check_hallucination(
73
76
 
74
77
  try:
75
78
  msgs = _get_msgs(input, config)
76
-
77
79
  result = await LanguageModelService.complete_async_util(
78
80
  company_id=company_id, user_id=user_id, messages=msgs, model_name=model_name
79
81
  )
82
+ except Exception as e:
83
+ error_message = "Error occurred during hallucination metric analysis"
84
+ raise EvaluatorException(
85
+ error_message=f"{error_message}: {e}",
86
+ user_message=error_message,
87
+ exception=e,
88
+ )
89
+
90
+ # Captured as soon as the (billable) LLM call returns, so a failure below
91
+ # (empty content, parsing) can still report it instead of losing it.
92
+ invocation_stats = (
93
+ [
94
+ LanguageModelInvocationStats.from_usage(
95
+ model_name, result.usage, source="hallucination"
96
+ )
97
+ ]
98
+ if result.usage is not None
99
+ else []
100
+ )
101
+
102
+ try:
80
103
  result_content = result.choices[0].message.content
81
104
  if not result_content or not isinstance(result_content, str):
82
105
  error_message = "Hallucination evaluation did not return a text result."
83
106
  raise EvaluatorException(
84
107
  error_message=error_message,
85
108
  user_message=error_message,
109
+ invocation_stats=invocation_stats,
86
110
  )
87
- result = parse_eval_metric_result(
111
+ eval_result = parse_eval_metric_result(
88
112
  result_content,
89
113
  EvaluationMetricName.HALLUCINATION,
90
114
  )
91
-
92
- return result
115
+ eval_result.invocation_stats = invocation_stats
116
+ return eval_result
117
+ except EvaluatorException as e:
118
+ # parse_eval_metric_result raises its own EvaluatorException (with no
119
+ # invocation_stats, since it has no usage context) -- attach ours if
120
+ # it didn't already carry stats, instead of re-raising it stats-less.
121
+ if not e.invocation_stats:
122
+ e.invocation_stats = invocation_stats
123
+ raise
93
124
  except Exception as e:
94
125
  error_message = "Error occurred during hallucination metric analysis"
95
126
  raise EvaluatorException(
96
127
  error_message=f"{error_message}: {e}",
97
128
  user_message=error_message,
98
129
  exception=e,
130
+ invocation_stats=invocation_stats,
99
131
  )
100
132
 
101
133
 
@@ -10,6 +10,7 @@ from unique_toolkit.chat.schemas import (
10
10
  ChatMessageAssessmentStatus,
11
11
  ChatMessageAssessmentType,
12
12
  )
13
+ from unique_toolkit.language_model.invocation_stats import LanguageModelInvocationStats
13
14
 
14
15
 
15
16
  class EvaluationMetricName(StrEnum):
@@ -102,6 +103,7 @@ class EvaluationMetricResult(BaseModel):
102
103
  user_info: Optional[str] = None
103
104
  error: Exception | None = None
104
105
  fact_list: list[str] = Field(default_factory=list[str])
106
+ invocation_stats: list[LanguageModelInvocationStats] = Field(default_factory=list)
105
107
 
106
108
 
107
109
  class EvaluationAssessmentMessage(BaseModel):