unique-toolkit 2026.36.0.dev2__tar.gz → 2026.36.0.dev4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/PKG-INFO +1 -1
  2. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/pyproject.toml +1 -1
  3. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/feature_flags/feature_flags.py +9 -5
  4. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/tool/service.py +1 -51
  5. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +1 -42
  6. unique_toolkit-2026.36.0.dev4/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/artifacts.py +213 -0
  7. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +10 -0
  8. unique_toolkit-2026.36.0.dev4/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/office_preview.py +154 -0
  9. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/services/chat_service.py +0 -7
  10. unique_toolkit-2026.36.0.dev2/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/artifacts.py +0 -103
  11. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/README.md +0 -0
  12. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/__init__.py +0 -0
  13. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/__init__.py +0 -0
  14. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/_base_service.py +0 -0
  15. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/_time_utils.py +0 -0
  16. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  17. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  18. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  19. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  20. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  21. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  22. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  23. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/config_checker/README.md +0 -0
  24. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/config_checker/__init__.py +0 -0
  25. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/config_checker/__main__.py +0 -0
  26. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/config_checker/cli.py +0 -0
  27. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/config_checker/differ.py +0 -0
  28. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/config_checker/exporter.py +0 -0
  29. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/config_checker/models.py +0 -0
  30. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/config_checker/registry.py +0 -0
  31. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/config_checker/validator.py +0 -0
  32. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/default_language_model.py +0 -0
  33. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
  34. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/docx_generator/config.py +0 -0
  35. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
  36. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
  37. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/docx_generator/service.py +0 -0
  38. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
  39. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/endpoint_builder.py +0 -0
  40. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  41. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/event_bus.py +0 -0
  42. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/exception.py +0 -0
  43. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/execution.py +0 -0
  44. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
  45. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
  46. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
  47. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
  48. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
  49. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
  50. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
  51. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
  52. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
  53. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
  54. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
  55. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
  56. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
  57. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
  58. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
  59. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
  60. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
  61. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
  62. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
  63. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
  64. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
  65. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
  66. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
  67. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
  68. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
  69. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
  70. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
  71. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  72. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/metadata_filter_scope.py +0 -0
  73. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  74. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  75. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/referencing.py +0 -0
  76. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/string_utilities.py +0 -0
  77. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/tests/test_referencing.py +0 -0
  78. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
  79. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/token/__init__.py +0 -0
  80. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  81. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/token/token_counting.py +0 -0
  82. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
  83. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
  84. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/utils/__init__.py +0 -0
  85. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/utils/files.py +0 -0
  86. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/utils/image/encode.py +0 -0
  87. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
  88. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/utils/jinja/render.py +0 -0
  89. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
  90. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
  91. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  92. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  93. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  94. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/validate_required_values.py +0 -0
  95. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/_common/validators.py +0 -0
  96. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/__init__.py +0 -0
  97. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
  98. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
  99. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/config.py +0 -0
  100. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
  101. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
  102. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
  103. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  104. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
  105. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
  106. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  107. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  108. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
  109. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
  110. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
  111. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
  112. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  113. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
  114. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  115. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
  116. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
  117. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
  118. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  119. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
  120. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/tests/test_hallucination_external_context.py +0 -0
  121. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -0
  122. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  123. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
  124. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/evaluation/utils.py +0 -0
  125. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
  126. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  127. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  128. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
  129. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/history_manager/settings.py +0 -0
  130. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  131. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/loop_runner/__init__.py +0 -0
  132. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
  133. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
  134. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
  135. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
  136. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/loop_runner/base.py +0 -0
  137. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
  138. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
  139. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +0 -0
  140. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
  141. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
  142. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
  143. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
  144. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
  145. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
  146. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
  147. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
  148. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
  149. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
  150. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/message_log_order.py +0 -0
  151. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
  152. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  153. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/reference_manager/tests/test_external_context.py +0 -0
  154. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
  155. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
  156. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
  157. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
  158. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  159. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  160. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/__init__.py +0 -0
  161. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  162. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  163. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  164. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  165. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  166. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
  167. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  168. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  169. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  170. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
  171. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
  172. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  173. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
  174. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
  175. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  176. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
  177. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
  178. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_references.py +0 -0
  179. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  180. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
  181. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
  182. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  183. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  184. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  185. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  186. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
  187. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  188. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/config.py +0 -0
  189. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/experimental/__init__.py +0 -0
  190. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/experimental/ask_user_tool/__init__.py +0 -0
  191. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/experimental/ask_user_tool/config.py +0 -0
  192. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/experimental/ask_user_tool/tool.py +0 -0
  193. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/experimental/open_file_tool/__init__.py +0 -0
  194. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/experimental/open_file_tool/config.py +0 -0
  195. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/experimental/open_file_tool/runtime.py +0 -0
  196. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/experimental/open_file_tool/tool.py +0 -0
  197. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/__init__.py +0 -0
  198. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/config.py +0 -0
  199. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/tool.py +0 -0
  200. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/experimental/todo/__init__.py +0 -0
  201. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/experimental/todo/config.py +0 -0
  202. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/experimental/todo/prompts/__init__.py +0 -0
  203. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/experimental/todo/prompts/execution_reminder.j2 +0 -0
  204. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/experimental/todo/prompts/system_prompt.j2 +0 -0
  205. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/experimental/todo/prompts/tool_description.j2 +0 -0
  206. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/experimental/todo/prompts/verification_nudge.j2 +0 -0
  207. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/experimental/todo/schemas.py +0 -0
  208. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/experimental/todo/service.py +0 -0
  209. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/factory.py +0 -0
  210. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  211. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  212. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  213. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/names.py +0 -0
  214. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
  215. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
  216. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
  217. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/activator/__init__.py +0 -0
  218. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/activator/config.py +0 -0
  219. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/activator/service.py +0 -0
  220. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/__init__.py +0 -0
  221. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/_container.py +0 -0
  222. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/_files.py +0 -0
  223. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/_memory.py +0 -0
  224. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/builder.py +0 -0
  225. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
  226. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
  227. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +0 -0
  228. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +0 -0
  229. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/tool/__init__.py +0 -0
  230. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/tool/config.py +0 -0
  231. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/tool/service.py +0 -0
  232. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
  233. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/run_context.py +0 -0
  234. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/schemas.py +0 -0
  235. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  236. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  237. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/tool.py +0 -0
  238. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
  239. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  240. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  241. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  242. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  243. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  244. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  245. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic_table/__init__.py +0 -0
  246. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic_table/schemas.py +0 -0
  247. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic_table/service.py +0 -0
  248. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/agentic_table/synthetic_chat_event.py +0 -0
  249. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/app/__init__.py +0 -0
  250. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/app/chat_event_filter_options_settings.py +0 -0
  251. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/app/dev_util.py +0 -0
  252. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/app/fast_api_factory.py +0 -0
  253. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/app/feature_flags.py +0 -0
  254. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/app/find_env_file.py +0 -0
  255. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/app/init_logging.py +0 -0
  256. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/app/init_sdk.py +0 -0
  257. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/app/performance/async_tasks.py +0 -0
  258. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  259. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/app/schemas.py +0 -0
  260. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/app/unique_settings.py +0 -0
  261. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/app/verification.py +0 -0
  262. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/app/webhook.py +0 -0
  263. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/chat/__init__.py +0 -0
  264. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/chat/cancellation.py +0 -0
  265. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/chat/constants.py +0 -0
  266. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/chat/deprecated/__init__.py +0 -0
  267. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/chat/deprecated/service.py +0 -0
  268. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/chat/functions.py +0 -0
  269. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/chat/rendering.py +0 -0
  270. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/chat/responses_api.py +0 -0
  271. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/chat/schemas.py +0 -0
  272. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/chat/service.py +0 -0
  273. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/chat/state.py +0 -0
  274. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/chat/utils.py +0 -0
  275. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/content/__init__.py +0 -0
  276. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/content/constants.py +0 -0
  277. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/content/functions.py +0 -0
  278. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/content/schemas.py +0 -0
  279. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/content/service.py +0 -0
  280. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/content/smart_rules.py +0 -0
  281. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/content/utils.py +0 -0
  282. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/data_extraction/README.md +0 -0
  283. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/data_extraction/__init__.py +0 -0
  284. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
  285. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/data_extraction/augmented/service.py +0 -0
  286. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/data_extraction/base.py +0 -0
  287. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
  288. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/data_extraction/basic/config.py +0 -0
  289. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
  290. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/data_extraction/basic/service.py +0 -0
  291. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/elicitation/__init__.py +0 -0
  292. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/elicitation/constants.py +0 -0
  293. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/elicitation/exceptions.py +0 -0
  294. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/elicitation/functions.py +0 -0
  295. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/elicitation/schemas.py +0 -0
  296. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/elicitation/service.py +0 -0
  297. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/embedding/__init__.py +0 -0
  298. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/embedding/constants.py +0 -0
  299. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/embedding/functions.py +0 -0
  300. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/embedding/schemas.py +0 -0
  301. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/embedding/service.py +0 -0
  302. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/embedding/utils.py +0 -0
  303. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/README.md +0 -0
  304. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/__init__.py +0 -0
  305. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/_internal/__init__.py +0 -0
  306. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/_internal/streaming/__init__.py +0 -0
  307. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/_internal/streaming/common.py +0 -0
  308. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/_internal/streaming/pattern_replacer.py +0 -0
  309. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/__init__.py +0 -0
  310. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/_base.py +0 -0
  311. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/content_tree/__init__.py +0 -0
  312. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/content_tree/functions.py +0 -0
  313. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/content_tree/schemas.py +0 -0
  314. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/content_tree/service.py +0 -0
  315. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/internal_search/__init__.py +0 -0
  316. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/internal_search/base/__init__.py +0 -0
  317. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/internal_search/base/config.py +0 -0
  318. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/internal_search/base/schemas.py +0 -0
  319. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/internal_search/base/service.py +0 -0
  320. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/internal_search/base/utils.py +0 -0
  321. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/internal_search/chat/__init__.py +0 -0
  322. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/internal_search/chat/config.py +0 -0
  323. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/internal_search/chat/schemas.py +0 -0
  324. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/internal_search/chat/service.py +0 -0
  325. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/internal_search/knowledge_base/__init__.py +0 -0
  326. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/internal_search/knowledge_base/config.py +0 -0
  327. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/internal_search/knowledge_base/schemas.py +0 -0
  328. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/internal_search/knowledge_base/service.py +0 -0
  329. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/internal_search/post_processing/__init__.py +0 -0
  330. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/internal_search/post_processing/config.py +0 -0
  331. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/components/internal_search/post_processing/service.py +0 -0
  332. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/content_tree/__init__.py +0 -0
  333. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/identity/__init__.py +0 -0
  334. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/__init__.py +0 -0
  335. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/__init__.py +0 -0
  336. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/__init__.py +0 -0
  337. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/__init__.py +0 -0
  338. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/_async_bridge.py +0 -0
  339. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/__init__.py +0 -0
  340. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/complete_with_references.py +0 -0
  341. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/stream_event_router.py +0 -0
  342. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/text_event_handler.py +0 -0
  343. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/tool_call_event_handler.py +0 -0
  344. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/events.py +0 -0
  345. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/__init__.py +0 -0
  346. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/chat_completions.py +0 -0
  347. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/responses.py +0 -0
  348. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/__init__.py +0 -0
  349. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/code_interpreter_event_handler.py +0 -0
  350. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/complete_with_references.py +0 -0
  351. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/completed_event_handler.py +0 -0
  352. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/stream_event_router.py +0 -0
  353. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/text_delta_event_handler.py +0 -0
  354. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/tool_call_event_handler.py +0 -0
  355. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/__init__.py +0 -0
  356. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/message_persister.py +0 -0
  357. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/progress_log_persister.py +0 -0
  358. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/__init__.py +0 -0
  359. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/content_folder/__init__.py +0 -0
  360. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/content_folder/functions.py +0 -0
  361. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/content_folder/schemas.py +0 -0
  362. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/content_folder/service.py +0 -0
  363. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/facades/__init__.py +0 -0
  364. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/facades/identity/__init__.py +0 -0
  365. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/facades/identity/service.py +0 -0
  366. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/feature_flags/README.md +0 -0
  367. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/feature_flags/__init__.py +0 -0
  368. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/feature_flags/_graphql_client.py +0 -0
  369. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/feature_flags/_ttl_cache.py +0 -0
  370. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/feature_flags/client.py +0 -0
  371. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/feature_flags/schemas.py +0 -0
  372. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/feature_flags/settings.py +0 -0
  373. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/group/__init__.py +0 -0
  374. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/group/functions.py +0 -0
  375. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/group/schemas.py +0 -0
  376. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/group/service.py +0 -0
  377. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/scheduled_task/__init__.py +0 -0
  378. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/scheduled_task/cron.py +0 -0
  379. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/scheduled_task/functions.py +0 -0
  380. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/scheduled_task/schemas.py +0 -0
  381. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/scheduled_task/service.py +0 -0
  382. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/user/__init__.py +0 -0
  383. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/user/functions.py +0 -0
  384. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/user/schemas.py +0 -0
  385. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/resources/user/service.py +0 -0
  386. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/experimental/testing/__init__.py +0 -0
  387. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/framework_utilities/__init__.py +0 -0
  388. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
  389. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  390. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  391. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  392. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  393. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  394. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/framework_utilities/utils.py +0 -0
  395. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/language_model/__init__.py +0 -0
  396. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
  397. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/language_model/builder.py +0 -0
  398. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/language_model/constants.py +0 -0
  399. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/language_model/default_language_model.py +0 -0
  400. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/language_model/functions.py +0 -0
  401. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/language_model/infos.py +0 -0
  402. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/language_model/invocation_stats.py +0 -0
  403. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/language_model/model_costs.py +0 -0
  404. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/language_model/prompt.py +0 -0
  405. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/language_model/reference.py +0 -0
  406. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/language_model/schemas.py +0 -0
  407. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/language_model/service.py +0 -0
  408. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/language_model/settings.py +0 -0
  409. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/language_model/stream_transform.py +0 -0
  410. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/language_model/utils.py +0 -0
  411. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/monitoring/__init__.py +0 -0
  412. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/monitoring/gunicorn.py +0 -0
  413. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/monitoring/middleware.py +0 -0
  414. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/monitoring/registry.py +0 -0
  415. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/monitoring/tracing.py +0 -0
  416. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/protocols/support.py +0 -0
  417. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/services/__init__.py +0 -0
  418. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/services/factory.py +0 -0
  419. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/services/knowledge_base.py +0 -0
  420. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/short_term_memory/__init__.py +0 -0
  421. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/short_term_memory/constants.py +0 -0
  422. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/short_term_memory/functions.py +0 -0
  423. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/short_term_memory/schemas.py +0 -0
  424. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/short_term_memory/service.py +0 -0
  425. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/smart_rules/__init__.py +0 -0
  426. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/unique_toolkit/smart_rules/compile.py +0 -0
  427. {unique_toolkit-2026.36.0.dev2 → unique_toolkit-2026.36.0.dev4}/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.dev2
3
+ Version: 2026.36.0.dev4
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.dev2"
3
+ version = "2026.36.0.dev4"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -30,7 +30,6 @@ class FeatureFlagNames(StrEnum):
30
30
  enable_web_search_argument_screening_un_18741 = (
31
31
  "FEATURE_FLAG_ENABLE_WEB_SEARCH_ARGUMENT_SCREENING_UN_18741"
32
32
  )
33
- enable_new_answers_ui_un_14411 = "FEATURE_FLAG_ENABLE_NEW_ANSWERS_UI_UN_14411"
34
33
 
35
34
 
36
35
  @deprecated(
@@ -83,20 +82,25 @@ class FeatureFlags(BaseSettings):
83
82
  """Feature flags loaded from environment variables.
84
83
 
85
84
  Environment variables are automatically loaded based on field names.
86
- For example, `enable_new_answers_ui_un_14411` will be loaded from
87
- `FEATURE_FLAG_ENABLE_NEW_ANSWERS_UI_UN_14411` (with the env_prefix).
85
+ For example, `enable_html_rendering_un_15131` will be loaded from
86
+ `FEATURE_FLAG_ENABLE_HTML_RENDERING_UN_15131` (with the env_prefix).
88
87
 
89
88
  Usage:
90
89
  >>> flags = FeatureFlags()
91
90
  >>> # Check if feature is enabled for a company
92
- >>> flags.enable_new_answers_ui_un_14411.is_enabled("company123")
91
+ >>> flags.enable_html_rendering_un_15131.is_enabled("company123")
93
92
  >>> # Check global enablement
94
93
  >>> bool(flags.enable_elicitation_un_15809)
95
94
  """
96
95
 
97
96
  enable_new_answers_ui_un_14411: FeatureFlag = Field(
98
97
  default=FeatureFlag([]),
99
- description="Enable new answers UI (UN-14411)",
98
+ description=(
99
+ "Retired (UN-24507): the new answers UI is always on now, no code "
100
+ "reads this field. Kept only so removing it doesn't trip the "
101
+ "config-checker's breaking-change gate on this settings model; "
102
+ "delete once that checker allows field removal."
103
+ ),
100
104
  )
101
105
 
102
106
  enable_html_rendering_un_15131: FeatureFlag = Field(
@@ -22,7 +22,6 @@ from unique_toolkit._common.referencing import (
22
22
  )
23
23
  from unique_toolkit._common.utils.jinja.render import render_template
24
24
  from unique_toolkit.agentic.evaluation.schemas import EvaluationMetricName
25
- from unique_toolkit.agentic.feature_flags import FeatureFlagNames
26
25
  from unique_toolkit.agentic.tools.a2a.response_watcher import SubAgentResponseWatcher
27
26
  from unique_toolkit.agentic.tools.a2a.tool._memory import (
28
27
  get_sub_agent_short_term_memory_manager,
@@ -39,10 +38,7 @@ from unique_toolkit.agentic.tools.a2a.tool.config import (
39
38
  from unique_toolkit.agentic.tools.factory import ToolFactory
40
39
  from unique_toolkit.agentic.tools.schemas import ToolCallResponse
41
40
  from unique_toolkit.agentic.tools.tool import Tool
42
- from unique_toolkit.agentic.tools.tool_progress_reporter import (
43
- ProgressState,
44
- ToolProgressReporter,
45
- )
41
+ from unique_toolkit.agentic.tools.tool_progress_reporter import ToolProgressReporter
46
42
  from unique_toolkit.app import ChatEvent
47
43
  from unique_toolkit.chat.schemas import (
48
44
  ChatMessageAssessmentLabel,
@@ -53,7 +49,6 @@ from unique_toolkit.chat.schemas import (
53
49
  )
54
50
  from unique_toolkit.chat.service import ChatService
55
51
  from unique_toolkit.content import ContentChunk, ContentReference
56
- from unique_toolkit.experimental.resources.feature_flags import is_flag_enabled
57
52
  from unique_toolkit.language_model import (
58
53
  LanguageModelFunction,
59
54
  LanguageModelService,
@@ -196,12 +191,6 @@ class SubAgentTool(Tool[SubAgentToolConfig]):
196
191
  timestamp = datetime.now()
197
192
 
198
193
  if self._lock.locked():
199
- await self._notify_progress(
200
- tool_call=tool_call,
201
- message=f"Waiting for another run of `{self.display_name()}` to finish",
202
- state=ProgressState.STARTED,
203
- )
204
-
205
194
  active_message_log = self._create_or_update_message_log(
206
195
  progress_message="_Waiting for another run of this sub agent to finish_",
207
196
  active_message_log=active_message_log,
@@ -215,12 +204,6 @@ class SubAgentTool(Tool[SubAgentToolConfig]):
215
204
  sequence_number = self._sequence_number
216
205
  self._sequence_number += 1
217
206
 
218
- await self._notify_progress(
219
- tool_call=tool_call,
220
- message=tool_input,
221
- state=ProgressState.RUNNING,
222
- )
223
-
224
207
  active_message_log = self._create_or_update_message_log(
225
208
  progress_message=f"<em>Executing sub agent with input: {tool_input}</em>",
226
209
  active_message_log=active_message_log,
@@ -285,12 +268,6 @@ class SubAgentTool(Tool[SubAgentToolConfig]):
285
268
  has_refs=has_refs,
286
269
  )
287
270
 
288
- await self._notify_progress(
289
- tool_call=tool_call,
290
- message=tool_input,
291
- state=ProgressState.FINISHED,
292
- )
293
-
294
271
  # Update message log entry to completed
295
272
  active_message_log = self._create_or_update_message_log(
296
273
  progress_message=f"<em>Completed sub agent with input: {tool_input}</em>",
@@ -329,11 +306,6 @@ class SubAgentTool(Tool[SubAgentToolConfig]):
329
306
  except TimeoutError as e:
330
307
  raise e
331
308
  except Exception as e:
332
- await self._notify_progress(
333
- tool_call=tool_call,
334
- message="Error while running sub agent",
335
- state=ProgressState.FAILED,
336
- )
337
309
  active_message_log = self._create_or_update_message_log(
338
310
  progress_message="_Error while running sub agent_",
339
311
  status=MessageLogStatus.FAILED,
@@ -426,23 +398,6 @@ class SubAgentTool(Tool[SubAgentToolConfig]):
426
398
  SubAgentShortTermMemorySchema(chat_id=chat_id)
427
399
  )
428
400
 
429
- async def _notify_progress(
430
- self,
431
- tool_call: LanguageModelFunction,
432
- message: str,
433
- state: ProgressState,
434
- ) -> None:
435
- if self._tool_progress_reporter is not None and not await is_flag_enabled(
436
- FeatureFlagNames.enable_new_answers_ui_un_14411,
437
- company_id=self._company_id or "",
438
- ):
439
- await self._tool_progress_reporter.notify_from_tool_call(
440
- tool_call=tool_call,
441
- name=self._display_name,
442
- message=message,
443
- state=state,
444
- )
445
-
446
401
  def _create_or_update_message_log(
447
402
  self,
448
403
  *,
@@ -511,11 +466,6 @@ class SubAgentTool(Tool[SubAgentToolConfig]):
511
466
  wait_for_invocations=True,
512
467
  )
513
468
  except TimeoutError as e:
514
- await self._notify_progress(
515
- tool_call=tool_call,
516
- message="Timeout while waiting for response from sub agent.",
517
- state=ProgressState.FAILED,
518
- )
519
469
  active_message_log = self._create_or_update_message_log(
520
470
  progress_message="_Timeout while waiting for response from sub agent_",
521
471
  status=MessageLogStatus.FAILED,
@@ -10,20 +10,15 @@ import unique_sdk
10
10
  from pydantic import ValidationError
11
11
 
12
12
  from unique_toolkit.agentic.evaluation.schemas import EvaluationMetricName
13
- from unique_toolkit.agentic.feature_flags import FeatureFlagNames
14
13
  from unique_toolkit.agentic.tools.mcp.models import MCPToolConfig
15
14
  from unique_toolkit.agentic.tools.schemas import ToolCallResponse
16
15
  from unique_toolkit.agentic.tools.tool import Tool
17
- from unique_toolkit.agentic.tools.tool_progress_reporter import (
18
- ProgressState,
19
- ToolProgressReporter,
20
- )
16
+ from unique_toolkit.agentic.tools.tool_progress_reporter import ToolProgressReporter
21
17
  from unique_toolkit.app.schemas import ChatEvent, McpServer, McpTool
22
18
  from unique_toolkit.chat.schemas import MessageLog, MessageLogStatus
23
19
  from unique_toolkit.chat.service import ChatService
24
20
  from unique_toolkit.content.functions import upload_content_from_bytes
25
21
  from unique_toolkit.content.schemas import ContentChunk, ContentReference
26
- from unique_toolkit.experimental.resources.feature_flags import is_flag_enabled
27
22
  from unique_toolkit.language_model import LanguageModelService
28
23
  from unique_toolkit.language_model.schemas import (
29
24
  LanguageModelFunction,
@@ -137,18 +132,6 @@ class MCPToolWrapper(Tool[MCPToolConfig]):
137
132
  active_message_log=active_message_log,
138
133
  )
139
134
 
140
- # Notify progress if reporter is available
141
- if self._tool_progress_reporter and not await is_flag_enabled(
142
- FeatureFlagNames.enable_new_answers_ui_un_14411,
143
- company_id=self._event.company_id,
144
- ):
145
- await self._tool_progress_reporter.notify_from_tool_call(
146
- tool_call=tool_call,
147
- name=f"**{self.display_name()}**",
148
- message=f"Executing MCP tool: {self.display_name()}",
149
- state=ProgressState.RUNNING,
150
- )
151
-
152
135
  try:
153
136
  # Robust argument extraction and validation
154
137
  arguments = self._extract_and_validate_arguments(tool_call)
@@ -180,18 +163,6 @@ class MCPToolWrapper(Tool[MCPToolConfig]):
180
163
  image_data_urls=image_data_urls,
181
164
  )
182
165
 
183
- # Notify completion
184
- if self._tool_progress_reporter and not await is_flag_enabled(
185
- FeatureFlagNames.enable_new_answers_ui_un_14411,
186
- company_id=self._event.company_id,
187
- ):
188
- await self._tool_progress_reporter.notify_from_tool_call(
189
- tool_call=tool_call,
190
- name=f"**{self.display_name()}**",
191
- message=f"MCP tool completed: {self.display_name()}",
192
- state=ProgressState.FINISHED,
193
- )
194
-
195
166
  # Update message log entry to completed
196
167
  active_message_log = self._create_or_update_message_log(
197
168
  progress_message="_Completed MCP tool_",
@@ -205,18 +176,6 @@ class MCPToolWrapper(Tool[MCPToolConfig]):
205
176
  except Exception as e:
206
177
  self.logger.error(f"Error executing MCP tool {self.name}: {e}")
207
178
 
208
- # Notify failure
209
- if self._tool_progress_reporter and not await is_flag_enabled(
210
- FeatureFlagNames.enable_new_answers_ui_un_14411,
211
- company_id=self._event.company_id,
212
- ):
213
- await self._tool_progress_reporter.notify_from_tool_call(
214
- tool_call=tool_call,
215
- name=f"**{self.display_name()}**",
216
- message=f"MCP tool failed: {str(e)}",
217
- state=ProgressState.FAILED,
218
- )
219
-
220
179
  # Update message log entry to failed
221
180
  active_message_log = self._create_or_update_message_log(
222
181
  progress_message="_Failed executing MCP tool_",
@@ -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
@@ -22,7 +22,6 @@ from unique_toolkit._common.metadata_filter_scope import (
22
22
  merge_scope_clause_into_metadata_filter,
23
23
  )
24
24
  from unique_toolkit._common.utils.files import is_file_content, is_image_content
25
- from unique_toolkit.agentic.feature_flags import FeatureFlagNames
26
25
  from unique_toolkit.agentic.message_log_order import next_message_log_order
27
26
  from unique_toolkit.app.unique_settings import UniqueContext, UniqueSettings
28
27
  from unique_toolkit.chat.cancellation import CancellationWatcher
@@ -100,7 +99,6 @@ from unique_toolkit.content.schemas import (
100
99
  ContentSearchType,
101
100
  )
102
101
  from unique_toolkit.elicitation.service import ElicitationService
103
- from unique_toolkit.experimental.resources.feature_flags import is_flag_enabled
104
102
  from unique_toolkit.language_model.constants import (
105
103
  DEFAULT_COMPLETE_TEMPERATURE,
106
104
  DEFAULT_COMPLETE_TIMEOUT,
@@ -1806,11 +1804,6 @@ class ChatService(ChatServiceDeprecated):
1806
1804
 
1807
1805
  if not rate_limit_retry_config.log_message_on_retry:
1808
1806
  return
1809
- if not await is_flag_enabled(
1810
- FeatureFlagNames.enable_new_answers_ui_un_14411,
1811
- company_id=self._company_id,
1812
- ):
1813
- return
1814
1807
 
1815
1808
  await _cancel_ticker()
1816
1809