unique_toolkit 1.64.7__tar.gz → 1.65.1__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.64.7 → unique_toolkit-1.65.1}/PKG-INFO +1 -1
  2. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/pyproject.toml +1 -1
  3. unique_toolkit-1.65.1/unique_toolkit/agentic/tools/experimental/__init__.py +11 -0
  4. unique_toolkit-1.65.1/unique_toolkit/agentic/tools/experimental/open_file_tool/__init__.py +11 -0
  5. unique_toolkit-1.65.1/unique_toolkit/agentic/tools/experimental/open_file_tool/config.py +97 -0
  6. unique_toolkit-1.65.1/unique_toolkit/agentic/tools/experimental/open_file_tool/runtime.py +390 -0
  7. unique_toolkit-1.65.1/unique_toolkit/agentic/tools/experimental/open_file_tool/tool.py +108 -0
  8. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +5 -2
  9. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +1 -25
  10. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/tool_manager.py +51 -0
  11. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/README.md +0 -0
  12. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/__init__.py +0 -0
  13. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/__init__.py +0 -0
  14. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/_base_service.py +0 -0
  15. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/_time_utils.py +0 -0
  16. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  17. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  18. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  19. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  20. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  21. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  22. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  23. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/config_checker/README.md +0 -0
  24. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/config_checker/__init__.py +0 -0
  25. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/config_checker/__main__.py +0 -0
  26. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/config_checker/cli.py +0 -0
  27. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/config_checker/differ.py +0 -0
  28. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/config_checker/exporter.py +0 -0
  29. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/config_checker/models.py +0 -0
  30. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/config_checker/registry.py +0 -0
  31. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/config_checker/validator.py +0 -0
  32. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/default_language_model.py +0 -0
  33. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
  34. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/docx_generator/config.py +0 -0
  35. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
  36. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
  37. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/docx_generator/service.py +0 -0
  38. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
  39. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/endpoint_builder.py +0 -0
  40. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  41. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/event_bus.py +0 -0
  42. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/exception.py +0 -0
  43. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/execution.py +0 -0
  44. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
  45. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
  46. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
  47. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
  48. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
  49. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
  50. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
  51. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
  52. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
  53. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
  54. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
  55. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
  56. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
  57. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
  58. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
  59. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
  60. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
  61. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
  62. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
  63. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
  64. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
  65. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
  66. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
  67. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
  68. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
  69. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
  70. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
  71. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  72. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  73. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  74. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/referencing.py +0 -0
  75. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/string_utilities.py +0 -0
  76. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/tests/test_referencing.py +0 -0
  77. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
  78. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/token/__init__.py +0 -0
  79. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  80. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/token/token_counting.py +0 -0
  81. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
  82. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
  83. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/utils/__init__.py +0 -0
  84. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/utils/files.py +0 -0
  85. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/utils/image/encode.py +0 -0
  86. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
  87. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/utils/jinja/render.py +0 -0
  88. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
  89. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
  90. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  91. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  92. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  93. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/validate_required_values.py +0 -0
  94. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/_common/validators.py +0 -0
  95. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/__init__.py +0 -0
  96. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
  97. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
  98. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/config.py +0 -0
  99. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
  100. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
  101. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
  102. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  103. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
  104. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
  105. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  106. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  107. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
  108. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
  109. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
  110. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
  111. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  112. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
  113. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  114. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
  115. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
  116. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
  117. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  118. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
  119. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -0
  120. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  121. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
  122. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/evaluation/utils.py +0 -0
  123. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
  124. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/feature_flags/feature_flags.py +0 -0
  125. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  126. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  127. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
  128. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  129. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/loop_runner/__init__.py +0 -0
  130. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
  131. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
  132. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
  133. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
  134. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/loop_runner/base.py +0 -0
  135. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
  136. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
  137. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +0 -0
  138. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
  139. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
  140. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
  141. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
  142. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
  143. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
  144. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
  145. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
  146. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
  147. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
  148. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
  149. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  150. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
  151. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
  152. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
  153. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
  154. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  155. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  156. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/__init__.py +0 -0
  157. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  158. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  159. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  160. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  161. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  162. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
  163. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  164. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  165. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  166. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
  167. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
  168. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  169. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
  170. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
  171. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  172. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
  173. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
  174. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  175. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
  176. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
  177. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  178. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  179. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  180. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  181. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  182. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
  183. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  184. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/config.py +0 -0
  185. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/factory.py +0 -0
  186. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  187. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  188. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  189. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
  190. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
  191. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
  192. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
  193. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
  194. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +0 -0
  195. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +0 -0
  196. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +0 -0
  197. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
  198. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/schemas.py +0 -0
  199. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  200. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  201. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/tool.py +0 -0
  202. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  203. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  204. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  205. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  206. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  207. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  208. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic_table/__init__.py +0 -0
  209. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic_table/schemas.py +0 -0
  210. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/agentic_table/service.py +0 -0
  211. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/app/__init__.py +0 -0
  212. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/app/dev_util.py +0 -0
  213. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/app/fast_api_factory.py +0 -0
  214. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/app/init_logging.py +0 -0
  215. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/app/init_sdk.py +0 -0
  216. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/app/performance/async_tasks.py +0 -0
  217. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  218. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/app/schemas.py +0 -0
  219. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/app/unique_settings.py +0 -0
  220. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/app/verification.py +0 -0
  221. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/app/webhook.py +0 -0
  222. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/chat/__init__.py +0 -0
  223. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/chat/cancellation.py +0 -0
  224. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/chat/constants.py +0 -0
  225. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/chat/deprecated/service.py +0 -0
  226. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/chat/functions.py +0 -0
  227. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/chat/rendering.py +0 -0
  228. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/chat/responses_api.py +0 -0
  229. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/chat/schemas.py +0 -0
  230. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/chat/service.py +0 -0
  231. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/chat/state.py +0 -0
  232. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/chat/utils.py +0 -0
  233. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/content/__init__.py +0 -0
  234. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/content/constants.py +0 -0
  235. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/content/functions.py +0 -0
  236. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/content/schemas.py +0 -0
  237. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/content/service.py +0 -0
  238. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/content/smart_rules.py +0 -0
  239. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/content/utils.py +0 -0
  240. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/data_extraction/README.md +0 -0
  241. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/data_extraction/__init__.py +0 -0
  242. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
  243. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/data_extraction/augmented/service.py +0 -0
  244. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/data_extraction/base.py +0 -0
  245. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
  246. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/data_extraction/basic/config.py +0 -0
  247. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
  248. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/data_extraction/basic/service.py +0 -0
  249. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/elicitation/__init__.py +0 -0
  250. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/elicitation/constants.py +0 -0
  251. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/elicitation/exceptions.py +0 -0
  252. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/elicitation/functions.py +0 -0
  253. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/elicitation/schemas.py +0 -0
  254. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/elicitation/service.py +0 -0
  255. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/embedding/__init__.py +0 -0
  256. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/embedding/constants.py +0 -0
  257. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/embedding/functions.py +0 -0
  258. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/embedding/schemas.py +0 -0
  259. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/embedding/service.py +0 -0
  260. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/embedding/utils.py +0 -0
  261. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/framework_utilities/__init__.py +0 -0
  262. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
  263. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  264. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  265. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  266. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  267. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  268. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/framework_utilities/utils.py +0 -0
  269. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/language_model/__init__.py +0 -0
  270. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
  271. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/language_model/builder.py +0 -0
  272. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/language_model/constants.py +0 -0
  273. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/language_model/default_language_model.py +0 -0
  274. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/language_model/functions.py +0 -0
  275. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/language_model/infos.py +0 -0
  276. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/language_model/prompt.py +0 -0
  277. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/language_model/reference.py +0 -0
  278. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/language_model/schemas.py +0 -0
  279. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/language_model/service.py +0 -0
  280. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/language_model/stream_transform.py +0 -0
  281. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/language_model/utils.py +0 -0
  282. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/protocols/support.py +0 -0
  283. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/services/__init__.py +0 -0
  284. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/services/chat_service.py +0 -0
  285. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/services/factory.py +0 -0
  286. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/services/knowledge_base.py +0 -0
  287. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/short_term_memory/__init__.py +0 -0
  288. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/short_term_memory/constants.py +0 -0
  289. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/short_term_memory/functions.py +0 -0
  290. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/short_term_memory/schemas.py +0 -0
  291. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/short_term_memory/service.py +0 -0
  292. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/smart_rules/__init__.py +0 -0
  293. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/unique_toolkit/smart_rules/compile.py +0 -0
  294. {unique_toolkit-1.64.7 → unique_toolkit-1.65.1}/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.64.7
3
+ Version: 1.65.1
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.64.7"
3
+ version = "1.65.1"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -0,0 +1,11 @@
1
+ from unique_toolkit.agentic.tools.experimental.open_file_tool import (
2
+ OpenFileTool,
3
+ OpenFileToolRuntime,
4
+ OpenFileToolRuntimeConfig,
5
+ )
6
+
7
+ __all__ = [
8
+ "OpenFileTool",
9
+ "OpenFileToolRuntime",
10
+ "OpenFileToolRuntimeConfig",
11
+ ]
@@ -0,0 +1,11 @@
1
+ from unique_toolkit.agentic.tools.experimental.open_file_tool.runtime import (
2
+ OpenFileToolRuntime,
3
+ OpenFileToolRuntimeConfig,
4
+ )
5
+ from unique_toolkit.agentic.tools.experimental.open_file_tool.tool import OpenFileTool
6
+
7
+ __all__ = [
8
+ "OpenFileTool",
9
+ "OpenFileToolRuntime",
10
+ "OpenFileToolRuntimeConfig",
11
+ ]
@@ -0,0 +1,97 @@
1
+ from typing import Annotated
2
+
3
+ from pydantic import Field
4
+
5
+ from unique_toolkit._common.pydantic.rjsf_tags import RJSFMetaTag
6
+ from unique_toolkit.agentic.tools.schemas import BaseToolConfig
7
+
8
+ DEFAULT_TOOL_DESCRIPTION = """Open one or more documents so you can read and reason over their full content. ALWAYS call this tool for any file you want to answer questions about — the text chunks from InternalSearch are lossy extracts and miss tables, charts, layout, and context. Opening the full file gives you far superior information.
9
+ """
10
+
11
+ DEFAULT_TOOL_DESCRIPTION_FOR_SYSTEM_PROMPT = """When the user asks you to work with, analyze, summarize, or reason over a document, you MUST open it with OpenFile before answering. The text chunks returned by InternalSearch are extracted fragments — they lose tables, charts, formatting, and cross-page context. Opening the full file gives you the complete document with all visual and structural information intact.
12
+
13
+ Workflow:
14
+ 1. Use InternalSearch to find relevant documents and identify their content_ids.
15
+ 2. Call OpenFile with the content_ids of the files you need.
16
+ 3. The full files will be available in the next iteration for you to read.
17
+ 4. Answer the user's question using the full file content, referencing the InternalSearch source numbers for citations.
18
+
19
+ You should still cite source numbers from InternalSearch in your answer (e.g. [source0]), but base your reasoning on the full opened file when available.
20
+ """
21
+
22
+ DEFAULT_TOOL_PARAMETER_CONTENT_IDS_DESCRIPTION = """List of content_ids of the documents to open. Each content_id is found in search results as the 'content_id' field (starts with 'cont_')."""
23
+
24
+
25
+ class OpenFileToolConfig(BaseToolConfig):
26
+ """Configuration for the OpenFile tool."""
27
+
28
+ enabled: Annotated[
29
+ bool,
30
+ RJSFMetaTag.BooleanWidget.checkbox(
31
+ help=(
32
+ "Master switch for all Open File Tool. When disabled, "
33
+ "none of the other flags in this config block take effect."
34
+ ),
35
+ ),
36
+ ] = Field(
37
+ default=False,
38
+ description="Enable the Open File Tool.",
39
+ )
40
+
41
+ send_files_in_payload: Annotated[
42
+ bool,
43
+ RJSFMetaTag.BooleanWidget.checkbox(
44
+ help=(
45
+ "Enable the OpenFile tool for knowledge-base files. When the agent "
46
+ "finds files via InternalSearch, it can call OpenFile with the "
47
+ "content_id to include the full document in the LLM context "
48
+ "(unique://content/<id> URLs, resolved to base64 by the backend). "
49
+ "Only takes effect when use_responses_api is also True."
50
+ ),
51
+ ),
52
+ ] = Field(
53
+ default=False,
54
+ description="Enable the OpenFile tool for knowledge-base files.",
55
+ )
56
+
57
+ send_uploaded_files_in_payload: Annotated[
58
+ bool,
59
+ RJSFMetaTag.BooleanWidget.checkbox(
60
+ help=(
61
+ "Attach uploaded files directly to the LLM payload as full "
62
+ "documents (unique://content/<id> URLs, resolved to base64 by the "
63
+ "backend). When enabled, uploaded files bypass InternalSearch and "
64
+ "are included automatically from iteration 1. "
65
+ "Only takes effect when use_responses_api is also True."
66
+ ),
67
+ ),
68
+ ] = Field(
69
+ default=False,
70
+ description="Attach uploaded files directly to the LLM payload.",
71
+ )
72
+
73
+ tool_description: Annotated[
74
+ str,
75
+ RJSFMetaTag.StringWidget.textarea(rows=3),
76
+ ] = Field(
77
+ default=DEFAULT_TOOL_DESCRIPTION,
78
+ description="The description of the tool that will be included in the system prompt.",
79
+ )
80
+
81
+ tool_description_for_system_prompt: Annotated[
82
+ str,
83
+ RJSFMetaTag.StringWidget.textarea(rows=7),
84
+ ] = Field(
85
+ default=DEFAULT_TOOL_DESCRIPTION_FOR_SYSTEM_PROMPT,
86
+ description="The description of the tool that will be included in the system prompt.",
87
+ )
88
+
89
+ tool_parameter_description_content_ids: Annotated[
90
+ str,
91
+ RJSFMetaTag.StringWidget.textarea(
92
+ rows=len(DEFAULT_TOOL_PARAMETER_CONTENT_IDS_DESCRIPTION.split("\n"))
93
+ ),
94
+ ] = Field(
95
+ default=DEFAULT_TOOL_PARAMETER_CONTENT_IDS_DESCRIPTION,
96
+ description="The description of the tool parameter 'content_ids'.",
97
+ )
@@ -0,0 +1,390 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from datetime import datetime, timezone
5
+ from logging import Logger
6
+ from typing import Any
7
+
8
+ from unique_toolkit.agentic.evaluation.schemas import EvaluationMetricName
9
+ from unique_toolkit.agentic.message_log_manager.service import MessageStepLogger
10
+ from unique_toolkit.agentic.tools.tool_manager import (
11
+ ResponsesApiToolManager,
12
+ ToolManager,
13
+ )
14
+ from unique_toolkit.content.schemas import Content
15
+ from unique_toolkit.language_model.schemas import (
16
+ LanguageModelAssistantMessage,
17
+ LanguageModelFunction,
18
+ LanguageModelMessageRole,
19
+ LanguageModelMessages,
20
+ LanguageModelToolMessage,
21
+ LanguageModelUserMessage,
22
+ )
23
+
24
+
25
+ @dataclass(frozen=True)
26
+ class OpenFileToolRuntimeConfig:
27
+ """Flat configuration for the OpenFileTool runtime.
28
+
29
+ The orchestrator is responsible for mapping its own nested config
30
+ (e.g. ``UniqueAIConfig``) into this structure.
31
+ """
32
+
33
+ enabled: bool = False
34
+ send_files_in_payload: bool = False
35
+ send_uploaded_files_in_payload: bool = False
36
+ use_responses_api: bool = False
37
+
38
+
39
+ class OpenFileToolRuntime:
40
+ """Runtime helper for the experimental OpenFile payload flow."""
41
+
42
+ _OPEN_FILE_TOOL_NAME = "OpenFile"
43
+ _RETRY_SIGNALS = (
44
+ "too large",
45
+ "payload too large",
46
+ "request entity too large",
47
+ "content_length_exceeded",
48
+ "max_tokens",
49
+ "context_length_exceeded",
50
+ "413",
51
+ "request too large",
52
+ "403 forbidden",
53
+ "application-gateway",
54
+ )
55
+ _FILE_TOO_LARGE_TOOL_RESPONSE = (
56
+ "ERROR: The file is too large to open. "
57
+ "Could not include the document in the context. "
58
+ "Please inform the user that the file is too large to process directly "
59
+ "and suggest asking an admin to include the document in the knowledge base."
60
+ )
61
+ _OPEN_FILE_SYSTEM_REMINDER = (
62
+ "<|system_reminder|>Documents were found in the search results. "
63
+ "For any file you want to reference or reason over, call the OpenFile tool "
64
+ "with the content_id from the search results. The document name is shown "
65
+ "inside <|document|>...<|/document|> tags in the content field. "
66
+ "The full file provides far better information than the extracted text "
67
+ "chunks (tables, charts, layout, and cross-page context are preserved)."
68
+ "<|/system_reminder|>"
69
+ )
70
+
71
+ def __init__(
72
+ self,
73
+ logger: Logger,
74
+ config: OpenFileToolRuntimeConfig,
75
+ content_service: Any,
76
+ tool_manager: ResponsesApiToolManager | ToolManager,
77
+ message_step_logger: MessageStepLogger,
78
+ agent_file_registry: list[str],
79
+ ) -> None:
80
+ self._logger = logger
81
+ self._config = config
82
+ self._content_service = content_service
83
+ self._tool_manager = tool_manager
84
+ self._message_step_logger = message_step_logger
85
+ self._agent_file_registry = agent_file_registry
86
+ self._cached_uploaded_documents: list[Content] | None = None
87
+ self._file_payload_attachments_disabled = False
88
+
89
+ def should_attach_content_files(self) -> bool:
90
+ if self._file_payload_attachments_disabled:
91
+ return False
92
+
93
+ return self._is_feature_enabled() and (
94
+ self._kb_file_payload_enabled() or self._uploaded_file_payload_enabled()
95
+ )
96
+
97
+ def inject_content_files_into_user_message(
98
+ self, messages: LanguageModelMessages
99
+ ) -> LanguageModelMessages:
100
+ file_parts = self._collect_content_file_parts()
101
+ if not file_parts:
102
+ return messages
103
+
104
+ for index in range(len(messages.root) - 1, -1, -1):
105
+ message = messages.root[index]
106
+ if message.role != LanguageModelMessageRole.USER:
107
+ continue
108
+
109
+ content_parts: list[dict[str, Any]] = []
110
+ if isinstance(message.content, str):
111
+ content_parts.append({"type": "text", "text": message.content})
112
+ elif isinstance(message.content, list):
113
+ content_parts.extend(
114
+ part for part in message.content if isinstance(part, dict)
115
+ )
116
+
117
+ if not content_parts:
118
+ content_parts = [{"type": "text", "text": ""}]
119
+
120
+ messages.root[index] = LanguageModelUserMessage(
121
+ content=content_parts + file_parts
122
+ )
123
+ break
124
+
125
+ return messages
126
+
127
+ def should_retry_without_files(self, exc: Exception) -> bool:
128
+ if self._file_payload_attachments_disabled:
129
+ return False
130
+ if not self._is_feature_enabled():
131
+ return False
132
+ if (
133
+ not self._kb_file_payload_enabled()
134
+ and not self._uploaded_file_payload_enabled()
135
+ ):
136
+ return False
137
+
138
+ has_kb_files = self._kb_file_payload_enabled() and bool(
139
+ self._agent_file_registry
140
+ )
141
+ has_uploaded_files = self._uploaded_file_payload_enabled() and bool(
142
+ self._get_uploaded_documents()
143
+ )
144
+ if not has_kb_files and not has_uploaded_files:
145
+ return False
146
+
147
+ error_text = str(exc).lower()
148
+ return any(signal in error_text for signal in self._RETRY_SIGNALS)
149
+
150
+ def prepare_retry_messages(
151
+ self, messages: LanguageModelMessages
152
+ ) -> LanguageModelMessages:
153
+ self._tool_manager.exclude_tool(self._OPEN_FILE_TOOL_NAME)
154
+ self._file_payload_attachments_disabled = True
155
+
156
+ messages = self.strip_file_parts_from_messages(messages)
157
+
158
+ if self._kb_file_payload_enabled():
159
+ self._strip_open_file_messages(messages)
160
+ if self._uploaded_file_payload_enabled():
161
+ self._inject_uploaded_file_fallback_messages(messages)
162
+
163
+ self._agent_file_registry.clear()
164
+ return messages
165
+
166
+ async def report_file_fallback_step(self) -> None:
167
+ await self._message_step_logger.create_message_log_entry_async(
168
+ text=(
169
+ "**Open File:** The file is too large to open. "
170
+ "Please ask an admin to include the document in the knowledge base."
171
+ ),
172
+ references=[],
173
+ )
174
+
175
+ def filter_evaluation_names(
176
+ self, evaluation_names: list[EvaluationMetricName]
177
+ ) -> list[EvaluationMetricName]:
178
+ if not self._agent_file_registry:
179
+ return evaluation_names
180
+
181
+ filtered_names = [
182
+ name
183
+ for name in evaluation_names
184
+ if name != EvaluationMetricName.HALLUCINATION
185
+ ]
186
+ if len(filtered_names) != len(evaluation_names):
187
+ self._logger.info(
188
+ "OpenFile was used - skipping hallucination check "
189
+ "(LLM has full file content, not just search chunks)."
190
+ )
191
+ return filtered_names
192
+
193
+ def inject_open_file_reminder(self, tool_call_responses: list[Any]) -> None:
194
+ if not self._tool_manager.get_tool_by_name(self._OPEN_FILE_TOOL_NAME):
195
+ return
196
+
197
+ for response in tool_call_responses:
198
+ if response.name != "InternalSearch":
199
+ continue
200
+
201
+ has_pdf_chunks = any(
202
+ chunk.key and chunk.key.split(" : ")[0].lower().endswith(".pdf")
203
+ for chunk in (response.content_chunks or [])
204
+ )
205
+ if not has_pdf_chunks:
206
+ continue
207
+
208
+ existing_reminder = response.system_reminder or ""
209
+ response.system_reminder = (
210
+ f"{existing_reminder}\n{self._OPEN_FILE_SYSTEM_REMINDER}".strip()
211
+ )
212
+
213
+ def get_uploaded_documents(self) -> list[Content]:
214
+ return self._get_uploaded_documents()
215
+
216
+ @staticmethod
217
+ def strip_file_parts_from_messages(
218
+ messages: LanguageModelMessages,
219
+ ) -> LanguageModelMessages:
220
+ for index, message in enumerate(messages.root):
221
+ if message.role != LanguageModelMessageRole.USER:
222
+ continue
223
+ if not isinstance(message.content, list):
224
+ continue
225
+
226
+ content_parts = [
227
+ part
228
+ for part in message.content
229
+ if not (isinstance(part, dict) and part.get("type") == "file")
230
+ ]
231
+ if len(content_parts) == len(message.content):
232
+ continue
233
+
234
+ messages.root[index] = LanguageModelUserMessage(content=content_parts)
235
+
236
+ return messages
237
+
238
+ def _is_feature_enabled(self) -> bool:
239
+ return self._config.use_responses_api and self._config.enabled
240
+
241
+ def _kb_file_payload_enabled(self) -> bool:
242
+ return self._config.send_files_in_payload
243
+
244
+ def _uploaded_file_payload_enabled(self) -> bool:
245
+ return self._config.send_uploaded_files_in_payload
246
+
247
+ def _get_uploaded_documents(self) -> list[Content]:
248
+ if self._cached_uploaded_documents is None:
249
+ now = datetime.now(timezone.utc)
250
+ all_documents = self._content_service.get_documents_uploaded_to_chat()
251
+ uploaded_documents = [
252
+ document
253
+ for document in all_documents
254
+ if (document.expired_at is None or document.expired_at > now)
255
+ and document.key.lower().endswith(".pdf")
256
+ ]
257
+ self._cached_uploaded_documents = sorted(
258
+ uploaded_documents,
259
+ key=lambda document: (
260
+ document.created_at is None,
261
+ document.created_at or datetime.max.replace(tzinfo=timezone.utc),
262
+ ),
263
+ )
264
+ return self._cached_uploaded_documents
265
+
266
+ def _collect_content_file_parts(self) -> list[dict[str, dict[str, str] | str]]:
267
+ if self._file_payload_attachments_disabled:
268
+ return []
269
+
270
+ seen_ids: set[str] = set()
271
+ file_parts: list[dict[str, dict[str, str] | str]] = []
272
+
273
+ if self._uploaded_file_payload_enabled():
274
+ for document in self._get_uploaded_documents():
275
+ if not document.id or document.id in seen_ids:
276
+ continue
277
+
278
+ seen_ids.add(document.id)
279
+ file_parts.append(
280
+ {
281
+ "type": "file",
282
+ "file": {
283
+ "filename": document.key or document.id,
284
+ "file_data": f"unique://content/{document.id}",
285
+ },
286
+ }
287
+ )
288
+
289
+ if self._kb_file_payload_enabled():
290
+ for content_id in self._agent_file_registry:
291
+ if content_id in seen_ids:
292
+ continue
293
+
294
+ seen_ids.add(content_id)
295
+ file_parts.append(
296
+ {
297
+ "type": "file",
298
+ "file": {
299
+ "filename": content_id,
300
+ "file_data": f"unique://content/{content_id}",
301
+ },
302
+ }
303
+ )
304
+
305
+ return file_parts
306
+
307
+ @staticmethod
308
+ def _is_empty_assistant_content(
309
+ content: str | list[dict[str, Any]] | None,
310
+ ) -> bool:
311
+ if content is None:
312
+ return True
313
+ if isinstance(content, str):
314
+ return not content.strip()
315
+ if isinstance(content, list):
316
+ return len(content) == 0
317
+ return False
318
+
319
+ def _strip_open_file_messages(self, messages: LanguageModelMessages) -> None:
320
+ open_file_call_ids: set[str] = set()
321
+
322
+ for message in messages.root:
323
+ if not isinstance(message, LanguageModelAssistantMessage):
324
+ continue
325
+ if not message.tool_calls:
326
+ continue
327
+
328
+ for tool_call in message.tool_calls:
329
+ if tool_call.function.name == self._OPEN_FILE_TOOL_NAME:
330
+ open_file_call_ids.add(tool_call.id or tool_call.function.id)
331
+
332
+ if not open_file_call_ids:
333
+ return
334
+
335
+ messages.root[:] = [
336
+ message
337
+ for message in messages.root
338
+ if not (
339
+ isinstance(message, LanguageModelToolMessage)
340
+ and message.tool_call_id in open_file_call_ids
341
+ )
342
+ ]
343
+
344
+ for message in messages.root:
345
+ if not isinstance(message, LanguageModelAssistantMessage):
346
+ continue
347
+ if not message.tool_calls:
348
+ continue
349
+
350
+ message.tool_calls = [
351
+ tool_call
352
+ for tool_call in message.tool_calls
353
+ if tool_call.function.name != self._OPEN_FILE_TOOL_NAME
354
+ ]
355
+ if not message.tool_calls:
356
+ message.tool_calls = None
357
+
358
+ messages.root[:] = [
359
+ message
360
+ for message in messages.root
361
+ if not (
362
+ isinstance(message, LanguageModelAssistantMessage)
363
+ and not message.tool_calls
364
+ and self._is_empty_assistant_content(message.content)
365
+ )
366
+ ]
367
+
368
+ def _inject_uploaded_file_fallback_messages(
369
+ self, messages: LanguageModelMessages
370
+ ) -> None:
371
+ uploaded_documents = self._get_uploaded_documents()
372
+ if not uploaded_documents:
373
+ return
374
+
375
+ content_ids = [document.id for document in uploaded_documents if document.id]
376
+ if not content_ids:
377
+ return
378
+
379
+ function = LanguageModelFunction(
380
+ name=self._OPEN_FILE_TOOL_NAME,
381
+ arguments={"content_ids": content_ids},
382
+ )
383
+ assistant_message = LanguageModelAssistantMessage.from_functions([function])
384
+ tool_message = LanguageModelToolMessage(
385
+ content=self._FILE_TOO_LARGE_TOOL_RESPONSE,
386
+ name=self._OPEN_FILE_TOOL_NAME,
387
+ tool_call_id=function.id,
388
+ )
389
+ messages.root.append(assistant_message)
390
+ messages.root.append(tool_message)
@@ -0,0 +1,108 @@
1
+ from unique_toolkit.agentic.evaluation.schemas import EvaluationMetricName
2
+ from unique_toolkit.agentic.tools.experimental.open_file_tool.config import (
3
+ OpenFileToolConfig,
4
+ )
5
+ from unique_toolkit.agentic.tools.factory import ToolFactory
6
+ from unique_toolkit.agentic.tools.schemas import ToolCallResponse
7
+ from unique_toolkit.agentic.tools.tool import Tool
8
+ from unique_toolkit.app.schemas import ChatEvent
9
+ from unique_toolkit.language_model.schemas import (
10
+ LanguageModelFunction,
11
+ LanguageModelToolDescription,
12
+ )
13
+
14
+
15
+ class OpenFileTool(Tool[OpenFileToolConfig]):
16
+ """Tool that lets the agent open a knowledge-base file so the full document
17
+ is included in the LLM payload (unique://content/<id> URL).
18
+
19
+ The agent calls this with the content_id it sees in search results. The
20
+ shared registry is then read by OpenFileToolRuntime on every subsequent
21
+ loop iteration.
22
+ """
23
+
24
+ name = "OpenFile"
25
+
26
+ def __init__(
27
+ self,
28
+ event: ChatEvent,
29
+ registry: list[str],
30
+ config: OpenFileToolConfig,
31
+ ) -> None:
32
+ super().__init__(config, event)
33
+ self._registry = registry
34
+
35
+ def display_name(self) -> str:
36
+ return "Open File"
37
+
38
+ def tool_description(self) -> LanguageModelToolDescription:
39
+ return LanguageModelToolDescription(
40
+ name=self.name,
41
+ description=self.config.tool_description,
42
+ parameters={
43
+ "type": "object",
44
+ "properties": {
45
+ "content_ids": {
46
+ "type": "array",
47
+ "items": {"type": "string"},
48
+ "description": self.config.tool_parameter_description_content_ids,
49
+ }
50
+ },
51
+ "required": ["content_ids"],
52
+ },
53
+ )
54
+
55
+ def tool_description_for_system_prompt(self) -> str:
56
+ return self.config.tool_description_for_system_prompt
57
+
58
+ async def run(self, tool_call: LanguageModelFunction) -> ToolCallResponse:
59
+ args = tool_call.arguments or {}
60
+ content_ids: list[str] = args.get("content_ids", [])
61
+
62
+ if not isinstance(content_ids, list) or not content_ids:
63
+ return ToolCallResponse(
64
+ id=tool_call.id, # type: ignore
65
+ name=self.name,
66
+ error_message="content_ids must be a non-empty list of content IDs.",
67
+ )
68
+
69
+ invalid = [cid for cid in content_ids if not cid.startswith("cont_")]
70
+ if invalid:
71
+ return ToolCallResponse(
72
+ id=tool_call.id, # type: ignore
73
+ name=self.name,
74
+ error_message=(
75
+ f"Invalid content_id(s): {invalid}. "
76
+ "All IDs must start with 'cont_'."
77
+ ),
78
+ )
79
+
80
+ added = []
81
+ for content_id in content_ids:
82
+ if content_id not in self._registry:
83
+ self._registry.append(content_id)
84
+ added.append(content_id)
85
+
86
+ already = [cid for cid in content_ids if cid not in added]
87
+ parts = []
88
+ if added:
89
+ parts.append(f"Added: {added}")
90
+ if already:
91
+ parts.append(f"Already registered: {already}")
92
+
93
+ return ToolCallResponse(
94
+ id=tool_call.id, # type: ignore
95
+ name=self.name,
96
+ content=f"Files will be included in the LLM context. {' | '.join(parts)}",
97
+ )
98
+
99
+ def evaluation_check_list(self) -> list[EvaluationMetricName]:
100
+ return []
101
+
102
+ def get_evaluation_checks_based_on_tool_response(
103
+ self, tool_response: ToolCallResponse
104
+ ) -> list[EvaluationMetricName]:
105
+ return []
106
+
107
+
108
+ ToolFactory.register_tool(OpenFileTool, OpenFileToolConfig)
@@ -106,6 +106,7 @@ Handling User Queries:
106
106
  - Whenever the user query requires using the python tool, you must always think first about the steps required.
107
107
  - CRITICAL: If any step generates a plot or visualization, that code block MUST include `plt.savefig('/mnt/data/<filename>.png', bbox_inches='tight')` and `plt.close()` as the final lines. Code that only calls `plt.show()` without saving will NOT display the image to the user.
108
108
  - CRITICAL: NEVER reference a `sandbox:/mnt/data/<filename>` link unless you have already executed code in this response that saved that exact file. Referencing a file that was not created by executed code will result in a broken link.
109
+ - CRITICAL: The sandbox has NO internet access. NEVER use `requests`, `httpx`, `urllib`, or any other HTTP library to fetch data from the web — these calls will always fail. If the user's query requires live web data (e.g. market prices, news, APIs), you MUST retrieve it using the web search tool first and then pass the result into the code interpreter.
109
110
  - Use the tool multiple times:
110
111
  - You MUST NOT guess anything about the structure of the data / files uploaded. Rather, you MUST perform some data exploration first.
111
112
  - Example: User uploads an excel files and asks a question about it. First Read the data, explore the columns, columns types, etc. Then use the tool to answer the user's query.
@@ -138,10 +139,12 @@ class OpenAICodeInterpreterConfig(BaseToolConfig):
138
139
  tool_description_for_system_prompt: Annotated[
139
140
  str,
140
141
  RJSFMetaTag.StringWidget.textarea(
141
- rows=int(len(DEFAULT_TOOL_DESCRIPTION_FOR_SYSTEM_PROMPT.split("\n")) / 2)
142
+ rows=int(
143
+ len(DEFAULT_TOOL_DESCRIPTION_FOR_SYSTEM_PROMPT_FENCE.split("\n")) / 2
144
+ )
142
145
  ),
143
146
  ] = Field(
144
- default=DEFAULT_TOOL_DESCRIPTION_FOR_SYSTEM_PROMPT,
147
+ default=DEFAULT_TOOL_DESCRIPTION_FOR_SYSTEM_PROMPT_FENCE,
145
148
  description="The description of the tool that will be included in the system prompt.",
146
149
  )
147
150
  tool_description_for_user_prompt: SkipJsonSchema[str] = (