unique-toolkit 2026.36.0.dev3__tar.gz → 2026.36.0.dev5__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 (428) hide show
  1. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/PKG-INFO +1 -1
  2. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/pyproject.toml +1 -1
  3. unique_toolkit-2026.36.0.dev5/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/artifacts.py +213 -0
  4. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +10 -0
  5. unique_toolkit-2026.36.0.dev5/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/office_preview.py +154 -0
  6. unique_toolkit-2026.36.0.dev5/unique_toolkit/language_model/invocation_stats.py +173 -0
  7. unique_toolkit-2026.36.0.dev3/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/artifacts.py +0 -103
  8. unique_toolkit-2026.36.0.dev3/unique_toolkit/language_model/invocation_stats.py +0 -77
  9. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/README.md +0 -0
  10. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/__init__.py +0 -0
  11. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/__init__.py +0 -0
  12. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/_base_service.py +0 -0
  13. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/_time_utils.py +0 -0
  14. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  15. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  16. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  17. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  18. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  19. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  20. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  21. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/config_checker/README.md +0 -0
  22. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/config_checker/__init__.py +0 -0
  23. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/config_checker/__main__.py +0 -0
  24. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/config_checker/cli.py +0 -0
  25. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/config_checker/differ.py +0 -0
  26. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/config_checker/exporter.py +0 -0
  27. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/config_checker/models.py +0 -0
  28. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/config_checker/registry.py +0 -0
  29. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/config_checker/validator.py +0 -0
  30. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/default_language_model.py +0 -0
  31. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
  32. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/docx_generator/config.py +0 -0
  33. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
  34. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
  35. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/docx_generator/service.py +0 -0
  36. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
  37. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/endpoint_builder.py +0 -0
  38. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  39. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/event_bus.py +0 -0
  40. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/exception.py +0 -0
  41. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/execution.py +0 -0
  42. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
  43. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
  44. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
  45. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
  46. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
  47. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
  48. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
  49. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
  50. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
  51. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
  52. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
  53. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
  54. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
  55. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
  56. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
  57. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
  58. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
  59. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
  60. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
  61. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
  62. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
  63. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
  64. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
  65. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
  66. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
  67. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
  68. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
  69. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  70. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/metadata_filter_scope.py +0 -0
  71. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  72. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  73. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/referencing.py +0 -0
  74. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/string_utilities.py +0 -0
  75. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/tests/test_referencing.py +0 -0
  76. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
  77. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/token/__init__.py +0 -0
  78. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  79. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/token/token_counting.py +0 -0
  80. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
  81. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
  82. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/utils/__init__.py +0 -0
  83. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/utils/files.py +0 -0
  84. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/utils/image/encode.py +0 -0
  85. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
  86. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/utils/jinja/render.py +0 -0
  87. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
  88. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
  89. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  90. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  91. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  92. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/validate_required_values.py +0 -0
  93. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/_common/validators.py +0 -0
  94. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/__init__.py +0 -0
  95. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
  96. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
  97. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/config.py +0 -0
  98. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
  99. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
  100. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
  101. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  102. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
  103. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
  104. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  105. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  106. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
  107. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
  108. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
  109. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
  110. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  111. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
  112. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  113. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
  114. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
  115. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
  116. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  117. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
  118. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/tests/test_hallucination_external_context.py +0 -0
  119. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -0
  120. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  121. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
  122. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/evaluation/utils.py +0 -0
  123. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
  124. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/feature_flags/feature_flags.py +0 -0
  125. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  126. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  127. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
  128. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/history_manager/settings.py +0 -0
  129. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  130. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/loop_runner/__init__.py +0 -0
  131. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
  132. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
  133. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
  134. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
  135. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/loop_runner/base.py +0 -0
  136. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
  137. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
  138. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +0 -0
  139. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
  140. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
  141. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
  142. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
  143. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
  144. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
  145. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
  146. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
  147. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
  148. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
  149. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/message_log_order.py +0 -0
  150. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
  151. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  152. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/reference_manager/tests/test_external_context.py +0 -0
  153. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
  154. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
  155. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
  156. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
  157. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  158. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  159. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/__init__.py +0 -0
  160. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  161. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  162. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  163. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  164. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  165. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
  166. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  167. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  168. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  169. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
  170. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
  171. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  172. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
  173. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
  174. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  175. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
  176. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
  177. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_references.py +0 -0
  178. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  179. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
  180. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
  181. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  182. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  183. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  184. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  185. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  186. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
  187. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  188. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/config.py +0 -0
  189. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/experimental/__init__.py +0 -0
  190. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/experimental/ask_user_tool/__init__.py +0 -0
  191. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/experimental/ask_user_tool/config.py +0 -0
  192. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/experimental/ask_user_tool/tool.py +0 -0
  193. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/experimental/open_file_tool/__init__.py +0 -0
  194. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/experimental/open_file_tool/config.py +0 -0
  195. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/experimental/open_file_tool/runtime.py +0 -0
  196. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/experimental/open_file_tool/tool.py +0 -0
  197. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/__init__.py +0 -0
  198. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/config.py +0 -0
  199. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/tool.py +0 -0
  200. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/experimental/todo/__init__.py +0 -0
  201. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/experimental/todo/config.py +0 -0
  202. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/experimental/todo/prompts/__init__.py +0 -0
  203. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/experimental/todo/prompts/execution_reminder.j2 +0 -0
  204. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/experimental/todo/prompts/system_prompt.j2 +0 -0
  205. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/experimental/todo/prompts/tool_description.j2 +0 -0
  206. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/experimental/todo/prompts/verification_nudge.j2 +0 -0
  207. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/experimental/todo/schemas.py +0 -0
  208. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/experimental/todo/service.py +0 -0
  209. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/factory.py +0 -0
  210. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  211. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  212. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  213. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
  214. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/names.py +0 -0
  215. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
  216. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
  217. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
  218. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/activator/__init__.py +0 -0
  219. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/activator/config.py +0 -0
  220. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/activator/service.py +0 -0
  221. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/__init__.py +0 -0
  222. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/_container.py +0 -0
  223. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/_files.py +0 -0
  224. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/_memory.py +0 -0
  225. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/builder.py +0 -0
  226. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
  227. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
  228. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +0 -0
  229. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +0 -0
  230. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/tool/__init__.py +0 -0
  231. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/tool/config.py +0 -0
  232. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/tool/service.py +0 -0
  233. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
  234. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/run_context.py +0 -0
  235. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/schemas.py +0 -0
  236. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  237. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  238. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/tool.py +0 -0
  239. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
  240. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  241. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  242. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  243. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  244. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  245. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  246. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic_table/__init__.py +0 -0
  247. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic_table/schemas.py +0 -0
  248. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic_table/service.py +0 -0
  249. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/agentic_table/synthetic_chat_event.py +0 -0
  250. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/app/__init__.py +0 -0
  251. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/app/chat_event_filter_options_settings.py +0 -0
  252. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/app/dev_util.py +0 -0
  253. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/app/fast_api_factory.py +0 -0
  254. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/app/feature_flags.py +0 -0
  255. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/app/find_env_file.py +0 -0
  256. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/app/init_logging.py +0 -0
  257. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/app/init_sdk.py +0 -0
  258. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/app/performance/async_tasks.py +0 -0
  259. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  260. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/app/schemas.py +0 -0
  261. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/app/unique_settings.py +0 -0
  262. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/app/verification.py +0 -0
  263. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/app/webhook.py +0 -0
  264. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/chat/__init__.py +0 -0
  265. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/chat/cancellation.py +0 -0
  266. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/chat/constants.py +0 -0
  267. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/chat/deprecated/__init__.py +0 -0
  268. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/chat/deprecated/service.py +0 -0
  269. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/chat/functions.py +0 -0
  270. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/chat/rendering.py +0 -0
  271. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/chat/responses_api.py +0 -0
  272. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/chat/schemas.py +0 -0
  273. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/chat/service.py +0 -0
  274. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/chat/state.py +0 -0
  275. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/chat/utils.py +0 -0
  276. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/content/__init__.py +0 -0
  277. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/content/constants.py +0 -0
  278. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/content/functions.py +0 -0
  279. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/content/schemas.py +0 -0
  280. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/content/service.py +0 -0
  281. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/content/smart_rules.py +0 -0
  282. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/content/utils.py +0 -0
  283. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/data_extraction/README.md +0 -0
  284. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/data_extraction/__init__.py +0 -0
  285. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
  286. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/data_extraction/augmented/service.py +0 -0
  287. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/data_extraction/base.py +0 -0
  288. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
  289. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/data_extraction/basic/config.py +0 -0
  290. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
  291. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/data_extraction/basic/service.py +0 -0
  292. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/elicitation/__init__.py +0 -0
  293. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/elicitation/constants.py +0 -0
  294. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/elicitation/exceptions.py +0 -0
  295. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/elicitation/functions.py +0 -0
  296. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/elicitation/schemas.py +0 -0
  297. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/elicitation/service.py +0 -0
  298. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/embedding/__init__.py +0 -0
  299. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/embedding/constants.py +0 -0
  300. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/embedding/functions.py +0 -0
  301. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/embedding/schemas.py +0 -0
  302. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/embedding/service.py +0 -0
  303. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/embedding/utils.py +0 -0
  304. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/README.md +0 -0
  305. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/__init__.py +0 -0
  306. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/_internal/__init__.py +0 -0
  307. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/_internal/streaming/__init__.py +0 -0
  308. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/_internal/streaming/common.py +0 -0
  309. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/_internal/streaming/pattern_replacer.py +0 -0
  310. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/__init__.py +0 -0
  311. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/_base.py +0 -0
  312. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/content_tree/__init__.py +0 -0
  313. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/content_tree/functions.py +0 -0
  314. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/content_tree/schemas.py +0 -0
  315. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/content_tree/service.py +0 -0
  316. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/internal_search/__init__.py +0 -0
  317. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/internal_search/base/__init__.py +0 -0
  318. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/internal_search/base/config.py +0 -0
  319. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/internal_search/base/schemas.py +0 -0
  320. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/internal_search/base/service.py +0 -0
  321. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/internal_search/base/utils.py +0 -0
  322. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/internal_search/chat/__init__.py +0 -0
  323. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/internal_search/chat/config.py +0 -0
  324. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/internal_search/chat/schemas.py +0 -0
  325. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/internal_search/chat/service.py +0 -0
  326. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/internal_search/knowledge_base/__init__.py +0 -0
  327. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/internal_search/knowledge_base/config.py +0 -0
  328. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/internal_search/knowledge_base/schemas.py +0 -0
  329. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/internal_search/knowledge_base/service.py +0 -0
  330. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/internal_search/post_processing/__init__.py +0 -0
  331. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/internal_search/post_processing/config.py +0 -0
  332. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/components/internal_search/post_processing/service.py +0 -0
  333. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/content_tree/__init__.py +0 -0
  334. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/identity/__init__.py +0 -0
  335. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/__init__.py +0 -0
  336. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/__init__.py +0 -0
  337. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/__init__.py +0 -0
  338. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/__init__.py +0 -0
  339. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/_async_bridge.py +0 -0
  340. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/__init__.py +0 -0
  341. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/complete_with_references.py +0 -0
  342. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/stream_event_router.py +0 -0
  343. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/text_event_handler.py +0 -0
  344. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/tool_call_event_handler.py +0 -0
  345. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/events.py +0 -0
  346. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/__init__.py +0 -0
  347. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/chat_completions.py +0 -0
  348. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/responses.py +0 -0
  349. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/__init__.py +0 -0
  350. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/code_interpreter_event_handler.py +0 -0
  351. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/complete_with_references.py +0 -0
  352. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/completed_event_handler.py +0 -0
  353. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/stream_event_router.py +0 -0
  354. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/text_delta_event_handler.py +0 -0
  355. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/tool_call_event_handler.py +0 -0
  356. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/__init__.py +0 -0
  357. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/message_persister.py +0 -0
  358. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/progress_log_persister.py +0 -0
  359. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/__init__.py +0 -0
  360. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/content_folder/__init__.py +0 -0
  361. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/content_folder/functions.py +0 -0
  362. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/content_folder/schemas.py +0 -0
  363. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/content_folder/service.py +0 -0
  364. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/facades/__init__.py +0 -0
  365. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/facades/identity/__init__.py +0 -0
  366. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/facades/identity/service.py +0 -0
  367. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/feature_flags/README.md +0 -0
  368. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/feature_flags/__init__.py +0 -0
  369. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/feature_flags/_graphql_client.py +0 -0
  370. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/feature_flags/_ttl_cache.py +0 -0
  371. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/feature_flags/client.py +0 -0
  372. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/feature_flags/schemas.py +0 -0
  373. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/feature_flags/settings.py +0 -0
  374. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/group/__init__.py +0 -0
  375. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/group/functions.py +0 -0
  376. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/group/schemas.py +0 -0
  377. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/group/service.py +0 -0
  378. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/scheduled_task/__init__.py +0 -0
  379. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/scheduled_task/cron.py +0 -0
  380. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/scheduled_task/functions.py +0 -0
  381. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/scheduled_task/schemas.py +0 -0
  382. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/scheduled_task/service.py +0 -0
  383. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/user/__init__.py +0 -0
  384. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/user/functions.py +0 -0
  385. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/user/schemas.py +0 -0
  386. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/resources/user/service.py +0 -0
  387. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/experimental/testing/__init__.py +0 -0
  388. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/framework_utilities/__init__.py +0 -0
  389. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
  390. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  391. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  392. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  393. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  394. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  395. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/framework_utilities/utils.py +0 -0
  396. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/language_model/__init__.py +0 -0
  397. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
  398. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/language_model/builder.py +0 -0
  399. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/language_model/constants.py +0 -0
  400. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/language_model/default_language_model.py +0 -0
  401. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/language_model/functions.py +0 -0
  402. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/language_model/infos.py +0 -0
  403. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/language_model/model_costs.py +0 -0
  404. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/language_model/prompt.py +0 -0
  405. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/language_model/reference.py +0 -0
  406. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/language_model/schemas.py +0 -0
  407. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/language_model/service.py +0 -0
  408. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/language_model/settings.py +0 -0
  409. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/language_model/stream_transform.py +0 -0
  410. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/language_model/utils.py +0 -0
  411. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/monitoring/__init__.py +0 -0
  412. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/monitoring/gunicorn.py +0 -0
  413. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/monitoring/middleware.py +0 -0
  414. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/monitoring/registry.py +0 -0
  415. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/monitoring/tracing.py +0 -0
  416. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/protocols/support.py +0 -0
  417. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/services/__init__.py +0 -0
  418. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/services/chat_service.py +0 -0
  419. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/services/factory.py +0 -0
  420. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/services/knowledge_base.py +0 -0
  421. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/short_term_memory/__init__.py +0 -0
  422. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/short_term_memory/constants.py +0 -0
  423. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/short_term_memory/functions.py +0 -0
  424. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/short_term_memory/schemas.py +0 -0
  425. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/short_term_memory/service.py +0 -0
  426. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/smart_rules/__init__.py +0 -0
  427. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/unique_toolkit/smart_rules/compile.py +0 -0
  428. {unique_toolkit-2026.36.0.dev3 → unique_toolkit-2026.36.0.dev5}/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.36.0.dev3
3
+ Version: 2026.36.0.dev5
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>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "unique_toolkit"
3
- version = "2026.36.0.dev3"
3
+ version = "2026.36.0.dev5"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -0,0 +1,213 @@
1
+ import asyncio
2
+ import logging
3
+ import tempfile
4
+ from mimetypes import guess_type
5
+ from pathlib import Path
6
+ from typing import Any
7
+
8
+ import unique_sdk.utils.file_io as file_io
9
+ from openai.types.responses.response_output_text import AnnotationContainerFileCitation
10
+ from pydantic import BaseModel
11
+
12
+ from unique_toolkit import ChatService
13
+ from unique_toolkit._common.utils.files import FileMimeType, ImageMimeType
14
+ from unique_toolkit.agentic.tools.openai_builtin.code_interpreter.postprocessors.office_preview import (
15
+ OFFICE_PREVIEW_MIME_TYPES,
16
+ convert_office_bytes_to_preview_pdf,
17
+ office_extension,
18
+ )
19
+ from unique_toolkit.content.schemas import Content
20
+
21
+ _CODE_EXECUTION_ARTIFACT_METADATA_KEY: str = "codeExecutionArtifactMetadata"
22
+
23
+ _LOGGER = logging.getLogger(__name__)
24
+
25
+
26
+ class CodeExecutionArtifactMetadata(BaseModel):
27
+ container_id: str
28
+ file_id: str
29
+ filepath: str
30
+
31
+
32
+ def _kb_safe_mime(mime: str) -> str:
33
+ """Return a MIME type the Unique KB will accept.
34
+
35
+ Membership is defined by ``FileMimeType`` and ``ImageMimeType`` in
36
+ ``unique_toolkit._common.utils.files`` (same catalog as path-based helpers
37
+ like ``FileMimeType.is_valid_mime``, but here we already have a resolved
38
+ MIME string from ``mimetypes.guess_type``, so we use StrEnum value lookup
39
+ instead of re-parsing a path).
40
+
41
+ The KB GraphQL API rejects many code-file MIME types (e.g. ``text/x-python``
42
+ for ``.py`` files). Anything not in those enums is coerced to
43
+ ``text/plain`` so the file can be stored and downloaded without changing
44
+ its bytes.
45
+
46
+ Other ``image/*`` subtypes (e.g. ``image/jpg``) still pass through unchanged.
47
+ """
48
+ try:
49
+ FileMimeType(mime)
50
+ return mime
51
+ except ValueError:
52
+ pass
53
+ try:
54
+ ImageMimeType(mime)
55
+ return mime
56
+ except ValueError:
57
+ pass
58
+ if mime.startswith("image/"):
59
+ return mime
60
+ return "text/plain"
61
+
62
+
63
+ def _artifact_metadata(
64
+ file: AnnotationContainerFileCitation,
65
+ ) -> dict[str, Any]:
66
+ return {
67
+ _CODE_EXECUTION_ARTIFACT_METADATA_KEY: CodeExecutionArtifactMetadata(
68
+ container_id=file.container_id,
69
+ file_id=file.file_id,
70
+ filepath=f"/mnt/data/{file.filename}",
71
+ ).model_dump()
72
+ }
73
+
74
+
75
+ async def _upload_artifact_bytes(
76
+ chat_service: ChatService,
77
+ file: AnnotationContainerFileCitation,
78
+ file_bytes: bytes,
79
+ mime: str,
80
+ ) -> Content:
81
+ _LOGGER.info(
82
+ "Uploading '%s' to knowledge base (%d bytes, mime type %s)",
83
+ file.filename,
84
+ len(file_bytes),
85
+ mime,
86
+ )
87
+
88
+ return await chat_service.upload_to_chat_from_bytes_async(
89
+ content=file_bytes,
90
+ content_name=file.filename,
91
+ mime_type=mime,
92
+ skip_ingestion=True,
93
+ hide_in_chat=True,
94
+ metadata=_artifact_metadata(file),
95
+ )
96
+
97
+
98
+ async def _upload_office_artifact_with_preview(
99
+ chat_service: ChatService,
100
+ file: AnnotationContainerFileCitation,
101
+ file_bytes: bytes,
102
+ mime: str,
103
+ ) -> Content | None:
104
+ """Upload an Office artifact with a PDF preview, or ``None`` to fall back."""
105
+ with tempfile.TemporaryDirectory(prefix="code-interpreter-preview-") as tmp:
106
+ output_dir = Path(tmp)
107
+ preview_path = await convert_office_bytes_to_preview_pdf(
108
+ filename=file.filename,
109
+ file_bytes=file_bytes,
110
+ tmp_dir=output_dir,
111
+ logger=_LOGGER,
112
+ )
113
+ if preview_path is None:
114
+ _LOGGER.warning(
115
+ "Code interpreter Office artifact '%s' could not be converted "
116
+ "to PDF; uploading without preview.",
117
+ file.filename,
118
+ )
119
+ return None
120
+
121
+ source_path = output_dir / Path(file.filename).name
122
+ _LOGGER.info(
123
+ "Uploading code interpreter Office artifact '%s' with PDF preview '%s'",
124
+ file.filename,
125
+ preview_path.name,
126
+ )
127
+
128
+ uploaded = await asyncio.to_thread(
129
+ file_io.upload_file,
130
+ chat_service._user_id,
131
+ chat_service._company_id,
132
+ str(source_path),
133
+ file.filename,
134
+ mime,
135
+ chat_id=chat_service._chat_id,
136
+ ingestion_config={
137
+ "uniqueIngestionMode": "SKIP_INGESTION",
138
+ "hideInChat": True,
139
+ },
140
+ metadata=_artifact_metadata(file),
141
+ preview_pdf_path=str(preview_path),
142
+ )
143
+
144
+ return Content.model_validate(uploaded, by_alias=True, by_name=True)
145
+
146
+
147
+ async def save_code_execution_artifact(
148
+ chat_service: ChatService,
149
+ file: AnnotationContainerFileCitation,
150
+ file_bytes: bytes,
151
+ *,
152
+ attach_office_preview: bool = False,
153
+ ) -> Content:
154
+ """Upload a code-interpreter artifact to the chat knowledge base.
155
+
156
+ ``attach_office_preview`` is opt-in (default ``False``) so existing
157
+ Unique AI callers keep the historical bytes-only upload. When ``True``,
158
+ Word / PowerPoint / Excel files are converted to a sibling PDF and
159
+ uploaded with ``preview_pdf_path``. Conversion is best-effort: if
160
+ LibreOffice is missing or conversion fails, the original bytes are
161
+ uploaded instead. Upload failures are not retried via the bytes path,
162
+ because ``file_io.upload_file`` may already have created a content row.
163
+ """
164
+ if attach_office_preview:
165
+ extension = office_extension(file.filename)
166
+ if extension is not None:
167
+ mime = _kb_safe_mime(OFFICE_PREVIEW_MIME_TYPES[extension])
168
+ content = await _upload_office_artifact_with_preview(
169
+ chat_service=chat_service,
170
+ file=file,
171
+ file_bytes=file_bytes,
172
+ mime=mime,
173
+ )
174
+ if content is not None:
175
+ return content
176
+ return await _upload_artifact_bytes(
177
+ chat_service=chat_service,
178
+ file=file,
179
+ file_bytes=file_bytes,
180
+ mime=mime,
181
+ )
182
+
183
+ raw_mime = guess_type(file.filename)[0] or "text/plain"
184
+ mime = _kb_safe_mime(raw_mime)
185
+
186
+ if mime != raw_mime:
187
+ _LOGGER.info(
188
+ "MIME type '%s' is not supported by the Unique KB; "
189
+ "uploading '%s' as 'text/plain' so the file can be stored and downloaded.",
190
+ raw_mime,
191
+ file.filename,
192
+ )
193
+
194
+ return await _upload_artifact_bytes(
195
+ chat_service=chat_service,
196
+ file=file,
197
+ file_bytes=file_bytes,
198
+ mime=mime,
199
+ )
200
+
201
+
202
+ def load_code_execution_metadata(
203
+ content: Content,
204
+ ) -> CodeExecutionArtifactMetadata | None:
205
+ if (
206
+ content.metadata is None
207
+ or _CODE_EXECUTION_ARTIFACT_METADATA_KEY not in content.metadata
208
+ ):
209
+ return None
210
+
211
+ return CodeExecutionArtifactMetadata.model_validate(
212
+ content.metadata[_CODE_EXECUTION_ARTIFACT_METADATA_KEY]
213
+ )
@@ -117,6 +117,15 @@ class DisplayCodeInterpreterFilesPostProcessorConfig(BaseModel):
117
117
  "Applies per SDK attempt. The OpenAI SDK default of 600s is too generous "
118
118
  "for small generated files; a shorter timeout lets us retry sooner.",
119
119
  )
120
+ attach_office_preview: SkipJsonSchema[bool] = Field(
121
+ default=False,
122
+ description=(
123
+ "When True, convert Word/PowerPoint/Excel artifacts to a sibling "
124
+ "PDF and attach it as the chat side-panel preview. Default False "
125
+ "keeps the historical bytes-only upload. Conversion is best-effort "
126
+ "and falls back to the original file."
127
+ ),
128
+ )
120
129
 
121
130
 
122
131
  class _ContentInfo(NamedTuple):
@@ -762,6 +771,7 @@ class DisplayCodeInterpreterFilesPostProcessor(
762
771
  chat_service=self._chat_service,
763
772
  file=container_file,
764
773
  file_bytes=file_bytes,
774
+ attach_office_preview=self._config.attach_office_preview,
765
775
  )
766
776
  upload_ms = (time.monotonic() - upload_t0) * 1000
767
777
  if upload_ms > 2000:
@@ -0,0 +1,154 @@
1
+ """LibreOffice PDF previews for code-interpreter Office artifacts.
2
+
3
+ When the OpenAI code interpreter emits a Word, PowerPoint, or Excel file,
4
+ the chat UI can render a sibling PDF in the side panel far more reliably
5
+ than the Office binary. Conversion is best-effort: if ``soffice`` is
6
+ missing, times out, or rejects the file, callers upload the original
7
+ without a preview.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import asyncio
13
+ import logging
14
+ import shutil
15
+ import subprocess
16
+ import tempfile
17
+ from pathlib import Path
18
+
19
+ _SOFFICE_TIMEOUT_SECONDS = 180
20
+
21
+ # Canonical MIME types so slim containers without ``/etc/mime.types`` still
22
+ # upload Office files with a KB-accepted type instead of falling back to
23
+ # ``text/plain`` via ``mimetypes.guess_type``.
24
+ OFFICE_PREVIEW_MIME_TYPES: dict[str, str] = {
25
+ ".doc": "application/msword",
26
+ ".docx": (
27
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
28
+ ),
29
+ ".ppt": "application/vnd.ms-powerpoint",
30
+ ".pptx": (
31
+ "application/vnd.openxmlformats-officedocument.presentationml.presentation"
32
+ ),
33
+ ".xls": "application/vnd.ms-excel",
34
+ ".xlsx": ("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"),
35
+ }
36
+
37
+
38
+ def office_extension(filename: str) -> str | None:
39
+ """Return the lowercased Office suffix, or ``None`` if not previewable."""
40
+ suffix = Path(filename).suffix.lower()
41
+ return suffix if suffix in OFFICE_PREVIEW_MIME_TYPES else None
42
+
43
+
44
+ def _resolve_soffice_binary() -> str | None:
45
+ return shutil.which("soffice") or shutil.which("libreoffice")
46
+
47
+
48
+ def _run_soffice(
49
+ soffice: str,
50
+ source: Path,
51
+ output_dir: Path,
52
+ logger: logging.Logger,
53
+ ) -> None:
54
+ """Invoke headless ``soffice`` to convert *source* into *output_dir*.
55
+
56
+ Uses an isolated ``UserInstallation`` profile so concurrent LibreOffice
57
+ invocations do not collide on ``$HOME/.config/libreoffice``.
58
+ """
59
+ with tempfile.TemporaryDirectory(
60
+ prefix=".libreoffice-profile-",
61
+ dir=output_dir,
62
+ ) as profile_dir:
63
+ proc = subprocess.run(
64
+ [
65
+ soffice,
66
+ f"-env:UserInstallation={Path(profile_dir).resolve().as_uri()}",
67
+ "--headless",
68
+ "--convert-to",
69
+ "pdf",
70
+ "--outdir",
71
+ str(output_dir),
72
+ str(source),
73
+ ],
74
+ capture_output=True,
75
+ text=True,
76
+ timeout=_SOFFICE_TIMEOUT_SECONDS,
77
+ )
78
+ if proc.returncode != 0:
79
+ logger.warning(
80
+ "office_preview: soffice exited %d for '%s' "
81
+ "(stdout=%d bytes, stderr=%d bytes)",
82
+ proc.returncode,
83
+ source.name,
84
+ len((proc.stdout or "").strip()),
85
+ len((proc.stderr or "").strip()),
86
+ )
87
+ raise subprocess.CalledProcessError(
88
+ proc.returncode, proc.args, proc.stdout, proc.stderr
89
+ )
90
+
91
+
92
+ async def convert_office_bytes_to_preview_pdf(
93
+ filename: str,
94
+ file_bytes: bytes,
95
+ tmp_dir: Path,
96
+ logger: logging.Logger,
97
+ ) -> Path | None:
98
+ """Write *file_bytes* into *tmp_dir* and convert to a sibling preview PDF.
99
+
100
+ The original file is written as ``tmp_dir / Path(filename).name`` so the
101
+ caller can pass that path to the SDK uploader. The preview is rendered
102
+ into ``tmp_dir / .previews / <stem>.pdf`` so it cannot collide with a
103
+ same-named PDF the interpreter also produced.
104
+
105
+ Returns the preview path, or ``None`` when conversion is unavailable or
106
+ fails. Never raises for expected conversion problems.
107
+ """
108
+ safe_filename = Path(filename).name
109
+ source_path = tmp_dir / safe_filename
110
+ source_path.write_bytes(file_bytes)
111
+
112
+ soffice = _resolve_soffice_binary()
113
+ if soffice is None:
114
+ logger.warning(
115
+ "office_preview: soffice/libreoffice not found on PATH — "
116
+ "uploading '%s' without a PDF preview.",
117
+ safe_filename,
118
+ )
119
+ return None
120
+
121
+ previews_dir = tmp_dir / ".previews"
122
+ previews_dir.mkdir(exist_ok=True)
123
+ target = previews_dir / f"{source_path.stem}.pdf"
124
+
125
+ try:
126
+ await asyncio.to_thread(
127
+ _run_soffice, soffice, source_path, previews_dir, logger
128
+ )
129
+ except subprocess.TimeoutExpired:
130
+ logger.warning(
131
+ "office_preview: soffice timed out after %ds for '%s' — "
132
+ "uploading original only",
133
+ _SOFFICE_TIMEOUT_SECONDS,
134
+ safe_filename,
135
+ )
136
+ return None
137
+ except subprocess.CalledProcessError:
138
+ return None
139
+ except Exception:
140
+ logger.exception(
141
+ "office_preview: unexpected error for '%s' — uploading original only",
142
+ safe_filename,
143
+ )
144
+ return None
145
+
146
+ if target.is_file():
147
+ return target
148
+
149
+ logger.warning(
150
+ "office_preview: soffice returned 0 but '%s' is missing for '%s'",
151
+ target.name,
152
+ safe_filename,
153
+ )
154
+ return None
@@ -0,0 +1,173 @@
1
+ """Per-invocation LLM usage stats with model identity.
2
+
3
+ Lives in its own module (not ``schemas.py``) because it needs
4
+ ``LanguageModelName`` from ``infos.py``, which itself imports from
5
+ ``schemas.py``.
6
+
7
+ :class:`InvocationStatsCollector` collects those stats for one namespaced
8
+ run. ``record_token_usage`` swallows all exceptions around parsing and
9
+ :meth:`LanguageModelInvocationStats.from_usage`: usage is optional
10
+ billing metadata and must not abort a tool run.
11
+ """
12
+
13
+ import logging
14
+ from collections.abc import Iterable, Iterator
15
+ from contextlib import contextmanager
16
+ from contextvars import ContextVar, Token
17
+ from typing import Annotated, Any, Self
18
+
19
+ from humps import camelize
20
+ from pydantic import BaseModel, BeforeValidator, ConfigDict
21
+
22
+ from unique_toolkit.language_model.infos import LanguageModelName
23
+ from unique_toolkit.language_model.model_costs import calculate_invocation_cost_usd
24
+ from unique_toolkit.language_model.schemas import LanguageModelTokenUsage
25
+
26
+ _LOGGER = logging.getLogger(__name__)
27
+
28
+ # `protected_namespaces=()` allows the `model_name` field name.
29
+ model_config = ConfigDict(
30
+ alias_generator=camelize,
31
+ populate_by_name=True,
32
+ protected_namespaces=(),
33
+ )
34
+
35
+
36
+ def _normalize_model_name(value: object) -> object:
37
+ """Canonicalize model_name: known names become the enum, customs stay str.
38
+
39
+ Pydantic's smart union keeps string inputs as `str` even when they match a
40
+ `LanguageModelName` value, so without this the same model could appear as
41
+ enum or str depending on the caller.
42
+ """
43
+ if isinstance(value, str) and not isinstance(value, LanguageModelName):
44
+ value = value.strip()
45
+ if not value:
46
+ raise ValueError("model_name must be a non-empty model name")
47
+ try:
48
+ return LanguageModelName(value)
49
+ except ValueError:
50
+ return value
51
+ return value
52
+
53
+
54
+ def _validate_source(value: object) -> object:
55
+ if isinstance(value, str):
56
+ value = value.strip()
57
+ if not value:
58
+ raise ValueError("source must be a non-empty string")
59
+ return value
60
+
61
+
62
+ ModelName = Annotated[LanguageModelName | str, BeforeValidator(_normalize_model_name)]
63
+ Source = Annotated[str, BeforeValidator(_validate_source)]
64
+
65
+
66
+ class LanguageModelInvocationStats(BaseModel):
67
+ """Usage of a single LLM invocation, tied to the model that served it."""
68
+
69
+ model_config = model_config
70
+
71
+ model_name: ModelName
72
+ token_usage: LanguageModelTokenUsage
73
+ source: Source # e.g. "main_loop", tool/evaluation/postprocessor name
74
+ cost_usd: float | None = None
75
+
76
+ @classmethod
77
+ def from_usage(
78
+ cls,
79
+ model_name: LanguageModelName | str,
80
+ token_usage: LanguageModelTokenUsage,
81
+ source: str,
82
+ ) -> Self:
83
+ return cls(
84
+ model_name=model_name,
85
+ token_usage=token_usage,
86
+ source=source,
87
+ cost_usd=calculate_invocation_cost_usd(str(model_name), token_usage),
88
+ )
89
+
90
+
91
+ class InvocationStatsCollector:
92
+ """Run-scoped collector with a namespaced ContextVar so nested tools don't mix.
93
+
94
+ Instantiate once per namespace and share that instance.
95
+ """
96
+
97
+ def __init__(self, namespace: str) -> None:
98
+ self._namespace = namespace
99
+ self._var: ContextVar[list[LanguageModelInvocationStats] | None] = ContextVar(
100
+ f"{namespace}_invocation_stats", default=None
101
+ )
102
+
103
+ @contextmanager
104
+ def scope(self) -> Iterator[list[LanguageModelInvocationStats]]:
105
+ """Collect stats for one run and isolate concurrent runs."""
106
+ invocation_stats: list[LanguageModelInvocationStats] = []
107
+ token: Token[list[LanguageModelInvocationStats] | None] = self._var.set(
108
+ invocation_stats
109
+ )
110
+ try:
111
+ yield invocation_stats
112
+ finally:
113
+ self._var.reset(token)
114
+
115
+ def record_invocation_stats(
116
+ self,
117
+ invocation_stats: Iterable[LanguageModelInvocationStats],
118
+ ) -> None:
119
+ """Record already-built stats when a run scope is active. No-op otherwise."""
120
+ current_invocation_stats = self._var.get()
121
+ if current_invocation_stats is not None:
122
+ current_invocation_stats.extend(invocation_stats)
123
+
124
+ def record_token_usage(
125
+ self,
126
+ *,
127
+ model_name: str,
128
+ usage: Any,
129
+ source: str,
130
+ ) -> None:
131
+ """Record provider usage when a run scope and usage are available.
132
+
133
+ Swallows all exceptions: this metadata is optional and must not abort
134
+ the calling tool.
135
+ """
136
+ invocation_stats = self._var.get()
137
+ if invocation_stats is None or usage is None:
138
+ return
139
+
140
+ try:
141
+ token_usage = LanguageModelTokenUsage.model_validate(usage)
142
+ invocation_stats.append(
143
+ LanguageModelInvocationStats.from_usage(
144
+ model_name=model_name,
145
+ token_usage=token_usage,
146
+ source=source,
147
+ )
148
+ )
149
+ except Exception:
150
+ _LOGGER.warning(
151
+ "Unable to parse %s token usage for %s",
152
+ self._namespace,
153
+ source,
154
+ exc_info=True,
155
+ )
156
+
157
+ def record_language_model_response(
158
+ self,
159
+ *,
160
+ model_name: str,
161
+ response: Any,
162
+ source: str,
163
+ ) -> None:
164
+ """Record usage from ``.usage``, ``.usage_metadata``, or ``response_metadata``."""
165
+ usage = getattr(response, "usage", None)
166
+ if usage is None:
167
+ usage = getattr(response, "usage_metadata", None)
168
+ if usage is None:
169
+ response_metadata = getattr(response, "response_metadata", None)
170
+ if isinstance(response_metadata, dict):
171
+ usage = response_metadata.get("token_usage")
172
+
173
+ self.record_token_usage(model_name=model_name, usage=usage, source=source)
@@ -1,103 +0,0 @@
1
- import logging
2
- from mimetypes import guess_type
3
-
4
- from openai.types.responses.response_output_text import AnnotationContainerFileCitation
5
- from pydantic import BaseModel
6
-
7
- from unique_toolkit import ChatService
8
- from unique_toolkit._common.utils.files import FileMimeType, ImageMimeType
9
- from unique_toolkit.content.schemas import Content
10
-
11
- _CODE_EXECUTION_ARTIFACT_METADATA_KEY: str = "codeExecutionArtifactMetadata"
12
-
13
- _LOGGER = logging.getLogger(__name__)
14
-
15
-
16
- class CodeExecutionArtifactMetadata(BaseModel):
17
- container_id: str
18
- file_id: str
19
- filepath: str
20
-
21
-
22
- def _kb_safe_mime(mime: str) -> str:
23
- """Return a MIME type the Unique KB will accept.
24
-
25
- Membership is defined by ``FileMimeType`` and ``ImageMimeType`` in
26
- ``unique_toolkit._common.utils.files`` (same catalog as path-based helpers
27
- like ``FileMimeType.is_valid_mime``, but here we already have a resolved
28
- MIME string from ``mimetypes.guess_type``, so we use StrEnum value lookup
29
- instead of re-parsing a path).
30
-
31
- The KB GraphQL API rejects many code-file MIME types (e.g. ``text/x-python``
32
- for ``.py`` files). Anything not in those enums is coerced to
33
- ``text/plain`` so the file can be stored and downloaded without changing
34
- its bytes.
35
-
36
- Other ``image/*`` subtypes (e.g. ``image/jpg``) still pass through unchanged.
37
- """
38
- try:
39
- FileMimeType(mime)
40
- return mime
41
- except ValueError:
42
- pass
43
- try:
44
- ImageMimeType(mime)
45
- return mime
46
- except ValueError:
47
- pass
48
- if mime.startswith("image/"):
49
- return mime
50
- return "text/plain"
51
-
52
-
53
- async def save_code_execution_artifact(
54
- chat_service: ChatService,
55
- file: AnnotationContainerFileCitation,
56
- file_bytes: bytes,
57
- ) -> Content:
58
- raw_mime = guess_type(file.filename)[0] or "text/plain"
59
- mime = _kb_safe_mime(raw_mime)
60
-
61
- if mime != raw_mime:
62
- _LOGGER.info(
63
- "MIME type '%s' is not supported by the Unique KB; "
64
- "uploading '%s' as 'text/plain' so the file can be stored and downloaded.",
65
- raw_mime,
66
- file.filename,
67
- )
68
-
69
- _LOGGER.info(
70
- "Uploading '%s' to knowledge base (%d bytes, mime type %s)",
71
- file.filename,
72
- len(file_bytes),
73
- mime,
74
- )
75
-
76
- return await chat_service.upload_to_chat_from_bytes_async(
77
- content=file_bytes,
78
- content_name=file.filename,
79
- mime_type=mime,
80
- skip_ingestion=True,
81
- hide_in_chat=True,
82
- metadata={
83
- _CODE_EXECUTION_ARTIFACT_METADATA_KEY: CodeExecutionArtifactMetadata(
84
- container_id=file.container_id,
85
- file_id=file.file_id,
86
- filepath=f"/mnt/data/{file.filename}",
87
- ).model_dump()
88
- },
89
- )
90
-
91
-
92
- def load_code_execution_metadata(
93
- content: Content,
94
- ) -> CodeExecutionArtifactMetadata | None:
95
- if (
96
- content.metadata is None
97
- or _CODE_EXECUTION_ARTIFACT_METADATA_KEY not in content.metadata
98
- ):
99
- return None
100
-
101
- return CodeExecutionArtifactMetadata.model_validate(
102
- content.metadata[_CODE_EXECUTION_ARTIFACT_METADATA_KEY]
103
- )