unique-toolkit 2026.30.0.dev18__tar.gz → 2026.30.0.dev20__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 (424) hide show
  1. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/PKG-INFO +2 -2
  2. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/pyproject.toml +2 -2
  3. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +11 -5
  4. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +81 -11
  5. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/evaluation_manager.py +17 -0
  6. unique_toolkit-2026.30.0.dev20/unique_toolkit/agentic/evaluation/exception.py +23 -0
  7. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/hallucination/utils.py +36 -4
  8. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/schemas.py +2 -0
  9. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +71 -0
  10. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/loop_runner/__init__.py +2 -0
  11. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +2 -0
  12. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +5 -1
  13. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/loop_runner/base.py +15 -1
  14. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +32 -0
  15. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +37 -5
  16. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +41 -6
  17. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +2 -0
  18. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +2 -0
  19. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +57 -2
  20. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/schemas.py +5 -0
  21. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/complete_with_references.py +16 -0
  22. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/text_event_handler.py +1 -5
  23. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/completed_event_handler.py +1 -5
  24. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/language_model/__init__.py +4 -0
  25. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/language_model/functions.py +8 -0
  26. unique_toolkit-2026.30.0.dev20/unique_toolkit/language_model/invocation_stats.py +70 -0
  27. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/language_model/schemas.py +151 -2
  28. unique_toolkit-2026.30.0.dev18/unique_toolkit/agentic/evaluation/exception.py +0 -5
  29. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/README.md +0 -0
  30. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/__init__.py +0 -0
  31. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/__init__.py +0 -0
  32. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/_base_service.py +0 -0
  33. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/_time_utils.py +0 -0
  34. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  35. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  36. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  37. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  38. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  39. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  40. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  41. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/config_checker/README.md +0 -0
  42. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/config_checker/__init__.py +0 -0
  43. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/config_checker/__main__.py +0 -0
  44. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/config_checker/cli.py +0 -0
  45. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/config_checker/differ.py +0 -0
  46. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/config_checker/exporter.py +0 -0
  47. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/config_checker/models.py +0 -0
  48. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/config_checker/registry.py +0 -0
  49. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/config_checker/validator.py +0 -0
  50. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/default_language_model.py +0 -0
  51. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
  52. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/docx_generator/config.py +0 -0
  53. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
  54. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
  55. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/docx_generator/service.py +0 -0
  56. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
  57. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/endpoint_builder.py +0 -0
  58. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  59. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/event_bus.py +0 -0
  60. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/exception.py +0 -0
  61. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/execution.py +0 -0
  62. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
  63. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
  64. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
  65. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
  66. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
  67. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
  68. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
  69. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
  70. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
  71. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
  72. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
  73. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
  74. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
  75. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
  76. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
  77. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
  78. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
  79. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
  80. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
  81. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
  82. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
  83. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
  84. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
  85. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
  86. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
  87. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
  88. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
  89. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  90. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/metadata_filter_scope.py +0 -0
  91. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  92. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  93. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/referencing.py +0 -0
  94. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/string_utilities.py +0 -0
  95. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/tests/test_referencing.py +0 -0
  96. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
  97. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/token/__init__.py +0 -0
  98. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  99. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/token/token_counting.py +0 -0
  100. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
  101. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
  102. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/utils/__init__.py +0 -0
  103. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/utils/files.py +0 -0
  104. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/utils/image/encode.py +0 -0
  105. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
  106. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/utils/jinja/render.py +0 -0
  107. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
  108. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
  109. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  110. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  111. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  112. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/validate_required_values.py +0 -0
  113. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/_common/validators.py +0 -0
  114. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/__init__.py +0 -0
  115. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
  116. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/config.py +0 -0
  117. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
  118. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
  119. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
  120. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  121. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  122. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
  123. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
  124. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
  125. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
  126. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  127. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  128. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
  129. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
  130. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
  131. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/tests/test_hallucination_external_context.py +0 -0
  132. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -0
  133. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  134. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
  135. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/evaluation/utils.py +0 -0
  136. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
  137. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/feature_flags/feature_flags.py +0 -0
  138. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  139. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  140. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
  141. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/history_manager/settings.py +0 -0
  142. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  143. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
  144. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
  145. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
  146. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
  147. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
  148. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
  149. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
  150. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
  151. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
  152. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
  153. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
  154. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
  155. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
  156. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
  157. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/message_log_order.py +0 -0
  158. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  159. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/reference_manager/tests/test_external_context.py +0 -0
  160. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
  161. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
  162. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
  163. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
  164. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  165. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  166. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/__init__.py +0 -0
  167. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  168. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  169. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  170. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  171. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  172. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  173. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  174. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  175. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
  176. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
  177. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  178. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
  179. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
  180. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  181. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
  182. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
  183. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_references.py +0 -0
  184. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  185. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
  186. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
  187. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  188. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  189. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  190. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  191. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  192. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
  193. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  194. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/config.py +0 -0
  195. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/experimental/__init__.py +0 -0
  196. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/experimental/ask_user_tool/__init__.py +0 -0
  197. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/experimental/ask_user_tool/config.py +0 -0
  198. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/experimental/ask_user_tool/tool.py +0 -0
  199. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/experimental/open_file_tool/__init__.py +0 -0
  200. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/experimental/open_file_tool/config.py +0 -0
  201. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/experimental/open_file_tool/runtime.py +0 -0
  202. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/experimental/open_file_tool/tool.py +0 -0
  203. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/__init__.py +0 -0
  204. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/config.py +0 -0
  205. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/tool.py +0 -0
  206. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/experimental/todo/__init__.py +0 -0
  207. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/experimental/todo/config.py +0 -0
  208. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/experimental/todo/prompts/__init__.py +0 -0
  209. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/experimental/todo/prompts/execution_reminder.j2 +0 -0
  210. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/experimental/todo/prompts/system_prompt.j2 +0 -0
  211. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/experimental/todo/prompts/tool_description.j2 +0 -0
  212. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/experimental/todo/prompts/verification_nudge.j2 +0 -0
  213. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/experimental/todo/schemas.py +0 -0
  214. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/experimental/todo/service.py +0 -0
  215. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/factory.py +0 -0
  216. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  217. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  218. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  219. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
  220. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/names.py +0 -0
  221. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
  222. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
  223. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/activator/__init__.py +0 -0
  224. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/activator/config.py +0 -0
  225. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/activator/service.py +0 -0
  226. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/__init__.py +0 -0
  227. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/_container.py +0 -0
  228. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/_files.py +0 -0
  229. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/_memory.py +0 -0
  230. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/builder.py +0 -0
  231. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
  232. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/artifacts.py +0 -0
  233. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +0 -0
  234. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +0 -0
  235. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/tool/__init__.py +0 -0
  236. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/tool/config.py +0 -0
  237. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/tool/service.py +0 -0
  238. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
  239. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/run_context.py +0 -0
  240. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  241. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  242. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/tool.py +0 -0
  243. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
  244. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  245. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  246. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  247. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  248. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  249. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  250. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic_table/__init__.py +0 -0
  251. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic_table/schemas.py +0 -0
  252. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic_table/service.py +0 -0
  253. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/agentic_table/synthetic_chat_event.py +0 -0
  254. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/app/__init__.py +0 -0
  255. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/app/chat_event_filter_options_settings.py +0 -0
  256. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/app/dev_util.py +0 -0
  257. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/app/fast_api_factory.py +0 -0
  258. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/app/feature_flags.py +0 -0
  259. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/app/find_env_file.py +0 -0
  260. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/app/init_logging.py +0 -0
  261. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/app/init_sdk.py +0 -0
  262. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/app/performance/async_tasks.py +0 -0
  263. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  264. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/app/schemas.py +0 -0
  265. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/app/unique_settings.py +0 -0
  266. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/app/verification.py +0 -0
  267. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/app/webhook.py +0 -0
  268. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/chat/__init__.py +0 -0
  269. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/chat/cancellation.py +0 -0
  270. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/chat/constants.py +0 -0
  271. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/chat/deprecated/__init__.py +0 -0
  272. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/chat/deprecated/service.py +0 -0
  273. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/chat/functions.py +0 -0
  274. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/chat/rendering.py +0 -0
  275. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/chat/responses_api.py +0 -0
  276. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/chat/schemas.py +0 -0
  277. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/chat/service.py +0 -0
  278. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/chat/state.py +0 -0
  279. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/chat/utils.py +0 -0
  280. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/content/__init__.py +0 -0
  281. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/content/constants.py +0 -0
  282. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/content/functions.py +0 -0
  283. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/content/schemas.py +0 -0
  284. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/content/service.py +0 -0
  285. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/content/smart_rules.py +0 -0
  286. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/content/utils.py +0 -0
  287. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/data_extraction/README.md +0 -0
  288. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/data_extraction/__init__.py +0 -0
  289. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
  290. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/data_extraction/augmented/service.py +0 -0
  291. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/data_extraction/base.py +0 -0
  292. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
  293. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/data_extraction/basic/config.py +0 -0
  294. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
  295. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/data_extraction/basic/service.py +0 -0
  296. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/elicitation/__init__.py +0 -0
  297. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/elicitation/constants.py +0 -0
  298. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/elicitation/exceptions.py +0 -0
  299. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/elicitation/functions.py +0 -0
  300. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/elicitation/schemas.py +0 -0
  301. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/elicitation/service.py +0 -0
  302. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/embedding/__init__.py +0 -0
  303. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/embedding/constants.py +0 -0
  304. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/embedding/functions.py +0 -0
  305. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/embedding/schemas.py +0 -0
  306. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/embedding/service.py +0 -0
  307. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/embedding/utils.py +0 -0
  308. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/README.md +0 -0
  309. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/__init__.py +0 -0
  310. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/_internal/__init__.py +0 -0
  311. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/_internal/streaming/__init__.py +0 -0
  312. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/_internal/streaming/common.py +0 -0
  313. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/_internal/streaming/pattern_replacer.py +0 -0
  314. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/__init__.py +0 -0
  315. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/_base.py +0 -0
  316. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/content_tree/__init__.py +0 -0
  317. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/content_tree/functions.py +0 -0
  318. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/content_tree/schemas.py +0 -0
  319. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/content_tree/service.py +0 -0
  320. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/internal_search/__init__.py +0 -0
  321. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/internal_search/base/__init__.py +0 -0
  322. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/internal_search/base/config.py +0 -0
  323. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/internal_search/base/schemas.py +0 -0
  324. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/internal_search/base/service.py +0 -0
  325. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/internal_search/base/utils.py +0 -0
  326. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/internal_search/chat/__init__.py +0 -0
  327. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/internal_search/chat/config.py +0 -0
  328. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/internal_search/chat/schemas.py +0 -0
  329. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/internal_search/chat/service.py +0 -0
  330. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/internal_search/knowledge_base/__init__.py +0 -0
  331. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/internal_search/knowledge_base/config.py +0 -0
  332. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/internal_search/knowledge_base/schemas.py +0 -0
  333. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/internal_search/knowledge_base/service.py +0 -0
  334. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/internal_search/post_processing/__init__.py +0 -0
  335. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/internal_search/post_processing/config.py +0 -0
  336. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/components/internal_search/post_processing/service.py +0 -0
  337. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/content_tree/__init__.py +0 -0
  338. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/identity/__init__.py +0 -0
  339. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/__init__.py +0 -0
  340. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/__init__.py +0 -0
  341. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/__init__.py +0 -0
  342. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/__init__.py +0 -0
  343. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/_async_bridge.py +0 -0
  344. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/__init__.py +0 -0
  345. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/stream_event_router.py +0 -0
  346. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/tool_call_event_handler.py +0 -0
  347. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/events.py +0 -0
  348. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/__init__.py +0 -0
  349. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/chat_completions.py +0 -0
  350. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/responses.py +0 -0
  351. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/__init__.py +0 -0
  352. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/code_interpreter_event_handler.py +0 -0
  353. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/complete_with_references.py +0 -0
  354. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/stream_event_router.py +0 -0
  355. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/text_delta_event_handler.py +0 -0
  356. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/tool_call_event_handler.py +0 -0
  357. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/__init__.py +0 -0
  358. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/message_persister.py +0 -0
  359. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/progress_log_persister.py +0 -0
  360. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/__init__.py +0 -0
  361. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/content_folder/__init__.py +0 -0
  362. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/content_folder/functions.py +0 -0
  363. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/content_folder/schemas.py +0 -0
  364. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/content_folder/service.py +0 -0
  365. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/facades/__init__.py +0 -0
  366. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/facades/identity/__init__.py +0 -0
  367. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/facades/identity/service.py +0 -0
  368. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/feature_flags/README.md +0 -0
  369. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/feature_flags/__init__.py +0 -0
  370. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/feature_flags/_graphql_client.py +0 -0
  371. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/feature_flags/_ttl_cache.py +0 -0
  372. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/feature_flags/client.py +0 -0
  373. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/feature_flags/schemas.py +0 -0
  374. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/feature_flags/settings.py +0 -0
  375. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/group/__init__.py +0 -0
  376. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/group/functions.py +0 -0
  377. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/group/schemas.py +0 -0
  378. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/group/service.py +0 -0
  379. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/scheduled_task/__init__.py +0 -0
  380. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/scheduled_task/cron.py +0 -0
  381. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/scheduled_task/functions.py +0 -0
  382. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/scheduled_task/schemas.py +0 -0
  383. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/scheduled_task/service.py +0 -0
  384. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/user/__init__.py +0 -0
  385. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/user/functions.py +0 -0
  386. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/user/schemas.py +0 -0
  387. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/resources/user/service.py +0 -0
  388. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/experimental/testing/__init__.py +0 -0
  389. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/framework_utilities/__init__.py +0 -0
  390. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
  391. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  392. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  393. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  394. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  395. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  396. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/framework_utilities/utils.py +0 -0
  397. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
  398. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/language_model/builder.py +0 -0
  399. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/language_model/constants.py +0 -0
  400. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/language_model/default_language_model.py +0 -0
  401. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/language_model/infos.py +0 -0
  402. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/language_model/prompt.py +0 -0
  403. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/language_model/reference.py +0 -0
  404. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/language_model/service.py +0 -0
  405. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/language_model/settings.py +0 -0
  406. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/language_model/stream_transform.py +0 -0
  407. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/language_model/utils.py +0 -0
  408. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/monitoring/__init__.py +0 -0
  409. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/monitoring/gunicorn.py +0 -0
  410. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/monitoring/middleware.py +0 -0
  411. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/monitoring/registry.py +0 -0
  412. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/protocols/support.py +0 -0
  413. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/services/__init__.py +0 -0
  414. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/services/chat_service.py +0 -0
  415. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/services/factory.py +0 -0
  416. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/services/knowledge_base.py +0 -0
  417. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/short_term_memory/__init__.py +0 -0
  418. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/short_term_memory/constants.py +0 -0
  419. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/short_term_memory/functions.py +0 -0
  420. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/short_term_memory/schemas.py +0 -0
  421. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/short_term_memory/service.py +0 -0
  422. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/smart_rules/__init__.py +0 -0
  423. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/unique_toolkit/smart_rules/compile.py +0 -0
  424. {unique_toolkit-2026.30.0.dev18 → unique_toolkit-2026.30.0.dev20}/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.30.0.dev18
3
+ Version: 2026.30.0.dev20
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.30.0.dev8,<2026.30.0rc0
19
+ Requires-Dist: unique-sdk>=2026.30.0.dev9,<2026.30.0rc0
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "unique_toolkit"
3
- version = "2026.30.0.dev18"
3
+ version = "2026.30.0.dev20"
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.30.0.dev8,<2026.30.0rc0",
31
+ "unique-sdk>=2026.30.0.dev9,<2026.30.0rc0",
32
32
  "jambo>=0.1.2,<0.2",
33
33
  "jinja2>=3.1.6,<4",
34
34
  "docxtpl>=0.20.1,<0.21",
@@ -2,6 +2,9 @@ from typing import Any, Required, TypedDict
2
2
 
3
3
  from unique_toolkit.agentic.tools.openai_builtin import OpenAICodeInterpreterTool
4
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
+ )
5
8
  from unique_toolkit.agentic.tools.schemas import ToolCallResponse
6
9
  from unique_toolkit.agentic.tools.tool_manager import ToolManager
7
10
  from unique_toolkit.language_model.schemas import (
@@ -55,7 +58,7 @@ class Analytics(TypedDict):
55
58
 
56
59
  class DebugInfoManager:
57
60
  def __init__(self):
58
- self.debug_info = {"tools": []}
61
+ self.debug_info: dict[str, Any] = {"tools": []}
59
62
 
60
63
  def extract_tool_debug_info(
61
64
  self,
@@ -106,6 +109,7 @@ class DebugInfoManager:
106
109
  answer_length: int = 0,
107
110
  loop_iteration_count: int = 0,
108
111
  total_time_to_answer_ms: int | None = None,
112
+ artifacts: ArtifactsDebugInfo | None = None,
109
113
  ) -> None:
110
114
  """Add a stable 'analytics' snapshot for downstream ROI/usage reporting.
111
115
 
@@ -121,6 +125,10 @@ class DebugInfoManager:
121
125
  _to_analytics_tool_entry(tool, tool_display_names)
122
126
  for tool in self.debug_info.get("tools", [])
123
127
  ]
128
+ # Artifacts are recorded at the postprocessor seam (Code Interpreter's
129
+ # DisplayCodeInterpreterFilesPostProcessor) into debug_info["artifacts"].
130
+ # Absent when no Code Interpreter ran this turn → both fields stay None,
131
+ # preserving the always-present, null-when-unknown contract.
124
132
  analytics = Analytics(
125
133
  tools_used=analytics_tools,
126
134
  tool_call_count=len(analytics_tools),
@@ -140,10 +148,8 @@ class DebugInfoManager:
140
148
  subagent_names_used=_unique_tool_names(analytics_tools, "is_sub_agent"),
141
149
  mcp_tool_names_used=_unique_tool_names(analytics_tools, "is_mcp"),
142
150
  total_time_to_answer_ms=total_time_to_answer_ms,
143
- # Reserved placeholders schema present so consumers can rely on the
144
- # keys, populated in a follow-up step (artifacts instrumentation).
145
- artifacts_created_count=None,
146
- artifacts_created_filetype=None,
151
+ artifacts_created_count=artifacts["count"] if artifacts else None,
152
+ artifacts_created_filetype=artifacts["filetypes"] if artifacts else None,
147
153
  )
148
154
  self.add("analytics", analytics)
149
155
 
@@ -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):
@@ -16,6 +16,7 @@ from unique_toolkit.agentic.evaluation.schemas import (
16
16
  from unique_toolkit.language_model.schemas import (
17
17
  LanguageModelAssistantMessage,
18
18
  LanguageModelCompletionChoice,
19
+ LanguageModelTokenUsage,
19
20
  )
20
21
  from unique_toolkit.language_model.service import LanguageModelResponse
21
22
 
@@ -271,3 +272,73 @@ async def test_analyze__raises_evaluator_exception__with_unknown_error(
271
272
  assert "Unknown error occurred during context relevancy metric analysis" in str(
272
273
  exc_info.value
273
274
  )
275
+
276
+
277
+ @pytest.mark.ai
278
+ @pytest.mark.asyncio
279
+ async def test_analyze__preserves_invocation_stats__on_regular_output_read_error(
280
+ context_relevancy_evaluator: MagicMock,
281
+ sample_evaluation_input: EvaluationMetricInput,
282
+ basic_evaluation_config: EvaluationMetricConfig,
283
+ ) -> None:
284
+ """
285
+ Purpose: A billed LLM call that returns no choices must still surface its
286
+ usage, instead of losing it to the generic error path.
287
+ Why this matters: `result.choices[0]` access is not otherwise guarded; an
288
+ empty `choices` list must not silently drop invocation_stats.
289
+ """
290
+ mock_result: LanguageModelResponse = LanguageModelResponse(
291
+ choices=[],
292
+ usage=LanguageModelTokenUsage(
293
+ completion_tokens=1, prompt_tokens=2, total_tokens=3
294
+ ),
295
+ )
296
+
297
+ with patch.object(
298
+ context_relevancy_evaluator.language_model_service,
299
+ "complete_async",
300
+ return_value=mock_result,
301
+ ):
302
+ with pytest.raises(EvaluatorException) as exc_info:
303
+ await context_relevancy_evaluator.analyze(
304
+ sample_evaluation_input, basic_evaluation_config
305
+ )
306
+
307
+ assert len(exc_info.value.invocation_stats) == 1
308
+ assert exc_info.value.invocation_stats[0].token_usage.total_tokens == 3
309
+
310
+
311
+ @pytest.mark.ai
312
+ @pytest.mark.asyncio
313
+ async def test_analyze__preserves_invocation_stats__on_structured_output_read_error(
314
+ context_relevancy_evaluator: MagicMock,
315
+ sample_evaluation_input: EvaluationMetricInput,
316
+ structured_evaluation_config: EvaluationMetricConfig,
317
+ ) -> None:
318
+ """
319
+ Purpose: Same as the regular-output case, for the structured-output path.
320
+ """
321
+ mock_result: LanguageModelResponse = LanguageModelResponse(
322
+ choices=[],
323
+ usage=LanguageModelTokenUsage(
324
+ completion_tokens=1, prompt_tokens=2, total_tokens=3
325
+ ),
326
+ )
327
+ structured_output_schema: type[EvaluationSchemaStructuredOutput] = (
328
+ EvaluationSchemaStructuredOutput
329
+ )
330
+
331
+ with patch.object(
332
+ context_relevancy_evaluator.language_model_service,
333
+ "complete_async",
334
+ return_value=mock_result,
335
+ ):
336
+ with pytest.raises(EvaluatorException) as exc_info:
337
+ await context_relevancy_evaluator.analyze(
338
+ sample_evaluation_input,
339
+ structured_evaluation_config,
340
+ structured_output_schema,
341
+ )
342
+
343
+ assert len(exc_info.value.invocation_stats) == 1
344
+ assert exc_info.value.invocation_stats[0].token_usage.total_tokens == 3
@@ -6,6 +6,7 @@ from unique_toolkit.agentic.loop_runner._iteration_handler_utils import (
6
6
  from unique_toolkit.agentic.loop_runner.base import (
7
7
  LoopIterationRunner,
8
8
  ResponsesLoopIterationRunner,
9
+ SupportsInvocationStats,
9
10
  )
10
11
  from unique_toolkit.agentic.loop_runner.middleware import (
11
12
  PlanningConfig,
@@ -42,4 +43,5 @@ __all__ = [
42
43
  "QWEN_MAX_LOOP_ITERATIONS",
43
44
  "ResponsesLoopIterationRunner",
44
45
  "ResponsesBasicLoopIterationRunner",
46
+ "SupportsInvocationStats",
45
47
  ]
@@ -6,6 +6,7 @@ from unique_toolkit.agentic.loop_runner.base import (
6
6
  _LoopIterationRunnerKwargs,
7
7
  )
8
8
  from unique_toolkit.chat.functions import LanguageModelStreamResponse
9
+ from unique_toolkit.language_model.schemas import LanguageModelTokenUsage
9
10
 
10
11
  _LOGGER = logging.getLogger(__name__)
11
12
 
@@ -103,5 +104,6 @@ async def run_forced_tools_iteration(
103
104
  response = responses[0]
104
105
  response.tool_calls = tool_calls if len(tool_calls) > 0 else None
105
106
  response.message.references = references
107
+ response.usage = LanguageModelTokenUsage.sum_usages(r.usage for r in responses)
106
108
 
107
109
  return response
@@ -7,7 +7,10 @@ from unique_toolkit.agentic.loop_runner._responses_stream_handler_utils import (
7
7
  from unique_toolkit.agentic.loop_runner.base import (
8
8
  _ResponsesLoopIterationRunnerKwargs,
9
9
  )
10
- from unique_toolkit.language_model.schemas import ResponsesLanguageModelStreamResponse
10
+ from unique_toolkit.language_model.schemas import (
11
+ LanguageModelTokenUsage,
12
+ ResponsesLanguageModelStreamResponse,
13
+ )
11
14
 
12
15
  _LOGGER = logging.getLogger(__name__)
13
16
 
@@ -59,5 +62,6 @@ async def handle_responses_forced_tools_iteration(
59
62
  response = responses[0]
60
63
  response.tool_calls = tool_calls if len(tool_calls) > 0 else None
61
64
  response.message.references = references
65
+ response.usage = LanguageModelTokenUsage.sum_usages(r.usage for r in responses)
62
66
 
63
67
  return response
@@ -1,4 +1,4 @@
1
- from typing import Any, Protocol, Required, Unpack
1
+ from typing import Any, Protocol, Required, Unpack, runtime_checkable
2
2
 
3
3
  from openai.types.chat import ChatCompletionNamedToolChoiceParam
4
4
  from openai.types.responses import (
@@ -15,6 +15,9 @@ from unique_toolkit.chat.functions import LanguageModelStreamResponse
15
15
  from unique_toolkit.chat.service import LanguageModelMessages
16
16
  from unique_toolkit.content import ContentChunk
17
17
  from unique_toolkit.language_model.infos import LanguageModelInfo
18
+ from unique_toolkit.language_model.invocation_stats import (
19
+ LanguageModelInvocationStats,
20
+ )
18
21
  from unique_toolkit.language_model.schemas import (
19
22
  ResponsesLanguageModelStreamResponse,
20
23
  ResponsesMessageInput,
@@ -25,6 +28,17 @@ from unique_toolkit.protocols.support import (
25
28
  )
26
29
 
27
30
 
31
+ @runtime_checkable
32
+ class SupportsInvocationStats(Protocol):
33
+ """Optional capability for a loop iteration runner (or middleware wrapping
34
+ one) that makes its own extra LLM call(s) beyond the main iteration
35
+ response — e.g. a planning step. `unique_ai.py` checks for this via
36
+ `isinstance` and, if present, folds the returned stats into the turn's
37
+ accumulator; runners that don't make extra calls need not implement it."""
38
+
39
+ def get_invocation_stats(self) -> list[LanguageModelInvocationStats]: ...
40
+
41
+
28
42
  class _LoopIterationRunnerKwargs(TypedDict, total=False):
29
43
  iteration_index: Required[int]
30
44
  streaming_handler: Required[SupportCompleteWithReferences]
@@ -37,9 +37,13 @@ from unique_toolkit.language_model import (
37
37
  LanguageModelAssistantMessage,
38
38
  LanguageModelUserMessage,
39
39
  )
40
+ from unique_toolkit.language_model.invocation_stats import (
41
+ LanguageModelInvocationStats,
42
+ )
40
43
  from unique_toolkit.language_model.schemas import (
41
44
  LanguageModelMessageOptions,
42
45
  LanguageModelMessages,
46
+ LanguageModelTokenUsage,
43
47
  ResponsesLanguageModelStreamResponse,
44
48
  )
45
49
 
@@ -136,6 +140,12 @@ class PlanningMiddleware(LoopIterationRunner):
136
140
  self._loop_runner = loop_runner
137
141
  self._history_manager = history_manager
138
142
  self._llm_service = llm_service
143
+ self._invocation_stats: list[LanguageModelInvocationStats] = []
144
+
145
+ def get_invocation_stats(self) -> list[LanguageModelInvocationStats]:
146
+ """Return and clear the planning-step stats captured since the last call."""
147
+ stats, self._invocation_stats = self._invocation_stats, []
148
+ return stats
139
149
 
140
150
  @failsafe_async(failure_return_value=None, logger=_LOGGER)
141
151
  async def _run_plan_step(
@@ -155,6 +165,13 @@ class PlanningMiddleware(LoopIterationRunner):
155
165
  other_options=other_options,
156
166
  )
157
167
 
168
+ if response.usage is not None:
169
+ self._invocation_stats.append(
170
+ LanguageModelInvocationStats.from_usage(
171
+ kwargs["model"].name, response.usage, source="planning"
172
+ )
173
+ )
174
+
158
175
  if response.choices[0].message.parsed is None:
159
176
  _LOGGER.info("Error parsing planning response")
160
177
  return None
@@ -196,6 +213,12 @@ class ResponsesPlanningMiddleware(ResponsesLoopIterationRunner):
196
213
  self._loop_runner = loop_runner
197
214
  self._history_manager = history_manager
198
215
  self._openai_client = openai_client
216
+ self._invocation_stats: list[LanguageModelInvocationStats] = []
217
+
218
+ def get_invocation_stats(self) -> list[LanguageModelInvocationStats]:
219
+ """Return and clear the planning-step stats captured since the last call."""
220
+ stats, self._invocation_stats = self._invocation_stats, []
221
+ return stats
199
222
 
200
223
  def _build_forwarded_options(
201
224
  self, kwargs: _ResponsesLoopIterationRunnerKwargs
@@ -260,6 +283,15 @@ class ResponsesPlanningMiddleware(ResponsesLoopIterationRunner):
260
283
  **forwarded_options,
261
284
  )
262
285
 
286
+ if response.usage is not None:
287
+ self._invocation_stats.append(
288
+ LanguageModelInvocationStats.from_usage(
289
+ model_name,
290
+ LanguageModelTokenUsage.model_validate(response.usage),
291
+ source="planning",
292
+ )
293
+ )
294
+
263
295
  output_text = _get_first_tool_call_arguments(response)
264
296
  if not output_text:
265
297
  _LOGGER.info("Empty planning response")