unique_toolkit 1.68.8__tar.gz → 1.68.10__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 (294) hide show
  1. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/PKG-INFO +1 -1
  2. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/pyproject.toml +1 -1
  3. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +187 -40
  4. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/README.md +0 -0
  5. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/__init__.py +0 -0
  6. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/__init__.py +0 -0
  7. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/_base_service.py +0 -0
  8. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/_time_utils.py +0 -0
  9. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  10. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  11. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  12. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  13. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  14. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  15. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  16. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/config_checker/README.md +0 -0
  17. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/config_checker/__init__.py +0 -0
  18. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/config_checker/__main__.py +0 -0
  19. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/config_checker/cli.py +0 -0
  20. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/config_checker/differ.py +0 -0
  21. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/config_checker/exporter.py +0 -0
  22. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/config_checker/models.py +0 -0
  23. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/config_checker/registry.py +0 -0
  24. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/config_checker/validator.py +0 -0
  25. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/default_language_model.py +0 -0
  26. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
  27. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/docx_generator/config.py +0 -0
  28. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
  29. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
  30. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/docx_generator/service.py +0 -0
  31. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
  32. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/endpoint_builder.py +0 -0
  33. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  34. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/event_bus.py +0 -0
  35. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/exception.py +0 -0
  36. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/execution.py +0 -0
  37. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
  38. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
  39. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
  40. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
  41. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
  42. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
  43. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
  44. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
  45. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
  46. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
  47. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
  48. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
  49. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
  50. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
  51. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
  52. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
  53. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
  54. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
  55. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
  56. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
  57. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
  58. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
  59. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
  60. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
  61. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
  62. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
  63. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
  64. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  65. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  66. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  67. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/referencing.py +0 -0
  68. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/string_utilities.py +0 -0
  69. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/tests/test_referencing.py +0 -0
  70. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
  71. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/token/__init__.py +0 -0
  72. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  73. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/token/token_counting.py +0 -0
  74. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
  75. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
  76. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/utils/__init__.py +0 -0
  77. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/utils/files.py +0 -0
  78. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/utils/image/encode.py +0 -0
  79. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
  80. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/utils/jinja/render.py +0 -0
  81. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
  82. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
  83. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  84. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  85. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  86. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/validate_required_values.py +0 -0
  87. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/_common/validators.py +0 -0
  88. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/__init__.py +0 -0
  89. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
  90. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
  91. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/config.py +0 -0
  92. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
  93. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
  94. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
  95. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  96. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
  97. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
  98. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  99. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  100. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
  101. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
  102. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
  103. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
  104. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  105. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
  106. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  107. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
  108. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
  109. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
  110. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  111. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
  112. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -0
  113. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  114. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
  115. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/evaluation/utils.py +0 -0
  116. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
  117. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/feature_flags/feature_flags.py +0 -0
  118. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  119. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  120. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
  121. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  122. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/loop_runner/__init__.py +0 -0
  123. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
  124. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
  125. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
  126. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
  127. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/loop_runner/base.py +0 -0
  128. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
  129. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
  130. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +0 -0
  131. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
  132. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
  133. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
  134. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
  135. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
  136. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
  137. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
  138. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
  139. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
  140. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
  141. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
  142. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  143. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
  144. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
  145. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
  146. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
  147. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  148. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  149. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/__init__.py +0 -0
  150. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  151. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  152. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  153. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  154. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  155. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
  156. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  157. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  158. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  159. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
  160. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
  161. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  162. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
  163. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
  164. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  165. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
  166. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
  167. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  168. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
  169. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
  170. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  171. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  172. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  173. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  174. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  175. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
  176. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  177. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/config.py +0 -0
  178. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/experimental/__init__.py +0 -0
  179. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/experimental/open_file_tool/__init__.py +0 -0
  180. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/experimental/open_file_tool/config.py +0 -0
  181. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/experimental/open_file_tool/runtime.py +0 -0
  182. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/experimental/open_file_tool/tool.py +0 -0
  183. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/factory.py +0 -0
  184. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  185. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  186. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  187. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
  188. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
  189. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
  190. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
  191. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
  192. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
  193. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +0 -0
  194. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +0 -0
  195. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +0 -0
  196. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
  197. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/schemas.py +0 -0
  198. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  199. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  200. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/tool.py +0 -0
  201. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
  202. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  203. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  204. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  205. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  206. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  207. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  208. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic_table/__init__.py +0 -0
  209. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic_table/schemas.py +0 -0
  210. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/agentic_table/service.py +0 -0
  211. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/app/__init__.py +0 -0
  212. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/app/dev_util.py +0 -0
  213. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/app/fast_api_factory.py +0 -0
  214. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/app/init_logging.py +0 -0
  215. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/app/init_sdk.py +0 -0
  216. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/app/performance/async_tasks.py +0 -0
  217. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  218. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/app/schemas.py +0 -0
  219. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/app/unique_settings.py +0 -0
  220. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/app/verification.py +0 -0
  221. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/app/webhook.py +0 -0
  222. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/chat/__init__.py +0 -0
  223. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/chat/cancellation.py +0 -0
  224. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/chat/constants.py +0 -0
  225. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/chat/deprecated/service.py +0 -0
  226. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/chat/functions.py +0 -0
  227. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/chat/rendering.py +0 -0
  228. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/chat/responses_api.py +0 -0
  229. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/chat/schemas.py +0 -0
  230. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/chat/service.py +0 -0
  231. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/chat/state.py +0 -0
  232. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/chat/utils.py +0 -0
  233. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/content/__init__.py +0 -0
  234. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/content/constants.py +0 -0
  235. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/content/functions.py +0 -0
  236. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/content/schemas.py +0 -0
  237. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/content/service.py +0 -0
  238. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/content/smart_rules.py +0 -0
  239. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/content/utils.py +0 -0
  240. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/data_extraction/README.md +0 -0
  241. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/data_extraction/__init__.py +0 -0
  242. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
  243. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/data_extraction/augmented/service.py +0 -0
  244. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/data_extraction/base.py +0 -0
  245. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
  246. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/data_extraction/basic/config.py +0 -0
  247. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
  248. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/data_extraction/basic/service.py +0 -0
  249. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/elicitation/__init__.py +0 -0
  250. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/elicitation/constants.py +0 -0
  251. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/elicitation/exceptions.py +0 -0
  252. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/elicitation/functions.py +0 -0
  253. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/elicitation/schemas.py +0 -0
  254. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/elicitation/service.py +0 -0
  255. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/embedding/__init__.py +0 -0
  256. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/embedding/constants.py +0 -0
  257. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/embedding/functions.py +0 -0
  258. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/embedding/schemas.py +0 -0
  259. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/embedding/service.py +0 -0
  260. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/embedding/utils.py +0 -0
  261. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/framework_utilities/__init__.py +0 -0
  262. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
  263. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  264. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  265. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  266. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  267. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  268. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/framework_utilities/utils.py +0 -0
  269. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/language_model/__init__.py +0 -0
  270. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
  271. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/language_model/builder.py +0 -0
  272. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/language_model/constants.py +0 -0
  273. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/language_model/default_language_model.py +0 -0
  274. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/language_model/functions.py +0 -0
  275. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/language_model/infos.py +0 -0
  276. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/language_model/prompt.py +0 -0
  277. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/language_model/reference.py +0 -0
  278. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/language_model/schemas.py +0 -0
  279. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/language_model/service.py +0 -0
  280. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/language_model/stream_transform.py +0 -0
  281. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/language_model/utils.py +0 -0
  282. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/protocols/support.py +0 -0
  283. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/services/__init__.py +0 -0
  284. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/services/chat_service.py +0 -0
  285. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/services/factory.py +0 -0
  286. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/services/knowledge_base.py +0 -0
  287. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/short_term_memory/__init__.py +0 -0
  288. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/short_term_memory/constants.py +0 -0
  289. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/short_term_memory/functions.py +0 -0
  290. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/short_term_memory/schemas.py +0 -0
  291. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/short_term_memory/service.py +0 -0
  292. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/smart_rules/__init__.py +0 -0
  293. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/unique_toolkit/smart_rules/compile.py +0 -0
  294. {unique_toolkit-1.68.8 → unique_toolkit-1.68.10}/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.68.8
3
+ Version: 1.68.10
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.68.8"
3
+ version = "1.68.10"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -41,6 +41,14 @@ from unique_toolkit.short_term_memory.service import ShortTermMemoryService
41
41
  logger = logging.getLogger(__name__)
42
42
 
43
43
 
44
+ class _ChatLoggerAdapter(logging.LoggerAdapter[logging.Logger]):
45
+ """LoggerAdapter that prefixes every message with ``[chat_id=…]``."""
46
+
47
+ def process(self, msg: str, kwargs): # type: ignore[override]
48
+ extra = dict(self.extra) if self.extra else {} # type: ignore[arg-type]
49
+ return f"[chat_id={extra.get('chat_id', 'n/a')}] {msg}", kwargs
50
+
51
+
44
52
  class DisplayCodeInterpreterFilesPostProcessorConfig(BaseModel):
45
53
  model_config = get_configuration_dict()
46
54
  upload_to_chat: SkipJsonSchema[bool] = Field(
@@ -53,8 +61,8 @@ class DisplayCodeInterpreterFilesPostProcessorConfig(BaseModel):
53
61
  )
54
62
 
55
63
  file_download_failed_message: str = Field(
56
- default="⚠️ File download failed ...",
57
- description="The message to display when a file download fails.",
64
+ default="⚠️ File could not be generated. Please try again.",
65
+ description="The message to display when a file download fails after all retry attempts.",
58
66
  )
59
67
  max_concurrent_file_downloads: int = Field(
60
68
  default=10,
@@ -122,6 +130,10 @@ class DisplayCodeInterpreterFilesPostProcessor(
122
130
  if self._chat_service is None:
123
131
  raise ValueError("ChatService is required if uploadToChat is True")
124
132
 
133
+ self._log: logging.LoggerAdapter[logging.Logger] = _ChatLoggerAdapter(
134
+ logger, {"chat_id": chat_id or "n/a"}
135
+ )
136
+
125
137
  self._orphan_code_blocks: list[CodeInterpreterBlock] = []
126
138
  self._short_term_memory_manager = None
127
139
  if chat_id is not None and user_id is not None and company_id is not None:
@@ -131,14 +143,44 @@ class DisplayCodeInterpreterFilesPostProcessor(
131
143
  chat_id=chat_id,
132
144
  )
133
145
 
146
+ def _build_retry(self) -> AsyncRetrying:
147
+ """Build a tenacity retry policy from the current config.
148
+
149
+ Reused for both container-file downloads and knowledge-base uploads so
150
+ that every I/O call gets the same exponential-backoff behaviour.
151
+ """
152
+ return AsyncRetrying(
153
+ stop=stop_after_attempt(1 + self._config.max_download_retries),
154
+ wait=wait_exponential(multiplier=self._config.download_retry_base_delay),
155
+ before_sleep=before_sleep_log(self._log, logging.WARNING), # type: ignore[arg-type]
156
+ reraise=True,
157
+ )
158
+
134
159
  @override
135
160
  async def run(self, loop_response: ResponsesLanguageModelStreamResponse) -> None:
136
- logger.info("Fetching and adding code interpreter files to the response")
161
+ self._log.info("run() started — fetching and uploading code interpreter files")
137
162
 
138
163
  container_files = loop_response.container_files
139
- logger.info("Found %s container files", len(container_files))
164
+ self._log.info(
165
+ "run() found %d container file annotation(s): %s",
166
+ len(container_files),
167
+ [cf.filename for cf in container_files],
168
+ )
140
169
 
141
- self._content_map: dict[str, str | None] = await self._load_previous_files() # type: ignore
170
+ try:
171
+ self._content_map: dict[str, str | None] = await self._load_previous_files() # type: ignore
172
+ if self._content_map:
173
+ self._log.info(
174
+ "run() loaded %d previous file(s) from short-term memory: %s",
175
+ len(self._content_map),
176
+ list(self._content_map.keys()),
177
+ )
178
+ except Exception:
179
+ self._log.exception(
180
+ "run() failed to load previous files from short-term memory; "
181
+ "proceeding without previous file context."
182
+ )
183
+ self._content_map = {}
142
184
 
143
185
  semaphore = asyncio.Semaphore(self._config.max_concurrent_file_downloads)
144
186
  tasks = [
@@ -150,32 +192,75 @@ class DisplayCodeInterpreterFilesPostProcessor(
150
192
  results = await asyncio.gather(*tasks)
151
193
 
152
194
  for citation, result in zip(container_files, results):
153
- # Overwrite if file has been re-generated
154
195
  self._content_map[citation.filename] = (
155
196
  result.content_id if result is not None else None
156
197
  )
157
198
 
158
- await self._save_generated_files(
159
- [
160
- _ContentInfo(filename=filename, content_id=content_id)
161
- for filename, content_id in self._content_map.items()
162
- if content_id is not None
163
- ]
199
+ succeeded = {f: cid for f, cid in self._content_map.items() if cid is not None}
200
+ failed = [f for f, cid in self._content_map.items() if cid is None]
201
+ self._log.info(
202
+ "run() download/upload complete — %d succeeded, %d failed. "
203
+ "succeeded=%s, failed=%s",
204
+ len(succeeded),
205
+ len(failed),
206
+ list(succeeded.keys()),
207
+ failed,
164
208
  )
165
209
 
166
- if feature_flags.enable_code_execution_fence_un_17972.is_enabled(
167
- self._company_id
168
- ):
169
- self._orphan_code_blocks = await self._upload_orphan_code_as_txt(
170
- loop_response
210
+ try:
211
+ await self._save_generated_files(
212
+ [
213
+ _ContentInfo(filename=filename, content_id=content_id)
214
+ for filename, content_id in self._content_map.items()
215
+ if content_id is not None
216
+ ]
217
+ )
218
+ except Exception:
219
+ self._log.exception(
220
+ "run() failed to save generated files to short-term memory; "
221
+ "file replacement will still proceed."
222
+ )
223
+
224
+ try:
225
+ if feature_flags.enable_code_execution_fence_un_17972.is_enabled(
226
+ self._company_id
227
+ ):
228
+ self._orphan_code_blocks = await self._upload_orphan_code_as_txt(
229
+ loop_response
230
+ )
231
+ if self._orphan_code_blocks:
232
+ self._log.info(
233
+ "run() produced %d orphan code block(s)",
234
+ len(self._orphan_code_blocks),
235
+ )
236
+ else:
237
+ self._orphan_code_blocks = []
238
+ except Exception:
239
+ self._log.exception(
240
+ "run() failed to process orphan code blocks; "
241
+ "file replacement will still proceed."
171
242
  )
172
- else:
173
243
  self._orphan_code_blocks = []
174
244
 
245
+ self._log.info(
246
+ "run() finished — content_map has %d entries (%d with content_id, %d failed)",
247
+ len(self._content_map),
248
+ len(succeeded),
249
+ len(failed),
250
+ )
251
+
175
252
  @override
176
253
  def apply_postprocessing_to_response(
177
254
  self, loop_response: ResponsesLanguageModelStreamResponse
178
255
  ) -> bool:
256
+ self._log.info(
257
+ "apply_postprocessing started — %d file(s) in content_map, fence_ff=%s",
258
+ len(self._content_map),
259
+ feature_flags.enable_code_execution_fence_un_17972.is_enabled(
260
+ self._company_id
261
+ ),
262
+ )
263
+
179
264
  if loop_response.message.references is None:
180
265
  loop_response.message.references = []
181
266
  if loop_response.message.text is None:
@@ -187,6 +272,10 @@ class DisplayCodeInterpreterFilesPostProcessor(
187
272
  self._company_id
188
273
  )
189
274
 
275
+ replaced_files: list[str] = []
276
+ missed_files: list[str] = []
277
+ error_files: list[str] = []
278
+
190
279
  for filename, content_id in self._content_map.items():
191
280
  if content_id is None:
192
281
  loop_response.message.text, replaced = _replace_container_file_error(
@@ -195,12 +284,14 @@ class DisplayCodeInterpreterFilesPostProcessor(
195
284
  error_message=self._config.file_download_failed_message,
196
285
  )
197
286
  changed |= replaced
287
+ error_files.append(filename)
198
288
  continue
199
289
 
200
- is_image = (guess_type(filename)[0] or "").startswith("image/")
201
- is_html = (guess_type(filename)[0] or "") == "text/html"
290
+ mime = guess_type(filename)[0] or ""
291
+ is_image = mime.startswith("image/")
292
+ is_html = mime == "text/html"
293
+ file_type = "image" if is_image else ("html" if is_html else "document")
202
294
 
203
- # Images
204
295
  if is_image:
205
296
  loop_response.message.text, replaced = (
206
297
  _replace_container_image_citation(
@@ -229,6 +320,17 @@ class DisplayCodeInterpreterFilesPostProcessor(
229
320
  )
230
321
  changed |= replaced
231
322
 
323
+ if replaced:
324
+ replaced_files.append(filename)
325
+ self._log.info(
326
+ "Replaced sandbox link for '%s' (type=%s, content_id=%s)",
327
+ filename,
328
+ file_type,
329
+ content_id,
330
+ )
331
+ else:
332
+ missed_files.append(filename)
333
+
232
334
  is_html_rendered = is_html
233
335
  if replaced and not (is_image or is_html_rendered or fence_ff_on):
234
336
  loop_response.message.references.append(
@@ -242,15 +344,30 @@ class DisplayCodeInterpreterFilesPostProcessor(
242
344
  )
243
345
  ref_number += 1
244
346
 
347
+ self._log.info(
348
+ "Stage-1 replacement summary — replaced=%s, missed=%s, error=%s",
349
+ replaced_files,
350
+ missed_files,
351
+ error_files,
352
+ )
353
+
245
354
  if fence_ff_on:
246
355
  code_blocks = _build_code_blocks(loop_response, self._content_map)
356
+ self._log.info(
357
+ "Fence injection — %d code block(s), files: %s",
358
+ len(code_blocks),
359
+ [f.filename for b in code_blocks for f in b.files],
360
+ )
247
361
  _warn_unmatched_code_blocks(self._content_map, code_blocks)
248
362
  text_before = loop_response.message.text
249
363
  loop_response.message.text = _inject_code_execution_fences(
250
364
  loop_response.message.text,
251
365
  code_blocks,
252
366
  )
253
- changed |= loop_response.message.text != text_before
367
+ fences_changed = loop_response.message.text != text_before
368
+ changed |= fences_changed
369
+ if fences_changed:
370
+ self._log.info("Fence injection modified the message text")
254
371
 
255
372
  if self._orphan_code_blocks:
256
373
  fence_id = _get_next_fence_id(loop_response.message.text)
@@ -259,12 +376,29 @@ class DisplayCodeInterpreterFilesPostProcessor(
259
376
  loop_response.message.text.rstrip() + "\n\n" + orphan_fences
260
377
  )
261
378
  changed = True
379
+ self._log.info(
380
+ "Appended %d orphan fence(s)", len(self._orphan_code_blocks)
381
+ )
262
382
 
263
383
  _warn_missing_content_ids(loop_response.message.text, self._content_map)
264
384
  loop_response.message.text, dangling_replaced = _replace_dangling_sandbox_links(
265
385
  loop_response.message.text, self._config.file_download_failed_message
266
386
  )
267
387
  changed |= dangling_replaced
388
+ if dangling_replaced:
389
+ self._log.warning(
390
+ "apply_postprocessing found and replaced dangling sandbox links"
391
+ )
392
+
393
+ self._log.info(
394
+ "apply_postprocessing finished — changed=%s, replaced=%d, missed=%d, "
395
+ "error=%d, dangling_cleaned=%s",
396
+ changed,
397
+ len(replaced_files),
398
+ len(missed_files),
399
+ len(error_files),
400
+ dangling_replaced,
401
+ )
268
402
 
269
403
  return changed
270
404
 
@@ -279,52 +413,64 @@ class DisplayCodeInterpreterFilesPostProcessor(
279
413
  semaphore: asyncio.Semaphore,
280
414
  ) -> _ContentInfo | None:
281
415
  async with semaphore:
282
- retry = AsyncRetrying(
283
- stop=stop_after_attempt(1 + self._config.max_download_retries),
284
- wait=wait_exponential(
285
- multiplier=self._config.download_retry_base_delay
286
- ),
287
- before_sleep=before_sleep_log(logger, logging.WARNING),
288
- reraise=True,
416
+ self._log.info(
417
+ "Downloading container file '%s' (container=%s, file_id=%s)",
418
+ container_file.filename,
419
+ container_file.container_id,
420
+ container_file.file_id,
289
421
  )
422
+ retry = self._build_retry()
290
423
  file_content = await retry(
291
424
  self._client.containers.files.content.retrieve,
292
425
  container_id=container_file.container_id,
293
426
  file_id=container_file.file_id,
294
427
  )
428
+ self._log.info(
429
+ "Downloaded container file '%s' (%d bytes)",
430
+ container_file.filename,
431
+ len(file_content.content),
432
+ )
295
433
 
296
- logger.info(
297
- "Uploading file content for %s to knowledge base",
434
+ mime = guess_type(container_file.filename)[0] or "text/plain"
435
+ self._log.info(
436
+ "Uploading '%s' to knowledge base (mime=%s)",
298
437
  container_file.filename,
438
+ mime,
299
439
  )
300
440
 
301
441
  assert self._chat_service is not None # Checked in __init__
302
- content = await self._chat_service.upload_to_chat_from_bytes_async(
442
+ content = await self._build_retry()(
443
+ self._chat_service.upload_to_chat_from_bytes_async,
303
444
  content=file_content.content,
304
445
  content_name=container_file.filename,
305
- mime_type=guess_type(container_file.filename)[0] or "text/plain",
446
+ mime_type=mime,
306
447
  skip_ingestion=True,
307
448
  hide_in_chat=True,
308
449
  )
309
450
 
451
+ self._log.info(
452
+ "Uploaded '%s' — content_id=%s",
453
+ container_file.filename,
454
+ content.id,
455
+ )
310
456
  return _ContentInfo(filename=container_file.filename, content_id=content.id)
311
457
 
312
458
  async def _load_previous_files(self) -> dict[str, str]:
313
459
  if self._short_term_memory_manager is None:
314
460
  return {}
315
461
 
316
- logger.info(
462
+ self._log.info(
317
463
  "Loading previously generated code interpreter files from short term memory"
318
464
  )
319
465
  memory = await self._short_term_memory_manager.load_async()
320
466
 
321
467
  if memory is None:
322
- logger.info(
468
+ self._log.info(
323
469
  "No previously generated code interpreter files found in short term memory"
324
470
  )
325
471
  return {}
326
472
 
327
- logger.info(
473
+ self._log.info(
328
474
  "Found %s previously generated code interpreter files", len(memory.root)
329
475
  )
330
476
 
@@ -378,7 +524,8 @@ class DisplayCodeInterpreterFilesPostProcessor(
378
524
  filename = f"code_{i + 1}.txt" if use_numeric_suffix else "code.txt"
379
525
 
380
526
  try:
381
- content = await self._chat_service.upload_to_chat_from_bytes_async(
527
+ content = await self._build_retry()(
528
+ self._chat_service.upload_to_chat_from_bytes_async,
382
529
  content=txt_content.encode("utf-8"),
383
530
  content_name=filename,
384
531
  mime_type="text/plain",
@@ -386,7 +533,7 @@ class DisplayCodeInterpreterFilesPostProcessor(
386
533
  hide_in_chat=True,
387
534
  )
388
535
  except Exception:
389
- logger.exception(
536
+ self._log.exception(
390
537
  "Failed to upload orphan code block as txt for call %d ('%s'); "
391
538
  "falling back to legacy code block display.",
392
539
  i,
@@ -402,7 +549,7 @@ class DisplayCodeInterpreterFilesPostProcessor(
402
549
  orphan_blocks.append(
403
550
  CodeInterpreterBlock(code=call.code, files=[orphan_file])
404
551
  )
405
- logger.info(
552
+ self._log.info(
406
553
  "Uploaded orphan code block as '%s' (content_id=%s)",
407
554
  filename,
408
555
  content.id,
@@ -938,7 +1085,7 @@ def _replace_container_file_citation(
938
1085
  original pre-fence behaviour is restored: the link is replaced with <sup>N</sup>
939
1086
  and the file remains accessible via the references panel.
940
1087
  """
941
- file_markdown = rf"\[.*?\]\(sandbox:/mnt/data/{re.escape(filename)}\)"
1088
+ file_markdown = rf"!?\[.*?\]\(sandbox:/mnt/data/{re.escape(filename)}\)"
942
1089
 
943
1090
  if not re.search(file_markdown, text):
944
1091
  logger.warning(