unique_toolkit 1.68.11__tar.gz → 1.68.13__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.11 → unique_toolkit-1.68.13}/PKG-INFO +1 -1
  2. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/pyproject.toml +1 -1
  3. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +22 -2
  4. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +251 -47
  5. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/README.md +0 -0
  6. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/__init__.py +0 -0
  7. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/__init__.py +0 -0
  8. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/_base_service.py +0 -0
  9. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/_time_utils.py +0 -0
  10. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  11. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  12. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  13. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  14. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  15. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  16. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  17. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/config_checker/README.md +0 -0
  18. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/config_checker/__init__.py +0 -0
  19. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/config_checker/__main__.py +0 -0
  20. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/config_checker/cli.py +0 -0
  21. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/config_checker/differ.py +0 -0
  22. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/config_checker/exporter.py +0 -0
  23. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/config_checker/models.py +0 -0
  24. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/config_checker/registry.py +0 -0
  25. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/config_checker/validator.py +0 -0
  26. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/default_language_model.py +0 -0
  27. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
  28. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/docx_generator/config.py +0 -0
  29. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
  30. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
  31. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/docx_generator/service.py +0 -0
  32. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
  33. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/endpoint_builder.py +0 -0
  34. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  35. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/event_bus.py +0 -0
  36. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/exception.py +0 -0
  37. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/execution.py +0 -0
  38. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
  39. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
  40. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
  41. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
  42. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
  43. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
  44. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
  45. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
  46. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
  47. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
  48. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
  49. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
  50. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
  51. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
  52. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
  53. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
  54. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
  55. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
  56. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
  57. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
  58. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
  59. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
  60. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
  61. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
  62. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
  63. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
  64. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
  65. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  66. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  67. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  68. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/referencing.py +0 -0
  69. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/string_utilities.py +0 -0
  70. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/tests/test_referencing.py +0 -0
  71. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
  72. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/token/__init__.py +0 -0
  73. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  74. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/token/token_counting.py +0 -0
  75. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
  76. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
  77. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/utils/__init__.py +0 -0
  78. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/utils/files.py +0 -0
  79. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/utils/image/encode.py +0 -0
  80. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
  81. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/utils/jinja/render.py +0 -0
  82. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
  83. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
  84. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  85. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  86. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  87. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/validate_required_values.py +0 -0
  88. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/_common/validators.py +0 -0
  89. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/__init__.py +0 -0
  90. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
  91. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
  92. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/config.py +0 -0
  93. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
  94. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
  95. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
  96. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  97. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
  98. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
  99. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  100. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  101. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
  102. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
  103. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
  104. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
  105. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  106. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
  107. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  108. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
  109. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
  110. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
  111. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  112. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
  113. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -0
  114. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  115. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
  116. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/evaluation/utils.py +0 -0
  117. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
  118. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/feature_flags/feature_flags.py +0 -0
  119. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  120. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  121. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
  122. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  123. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/loop_runner/__init__.py +0 -0
  124. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
  125. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
  126. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
  127. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
  128. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/loop_runner/base.py +0 -0
  129. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
  130. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
  131. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +0 -0
  132. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
  133. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
  134. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
  135. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
  136. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
  137. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
  138. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
  139. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
  140. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
  141. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
  142. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
  143. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  144. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
  145. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
  146. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
  147. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
  148. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  149. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/__init__.py +0 -0
  150. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  151. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  152. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  153. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  154. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  155. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
  156. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  157. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  158. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  159. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
  160. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
  161. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  162. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
  163. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
  164. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  165. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
  166. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
  167. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  168. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
  169. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
  170. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  171. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  172. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  173. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  174. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  175. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
  176. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  177. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/config.py +0 -0
  178. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/experimental/__init__.py +0 -0
  179. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/experimental/open_file_tool/__init__.py +0 -0
  180. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/experimental/open_file_tool/config.py +0 -0
  181. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/experimental/open_file_tool/runtime.py +0 -0
  182. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/experimental/open_file_tool/tool.py +0 -0
  183. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/factory.py +0 -0
  184. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  185. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  186. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  187. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
  188. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
  189. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
  190. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
  191. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
  192. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
  193. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +0 -0
  194. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +0 -0
  195. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +0 -0
  196. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
  197. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/schemas.py +0 -0
  198. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  199. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  200. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/tool.py +0 -0
  201. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
  202. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  203. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  204. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  205. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  206. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  207. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  208. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic_table/__init__.py +0 -0
  209. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic_table/schemas.py +0 -0
  210. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/agentic_table/service.py +0 -0
  211. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/app/__init__.py +0 -0
  212. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/app/dev_util.py +0 -0
  213. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/app/fast_api_factory.py +0 -0
  214. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/app/init_logging.py +0 -0
  215. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/app/init_sdk.py +0 -0
  216. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/app/performance/async_tasks.py +0 -0
  217. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  218. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/app/schemas.py +0 -0
  219. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/app/unique_settings.py +0 -0
  220. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/app/verification.py +0 -0
  221. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/app/webhook.py +0 -0
  222. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/chat/__init__.py +0 -0
  223. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/chat/cancellation.py +0 -0
  224. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/chat/constants.py +0 -0
  225. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/chat/deprecated/service.py +0 -0
  226. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/chat/functions.py +0 -0
  227. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/chat/rendering.py +0 -0
  228. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/chat/responses_api.py +0 -0
  229. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/chat/schemas.py +0 -0
  230. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/chat/service.py +0 -0
  231. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/chat/state.py +0 -0
  232. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/chat/utils.py +0 -0
  233. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/content/__init__.py +0 -0
  234. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/content/constants.py +0 -0
  235. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/content/functions.py +0 -0
  236. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/content/schemas.py +0 -0
  237. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/content/service.py +0 -0
  238. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/content/smart_rules.py +0 -0
  239. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/content/utils.py +0 -0
  240. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/data_extraction/README.md +0 -0
  241. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/data_extraction/__init__.py +0 -0
  242. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
  243. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/data_extraction/augmented/service.py +0 -0
  244. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/data_extraction/base.py +0 -0
  245. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
  246. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/data_extraction/basic/config.py +0 -0
  247. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
  248. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/data_extraction/basic/service.py +0 -0
  249. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/elicitation/__init__.py +0 -0
  250. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/elicitation/constants.py +0 -0
  251. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/elicitation/exceptions.py +0 -0
  252. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/elicitation/functions.py +0 -0
  253. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/elicitation/schemas.py +0 -0
  254. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/elicitation/service.py +0 -0
  255. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/embedding/__init__.py +0 -0
  256. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/embedding/constants.py +0 -0
  257. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/embedding/functions.py +0 -0
  258. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/embedding/schemas.py +0 -0
  259. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/embedding/service.py +0 -0
  260. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/embedding/utils.py +0 -0
  261. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/framework_utilities/__init__.py +0 -0
  262. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
  263. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  264. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  265. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  266. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  267. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  268. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/framework_utilities/utils.py +0 -0
  269. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/language_model/__init__.py +0 -0
  270. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
  271. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/language_model/builder.py +0 -0
  272. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/language_model/constants.py +0 -0
  273. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/language_model/default_language_model.py +0 -0
  274. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/language_model/functions.py +0 -0
  275. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/language_model/infos.py +0 -0
  276. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/language_model/prompt.py +0 -0
  277. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/language_model/reference.py +0 -0
  278. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/language_model/schemas.py +0 -0
  279. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/language_model/service.py +0 -0
  280. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/language_model/stream_transform.py +0 -0
  281. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/language_model/utils.py +0 -0
  282. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/protocols/support.py +0 -0
  283. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/services/__init__.py +0 -0
  284. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/services/chat_service.py +0 -0
  285. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/services/factory.py +0 -0
  286. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/services/knowledge_base.py +0 -0
  287. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/short_term_memory/__init__.py +0 -0
  288. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/short_term_memory/constants.py +0 -0
  289. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/short_term_memory/functions.py +0 -0
  290. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/short_term_memory/schemas.py +0 -0
  291. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/short_term_memory/service.py +0 -0
  292. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/smart_rules/__init__.py +0 -0
  293. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/unique_toolkit/smart_rules/compile.py +0 -0
  294. {unique_toolkit-1.68.11 → unique_toolkit-1.68.13}/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.11
3
+ Version: 1.68.13
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.11"
3
+ version = "1.68.13"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -85,7 +85,17 @@ class PersistentShortMemoryManager(Generic[TSchema]):
85
85
  self._short_term_memory_name,
86
86
  )
87
87
 
88
- self._log_not_found() if not result.success else self._log_found()
88
+ if not result.success:
89
+ self._log_not_found()
90
+ if result.exception is not None:
91
+ logger.warning(
92
+ "Short term memory lookup failed with %s: %s",
93
+ type(result.exception).__name__,
94
+ result.exception,
95
+ exc_info=result.exception,
96
+ )
97
+ else:
98
+ self._log_found()
89
99
 
90
100
  return result.unpack(default=None)
91
101
 
@@ -95,7 +105,17 @@ class PersistentShortMemoryManager(Generic[TSchema]):
95
105
  self._short_term_memory_name,
96
106
  )
97
107
 
98
- self._log_not_found() if not result.success else self._log_found()
108
+ if not result.success:
109
+ self._log_not_found()
110
+ if result.exception is not None:
111
+ logger.warning(
112
+ "Short term memory lookup failed with %s: %s",
113
+ type(result.exception).__name__,
114
+ result.exception,
115
+ exc_info=result.exception,
116
+ )
117
+ else:
118
+ self._log_found()
99
119
 
100
120
  return result.unpack(default=None)
101
121
 
@@ -7,6 +7,7 @@ from dataclasses import dataclass
7
7
  from mimetypes import guess_type
8
8
  from typing import NamedTuple, override
9
9
 
10
+ import httpx
10
11
  from openai import AsyncOpenAI
11
12
  from openai.types.responses import ResponseCodeInterpreterToolCall
12
13
  from openai.types.responses.response_output_text import AnnotationContainerFileCitation
@@ -86,6 +87,12 @@ class DisplayCodeInterpreterFilesPostProcessorConfig(BaseModel):
86
87
  default=8192,
87
88
  description="Chunk size in bytes for streaming container file downloads.",
88
89
  )
90
+ download_read_timeout: float = Field(
91
+ default=120.0,
92
+ description="HTTP read timeout in seconds for container file downloads. "
93
+ "Applies per SDK attempt. The OpenAI SDK default of 600s is too generous "
94
+ "for small generated files; a shorter timeout lets us retry sooner.",
95
+ )
89
96
 
90
97
 
91
98
  class _ContentInfo(NamedTuple):
@@ -157,7 +164,9 @@ class _FileProgressTracker:
157
164
  max_retries: int = 0,
158
165
  force_publish: bool = False,
159
166
  ) -> None:
167
+ lock_wait_t0 = time.monotonic()
160
168
  async with self._lock:
169
+ lock_wait_ms = (time.monotonic() - lock_wait_t0) * 1000
161
170
  state = self._states.get(filename)
162
171
  if state is None:
163
172
  return
@@ -174,8 +183,70 @@ class _FileProgressTracker:
174
183
  or now - self._last_publish_time >= self._min_interval
175
184
  )
176
185
  if should_publish:
186
+ publish_t0 = time.monotonic()
177
187
  await self._publish()
188
+ publish_ms = (time.monotonic() - publish_t0) * 1000
178
189
  self._last_publish_time = now
190
+ if lock_wait_ms > 100 or publish_ms > 500:
191
+ lock_held_ms = (
192
+ time.monotonic() - lock_wait_t0
193
+ ) * 1000 - lock_wait_ms
194
+ self._log.warning(
195
+ "Tracker.update('%s', phase=%s): "
196
+ "lock_wait=%.0fms, publish=%.0fms, "
197
+ "lock_held=%.0fms",
198
+ filename,
199
+ phase,
200
+ lock_wait_ms,
201
+ publish_ms,
202
+ lock_held_ms,
203
+ )
204
+ elif lock_wait_ms > 100:
205
+ self._log.warning(
206
+ "Tracker.update('%s', phase=%s): lock_wait=%.0fms (no publish)",
207
+ filename,
208
+ phase,
209
+ lock_wait_ms,
210
+ )
211
+
212
+ async def tick_elapsed(self, filename: str, elapsed_seconds: float) -> None:
213
+ """Publish an elapsed-time update without changing percent or retry state.
214
+
215
+ Used by the background ticker to show time-based progress while the
216
+ OpenAI API hasn't started returning bytes yet.
217
+ """
218
+ lock_wait_t0 = time.monotonic()
219
+ async with self._lock:
220
+ lock_wait_ms = (time.monotonic() - lock_wait_t0) * 1000
221
+ state = self._states.get(filename)
222
+ if state is None or state.phase != "downloading":
223
+ return
224
+ state.elapsed_seconds = elapsed_seconds
225
+ now = time.monotonic()
226
+ if now - self._last_publish_time >= self._min_interval:
227
+ publish_t0 = time.monotonic()
228
+ await self._publish()
229
+ publish_ms = (time.monotonic() - publish_t0) * 1000
230
+ self._last_publish_time = now
231
+ if lock_wait_ms > 100 or publish_ms > 500:
232
+ lock_held_ms = (
233
+ time.monotonic() - lock_wait_t0
234
+ ) * 1000 - lock_wait_ms
235
+ self._log.warning(
236
+ "Tracker.tick_elapsed('%s'): "
237
+ "lock_wait=%.0fms, publish=%.0fms, "
238
+ "lock_held=%.0fms",
239
+ filename,
240
+ lock_wait_ms,
241
+ publish_ms,
242
+ lock_held_ms,
243
+ )
244
+ elif lock_wait_ms > 100:
245
+ self._log.warning(
246
+ "Tracker.tick_elapsed('%s'): lock_wait=%.0fms (no publish)",
247
+ filename,
248
+ lock_wait_ms,
249
+ )
179
250
 
180
251
  async def publish_initial(self) -> None:
181
252
  """Send the first progress update (marks all files as pending)."""
@@ -188,7 +259,15 @@ class _FileProgressTracker:
188
259
  async def _publish(self) -> None:
189
260
  text = self._build_progress_text()
190
261
  try:
262
+ t0 = time.monotonic()
191
263
  await self._chat_service.modify_assistant_message_async(content=text)
264
+ publish_ms = (time.monotonic() - t0) * 1000
265
+ if publish_ms > 500:
266
+ self._log.warning(
267
+ "modify_assistant_message_async took %.0fms "
268
+ "(SDK singleton / backend contention suspected)",
269
+ publish_ms,
270
+ )
192
271
  except Exception:
193
272
  self._log.debug("Failed to publish progress update", exc_info=True)
194
273
 
@@ -303,6 +382,7 @@ class DisplayCodeInterpreterFilesPostProcessor(
303
382
 
304
383
  @override
305
384
  async def run(self, loop_response: ResponsesLanguageModelStreamResponse) -> None:
385
+ run_t0 = time.monotonic()
306
386
  self._log.info("run() started — fetching and uploading code interpreter files")
307
387
 
308
388
  container_files = loop_response.container_files
@@ -312,6 +392,7 @@ class DisplayCodeInterpreterFilesPostProcessor(
312
392
  [cf.filename for cf in container_files],
313
393
  )
314
394
 
395
+ phase_t0 = time.monotonic()
315
396
  try:
316
397
  self._content_map: dict[str, str | None] = await self._load_previous_files() # type: ignore
317
398
  if self._content_map:
@@ -326,6 +407,7 @@ class DisplayCodeInterpreterFilesPostProcessor(
326
407
  "proceeding without previous file context."
327
408
  )
328
409
  self._content_map = {}
410
+ load_ms = (time.monotonic() - phase_t0) * 1000
329
411
 
330
412
  tracker: _FileProgressTracker | None = None
331
413
  if container_files and self._chat_service is not None:
@@ -338,6 +420,7 @@ class DisplayCodeInterpreterFilesPostProcessor(
338
420
  )
339
421
  await tracker.publish_initial()
340
422
 
423
+ phase_t0 = time.monotonic()
341
424
  semaphore = asyncio.Semaphore(self._config.max_concurrent_file_downloads)
342
425
  tasks = [
343
426
  self._download_and_upload_container_files_to_knowledge_base(
@@ -346,6 +429,7 @@ class DisplayCodeInterpreterFilesPostProcessor(
346
429
  for citation in container_files
347
430
  ]
348
431
  results = await asyncio.gather(*tasks)
432
+ download_upload_ms = (time.monotonic() - phase_t0) * 1000
349
433
 
350
434
  for citation, result in zip(container_files, results):
351
435
  self._content_map[citation.filename] = (
@@ -365,6 +449,7 @@ class DisplayCodeInterpreterFilesPostProcessor(
365
449
  failed,
366
450
  )
367
451
 
452
+ phase_t0 = time.monotonic()
368
453
  try:
369
454
  await self._save_generated_files(
370
455
  [
@@ -378,7 +463,9 @@ class DisplayCodeInterpreterFilesPostProcessor(
378
463
  "run() failed to save generated files to short-term memory; "
379
464
  "file replacement will still proceed."
380
465
  )
466
+ save_ms = (time.monotonic() - phase_t0) * 1000
381
467
 
468
+ phase_t0 = time.monotonic()
382
469
  try:
383
470
  if feature_flags.enable_code_execution_fence_un_17972.is_enabled(
384
471
  self._company_id
@@ -399,18 +486,28 @@ class DisplayCodeInterpreterFilesPostProcessor(
399
486
  "file replacement will still proceed."
400
487
  )
401
488
  self._orphan_code_blocks = []
489
+ orphan_ms = (time.monotonic() - phase_t0) * 1000
402
490
 
491
+ total_ms = (time.monotonic() - run_t0) * 1000
403
492
  self._log.info(
404
- "run() finished — content_map has %d entries (%d with content_id, %d failed)",
493
+ "run() finished — content_map has %d entries (%d ok, %d failed). "
494
+ "Timing: total=%.0fms, load_stm=%.0fms, download_upload=%.0fms, "
495
+ "save_stm=%.0fms, orphan=%.0fms",
405
496
  len(self._content_map),
406
497
  len(succeeded),
407
498
  len(failed),
499
+ total_ms,
500
+ load_ms,
501
+ download_upload_ms,
502
+ save_ms,
503
+ orphan_ms,
408
504
  )
409
505
 
410
506
  @override
411
507
  def apply_postprocessing_to_response(
412
508
  self, loop_response: ResponsesLanguageModelStreamResponse
413
509
  ) -> bool:
510
+ apply_t0 = time.monotonic()
414
511
  self._log.info(
415
512
  "apply_postprocessing started — %d file(s) in content_map, fence_ff=%s",
416
513
  len(self._content_map),
@@ -548,14 +645,16 @@ class DisplayCodeInterpreterFilesPostProcessor(
548
645
  "apply_postprocessing found and replaced dangling sandbox links"
549
646
  )
550
647
 
648
+ apply_ms = (time.monotonic() - apply_t0) * 1000
551
649
  self._log.info(
552
650
  "apply_postprocessing finished — changed=%s, replaced=%d, missed=%d, "
553
- "error=%d, dangling_cleaned=%s",
651
+ "error=%d, dangling_cleaned=%s (%.0fms)",
554
652
  changed,
555
653
  len(replaced_files),
556
654
  len(missed_files),
557
655
  len(error_files),
558
656
  dangling_replaced,
657
+ apply_ms,
559
658
  )
560
659
 
561
660
  return changed
@@ -572,6 +671,7 @@ class DisplayCodeInterpreterFilesPostProcessor(
572
671
  tracker: _FileProgressTracker | None = None,
573
672
  ) -> _ContentInfo | None:
574
673
  async with semaphore:
674
+ pipeline_t0 = time.monotonic()
575
675
  self._log.info(
576
676
  "Downloading container file '%s' (container=%s, file_id=%s)",
577
677
  container_file.filename,
@@ -579,14 +679,17 @@ class DisplayCodeInterpreterFilesPostProcessor(
579
679
  container_file.file_id,
580
680
  )
581
681
 
682
+ download_t0 = time.monotonic()
582
683
  file_bytes = await self._download_file_bytes_with_progress(
583
684
  container_file, tracker
584
685
  )
686
+ download_ms = (time.monotonic() - download_t0) * 1000
585
687
 
586
688
  self._log.info(
587
- "Downloaded container file '%s' (%d bytes)",
689
+ "Downloaded container file '%s' (%d bytes, %.0fms)",
588
690
  container_file.filename,
589
691
  len(file_bytes),
692
+ download_ms,
590
693
  )
591
694
 
592
695
  if tracker:
@@ -596,12 +699,14 @@ class DisplayCodeInterpreterFilesPostProcessor(
596
699
 
597
700
  mime = guess_type(container_file.filename)[0] or "text/plain"
598
701
  self._log.info(
599
- "Uploading '%s' to knowledge base (mime=%s)",
702
+ "Uploading '%s' to knowledge base (mime=%s, %d bytes)",
600
703
  container_file.filename,
601
704
  mime,
705
+ len(file_bytes),
602
706
  )
603
707
 
604
708
  assert self._chat_service is not None # Checked in __init__
709
+ upload_t0 = time.monotonic()
605
710
  content = await self._build_retry()(
606
711
  self._chat_service.upload_to_chat_from_bytes_async,
607
712
  content=file_bytes,
@@ -610,16 +715,29 @@ class DisplayCodeInterpreterFilesPostProcessor(
610
715
  skip_ingestion=True,
611
716
  hide_in_chat=True,
612
717
  )
718
+ upload_ms = (time.monotonic() - upload_t0) * 1000
719
+ if upload_ms > 2000:
720
+ self._log.warning(
721
+ "SDK upload for '%s' took %.0fms — "
722
+ "backend contention or slow blob storage suspected",
723
+ container_file.filename,
724
+ upload_ms,
725
+ )
613
726
 
614
727
  if tracker:
615
728
  await tracker.update(
616
729
  container_file.filename, "done", force_publish=True
617
730
  )
618
731
 
732
+ pipeline_ms = (time.monotonic() - pipeline_t0) * 1000
619
733
  self._log.info(
620
- "Uploaded '%s' — content_id=%s",
734
+ "Uploaded '%s' — content_id=%s. "
735
+ "Timing: download=%.0fms, upload=%.0fms, pipeline=%.0fms",
621
736
  container_file.filename,
622
737
  content.id,
738
+ download_ms,
739
+ upload_ms,
740
+ pipeline_ms,
623
741
  )
624
742
  return _ContentInfo(filename=container_file.filename, content_id=content.id)
625
743
 
@@ -633,49 +751,78 @@ class DisplayCodeInterpreterFilesPostProcessor(
633
751
  Uses ``with_streaming_response`` so we can read ``content-length``
634
752
  and report download percentage. Falls back to elapsed-time display
635
753
  when the header is absent.
754
+
755
+ A background ticker task publishes elapsed-time updates at regular
756
+ intervals even when the OpenAI API is slow to return the first byte.
636
757
  """
637
758
  max_attempts = 1 + self._config.max_download_retries
638
759
  download_start = time.monotonic()
639
760
  last_exception: Exception | None = None
640
761
 
641
- for attempt_num in range(1, max_attempts + 1):
642
- retry_num = attempt_num - 1
643
- try:
644
- if retry_num > 0:
645
- delay = self._config.download_retry_base_delay * (2**retry_num)
646
- self._log.warning(
647
- "Retrying download of '%s' (attempt %d/%d) after %.1fs",
762
+ ticker_task: asyncio.Task[None] | None = None
763
+ if tracker:
764
+
765
+ async def _ticker() -> None:
766
+ while True:
767
+ await asyncio.sleep(self._config.progress_update_interval)
768
+ elapsed = time.monotonic() - download_start
769
+ self._log.info(
770
+ "Still downloading '%s' (%.0fs elapsed)",
648
771
  container_file.filename,
649
- attempt_num,
650
- max_attempts,
651
- delay,
772
+ elapsed,
652
773
  )
653
- if tracker:
654
- await tracker.update(
774
+ await tracker.tick_elapsed(container_file.filename, elapsed)
775
+
776
+ ticker_task = asyncio.create_task(_ticker())
777
+
778
+ try:
779
+ for attempt_num in range(1, max_attempts + 1):
780
+ retry_num = attempt_num - 1
781
+ try:
782
+ if retry_num > 0:
783
+ delay = self._config.download_retry_base_delay * (
784
+ 2 ** (retry_num - 1)
785
+ )
786
+ self._log.warning(
787
+ "Retrying download of '%s' (attempt %d/%d) after %.1fs",
655
788
  container_file.filename,
656
- "downloading",
657
- elapsed_seconds=time.monotonic() - download_start,
658
- retry_attempt=retry_num,
659
- max_retries=self._config.max_download_retries,
660
- force_publish=True,
789
+ attempt_num,
790
+ max_attempts,
791
+ delay,
661
792
  )
662
- await asyncio.sleep(delay)
663
-
664
- return await self._stream_download_bytes(
665
- container_file, tracker, retry_num, download_start
666
- )
667
- except Exception as exc:
668
- last_exception = exc
669
- self._log.warning(
670
- "Download attempt %d/%d failed for '%s': %s",
671
- attempt_num,
672
- max_attempts,
673
- container_file.filename,
674
- exc,
675
- )
793
+ if tracker:
794
+ await tracker.update(
795
+ container_file.filename,
796
+ "downloading",
797
+ elapsed_seconds=time.monotonic() - download_start,
798
+ retry_attempt=retry_num,
799
+ max_retries=self._config.max_download_retries,
800
+ force_publish=True,
801
+ )
802
+ await asyncio.sleep(delay)
803
+
804
+ return await self._stream_download_bytes(
805
+ container_file, tracker, retry_num, download_start
806
+ )
807
+ except Exception as exc:
808
+ last_exception = exc
809
+ self._log.warning(
810
+ "Download attempt %d/%d failed for '%s': %s",
811
+ attempt_num,
812
+ max_attempts,
813
+ container_file.filename,
814
+ exc,
815
+ )
676
816
 
677
- assert last_exception is not None
678
- raise last_exception
817
+ assert last_exception is not None
818
+ raise last_exception
819
+ finally:
820
+ if ticker_task is not None:
821
+ ticker_task.cancel()
822
+ try:
823
+ await ticker_task
824
+ except BaseException:
825
+ pass
679
826
 
680
827
  async def _stream_download_bytes(
681
828
  self,
@@ -684,25 +831,54 @@ class DisplayCodeInterpreterFilesPostProcessor(
684
831
  retry_attempt: int,
685
832
  download_start: float,
686
833
  ) -> bytes:
687
- """Stream-download a single container file, reporting chunk-level progress."""
688
- async with (
689
- self._client.containers.files.content.with_streaming_response.retrieve(
690
- file_id=container_file.file_id,
691
- container_id=container_file.container_id,
692
- ) as response
693
- ):
834
+ """Stream-download a single container file, reporting chunk-level progress.
835
+
836
+ SDK-level retries are disabled (``max_retries=0``) so that only our
837
+ manual retry loop retries, with full visibility in logs and progress
838
+ tracker. A shorter read timeout avoids waiting 10 minutes on a
839
+ stalled connection.
840
+ """
841
+ t0 = time.monotonic()
842
+ async with self._client.with_options(
843
+ max_retries=0,
844
+ timeout=httpx.Timeout(5.0, read=self._config.download_read_timeout),
845
+ ).containers.files.content.with_streaming_response.retrieve(
846
+ file_id=container_file.file_id,
847
+ container_id=container_file.container_id,
848
+ ) as response:
849
+ first_byte_ms = (time.monotonic() - t0) * 1000
850
+ self._log.info(
851
+ "Stream opened for '%s' — first-byte latency=%.0fms, "
852
+ "content-length=%s, status=%s",
853
+ container_file.filename,
854
+ first_byte_ms,
855
+ response.headers.get("content-length", "unknown"),
856
+ response.status_code,
857
+ )
694
858
  content_length = response.headers.get("content-length")
695
859
  total = int(content_length) if content_length else None
696
860
  chunks: list[bytes] = []
697
861
  downloaded = 0
862
+ last_chunk_time = time.monotonic()
698
863
  async for chunk in response.iter_bytes(
699
864
  chunk_size=self._config.download_chunk_size
700
865
  ):
866
+ now = time.monotonic()
867
+ chunk_gap_ms = (now - last_chunk_time) * 1000
868
+ if chunk_gap_ms > 500:
869
+ self._log.warning(
870
+ "Download chunk gap for '%s': %.0fms "
871
+ "(downloaded=%d bytes so far)",
872
+ container_file.filename,
873
+ chunk_gap_ms,
874
+ downloaded,
875
+ )
701
876
  chunks.append(chunk)
702
877
  downloaded += len(chunk)
703
878
  if tracker:
704
879
  pct = (downloaded * 100 // total) if total else None
705
880
  elapsed = time.monotonic() - download_start
881
+ update_t0 = time.monotonic()
706
882
  await tracker.update(
707
883
  container_file.filename,
708
884
  "downloading",
@@ -711,6 +887,22 @@ class DisplayCodeInterpreterFilesPostProcessor(
711
887
  retry_attempt=retry_attempt,
712
888
  max_retries=self._config.max_download_retries,
713
889
  )
890
+ update_ms = (time.monotonic() - update_t0) * 1000
891
+ if update_ms > 200:
892
+ self._log.warning(
893
+ "tracker.update() blocked download stream for '%s' "
894
+ "for %.0fms (lock contention or slow modify_message)",
895
+ container_file.filename,
896
+ update_ms,
897
+ )
898
+ last_chunk_time = time.monotonic()
899
+ transfer_ms = (time.monotonic() - t0) * 1000 - first_byte_ms
900
+ self._log.info(
901
+ "Stream complete for '%s' — transfer=%.0fms, total=%d bytes",
902
+ container_file.filename,
903
+ transfer_ms,
904
+ downloaded,
905
+ )
714
906
  return b"".join(chunks)
715
907
 
716
908
  async def _load_previous_files(self) -> dict[str, str]:
@@ -720,16 +912,22 @@ class DisplayCodeInterpreterFilesPostProcessor(
720
912
  self._log.info(
721
913
  "Loading previously generated code interpreter files from short term memory"
722
914
  )
915
+ t0 = time.monotonic()
723
916
  memory = await self._short_term_memory_manager.load_async()
917
+ elapsed_ms = (time.monotonic() - t0) * 1000
724
918
 
725
919
  if memory is None:
726
920
  self._log.info(
727
- "No previously generated code interpreter files found in short term memory"
921
+ "No previously generated code interpreter files found "
922
+ "in short term memory (%.0fms)",
923
+ elapsed_ms,
728
924
  )
729
925
  return {}
730
926
 
731
927
  self._log.info(
732
- "Found %s previously generated code interpreter files", len(memory.root)
928
+ "Found %s previously generated code interpreter files (%.0fms)",
929
+ len(memory.root),
930
+ elapsed_ms,
733
931
  )
734
932
 
735
933
  return {content.filename: content.content_id for content in memory.root}
@@ -738,9 +936,15 @@ class DisplayCodeInterpreterFilesPostProcessor(
738
936
  if self._short_term_memory_manager is None or len(content_infos) == 0:
739
937
  return
740
938
 
939
+ t0 = time.monotonic()
741
940
  await self._short_term_memory_manager.save_async(
742
941
  _DisplayedFilesShortTermMemorySchema(root=content_infos)
743
942
  )
943
+ self._log.info(
944
+ "Saved %d generated file(s) to short term memory (%.0fms)",
945
+ len(content_infos),
946
+ (time.monotonic() - t0) * 1000,
947
+ )
744
948
 
745
949
  async def _upload_orphan_code_as_txt(
746
950
  self, loop_response: ResponsesLanguageModelStreamResponse