unique_toolkit 2026.38.0.dev18__tar.gz → 2026.40.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/PKG-INFO +2 -2
  2. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/pyproject.toml +2 -2
  3. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/hallucination/utils.py +3 -2
  4. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +64 -0
  5. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/feature_flags/feature_flags.py +14 -6
  6. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/__init__.py +2 -0
  7. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/runners/__init__.py +6 -0
  8. unique_toolkit-2026.40.0/unique_toolkit/agentic/loop_runner/runners/prompt_forced_tool/__init__.py +9 -0
  9. unique_toolkit-2026.40.0/unique_toolkit/agentic/loop_runner/runners/prompt_forced_tool/helpers.py +32 -0
  10. unique_toolkit-2026.40.0/unique_toolkit/agentic/loop_runner/runners/prompt_forced_tool/runner.py +53 -0
  11. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +20 -14
  12. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +24 -37
  13. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/tool/config.py +3 -3
  14. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic_table/service.py +22 -17
  15. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/chat/functions.py +40 -0
  16. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/chat/schemas.py +6 -0
  17. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/infos.py +209 -0
  18. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/services/chat_service.py +31 -0
  19. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/README.md +0 -0
  20. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/__init__.py +0 -0
  21. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/__init__.py +0 -0
  22. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/_base_service.py +0 -0
  23. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/_time_utils.py +0 -0
  24. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  25. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  26. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  27. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  28. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  29. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  30. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  31. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/config_checker/README.md +0 -0
  32. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/config_checker/__init__.py +0 -0
  33. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/config_checker/__main__.py +0 -0
  34. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/config_checker/cli.py +0 -0
  35. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/config_checker/differ.py +0 -0
  36. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/config_checker/exporter.py +0 -0
  37. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/config_checker/models.py +0 -0
  38. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/config_checker/registry.py +0 -0
  39. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/config_checker/validator.py +0 -0
  40. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/default_language_model.py +0 -0
  41. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
  42. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/docx_generator/config.py +0 -0
  43. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
  44. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
  45. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/docx_generator/service.py +0 -0
  46. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
  47. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/endpoint_builder.py +0 -0
  48. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  49. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/event_bus.py +0 -0
  50. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/exception.py +0 -0
  51. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/execution.py +0 -0
  52. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
  53. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
  54. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
  55. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
  56. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
  57. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
  58. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
  59. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
  60. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
  61. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
  62. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
  63. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
  64. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
  65. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
  66. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
  67. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
  68. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
  69. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
  70. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
  71. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
  72. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
  73. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
  74. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
  75. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
  76. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
  77. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
  78. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
  79. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  80. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/metadata_filter_scope.py +0 -0
  81. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  82. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  83. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/referencing.py +0 -0
  84. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/string_utilities.py +0 -0
  85. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/tests/test_referencing.py +0 -0
  86. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
  87. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/token/__init__.py +0 -0
  88. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  89. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/token/token_counting.py +0 -0
  90. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
  91. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
  92. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/utils/__init__.py +0 -0
  93. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/utils/files.py +0 -0
  94. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/utils/image/encode.py +0 -0
  95. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
  96. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/utils/jinja/render.py +0 -0
  97. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
  98. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
  99. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  100. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  101. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  102. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/validate_required_values.py +0 -0
  103. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/_common/validators.py +0 -0
  104. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/__init__.py +0 -0
  105. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
  106. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
  107. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/config.py +0 -0
  108. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
  109. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
  110. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
  111. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  112. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
  113. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
  114. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  115. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  116. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
  117. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
  118. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
  119. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
  120. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  121. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  122. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
  123. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
  124. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
  125. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  126. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
  127. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/tests/test_hallucination_external_context.py +0 -0
  128. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  129. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
  130. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/utils.py +0 -0
  131. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
  132. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  133. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  134. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
  135. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/history_manager/settings.py +0 -0
  136. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  137. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
  138. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
  139. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
  140. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
  141. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/base.py +0 -0
  142. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
  143. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
  144. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +0 -0
  145. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
  146. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
  147. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
  148. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
  149. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
  150. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
  151. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
  152. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
  153. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
  154. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/message_log_order.py +0 -0
  155. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
  156. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  157. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/reference_manager/tests/test_external_context.py +0 -0
  158. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
  159. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
  160. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
  161. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
  162. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  163. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  164. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/__init__.py +0 -0
  165. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  166. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  167. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  168. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  169. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  170. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
  171. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  172. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  173. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  174. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
  175. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
  176. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  177. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
  178. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
  179. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  180. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
  181. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
  182. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_references.py +0 -0
  183. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  184. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
  185. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
  186. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  187. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  188. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  189. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  190. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  191. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
  192. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  193. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/config.py +0 -0
  194. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/__init__.py +0 -0
  195. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/ask_user_tool/__init__.py +0 -0
  196. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/ask_user_tool/config.py +0 -0
  197. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/ask_user_tool/tool.py +0 -0
  198. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/__init__.py +0 -0
  199. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/config.py +0 -0
  200. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/runtime.py +0 -0
  201. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/tool.py +0 -0
  202. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/__init__.py +0 -0
  203. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/config.py +0 -0
  204. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/tool.py +0 -0
  205. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/todo/__init__.py +0 -0
  206. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/todo/config.py +0 -0
  207. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/todo/prompts/__init__.py +0 -0
  208. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/todo/prompts/execution_reminder.j2 +0 -0
  209. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/todo/prompts/system_prompt.j2 +0 -0
  210. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/todo/prompts/tool_description.j2 +0 -0
  211. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/todo/prompts/verification_nudge.j2 +0 -0
  212. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/todo/schemas.py +0 -0
  213. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/todo/service.py +0 -0
  214. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/factory.py +0 -0
  215. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  216. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  217. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  218. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
  219. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/names.py +0 -0
  220. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
  221. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
  222. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
  223. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/activator/__init__.py +0 -0
  224. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/activator/config.py +0 -0
  225. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/activator/service.py +0 -0
  226. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/__init__.py +0 -0
  227. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/_container.py +0 -0
  228. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/_files.py +0 -0
  229. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/_memory.py +0 -0
  230. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/builder.py +0 -0
  231. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
  232. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
  233. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/artifacts.py +0 -0
  234. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/office_preview.py +0 -0
  235. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +0 -0
  236. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/tool/__init__.py +0 -0
  237. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/tool/service.py +0 -0
  238. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
  239. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/run_context.py +0 -0
  240. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/schemas.py +0 -0
  241. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  242. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  243. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/tool.py +0 -0
  244. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
  245. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  246. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  247. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  248. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  249. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  250. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  251. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic_table/__init__.py +0 -0
  252. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic_table/schemas.py +0 -0
  253. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/agentic_table/synthetic_chat_event.py +0 -0
  254. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/app/__init__.py +0 -0
  255. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/app/chat_event_filter_options_settings.py +0 -0
  256. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/app/dev_util.py +0 -0
  257. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/app/fast_api_factory.py +0 -0
  258. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/app/feature_flags.py +0 -0
  259. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/app/find_env_file.py +0 -0
  260. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/app/init_logging.py +0 -0
  261. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/app/init_sdk.py +0 -0
  262. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/app/performance/async_tasks.py +0 -0
  263. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  264. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/app/schemas.py +0 -0
  265. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/app/unique_settings.py +0 -0
  266. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/app/verification.py +0 -0
  267. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/app/webhook.py +0 -0
  268. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/chat/__init__.py +0 -0
  269. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/chat/cancellation.py +0 -0
  270. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/chat/constants.py +0 -0
  271. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/chat/deprecated/__init__.py +0 -0
  272. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/chat/deprecated/service.py +0 -0
  273. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/chat/rendering.py +0 -0
  274. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/chat/responses_api.py +0 -0
  275. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/chat/service.py +0 -0
  276. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/chat/state.py +0 -0
  277. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/chat/utils.py +0 -0
  278. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/content/__init__.py +0 -0
  279. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/content/constants.py +0 -0
  280. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/content/functions.py +0 -0
  281. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/content/schemas.py +0 -0
  282. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/content/service.py +0 -0
  283. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/content/smart_rules.py +0 -0
  284. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/content/utils.py +0 -0
  285. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/data_extraction/README.md +0 -0
  286. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/data_extraction/__init__.py +0 -0
  287. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
  288. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/data_extraction/augmented/service.py +0 -0
  289. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/data_extraction/base.py +0 -0
  290. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
  291. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/data_extraction/basic/config.py +0 -0
  292. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
  293. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/data_extraction/basic/service.py +0 -0
  294. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/elicitation/__init__.py +0 -0
  295. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/elicitation/constants.py +0 -0
  296. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/elicitation/exceptions.py +0 -0
  297. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/elicitation/functions.py +0 -0
  298. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/elicitation/schemas.py +0 -0
  299. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/elicitation/service.py +0 -0
  300. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/embedding/__init__.py +0 -0
  301. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/embedding/constants.py +0 -0
  302. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/embedding/functions.py +0 -0
  303. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/embedding/schemas.py +0 -0
  304. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/embedding/service.py +0 -0
  305. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/embedding/utils.py +0 -0
  306. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/README.md +0 -0
  307. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/__init__.py +0 -0
  308. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/_internal/__init__.py +0 -0
  309. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/_internal/streaming/__init__.py +0 -0
  310. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/_internal/streaming/common.py +0 -0
  311. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/_internal/streaming/pattern_replacer.py +0 -0
  312. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/__init__.py +0 -0
  313. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/_base.py +0 -0
  314. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/content_tree/__init__.py +0 -0
  315. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/content_tree/functions.py +0 -0
  316. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/content_tree/schemas.py +0 -0
  317. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/content_tree/service.py +0 -0
  318. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/__init__.py +0 -0
  319. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/base/__init__.py +0 -0
  320. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/base/config.py +0 -0
  321. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/base/schemas.py +0 -0
  322. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/base/service.py +0 -0
  323. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/base/utils.py +0 -0
  324. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/chat/__init__.py +0 -0
  325. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/chat/config.py +0 -0
  326. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/chat/schemas.py +0 -0
  327. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/chat/service.py +0 -0
  328. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/knowledge_base/__init__.py +0 -0
  329. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/knowledge_base/config.py +0 -0
  330. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/knowledge_base/schemas.py +0 -0
  331. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/knowledge_base/service.py +0 -0
  332. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/post_processing/__init__.py +0 -0
  333. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/post_processing/config.py +0 -0
  334. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/post_processing/service.py +0 -0
  335. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/content_tree/__init__.py +0 -0
  336. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/identity/__init__.py +0 -0
  337. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/__init__.py +0 -0
  338. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/__init__.py +0 -0
  339. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/__init__.py +0 -0
  340. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/__init__.py +0 -0
  341. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/_async_bridge.py +0 -0
  342. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/_model_params.py +0 -0
  343. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/__init__.py +0 -0
  344. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/complete_with_references.py +0 -0
  345. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/stream_event_router.py +0 -0
  346. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/text_event_handler.py +0 -0
  347. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/tool_call_event_handler.py +0 -0
  348. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/events.py +0 -0
  349. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/__init__.py +0 -0
  350. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/chat_completions.py +0 -0
  351. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/responses.py +0 -0
  352. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/__init__.py +0 -0
  353. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/code_interpreter_event_handler.py +0 -0
  354. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/complete_with_references.py +0 -0
  355. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/completed_event_handler.py +0 -0
  356. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/stream_event_router.py +0 -0
  357. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/text_delta_event_handler.py +0 -0
  358. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/tool_call_event_handler.py +0 -0
  359. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/__init__.py +0 -0
  360. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/message_persister.py +0 -0
  361. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/progress_log_persister.py +0 -0
  362. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/__init__.py +0 -0
  363. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/content_folder/__init__.py +0 -0
  364. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/content_folder/functions.py +0 -0
  365. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/content_folder/schemas.py +0 -0
  366. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/content_folder/service.py +0 -0
  367. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/facades/__init__.py +0 -0
  368. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/facades/identity/__init__.py +0 -0
  369. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/facades/identity/service.py +0 -0
  370. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/feature_flags/README.md +0 -0
  371. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/feature_flags/__init__.py +0 -0
  372. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/feature_flags/_graphql_client.py +0 -0
  373. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/feature_flags/_ttl_cache.py +0 -0
  374. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/feature_flags/client.py +0 -0
  375. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/feature_flags/schemas.py +0 -0
  376. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/feature_flags/settings.py +0 -0
  377. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/group/__init__.py +0 -0
  378. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/group/functions.py +0 -0
  379. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/group/schemas.py +0 -0
  380. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/group/service.py +0 -0
  381. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/scheduled_task/__init__.py +0 -0
  382. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/scheduled_task/cron.py +0 -0
  383. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/scheduled_task/functions.py +0 -0
  384. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/scheduled_task/schemas.py +0 -0
  385. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/scheduled_task/service.py +0 -0
  386. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/user/__init__.py +0 -0
  387. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/user/functions.py +0 -0
  388. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/user/schemas.py +0 -0
  389. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/user/service.py +0 -0
  390. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/testing/__init__.py +0 -0
  391. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/framework_utilities/__init__.py +0 -0
  392. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
  393. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  394. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  395. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  396. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  397. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  398. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/framework_utilities/utils.py +0 -0
  399. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/__init__.py +0 -0
  400. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
  401. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/builder.py +0 -0
  402. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/constants.py +0 -0
  403. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/default_language_model.py +0 -0
  404. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/functions.py +0 -0
  405. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/invocation_stats.py +0 -0
  406. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/model_costs.py +0 -0
  407. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/prompt.py +0 -0
  408. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/reference.py +0 -0
  409. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/schemas.py +0 -0
  410. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/service.py +0 -0
  411. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/settings.py +0 -0
  412. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/stream_transform.py +0 -0
  413. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/utils.py +0 -0
  414. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/monitoring/__init__.py +0 -0
  415. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/monitoring/gunicorn.py +0 -0
  416. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/monitoring/memory.py +0 -0
  417. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/monitoring/middleware.py +0 -0
  418. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/monitoring/registry.py +0 -0
  419. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/monitoring/tracing.py +0 -0
  420. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/protocols/support.py +0 -0
  421. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/services/__init__.py +0 -0
  422. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/services/factory.py +0 -0
  423. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/services/knowledge_base.py +0 -0
  424. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/short_term_memory/__init__.py +0 -0
  425. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/short_term_memory/constants.py +0 -0
  426. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/short_term_memory/functions.py +0 -0
  427. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/short_term_memory/schemas.py +0 -0
  428. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/short_term_memory/service.py +0 -0
  429. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/smart_rules/__init__.py +0 -0
  430. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/smart_rules/compile.py +0 -0
  431. {unique_toolkit-2026.38.0.dev18 → unique_toolkit-2026.40.0}/unique_toolkit/test_utilities/events.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: unique-toolkit
3
- Version: 2026.38.0.dev18
3
+ Version: 2026.40.0
4
4
  Summary:
5
5
  Author: Cedric Klinkert, Martin Fadler, Sadique Sheik, Fabian Schläpfer, Pascal Hauri, Ejiroghene Oki-Peter, Rami Azouz, Ricardo Visini, Sanzio Monti
6
6
  Author-email: Cedric Klinkert <cedric.klinkert@unique.ch>, Martin Fadler <martin.fadler@unique.ch>, Sadique Sheik <sadique@unique.ch>, Fabian Schläpfer <fabian@unique.ch>, Pascal Hauri <pascal@unique.ch>, Ejiroghene Oki-Peter <oki-peter.ejiroghene@unique.ai>, Rami Azouz <rami.ext@unique.ch>, Ricardo Visini <ricardo.visini@unique.ch>, Sanzio Monti <sanzio.monti@unique.ai>
@@ -16,7 +16,7 @@ Requires-Dist: sseclient>=0.0.27,<0.0.28
16
16
  Requires-Dist: openai>=1.105.0,<3
17
17
  Requires-Dist: platformdirs>=4.0.0,<5
18
18
  Requires-Dist: pillow>=12.1.1
19
- Requires-Dist: unique-sdk>=2026.38.0.dev5,<2026.38.0rc0
19
+ Requires-Dist: unique-sdk>=2026.40.0
20
20
  Requires-Dist: jambo>=0.1.2,<0.2
21
21
  Requires-Dist: jinja2>=3.1.6,<4
22
22
  Requires-Dist: docxtpl>=0.20.1,<0.21
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "unique_toolkit"
3
- version = "2026.38.0.dev18"
3
+ version = "2026.40.0"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -28,7 +28,7 @@ dependencies = [
28
28
  "openai>=1.105.0,<3",
29
29
  "platformdirs>=4.0.0,<5",
30
30
  "pillow>=12.1.1",
31
- "unique-sdk>=2026.38.0.dev5,<2026.38.0rc0",
31
+ "unique-sdk>=2026.40.0",
32
32
  "jambo>=0.1.2,<0.2",
33
33
  "jinja2>=3.1.6,<4",
34
34
  "docxtpl>=0.20.1,<0.21",
@@ -203,7 +203,8 @@ def _compose_msgs(
203
203
  )
204
204
  system_msg = LanguageModelSystemMessage(content=system_msg_content)
205
205
 
206
- # Render user message
206
+ # Render user message. Pass history text only when history exists so the
207
+ # template can omit an empty conversation section.
207
208
  user_msg_content = render_template(
208
209
  user_template,
209
210
  input_text=input.input_text,
@@ -211,7 +212,7 @@ def _compose_msgs(
211
212
  if has_context
212
213
  else None,
213
214
  history_messages_text=input.get_joined_history_texts(tag_name="conversation")
214
- if has_context
215
+ if has_context and input.history_messages
215
216
  else None,
216
217
  output_text=input.output_text,
217
218
  )
@@ -1224,3 +1224,67 @@ def test_get_msgs__ignores_context_images__when_model_lacks_vision() -> None:
1224
1224
  # Assert
1225
1225
  assert result.root[0].content == no_context_result.root[0].content
1226
1226
  assert isinstance(result.root[1].content, str)
1227
+
1228
+
1229
+ @pytest.mark.unit
1230
+ def test_compose_msgs__omits_conversation_section__when_history_is_empty():
1231
+ """A single-turn evaluation must not be shown an empty conversation.
1232
+
1233
+ The template guards the section with `{% if history_messages_text %}`,
1234
+ and the getter returns a truthy placeholder when there is no history, so
1235
+ the guard used to never fire: every caller evaluating one turn shipped a
1236
+ `Conversation:` section whose body said there was no conversation, while
1237
+ the system prompt announced one.
1238
+ """
1239
+ msgs = _compose_msgs(
1240
+ EvaluationMetricInput(
1241
+ input_text="What is the policy rate?",
1242
+ context_texts=["The policy rate is 0.25%."],
1243
+ history_messages=[],
1244
+ output_text="0.25%.",
1245
+ ),
1246
+ HallucinationConfig(),
1247
+ has_context=True,
1248
+ )
1249
+
1250
+ user_content = msgs.root[-1].content
1251
+ assert isinstance(user_content, str)
1252
+ assert "Conversation:" not in user_content
1253
+ assert "<No conversation texts provided>" not in user_content
1254
+ # The references the model does have must still be there.
1255
+ assert "The policy rate is 0.25%." in user_content
1256
+
1257
+
1258
+ @pytest.mark.unit
1259
+ def test_compose_msgs__keeps_conversation_section__when_history_is_present():
1260
+ msgs = _compose_msgs(
1261
+ EvaluationMetricInput(
1262
+ input_text="And in March?",
1263
+ context_texts=["The March rate was 0.50%."],
1264
+ history_messages=[
1265
+ ChatMessage(
1266
+ id="msg_1",
1267
+ chat_id="chat_1",
1268
+ previous_message_id=None,
1269
+ role=LanguageModelMessageRole.USER,
1270
+ text="What is the policy rate?",
1271
+ ),
1272
+ ChatMessage(
1273
+ id="msg_2",
1274
+ chat_id="chat_1",
1275
+ previous_message_id="msg_1",
1276
+ role=LanguageModelMessageRole.ASSISTANT,
1277
+ text="0.25%.",
1278
+ ),
1279
+ ],
1280
+ output_text="0.50%.",
1281
+ ),
1282
+ HallucinationConfig(),
1283
+ has_context=True,
1284
+ )
1285
+
1286
+ user_content = msgs.root[-1].content
1287
+ assert isinstance(user_content, str)
1288
+ assert "Conversation:" in user_content
1289
+ assert "What is the policy rate?" in user_content
1290
+ assert "<No conversation texts provided>" not in user_content
@@ -23,10 +23,6 @@ class FeatureFlagNames(StrEnum):
23
23
  "FEATURE_FLAG_ENABLE_MCP_METADATA_FALLBACK_UN_19145"
24
24
  )
25
25
  enable_html_rendering_un_15131 = "FEATURE_FLAG_ENABLE_HTML_RENDERING_UN_15131"
26
- enable_code_execution_fence_un_17972 = (
27
- "FEATURE_FLAG_ENABLE_CODE_EXECUTION_FENCE_UN_17972"
28
- )
29
- enable_html_with_fence_un_17927 = "FEATURE_FLAG_ENABLE_HTML_WITH_FENCE_UN_17927"
30
26
  enable_web_search_argument_screening_un_18741 = (
31
27
  "FEATURE_FLAG_ENABLE_WEB_SEARCH_ARGUMENT_SCREENING_UN_18741"
32
28
  )
@@ -110,12 +106,24 @@ class FeatureFlags(BaseSettings):
110
106
 
111
107
  enable_code_execution_fence_un_17972: FeatureFlag = Field(
112
108
  default=FeatureFlag(False),
113
- description="Emit codeExecution fences in message.text for code interpreter outputs (UN-17972). When disabled, inline file refs are kept as-is. Can be 'true' or comma-separated company IDs.",
109
+ description=(
110
+ "Retired: replaced by the `enable_code_execution_fence` config field "
111
+ "on ShowExecutedCodePostprocessorConfig (default true). "
112
+ "No code reads this field anymore. Kept only so removing it doesn't "
113
+ "trip the config-checker's breaking-change gate on this settings "
114
+ "model; delete once that checker allows field removal."
115
+ ),
114
116
  )
115
117
 
116
118
  enable_html_with_fence_un_17927: FeatureFlag = Field(
117
119
  default=FeatureFlag(False),
118
- description="Render HTML code interpreter files as htmlWithSource fences instead of HtmlRendering blocks (UN-17927). Requires enable_code_execution_fence_un_17972 to also be enabled. Can be 'true' or comma-separated company IDs.",
120
+ description=(
121
+ "Retired: replaced by the `enable_html_with_fence` config field "
122
+ "on ShowExecutedCodePostprocessorConfig (default true). "
123
+ "No code reads this field anymore. Kept only so removing it doesn't "
124
+ "trip the config-checker's breaking-change gate on this settings "
125
+ "model; delete once that checker allows field removal."
126
+ ),
119
127
  )
120
128
 
121
129
  enable_web_search_argument_screening_un_18741: FeatureFlag = Field(
@@ -21,6 +21,7 @@ from unique_toolkit.agentic.loop_runner.runners import (
21
21
  BasicLoopIterationRunner,
22
22
  BasicLoopIterationRunnerConfig,
23
23
  MistralLoopIterationRunner,
24
+ PromptForcedToolLoopIterationRunner,
24
25
  QwenLoopIterationRunner,
25
26
  ResponsesBasicLoopIterationRunner,
26
27
  )
@@ -34,6 +35,7 @@ __all__ = [
34
35
  "BasicLoopIterationRunnerConfig",
35
36
  "BasicLoopIterationRunner",
36
37
  "MistralLoopIterationRunner",
38
+ "PromptForcedToolLoopIterationRunner",
37
39
  "QwenLoopIterationRunner",
38
40
  "handle_forced_tools_iteration",
39
41
  "handle_last_iteration",
@@ -6,6 +6,10 @@ from unique_toolkit.agentic.loop_runner.runners.basic import (
6
6
  from unique_toolkit.agentic.loop_runner.runners.mistral import (
7
7
  MistralLoopIterationRunner,
8
8
  )
9
+ from unique_toolkit.agentic.loop_runner.runners.prompt_forced_tool import (
10
+ PROMPT_FORCED_TOOL_CALL_INSTRUCTION,
11
+ PromptForcedToolLoopIterationRunner,
12
+ )
9
13
  from unique_toolkit.agentic.loop_runner.runners.qwen import (
10
14
  QWEN_FORCED_TOOL_CALL_INSTRUCTION,
11
15
  QWEN_LAST_ITERATION_INSTRUCTION,
@@ -18,6 +22,8 @@ __all__ = [
18
22
  "BasicLoopIterationRunner",
19
23
  "ResponsesBasicLoopIterationRunner",
20
24
  "MistralLoopIterationRunner",
25
+ "PROMPT_FORCED_TOOL_CALL_INSTRUCTION",
26
+ "PromptForcedToolLoopIterationRunner",
21
27
  "QwenLoopIterationRunner",
22
28
  "QWEN_FORCED_TOOL_CALL_INSTRUCTION",
23
29
  "QWEN_LAST_ITERATION_INSTRUCTION",
@@ -0,0 +1,9 @@
1
+ from unique_toolkit.agentic.loop_runner.runners.prompt_forced_tool.runner import (
2
+ PROMPT_FORCED_TOOL_CALL_INSTRUCTION,
3
+ PromptForcedToolLoopIterationRunner,
4
+ )
5
+
6
+ __all__ = [
7
+ "PROMPT_FORCED_TOOL_CALL_INSTRUCTION",
8
+ "PromptForcedToolLoopIterationRunner",
9
+ ]
@@ -0,0 +1,32 @@
1
+ """Message helpers for models that reject a forced tool_choice."""
2
+
3
+ from unique_toolkit.language_model.schemas import (
4
+ LanguageModelMessageRole,
5
+ LanguageModelMessages,
6
+ )
7
+
8
+
9
+ def append_prompt_forced_tool_instruction(
10
+ *,
11
+ messages: LanguageModelMessages,
12
+ instruction: str,
13
+ ) -> LanguageModelMessages:
14
+ """Append a must-call instruction to the last user message.
15
+
16
+ Args:
17
+ messages (LanguageModelMessages): Conversation copied for this tool.
18
+ instruction (str): Instruction that names the tool to call.
19
+
20
+ Returns:
21
+ LanguageModelMessages: A new message list with the instruction appended
22
+ when the last user message has string content.
23
+ """
24
+ messages_list = list(messages)
25
+ for i in range(len(messages_list) - 1, -1, -1):
26
+ msg = messages_list[i]
27
+ if msg.role == LanguageModelMessageRole.USER and isinstance(msg.content, str):
28
+ messages_list[i] = msg.model_copy(
29
+ update={"content": msg.content + "\n" + instruction}
30
+ )
31
+ break
32
+ return LanguageModelMessages(root=messages_list)
@@ -0,0 +1,53 @@
1
+ """Loop runner for models that reject forced tool_choice values."""
2
+
3
+ from typing import Unpack
4
+
5
+ from unique_toolkit.agentic.loop_runner._iteration_handler_utils import (
6
+ run_forced_tools_iteration,
7
+ )
8
+ from unique_toolkit.agentic.loop_runner.base import _LoopIterationRunnerKwargs
9
+ from unique_toolkit.agentic.loop_runner.runners.basic import (
10
+ BasicLoopIterationRunner,
11
+ )
12
+ from unique_toolkit.agentic.loop_runner.runners.prompt_forced_tool.helpers import (
13
+ append_prompt_forced_tool_instruction,
14
+ )
15
+ from unique_toolkit.chat.functions import LanguageModelStreamResponse
16
+
17
+ PROMPT_FORCED_TOOL_CALL_INSTRUCTION = (
18
+ "You must call the tool {TOOL_NAME}. Call it instead of replying with text."
19
+ )
20
+
21
+
22
+ class PromptForcedToolLoopIterationRunner(BasicLoopIterationRunner):
23
+ """Runner for models that reject named and ``any`` tool choices.
24
+
25
+ Claude Opus 5.5 and Fable 5.1 return HTTP 400 for those ``tool_choice``
26
+ types. This runner keeps one request per forced tool, limits ``tools`` to
27
+ that tool, sends ``tool_choice="auto"``, and asks for the call in the prompt.
28
+ """
29
+
30
+ async def _handle_forced_tools(
31
+ self,
32
+ **kwargs: Unpack[_LoopIterationRunnerKwargs],
33
+ ) -> LanguageModelStreamResponse:
34
+ original_messages = kwargs["messages"].model_copy(deep=True)
35
+
36
+ def _prepare(
37
+ func_name: str | None,
38
+ per_choice_kwargs: _LoopIterationRunnerKwargs,
39
+ ) -> _LoopIterationRunnerKwargs:
40
+ instruction = PROMPT_FORCED_TOOL_CALL_INSTRUCTION.format(
41
+ TOOL_NAME=func_name or ""
42
+ )
43
+ per_choice_kwargs["messages"] = append_prompt_forced_tool_instruction(
44
+ messages=original_messages,
45
+ instruction=instruction,
46
+ )
47
+ return per_choice_kwargs
48
+
49
+ return await run_forced_tools_iteration(
50
+ loop_runner_kwargs=kwargs,
51
+ prepare_loop_runner_kwargs=_prepare,
52
+ tool_choice_override="auto",
53
+ )
@@ -6,15 +6,10 @@ from typing import override
6
6
  from pydantic import BaseModel, Field
7
7
  from pydantic.json_schema import SkipJsonSchema
8
8
 
9
- from unique_toolkit.agentic.feature_flags import FeatureFlagNames
10
9
  from unique_toolkit.agentic.postprocessor.postprocessor_manager import (
11
10
  ResponsesApiPostprocessor,
12
11
  )
13
12
  from unique_toolkit.agentic.tools.config import get_configuration_dict
14
- from unique_toolkit.experimental.resources.feature_flags import (
15
- COMPANY_ID_PLACEHOLDER,
16
- is_flag_enabled,
17
- )
18
13
  from unique_toolkit.language_model.schemas import ResponsesLanguageModelStreamResponse
19
14
 
20
15
  _TEMPLATE = """
@@ -37,7 +32,23 @@ class ShowExecutedCodePostprocessorConfig(BaseModel):
37
32
  model_config = get_configuration_dict()
38
33
  enable: bool = Field(
39
34
  default=True,
40
- description="Enable display of executed code before the assistant message",
35
+ description="Show the executed source code to the user",
36
+ )
37
+ enable_code_execution_fence: bool = Field(
38
+ default=True,
39
+ description=(
40
+ "Show generated files as interactive cards with a built-in code view "
41
+ "and hide the legacy collapsible code block below."
42
+ ),
43
+ )
44
+ enable_html_with_fence: bool = Field(
45
+ default=True,
46
+ description=(
47
+ "Show generated HTML files as interactive cards with a built-in code "
48
+ "view instead of a plain rendered HTML block. Has no effect on its "
49
+ "own: 'enable_code_execution_fence' must be on as well. While that "
50
+ "switch is off, HTML files stay a plain rendered HTML block."
51
+ ),
41
52
  )
42
53
  remove_from_history: SkipJsonSchema[bool] = (
43
54
  Field( # At the moment, it's not possible to keep executed code in the history
@@ -55,20 +66,15 @@ class ShowExecutedCodePostprocessor(ResponsesApiPostprocessor):
55
66
  def __init__(
56
67
  self,
57
68
  config: ShowExecutedCodePostprocessorConfig,
58
- company_id: str | None = None,
59
69
  ):
60
70
  super().__init__(self.__class__.__name__)
61
71
  self._config = config
62
- self._company_id = company_id
63
- # Resolved in run() (before apply_postprocessing_to_response) since flag evaluation is async.
64
- self._is_enabled = False
72
+ # When fences are enabled, the fence itself shows the executed code,
73
+ # so this legacy <details> display must stay off.
74
+ self._is_enabled = config.enable and not config.enable_code_execution_fence
65
75
 
66
76
  @override
67
77
  async def run(self, loop_response: ResponsesLanguageModelStreamResponse) -> None:
68
- self._is_enabled = self._config.enable and not await is_flag_enabled(
69
- FeatureFlagNames.enable_code_execution_fence_un_17972,
70
- company_id=self._company_id or COMPANY_ID_PLACEHOLDER,
71
- )
72
78
  if self._is_enabled:
73
79
  await asyncio.sleep(self._config.sleep_time_before_display)
74
80
 
@@ -21,7 +21,6 @@ from tenacity import (
21
21
 
22
22
  from unique_toolkit import ChatService
23
23
  from unique_toolkit._common.execution import failsafe_async
24
- from unique_toolkit.agentic.feature_flags import FeatureFlagNames
25
24
  from unique_toolkit.agentic.postprocessor.postprocessor_manager import (
26
25
  ResponsesApiPostprocessor,
27
26
  )
@@ -40,10 +39,6 @@ from unique_toolkit.agentic.tools.openai_builtin.code_interpreter.schemas import
40
39
  )
41
40
  from unique_toolkit.content.schemas import ContentReference
42
41
  from unique_toolkit.content.service import ContentService
43
- from unique_toolkit.experimental.resources.feature_flags import (
44
- COMPANY_ID_PLACEHOLDER,
45
- is_flag_enabled,
46
- )
47
42
  from unique_toolkit.language_model.schemas import ResponsesLanguageModelStreamResponse
48
43
  from unique_toolkit.services.knowledge_base import KnowledgeBaseService
49
44
  from unique_toolkit.short_term_memory.service import ShortTermMemoryService
@@ -376,6 +371,8 @@ class DisplayCodeInterpreterFilesPostProcessor(
376
371
  company_id: str | None = None,
377
372
  user_id: str | None = None,
378
373
  chat_id: str | None = None,
374
+ code_execution_fence_enabled: bool = True,
375
+ html_with_fence_enabled: bool = True,
379
376
  ) -> None:
380
377
  super().__init__(self.__class__.__name__)
381
378
 
@@ -383,7 +380,6 @@ class DisplayCodeInterpreterFilesPostProcessor(
383
380
  self._chat_service = chat_service
384
381
  self._client = client
385
382
  self._config = config
386
- self._company_id = company_id
387
383
 
388
384
  if self._chat_service is None:
389
385
  raise ValueError("ChatService is required if uploadToChat is True")
@@ -404,9 +400,11 @@ class DisplayCodeInterpreterFilesPostProcessor(
404
400
  self._file_size_map: dict[str, int] = {}
405
401
  self._container_files: list[CodeInterpreterContainerFile] = []
406
402
 
407
- # Resolved in run() (before apply_postprocessing_to_response) since flag evaluation is async.
408
- self._fence_ff_on = False
409
- self._html_fence_ff_on = False
403
+ # Both switches are plain config values now (were FFs UN-17972 / UN-17927).
404
+ # They live on ShowExecutedCodePostprocessorConfig ("Code display" on the
405
+ # config page) and are passed in by the orchestrator.
406
+ self._fence_enabled = code_execution_fence_enabled
407
+ self._html_fence_enabled = html_with_fence_enabled
410
408
 
411
409
  def _build_retry(self) -> AsyncRetrying:
412
410
  """Build a tenacity retry policy from the current config.
@@ -511,17 +509,6 @@ class DisplayCodeInterpreterFilesPostProcessor(
511
509
  run_t0 = time.monotonic()
512
510
  self._log.info("run() started — fetching and uploading code interpreter files")
513
511
 
514
- self._fence_ff_on = await is_flag_enabled(
515
- FeatureFlagNames.enable_code_execution_fence_un_17972,
516
- company_id=self._company_id or COMPANY_ID_PLACEHOLDER,
517
- )
518
- # htmlWithSource requires BOTH the fence FF and the HTML-fence FF on; default
519
- # (FF off) keeps HtmlRendering, so existing deployments are unaffected.
520
- self._html_fence_ff_on = await is_flag_enabled(
521
- FeatureFlagNames.enable_html_with_fence_un_17927,
522
- company_id=self._company_id or COMPANY_ID_PLACEHOLDER,
523
- )
524
-
525
512
  container_files = await self._resolve_container_files(loop_response)
526
513
  self._container_files = container_files
527
514
  self._log.info(
@@ -668,9 +655,9 @@ class DisplayCodeInterpreterFilesPostProcessor(
668
655
  ) -> bool:
669
656
  apply_t0 = time.monotonic()
670
657
  self._log.info(
671
- "apply_postprocessing started — %d file(s) in content_map, fence_ff=%s",
658
+ "apply_postprocessing started — %d file(s) in content_map, fence_enabled=%s",
672
659
  len(self._content_map),
673
- self._fence_ff_on,
660
+ self._fence_enabled,
674
661
  )
675
662
 
676
663
  if loop_response.message.references is None:
@@ -711,9 +698,9 @@ class DisplayCodeInterpreterFilesPostProcessor(
711
698
  )
712
699
  changed |= replaced
713
700
 
714
- # HTML rendered as HtmlRendering block unless the dedicated html-fence FF
715
- # is on (enable_html_with_fence_un_17927). Default keeps HtmlRendering.
716
- elif is_html and not self._html_fence_ff_on:
701
+ # HTML uses HtmlRendering unless BOTH switches are on (htmlWithSource
702
+ # needs the code-execution fence too).
703
+ elif is_html and not (self._html_fence_enabled and self._fence_enabled):
717
704
  loop_response.message.text, replaced = _replace_container_html_citation(
718
705
  text=loop_response.message.text or "",
719
706
  filename=filename,
@@ -721,15 +708,15 @@ class DisplayCodeInterpreterFilesPostProcessor(
721
708
  )
722
709
  changed |= replaced
723
710
 
724
- # Non-HTML files, or HTML when self._html_fence_ff_on → inline content link for
725
- # subsequent fence injection (htmlWithSource / imgWithSource / fileWithSource)
711
+ # Non-HTML files, or HTML when both fence switches are on → inline
712
+ # content link for subsequent fence injection
726
713
  else:
727
714
  loop_response.message.text, replaced = _replace_container_file_citation(
728
715
  text=loop_response.message.text or "",
729
716
  filename=filename,
730
717
  content_id=content_id,
731
718
  ref_number=ref_number,
732
- use_content_link=self._fence_ff_on,
719
+ use_content_link=self._fence_enabled,
733
720
  )
734
721
  changed |= replaced
735
722
 
@@ -746,7 +733,7 @@ class DisplayCodeInterpreterFilesPostProcessor(
746
733
 
747
734
  # HtmlRendering and htmlWithSource both embed contentId directly — no ContentReference needed
748
735
  is_html_rendered = is_html
749
- if replaced and not (is_image or is_html_rendered or self._fence_ff_on):
736
+ if replaced and not (is_image or is_html_rendered or self._fence_enabled):
750
737
  loop_response.message.references.append(
751
738
  ContentReference(
752
739
  sequence_number=ref_number,
@@ -765,12 +752,12 @@ class DisplayCodeInterpreterFilesPostProcessor(
765
752
  error_files,
766
753
  )
767
754
 
768
- if self._fence_ff_on:
755
+ if self._fence_enabled:
769
756
  code_blocks = _build_code_blocks(
770
757
  loop_response,
771
758
  self._content_map,
772
759
  self._container_files,
773
- include_html=self._html_fence_ff_on,
760
+ include_html=self._html_fence_enabled,
774
761
  )
775
762
  self._log.info(
776
763
  "Fence injection — %d code block(s), files: %s",
@@ -778,7 +765,7 @@ class DisplayCodeInterpreterFilesPostProcessor(
778
765
  [f.filename for b in code_blocks for f in b.files],
779
766
  )
780
767
  _warn_unmatched_code_blocks(
781
- self._content_map, code_blocks, include_html=self._html_fence_ff_on
768
+ self._content_map, code_blocks, include_html=self._html_fence_enabled
782
769
  )
783
770
  text_before = loop_response.message.text
784
771
  loop_response.message.text = _inject_code_execution_fences(
@@ -1503,7 +1490,7 @@ def _warn_unmatched_code_blocks(
1503
1490
  ) -> None:
1504
1491
  """Warn for files that were uploaded but could not be matched to any code block.
1505
1492
 
1506
- When the fence feature flag is on, every uploaded file should map to a code block
1493
+ When fence rendering is enabled, every uploaded file should map to a code block
1507
1494
  via its /mnt/data/<filename> path so it can receive a fence. If a file is not
1508
1495
  matched (e.g. the LLM used a variable for the output path rather than a literal
1509
1496
  string) it falls back to a plain unique://content/ link with no code context.
@@ -1634,10 +1621,10 @@ def _replace_container_file_citation(
1634
1621
  ) -> tuple[str, bool]:
1635
1622
  """Replace a sandbox file link with either an inline content link or a superscript ref.
1636
1623
 
1637
- When the fence feature flag is on (use_content_link=True), the sandbox link is
1638
- replaced with [filename](unique://content/{id}) so the subsequent fence injection
1639
- step can locate and wrap it. When the flag is off (use_content_link=False), the
1640
- original pre-fence behaviour is restored: the link is replaced with <sup>N</sup>
1624
+ When fence rendering is enabled in the config (use_content_link=True), the sandbox
1625
+ link is replaced with [filename](unique://content/{id}) so the subsequent fence
1626
+ injection step can locate and wrap it. When it is disabled (use_content_link=False),
1627
+ the original pre-fence behaviour is restored: the link is replaced with <sup>N</sup>
1641
1628
  and the file remains accessible via the references panel.
1642
1629
  """
1643
1630
  file_markdown = _sandbox_link_pattern(filename)
@@ -96,9 +96,9 @@ DEFAULT_TOOL_DESCRIPTION_FOR_SYSTEM_PROMPT = (
96
96
  _TOOL_DESCRIPTION_FOR_SYSTEM_PROMPT_BASE + _TOOL_DESCRIPTION_FILES_SUFFIX
97
97
  ).strip()
98
98
 
99
- # Used when the code-execution fence feature flag (UN-17972) is enabled.
100
- # The frontend derives the artifact title from the filename itself, so the
101
- # LLM no longer needs to produce a markdown heading before the sandbox link.
99
+ # Default system prompt. The frontend derives the artifact title from the
100
+ # filename itself, so the LLM does not need to produce a markdown heading
101
+ # before the sandbox link.
102
102
  #
103
103
  # UN-19711 / Horizon follow-up: The HTML rules in the fence prompt reduce iframe height
104
104
  # collapse when chat auto-measures the embedded document. Remaining gaps belong in the
@@ -653,6 +653,8 @@ class AgenticTableService:
653
653
  row_orders: list[int],
654
654
  status: RowVerificationStatus,
655
655
  locked: bool | None = None,
656
+ *,
657
+ emit_library_sheet_verified_event: bool | None = None,
656
658
  ):
657
659
  """Update the verification status of multiple rows at once.
658
660
 
@@ -660,24 +662,27 @@ class AgenticTableService:
660
662
  row_orders: The row indexes to update.
661
663
  status: The verification status to set (``NEEDS_REVIEW``, etc.; matches public API).
662
664
  locked: When set, forwarded as ``locked`` on ``POST .../rows/bulk-update-status``.
665
+ emit_library_sheet_verified_event: When set, forwarded as
666
+ ``emitLibrarySheetVerifiedEvent``. ``False`` marks the rows without
667
+ starting a ``LIBRARY_SHEET_ROW_VERIFIED`` run on library sheets; use it
668
+ when the caller has already ingested the rows. ``None`` omits the field
669
+ and keeps the server default (``True``). Servers that predate the field
670
+ reject it with a 400, so only set it against a backend that supports it.
663
671
  """
664
- if locked is None:
665
- await AgenticTable.bulk_update_status(
666
- user_id=self._user_id,
667
- company_id=self._company_id,
668
- tableId=self.table_id,
669
- rowOrders=row_orders,
670
- status=status,
671
- )
672
- else:
673
- await AgenticTable.bulk_update_status(
674
- user_id=self._user_id,
675
- company_id=self._company_id,
676
- tableId=self.table_id,
677
- rowOrders=row_orders,
678
- status=status,
679
- locked=locked,
680
- )
672
+ params: AgenticTable.BulkUpdateStatus = {
673
+ "tableId": self.table_id,
674
+ "rowOrders": row_orders,
675
+ "status": status,
676
+ }
677
+ if locked is not None:
678
+ params["locked"] = locked
679
+ if emit_library_sheet_verified_event is not None:
680
+ params["emitLibrarySheetVerifiedEvent"] = emit_library_sheet_verified_event
681
+ await AgenticTable.bulk_update_status(
682
+ user_id=self._user_id,
683
+ company_id=self._company_id,
684
+ **params,
685
+ )
681
686
 
682
687
  async def import_questions_and_sources(
683
688
  self,
@@ -188,6 +188,46 @@ async def modify_message_async(
188
188
  raise e
189
189
 
190
190
 
191
+ async def mark_turn_system_interrupted_async(
192
+ user_id: str,
193
+ company_id: str,
194
+ chat_id: str,
195
+ user_message_id: str,
196
+ ) -> ChatMessage:
197
+ """Marks the turn anchored on *user_message_id* as system-interrupted.
198
+
199
+ Persists ``turnInterruptionReason = SYSTEM_INTERRUPTED`` on the originating
200
+ USER message via a dedicated service-authenticated node-chat endpoint. The
201
+ server guarantees idempotency and never overwrites ``userAbortedAt`` (a
202
+ user-initiated stop wins if both race).
203
+
204
+ Args:
205
+ user_id (str): The user ID.
206
+ company_id (str): The company ID.
207
+ chat_id (str): The chat ID.
208
+ user_message_id (str): The originating USER message of the turn.
209
+
210
+ Returns:
211
+ ChatMessage: The USER message after the update (unchanged if the call
212
+ was a no-op due to idempotency or a racing user stop).
213
+
214
+ Raises:
215
+ Exception: If the request fails.
216
+
217
+ """
218
+ try:
219
+ message = await unique_sdk.Message.mark_turn_system_interrupted_async(
220
+ user_id=user_id,
221
+ company_id=company_id,
222
+ id=user_message_id,
223
+ chatId=chat_id,
224
+ )
225
+ return ChatMessage(**message)
226
+ except Exception as e:
227
+ _LOGGER.error(f"Failed to mark turn as system-interrupted: {e}")
228
+ raise e
229
+
230
+
191
231
  def map_references(references: list[ContentReference]) -> list[dict[str, Any]]:
192
232
  return [
193
233
  {
@@ -192,6 +192,12 @@ class MessageLogStatus(StrEnum):
192
192
  RUNNING = "RUNNING"
193
193
  COMPLETED = "COMPLETED"
194
194
  FAILED = "FAILED"
195
+ CANCELLED = "CANCELLED"
196
+ """The user pressed Stop while this thinking/tool step was in flight.
197
+
198
+ Use ``FAILED`` for system-side interruption (timeout, truncation, terminal
199
+ backend failure), not for user-initiated cancellation.
200
+ """
195
201
 
196
202
 
197
203
  class MessageExecutionStatus(StrEnum):