unique_toolkit 1.53.1__tar.gz → 1.53.2__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 (288) hide show
  1. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/PKG-INFO +1 -1
  2. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/pyproject.toml +1 -1
  3. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/hallucination/utils.py +4 -2
  4. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/feature_flags/feature_flags.py +5 -0
  5. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +7 -5
  6. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +17 -0
  7. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +211 -3
  8. unique_toolkit-1.53.2/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +22 -0
  9. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/language_model/schemas.py +8 -1
  10. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/README.md +0 -0
  11. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/__init__.py +0 -0
  12. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/__init__.py +0 -0
  13. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/_base_service.py +0 -0
  14. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/_time_utils.py +0 -0
  15. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  16. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  17. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  18. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  19. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  20. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  21. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  22. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/config_checker/README.md +0 -0
  23. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/config_checker/__init__.py +0 -0
  24. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/config_checker/__main__.py +0 -0
  25. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/config_checker/cli.py +0 -0
  26. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/config_checker/differ.py +0 -0
  27. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/config_checker/exporter.py +0 -0
  28. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/config_checker/models.py +0 -0
  29. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/config_checker/registry.py +0 -0
  30. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/config_checker/validator.py +0 -0
  31. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/default_language_model.py +0 -0
  32. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
  33. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/docx_generator/config.py +0 -0
  34. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
  35. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
  36. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/docx_generator/service.py +0 -0
  37. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
  38. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/endpoint_builder.py +0 -0
  39. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  40. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/event_bus.py +0 -0
  41. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/exception.py +0 -0
  42. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/execution.py +0 -0
  43. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
  44. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
  45. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
  46. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
  47. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
  48. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
  49. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
  50. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
  51. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
  52. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
  53. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
  54. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
  55. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
  56. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
  57. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
  58. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
  59. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
  60. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
  61. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
  62. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
  63. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
  64. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
  65. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
  66. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
  67. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
  68. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
  69. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
  70. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  71. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  72. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  73. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/referencing.py +0 -0
  74. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/string_utilities.py +0 -0
  75. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/tests/test_referencing.py +0 -0
  76. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
  77. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/token/__init__.py +0 -0
  78. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  79. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/token/token_counting.py +0 -0
  80. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
  81. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
  82. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/utils/__init__.py +0 -0
  83. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/utils/files.py +0 -0
  84. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/utils/image/encode.py +0 -0
  85. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
  86. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/utils/jinja/render.py +0 -0
  87. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
  88. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
  89. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  90. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  91. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  92. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/validate_required_values.py +0 -0
  93. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/_common/validators.py +0 -0
  94. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/__init__.py +0 -0
  95. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
  96. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
  97. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/config.py +0 -0
  98. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
  99. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
  100. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
  101. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  102. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
  103. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
  104. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  105. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  106. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
  107. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
  108. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
  109. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
  110. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  111. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  112. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
  113. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
  114. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
  115. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  116. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
  117. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -0
  118. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  119. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
  120. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/evaluation/utils.py +0 -0
  121. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
  122. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  123. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  124. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
  125. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  126. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/loop_runner/__init__.py +0 -0
  127. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
  128. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
  129. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
  130. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
  131. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/loop_runner/base.py +0 -0
  132. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
  133. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
  134. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +0 -0
  135. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
  136. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
  137. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
  138. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
  139. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
  140. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
  141. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
  142. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
  143. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
  144. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
  145. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
  146. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  147. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
  148. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
  149. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
  150. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
  151. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  152. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  153. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/__init__.py +0 -0
  154. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  155. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  156. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  157. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  158. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  159. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
  160. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  161. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  162. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  163. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
  164. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
  165. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  166. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
  167. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  168. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
  169. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
  170. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  171. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
  172. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
  173. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  174. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  175. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  176. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  177. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  178. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
  179. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  180. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/config.py +0 -0
  181. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/factory.py +0 -0
  182. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  183. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  184. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  185. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
  186. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
  187. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
  188. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
  189. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
  190. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
  191. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +0 -0
  192. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
  193. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/schemas.py +0 -0
  194. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  195. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  196. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/tool.py +0 -0
  197. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
  198. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  199. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  200. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  201. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  202. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  203. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  204. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic_table/__init__.py +0 -0
  205. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic_table/schemas.py +0 -0
  206. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/agentic_table/service.py +0 -0
  207. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/app/__init__.py +0 -0
  208. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/app/dev_util.py +0 -0
  209. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/app/fast_api_factory.py +0 -0
  210. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/app/init_logging.py +0 -0
  211. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/app/init_sdk.py +0 -0
  212. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/app/performance/async_tasks.py +0 -0
  213. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  214. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/app/schemas.py +0 -0
  215. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/app/unique_settings.py +0 -0
  216. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/app/verification.py +0 -0
  217. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/app/webhook.py +0 -0
  218. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/chat/__init__.py +0 -0
  219. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/chat/cancellation.py +0 -0
  220. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/chat/constants.py +0 -0
  221. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/chat/deprecated/service.py +0 -0
  222. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/chat/functions.py +0 -0
  223. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/chat/rendering.py +0 -0
  224. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/chat/responses_api.py +0 -0
  225. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/chat/schemas.py +0 -0
  226. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/chat/service.py +0 -0
  227. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/chat/state.py +0 -0
  228. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/chat/utils.py +0 -0
  229. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/content/__init__.py +0 -0
  230. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/content/constants.py +0 -0
  231. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/content/functions.py +0 -0
  232. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/content/schemas.py +0 -0
  233. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/content/service.py +0 -0
  234. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/content/smart_rules.py +0 -0
  235. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/content/utils.py +0 -0
  236. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/data_extraction/README.md +0 -0
  237. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/data_extraction/__init__.py +0 -0
  238. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
  239. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/data_extraction/augmented/service.py +0 -0
  240. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/data_extraction/base.py +0 -0
  241. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
  242. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/data_extraction/basic/config.py +0 -0
  243. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
  244. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/data_extraction/basic/service.py +0 -0
  245. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/elicitation/__init__.py +0 -0
  246. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/elicitation/constants.py +0 -0
  247. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/elicitation/exceptions.py +0 -0
  248. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/elicitation/functions.py +0 -0
  249. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/elicitation/schemas.py +0 -0
  250. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/elicitation/service.py +0 -0
  251. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/embedding/__init__.py +0 -0
  252. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/embedding/constants.py +0 -0
  253. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/embedding/functions.py +0 -0
  254. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/embedding/schemas.py +0 -0
  255. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/embedding/service.py +0 -0
  256. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/embedding/utils.py +0 -0
  257. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/framework_utilities/__init__.py +0 -0
  258. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
  259. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  260. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  261. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  262. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  263. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  264. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/framework_utilities/utils.py +0 -0
  265. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/language_model/__init__.py +0 -0
  266. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
  267. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/language_model/builder.py +0 -0
  268. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/language_model/constants.py +0 -0
  269. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/language_model/default_language_model.py +0 -0
  270. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/language_model/functions.py +0 -0
  271. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/language_model/infos.py +0 -0
  272. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/language_model/prompt.py +0 -0
  273. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/language_model/reference.py +0 -0
  274. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/language_model/service.py +0 -0
  275. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/language_model/stream_transform.py +0 -0
  276. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/language_model/utils.py +0 -0
  277. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/protocols/support.py +0 -0
  278. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/services/__init__.py +0 -0
  279. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/services/chat_service.py +0 -0
  280. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/services/knowledge_base.py +0 -0
  281. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/short_term_memory/__init__.py +0 -0
  282. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/short_term_memory/constants.py +0 -0
  283. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/short_term_memory/functions.py +0 -0
  284. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/short_term_memory/schemas.py +0 -0
  285. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/short_term_memory/service.py +0 -0
  286. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/smart_rules/__init__.py +0 -0
  287. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/unique_toolkit/smart_rules/compile.py +0 -0
  288. {unique_toolkit-1.53.1 → unique_toolkit-1.53.2}/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: 1.53.1
3
+ Version: 1.53.2
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 = "1.53.1"
3
+ version = "1.53.2"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -203,8 +203,10 @@ def context_text_from_stream_response(
203
203
  SourceSelectionMode.FROM_ORDER: lambda: _from_order_source_selection_mode(
204
204
  response_references, selected_chunks
205
205
  ),
206
- SourceSelectionMode.FROM_ORIGINAL_RESPONSE: lambda: _from_original_response_source_selection_mode(
207
- response.message.original_text, selected_chunks, reference_pattern
206
+ SourceSelectionMode.FROM_ORIGINAL_RESPONSE: lambda: (
207
+ _from_original_response_source_selection_mode(
208
+ response.message.original_text, selected_chunks, reference_pattern
209
+ )
208
210
  ),
209
211
  }
210
212
 
@@ -77,6 +77,11 @@ class FeatureFlags(BaseSettings):
77
77
  description="Enable HTML rendering for code interpreter files (UN-15131). Can be 'true' or comma-separated company IDs.",
78
78
  )
79
79
 
80
+ enable_code_execution_fence_un_17972: FeatureFlag = Field(
81
+ default=FeatureFlag(False),
82
+ 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.",
83
+ )
84
+
80
85
  model_config = SettingsConfigDict(
81
86
  extra="ignore",
82
87
  env_prefix="FEATURE_FLAG_",
@@ -88,11 +88,13 @@ def _add_sub_agent_references_in_place(
88
88
  message_text=text,
89
89
  message_refs=refs,
90
90
  new_refs=sub_agent_refs,
91
- ref_pattern_f=lambda x: r"\s*" # Normalize spaces
92
- + SubAgentTool.get_sub_agent_reference_re(
93
- name=response.name,
94
- sequence_number=response.sequence_number,
95
- reference_number=x,
91
+ ref_pattern_f=lambda x: (
92
+ r"\s*" # Normalize spaces
93
+ + SubAgentTool.get_sub_agent_reference_re(
94
+ name=response.name,
95
+ sequence_number=response.sequence_number,
96
+ reference_number=x,
97
+ )
96
98
  ),
97
99
  ref_replacement_f=lambda x: " " + get_reference_pattern(x),
98
100
  )
@@ -24,6 +24,23 @@ _TEMPLATE = """
24
24
 
25
25
  """.lstrip()
26
26
 
27
+ # Pattern matching the block emitted by _TEMPLATE (including trailing </br>).
28
+ # Used when another postprocessor supersedes this content (e.g. fence injection).
29
+ _EXECUTED_CODE_BLOCK_RE = re.compile(
30
+ r"\n*<details><summary>Code Interpreter Call</summary>.*?</details>[ \t]*\n*(?:[ \t]*</br>[ \t]*\n*)?",
31
+ re.DOTALL,
32
+ )
33
+
34
+
35
+ def strip_executed_code_blocks(text: str) -> str:
36
+ """Remove all executed-code <details> blocks emitted by this postprocessor.
37
+
38
+ Call this when the same content is represented elsewhere (e.g. imgWithSource
39
+ / fileWithSource fences) so the message does not contain duplicate code blocks.
40
+ """
41
+ return _EXECUTED_CODE_BLOCK_RE.sub("", text)
42
+
43
+
27
44
  logger = logging.getLogger(__name__)
28
45
 
29
46
 
@@ -1,4 +1,5 @@
1
1
  import asyncio
2
+ import json
2
3
  import logging
3
4
  import re
4
5
  from mimetypes import guess_type
@@ -19,6 +20,14 @@ from unique_toolkit.agentic.short_term_memory_manager.persistent_short_term_memo
19
20
  PersistentShortMemoryManager,
20
21
  )
21
22
  from unique_toolkit.agentic.tools.config import get_configuration_dict
23
+ from unique_toolkit.agentic.tools.openai_builtin.code_interpreter.postprocessors.code_display import (
24
+ strip_executed_code_blocks,
25
+ )
26
+ from unique_toolkit.agentic.tools.openai_builtin.code_interpreter.schemas import (
27
+ CodeInterpreterBlock,
28
+ CodeInterpreterFile,
29
+ CodeInterpreterFileType,
30
+ )
22
31
  from unique_toolkit.content.schemas import ContentReference
23
32
  from unique_toolkit.content.service import ContentService
24
33
  from unique_toolkit.language_model.schemas import ResponsesLanguageModelStreamResponse
@@ -188,7 +197,7 @@ class DisplayCodeInterpreterFilesPostProcessor(
188
197
  loop_response.message.text, replaced = _replace_container_file_citation(
189
198
  text=loop_response.message.text,
190
199
  filename=filename,
191
- ref_number=ref_number,
200
+ content_id=content_id,
192
201
  )
193
202
  changed |= replaced
194
203
 
@@ -209,6 +218,18 @@ class DisplayCodeInterpreterFilesPostProcessor(
209
218
  )
210
219
  )
211
220
  ref_number += 1
221
+
222
+ if feature_flags.enable_code_execution_fence_un_17972.is_enabled(
223
+ self._company_id
224
+ ):
225
+ code_blocks = _build_code_blocks(loop_response, self._content_map)
226
+ text_before = loop_response.message.text
227
+ loop_response.message.text = _inject_code_execution_fences(
228
+ loop_response.message.text,
229
+ code_blocks,
230
+ )
231
+ changed |= loop_response.message.text != text_before
232
+
212
233
  return changed
213
234
 
214
235
  @override
@@ -273,6 +294,193 @@ class DisplayCodeInterpreterFilesPostProcessor(
273
294
  )
274
295
 
275
296
 
297
+ def _get_file_type(filename: str) -> CodeInterpreterFileType:
298
+ mime = guess_type(filename)[0] or ""
299
+ if mime.startswith("image/"):
300
+ return "image"
301
+ if mime == "text/html":
302
+ return "html"
303
+ return "document"
304
+
305
+
306
+ def _file_title(filename: str) -> str:
307
+ """Derive a human-readable title from a filename.
308
+
309
+ Strips the extension, replaces underscores and hyphens with spaces, and
310
+ applies title case. e.g. monthly_revenue_chart.png -> Monthly Revenue Chart.
311
+ """
312
+ stem = filename.rsplit(".", 1)[0] if "." in filename else filename
313
+ return stem.replace("_", " ").replace("-", " ").title()
314
+
315
+
316
+ def _file_frontend_type(filename: str) -> str:
317
+ """Map filename to the type token the frontend expects in fileWithSource.
318
+
319
+ Assumed enum (to be confirmed with frontend):
320
+ excel → .xlsx / .xls
321
+ csv → .csv
322
+ word → .docx / .doc
323
+ pdf → .pdf
324
+ html → .html / .htm
325
+ image → image/* MIME
326
+ document → fallback
327
+ """
328
+ ext = filename.rsplit(".", 1)[-1].lower() if "." in filename else ""
329
+ mime = guess_type(filename)[0] or ""
330
+ if mime.startswith("image/"):
331
+ return "image"
332
+ mapping = {
333
+ "xlsx": "excel",
334
+ "xls": "excel",
335
+ "csv": "csv",
336
+ "docx": "word",
337
+ "doc": "word",
338
+ "pdf": "pdf",
339
+ "html": "html",
340
+ "htm": "html",
341
+ }
342
+ return mapping.get(ext, "document")
343
+
344
+
345
+ def _escape_code_attr(code: str) -> str:
346
+ """Escape the code string for embedding as a double-quoted attribute value.
347
+
348
+ Uses JSON encoding so all special characters (quotes, backslashes, newlines,
349
+ control chars) are handled consistently and safely.
350
+ """
351
+ return json.dumps(code.rstrip())[1:-1]
352
+
353
+
354
+ def _build_file_fence(file: CodeInterpreterFile, code: str, fence_id: int) -> str:
355
+ """Build a per-file fence marker.
356
+
357
+ Images produce an imgWithSource fence; all other types produce a
358
+ fileWithSource fence. Each fence is self-contained: it carries the
359
+ content_id, a title derived from the filename, the type, and the
360
+ escaped source code.
361
+
362
+ Format (4 backticks so inner code backticks never close the fence):
363
+ ````imgWithSource(id='{n}', contentId='{id}', title="{title}", code="{escaped_code}")````
364
+ ````fileWithSource(id='{n}', contentId='{id}', title="{title}", type="{type}", code="{escaped_code}")````
365
+ """
366
+ title = _file_title(file.filename)
367
+ escaped = _escape_code_attr(code)
368
+ outer = "````"
369
+ if file.type == "image":
370
+ tag = f"imgWithSource(id='{fence_id}', contentId='{file.content_id}', title=\"{title}\", code=\"{escaped}\")"
371
+ else:
372
+ ftype = _file_frontend_type(file.filename)
373
+ tag = f'fileWithSource(id=\'{fence_id}\', contentId=\'{file.content_id}\', title="{title}", type="{ftype}", code="{escaped}")'
374
+ return f"{outer}{tag}{outer}"
375
+
376
+
377
+ def _inline_ref_pattern(file: CodeInterpreterFile) -> re.Pattern[str]:
378
+ """Return a compiled pattern matching the inline ref for a file in message text.
379
+
380
+ After apply_postprocessing_to_response replaces sandbox paths, each file type
381
+ has a distinct inline form in the text:
382
+ image → ![image](unique://content/{content_id})
383
+ document → [{filename}](unique://content/{content_id})
384
+ html → ```HtmlRendering\\n100%\\n500px\\n\\nunique://content/{content_id}\\n\\n```
385
+ """
386
+ cid = re.escape(file.content_id)
387
+ fname = re.escape(file.filename)
388
+ if file.type == "image":
389
+ return re.compile(rf"!\[image\]\(unique://content/{cid}\)")
390
+ if file.type == "html":
391
+ return re.compile(
392
+ rf"```HtmlRendering\n100%\n500px\n\nunique://content/{cid}\n\n```",
393
+ re.DOTALL,
394
+ )
395
+ return re.compile(rf"\[{fname}\]\(unique://content/{cid}\)")
396
+
397
+
398
+ def _inject_code_execution_fences(
399
+ text: str, code_blocks: list[CodeInterpreterBlock]
400
+ ) -> str:
401
+ """Replace inline file refs with imgWithSource / fileWithSource fences.
402
+
403
+ Images get an imgWithSource fence; all other files (PDF, Excel, Word, CSV, etc.)
404
+ get a fileWithSource fence. Both carry contentId, title, type (fileWithSource only),
405
+ and the generating code so the frontend can render or offer a download with full
406
+ context.
407
+
408
+ Each file gets its own fence placed at the position of its inline ref. Duplicate
409
+ refs for the same file (overwrite case) are removed after the first is replaced.
410
+ When at least one fence was injected, executed-code <details> blocks are
411
+ stripped via strip_executed_code_blocks() from the code_display postprocessor.
412
+
413
+ fence_id is a message-level counter so each fence has a unique id.
414
+ """
415
+ fence_id = 1
416
+ any_fence_injected = False
417
+ for block in code_blocks:
418
+ for file in block.files:
419
+ fence = _build_file_fence(file, block.code, fence_id)
420
+ pattern = _inline_ref_pattern(file)
421
+ new_text, n = re.subn(pattern, lambda m, _f=fence: _f, text, count=1)
422
+ if n:
423
+ text = new_text
424
+ fence_id += 1
425
+ any_fence_injected = True
426
+ # Remove duplicate refs (overwrite case)
427
+ text = re.sub(pattern, "", text)
428
+ if any_fence_injected:
429
+ text = strip_executed_code_blocks(text)
430
+ return text
431
+
432
+
433
+ def _build_code_blocks(
434
+ loop_response: ResponsesLanguageModelStreamResponse,
435
+ content_map: dict[str, str | None],
436
+ ) -> list[CodeInterpreterBlock]:
437
+ """Map each code interpreter call to the files it produced via /mnt/data/ path matching.
438
+
439
+ For each file, the LAST code block that references its path is treated as the
440
+ producer — this handles the case where a file is overwritten across blocks, where
441
+ the final content belongs to the last writer.
442
+ """
443
+ calls = loop_response.code_interpreter_calls
444
+
445
+ # Step 1: for each file, find the index of the last block that references it.
446
+ file_to_block_idx: dict[str, int] = {}
447
+ for idx, call in enumerate(calls):
448
+ if not call.code:
449
+ continue
450
+ for annotation in loop_response.container_files:
451
+ if (
452
+ content_map.get(annotation.filename) is not None
453
+ and f"/mnt/data/{annotation.filename}" in call.code
454
+ ):
455
+ file_to_block_idx[annotation.filename] = idx
456
+
457
+ # Step 2: group files by their owning block index, deduplicating by filename.
458
+ # OpenAI may emit multiple annotations for the same filename when a file is
459
+ # overwritten across executions. Using a dict keyed by filename ensures each
460
+ # file appears exactly once per block (last annotation wins, consistent with
461
+ # the last-writer-wins rule applied in step 1).
462
+ block_file_map: dict[int, dict[str, CodeInterpreterFile]] = {}
463
+ for annotation in loop_response.container_files:
464
+ content_id = content_map.get(annotation.filename)
465
+ if content_id is None:
466
+ continue
467
+ idx = file_to_block_idx.get(annotation.filename)
468
+ if idx is None:
469
+ continue
470
+ block_file_map.setdefault(idx, {})[annotation.filename] = CodeInterpreterFile(
471
+ filename=annotation.filename,
472
+ content_id=content_id,
473
+ type=_get_file_type(annotation.filename),
474
+ )
475
+
476
+ # Step 3: build result preserving block execution order.
477
+ return [
478
+ CodeInterpreterBlock(code=calls[idx].code, files=list(files.values()))
479
+ for idx, files in sorted(block_file_map.items())
480
+ if calls[idx].code
481
+ ]
482
+
483
+
276
484
  def _get_next_ref_number(references: list[ContentReference]) -> int:
277
485
  max_ref_number = 0
278
486
  for ref in references:
@@ -339,7 +547,7 @@ unique://content/{content_id}
339
547
 
340
548
 
341
549
  def _replace_container_file_citation(
342
- text: str, filename: str, ref_number: int
550
+ text: str, filename: str, content_id: str
343
551
  ) -> tuple[str, bool]:
344
552
  file_markdown = rf"\[.*?\]\(sandbox:/mnt/data/{re.escape(filename)}\)"
345
553
 
@@ -350,6 +558,6 @@ def _replace_container_file_citation(
350
558
  logger.info("Displaying file %s", filename)
351
559
  return re.sub(
352
560
  file_markdown,
353
- f"<sup>{ref_number}</sup>",
561
+ f"[{filename}](unique://content/{content_id})",
354
562
  text,
355
563
  ), True
@@ -0,0 +1,22 @@
1
+ """Code interpreter types used by the generated-files postprocessor."""
2
+
3
+ from typing import Literal
4
+
5
+ from pydantic import BaseModel
6
+
7
+ CodeInterpreterFileType = Literal["image", "document", "html"]
8
+
9
+
10
+ class CodeInterpreterFile(BaseModel):
11
+ """A single file produced by a code interpreter execution."""
12
+
13
+ filename: str
14
+ content_id: str
15
+ type: CodeInterpreterFileType
16
+
17
+
18
+ class CodeInterpreterBlock(BaseModel):
19
+ """A code interpreter execution paired with the files it produced."""
20
+
21
+ code: str
22
+ files: list[CodeInterpreterFile]
@@ -210,7 +210,14 @@ class ResponsesLanguageModelStreamResponse(LanguageModelStreamResponse):
210
210
  if content.type == "output_text":
211
211
  for annotation in content.annotations:
212
212
  if annotation.type == "container_file_citation":
213
- container_files.append(annotation)
213
+ # Filter out ghost annotations produced as a side-effect of
214
+ # OutputImage being present. These entries have
215
+ # start_index == end_index (zero-width, no text span) and
216
+ # filename == file_id. The index check alone is sufficient
217
+ # because all legitimate citations reference an actual span
218
+ # of text (start_index < end_index).
219
+ if annotation.start_index != annotation.end_index:
220
+ container_files.append(annotation)
214
221
  return container_files
215
222
 
216
223