unique_toolkit 1.47.2__tar.gz → 1.47.4__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 (286) hide show
  1. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/CHANGELOG.md +7 -0
  2. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/PKG-INFO +10 -2
  3. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/pyproject.toml +11 -1
  4. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/pydantic/rjsf_tags.py +140 -9
  5. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +9 -2
  6. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +37 -0
  7. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/tool/config.py +20 -7
  8. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +2 -0
  9. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/LICENSE +0 -0
  10. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/README.md +0 -0
  11. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/__init__.py +0 -0
  12. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/__init__.py +0 -0
  13. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/_base_service.py +0 -0
  14. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/_time_utils.py +0 -0
  15. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  16. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  17. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  18. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  19. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  20. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  21. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  22. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/config_checker/README.md +0 -0
  23. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/config_checker/__init__.py +0 -0
  24. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/config_checker/__main__.py +0 -0
  25. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/config_checker/cli.py +0 -0
  26. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/config_checker/differ.py +0 -0
  27. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/config_checker/exporter.py +0 -0
  28. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/config_checker/models.py +0 -0
  29. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/config_checker/registry.py +0 -0
  30. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/config_checker/validator.py +0 -0
  31. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/default_language_model.py +0 -0
  32. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
  33. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/docx_generator/config.py +0 -0
  34. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
  35. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/docx_generator/service.py +0 -0
  36. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
  37. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/endpoint_builder.py +0 -0
  38. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  39. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/event_bus.py +0 -0
  40. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/exception.py +0 -0
  41. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/execution.py +0 -0
  42. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
  43. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
  44. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
  45. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
  46. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
  47. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
  48. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
  49. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
  50. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
  51. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
  52. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
  53. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
  54. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
  55. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
  56. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
  57. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
  58. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
  59. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
  60. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
  61. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
  62. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
  63. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
  64. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
  65. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
  66. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
  67. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
  68. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
  69. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  70. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  71. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/referencing.py +0 -0
  72. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/string_utilities.py +0 -0
  73. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/tests/test_referencing.py +0 -0
  74. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
  75. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/token/__init__.py +0 -0
  76. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  77. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/token/token_counting.py +0 -0
  78. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
  79. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
  80. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/utils/__init__.py +0 -0
  81. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/utils/files.py +0 -0
  82. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/utils/image/encode.py +0 -0
  83. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
  84. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/utils/jinja/render.py +0 -0
  85. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
  86. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
  87. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  88. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  89. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  90. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/validate_required_values.py +0 -0
  91. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/_common/validators.py +0 -0
  92. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/__init__.py +0 -0
  93. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/config.py +0 -0
  94. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
  95. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
  96. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
  97. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  98. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
  99. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
  100. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  101. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  102. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
  103. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
  104. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
  105. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
  106. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  107. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
  108. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  109. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
  110. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
  111. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
  112. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  113. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
  114. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -0
  115. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  116. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
  117. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/evaluation/utils.py +0 -0
  118. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
  119. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/feature_flags/feature_flags.py +0 -0
  120. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  121. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  122. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
  123. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  124. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/loop_runner/__init__.py +0 -0
  125. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
  126. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
  127. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
  128. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
  129. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/loop_runner/base.py +0 -0
  130. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
  131. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
  132. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +0 -0
  133. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
  134. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
  135. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
  136. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
  137. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
  138. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
  139. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
  140. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
  141. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
  142. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  143. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
  144. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
  145. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
  146. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
  147. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  148. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  149. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/__init__.py +0 -0
  150. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  151. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  152. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  153. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  154. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  155. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
  156. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  157. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  158. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  159. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
  160. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
  161. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  162. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
  163. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
  164. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  165. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
  166. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
  167. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  168. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
  169. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
  170. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  171. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  172. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  173. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  174. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
  175. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  176. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/config.py +0 -0
  177. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/factory.py +0 -0
  178. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  179. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  180. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  181. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
  182. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
  183. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
  184. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
  185. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
  186. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +0 -0
  187. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +0 -0
  188. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +0 -0
  189. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
  190. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/schemas.py +0 -0
  191. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  192. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  193. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/tool.py +0 -0
  194. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
  195. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  196. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  197. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  198. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  199. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  200. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  201. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic_table/__init__.py +0 -0
  202. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic_table/schemas.py +0 -0
  203. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/agentic_table/service.py +0 -0
  204. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/app/__init__.py +0 -0
  205. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/app/dev_util.py +0 -0
  206. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/app/fast_api_factory.py +0 -0
  207. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/app/init_logging.py +0 -0
  208. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/app/init_sdk.py +0 -0
  209. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/app/performance/async_tasks.py +0 -0
  210. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  211. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/app/schemas.py +0 -0
  212. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/app/unique_settings.py +0 -0
  213. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/app/verification.py +0 -0
  214. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/app/webhook.py +0 -0
  215. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/chat/__init__.py +0 -0
  216. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/chat/cancellation.py +0 -0
  217. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/chat/constants.py +0 -0
  218. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/chat/deprecated/service.py +0 -0
  219. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/chat/functions.py +0 -0
  220. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/chat/rendering.py +0 -0
  221. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/chat/responses_api.py +0 -0
  222. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/chat/schemas.py +0 -0
  223. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/chat/service.py +0 -0
  224. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/chat/state.py +0 -0
  225. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/chat/utils.py +0 -0
  226. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/content/__init__.py +0 -0
  227. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/content/constants.py +0 -0
  228. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/content/functions.py +0 -0
  229. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/content/schemas.py +0 -0
  230. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/content/service.py +0 -0
  231. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/content/smart_rules.py +0 -0
  232. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/content/utils.py +0 -0
  233. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/data_extraction/README.md +0 -0
  234. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/data_extraction/__init__.py +0 -0
  235. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
  236. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/data_extraction/augmented/service.py +0 -0
  237. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/data_extraction/base.py +0 -0
  238. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
  239. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/data_extraction/basic/config.py +0 -0
  240. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
  241. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/data_extraction/basic/service.py +0 -0
  242. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/elicitation/__init__.py +0 -0
  243. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/elicitation/constants.py +0 -0
  244. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/elicitation/exceptions.py +0 -0
  245. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/elicitation/functions.py +0 -0
  246. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/elicitation/schemas.py +0 -0
  247. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/elicitation/service.py +0 -0
  248. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/embedding/__init__.py +0 -0
  249. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/embedding/constants.py +0 -0
  250. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/embedding/functions.py +0 -0
  251. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/embedding/schemas.py +0 -0
  252. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/embedding/service.py +0 -0
  253. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/embedding/utils.py +0 -0
  254. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/framework_utilities/__init__.py +0 -0
  255. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
  256. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  257. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  258. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  259. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  260. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  261. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/framework_utilities/utils.py +0 -0
  262. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/language_model/__init__.py +0 -0
  263. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
  264. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/language_model/builder.py +0 -0
  265. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/language_model/constants.py +0 -0
  266. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/language_model/default_language_model.py +0 -0
  267. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/language_model/functions.py +0 -0
  268. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/language_model/infos.py +0 -0
  269. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/language_model/prompt.py +0 -0
  270. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/language_model/reference.py +0 -0
  271. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/language_model/schemas.py +0 -0
  272. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/language_model/service.py +0 -0
  273. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/language_model/stream_transform.py +0 -0
  274. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/language_model/utils.py +0 -0
  275. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/protocols/support.py +0 -0
  276. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/services/__init__.py +0 -0
  277. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/services/chat_service.py +0 -0
  278. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/services/knowledge_base.py +0 -0
  279. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/short_term_memory/__init__.py +0 -0
  280. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/short_term_memory/constants.py +0 -0
  281. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/short_term_memory/functions.py +0 -0
  282. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/short_term_memory/schemas.py +0 -0
  283. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/short_term_memory/service.py +0 -0
  284. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/smart_rules/__init__.py +0 -0
  285. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/smart_rules/compile.py +0 -0
  286. {unique_toolkit-1.47.2 → unique_toolkit-1.47.4}/unique_toolkit/test_utilities/events.py +0 -0
@@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.47.4] - 2026-02-24
9
+ - Extend RJSF tags: add `CustomWidget.custom()` with `CustomWidgetName`, `ObjectWidget.collapsible()`, `SpecialWidget.hidden()`
10
+ - Add RJSF meta tags to `SubAgentToolConfig` text fields (textarea with rows=5 for tool descriptions and format info)
11
+
12
+ ## [1.47.3] - 2026-02-24
13
+ - Add `mcp_server` name to debug info for analytics
14
+
8
15
  ## [1.47.2] - 2026-02-23
9
16
  - Add HTML rendering documentation (inline HTML and content references)
10
17
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: unique_toolkit
3
- Version: 1.47.2
3
+ Version: 1.47.4
4
4
  Summary:
5
5
  License: Proprietary
6
6
  Author: Cedric Klinkert
@@ -9,6 +9,7 @@ Requires-Python: >=3.12,<4.0
9
9
  Classifier: License :: Other/Proprietary License
10
10
  Classifier: Programming Language :: Python :: 3
11
11
  Classifier: Programming Language :: Python :: 3.12
12
+ Classifier: Programming Language :: Python :: 3.13
12
13
  Requires-Dist: aiohttp (>=3.12.0,<4.0.0)
13
14
  Requires-Dist: click (>=8.1.0,<9.0.0)
14
15
  Requires-Dist: deepdiff (>=8.6.1,<9.0.0)
@@ -127,6 +128,13 @@ All notable changes to this project will be documented in this file.
127
128
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
128
129
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
129
130
 
131
+ ## [1.47.4] - 2026-02-24
132
+ - Extend RJSF tags: add `CustomWidget.custom()` with `CustomWidgetName`, `ObjectWidget.collapsible()`, `SpecialWidget.hidden()`
133
+ - Add RJSF meta tags to `SubAgentToolConfig` text fields (textarea with rows=5 for tool descriptions and format info)
134
+
135
+ ## [1.47.3] - 2026-02-24
136
+ - Add `mcp_server` name to debug info for analytics
137
+
130
138
  ## [1.47.2] - 2026-02-23
131
139
  - Add HTML rendering documentation (inline HTML and content references)
132
140
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "unique_toolkit"
3
- version = "1.47.2"
3
+ version = "1.47.4"
4
4
  description = ""
5
5
  authors = [
6
6
  "Cedric Klinkert <cedric.klinkert@unique.ch>",
@@ -94,6 +94,16 @@ coverage = "pytest --cov=unique_toolkit --cov-report=term-missing"
94
94
  ci-typecheck = { shell = "bash $(git rev-parse --show-toplevel)/.github/scripts/dev.sh typecheck" }
95
95
  ci-coverage = { shell = "bash $(git rev-parse --show-toplevel)/.github/scripts/dev.sh coverage" }
96
96
 
97
+ [tool.pytest.ini_options]
98
+ addopts = "--strict-markers"
99
+ asyncio_mode = "auto"
100
+ markers = [
101
+ "ai: AI-generated tests",
102
+ "verified: AI-generated tests with human verification",
103
+ "wip: Work in progress tests"
104
+ ]
105
+ filterwarnings = ["ignore::DeprecationWarning"]
106
+
97
107
  [tool.deptry]
98
108
  known_first_party = ["unique_toolkit"]
99
109
  extend_exclude = ["docs", "tests", "unique_toolkit/.*/test", "unique_toolkit/.*/tests"]
@@ -13,12 +13,21 @@ Key components:
13
13
 
14
14
  from __future__ import annotations
15
15
 
16
+ from collections.abc import Callable
17
+ from enum import StrEnum
16
18
  from typing import Annotated, Any, Union, get_args, get_origin
17
19
 
18
20
  from pydantic import BaseModel
19
21
  from typing_extensions import get_type_hints
20
22
 
21
23
 
24
+ class CustomWidgetName(StrEnum):
25
+ """Mirrors TypeScript CustomWidgetName. Keep in sync when extending."""
26
+
27
+ ICON_PICKER = "iconPicker"
28
+ # Add new entries here when adding custom widgets in TypeScript
29
+
30
+
22
31
  # --------- Base Metadata carrier ----------
23
32
  class RJSFMetaTag:
24
33
  def __init__(self, attrs: dict[str, Any] | None = None):
@@ -401,7 +410,7 @@ class RJSFMetaTag:
401
410
 
402
411
  attrs = {
403
412
  "ui:widget": "range",
404
- "ui:disabled": str(disabled).lower() if disabled else None,
413
+ "ui:disabled": disabled,
405
414
  "ui:options": options if options else None,
406
415
  "ui:title": title,
407
416
  "ui:description": description,
@@ -573,6 +582,29 @@ class RJSFMetaTag:
573
582
  }
574
583
  return RJSFMetaTag({k: v for k, v in attrs.items() if v is not None})
575
584
 
585
+ class CustomWidget:
586
+ @classmethod
587
+ def custom(
588
+ cls,
589
+ name: CustomWidgetName,
590
+ *,
591
+ disabled: bool = False,
592
+ title: str | None = None,
593
+ description: str | None = None,
594
+ help: str | None = None,
595
+ **kwargs: Any,
596
+ ) -> RJSFMetaTag:
597
+ """Use any custom widget by name. Extend CustomWidgetName when adding new widgets."""
598
+ attrs = {
599
+ "ui:widget": name,
600
+ "ui:disabled": disabled,
601
+ "ui:title": title,
602
+ "ui:description": description,
603
+ "ui:help": help,
604
+ **kwargs,
605
+ }
606
+ return RJSFMetaTag({k: v for k, v in attrs.items() if v is not None})
607
+
576
608
  # --------- Composer Methods ----------
577
609
 
578
610
  @classmethod
@@ -663,7 +695,6 @@ class RJSFMetaTag:
663
695
  for widget in widgets:
664
696
  any_of_branches.append(widget.attrs)
665
697
 
666
- # Start with Union-level metadata
667
698
  union_attrs = {
668
699
  "ui:title": title,
669
700
  "ui:description": description,
@@ -673,11 +704,6 @@ class RJSFMetaTag:
673
704
  **kwargs,
674
705
  }
675
706
 
676
- # Add any additional kwargs
677
- for key, value in kwargs.items():
678
- if value is not None:
679
- union_attrs[f"ui:{key}" if not key.startswith("ui:") else key] = value
680
-
681
707
  union_attrs = {k: v for k, v in union_attrs.items() if v is not None}
682
708
  return RJSFMetaTag({**union_attrs, "anyOf": any_of_branches})
683
709
 
@@ -788,7 +814,12 @@ def _is_pyd_model(t: Any) -> bool:
788
814
 
789
815
 
790
816
  # --------- Build RJSF-style uiSchema dict from a model *type* ----------
791
- def ui_schema_for_model(model_cls: type[BaseModel]) -> dict[str, Any]:
817
+ def ui_schema_for_model(
818
+ model_cls: type[BaseModel],
819
+ *,
820
+ key_transform: Callable[[str], str] | None = None,
821
+ value_transform: Callable[[str], str] | None = None,
822
+ ) -> dict[str, Any]:
792
823
  """
793
824
  Generate a React JSON Schema Form (RJSF) uiSchema from a Pydantic model.
794
825
 
@@ -806,6 +837,15 @@ def ui_schema_for_model(model_cls: type[BaseModel]) -> dict[str, Any]:
806
837
 
807
838
  Args:
808
839
  model_cls: A Pydantic BaseModel subclass to analyze
840
+ key_transform: An optional ``str → str`` function (e.g.
841
+ ``humps.camelize``) applied to **dict keys** (field names).
842
+ RJSF metadata keys like ``ui:widget`` are never transformed.
843
+ When ``None`` (default), the schema is returned with the
844
+ original snake_case keys.
845
+ value_transform: An optional ``str → str`` function applied to
846
+ **string values inside ``ui:order`` lists**. Defaults to
847
+ *key_transform* when not provided, since ``ui:order`` values
848
+ must match the (transformed) property names.
809
849
 
810
850
  Returns:
811
851
  A dictionary representing the RJSF uiSchema with the structure:
@@ -834,11 +874,16 @@ def ui_schema_for_model(model_cls: type[BaseModel]) -> dict[str, Any]:
834
874
  hints = get_type_hints(model_cls, include_extras=True)
835
875
  ui: dict[str, Any] = {}
836
876
 
837
- for fname, ann in hints.items():
877
+ for fname in model_cls.model_fields:
878
+ ann = hints[fname]
838
879
  node: dict[str, Any] = {}
839
880
 
840
881
  base, meta = _walk_annotated_chain(ann)
841
882
  base = _unwrap_optional(base)
883
+ # For Annotated[T, meta] | None, _walk_annotated_chain sees Union (empty meta).
884
+ # Re-process the unwrapped type to extract metadata from the Annotated branch.
885
+ if not meta and get_origin(base) is Annotated:
886
+ base, meta = _walk_annotated_chain(base)
842
887
  # Start with field-level metadata (flat dict)
843
888
  if meta:
844
889
  node.update(meta)
@@ -901,9 +946,95 @@ def ui_schema_for_model(model_cls: type[BaseModel]) -> dict[str, Any]:
901
946
 
902
947
  ui[fname] = node
903
948
 
949
+ ui["ui:order"] = list(model_cls.model_fields.keys())
950
+
951
+ if key_transform is not None:
952
+ return transform_ui_schema(ui, key_transform, value_transform)
904
953
  return ui
905
954
 
906
955
 
956
+ # --------- Key / value transformation helpers ----------
957
+
958
+
959
+ _STRUCTURAL_KEYS = frozenset(
960
+ {
961
+ "anyOf",
962
+ "oneOf",
963
+ "allOf",
964
+ "items",
965
+ "additionalProperties",
966
+ "type",
967
+ }
968
+ )
969
+
970
+
971
+ def _is_metadata_key(key: str, field_names: frozenset[str] | None = None) -> bool:
972
+ """Return ``True`` for RJSF / JSON-Schema structural keys that must not
973
+ be treated as field names (and therefore must not be transformed).
974
+
975
+ When *field_names* is provided, a key that exists in both
976
+ ``_STRUCTURAL_KEYS`` and *field_names* is treated as a field name
977
+ (i.e. **not** metadata), so it will be transformed correctly.
978
+ """
979
+ if key.startswith(("ui:", "$")):
980
+ return True
981
+ if key in _STRUCTURAL_KEYS:
982
+ return field_names is None or key not in field_names
983
+ return False
984
+
985
+
986
+ def transform_ui_schema(
987
+ ui_schema: dict[str, Any],
988
+ key_transform: Callable[[str], str],
989
+ value_transform: Callable[[str], str] | None = None,
990
+ ) -> dict[str, Any]:
991
+ """Apply transforms to field-name keys and ``ui:order`` values.
992
+
993
+ RJSF metadata keys (``ui:widget``, ``ui:options``, …) and JSON-Schema
994
+ structural keys (``anyOf``, ``items``, …) are never transformed — only
995
+ regular field-name keys and the string values inside ``ui:order`` lists.
996
+
997
+ For the common camelCase use-case::
998
+
999
+ from humps import camelize
1000
+ transform_ui_schema(raw_ui, camelize)
1001
+
1002
+ Args:
1003
+ ui_schema: The raw UI schema to transform.
1004
+ key_transform: A ``str → str`` function for dict keys.
1005
+ value_transform: A ``str → str`` function for ``ui:order`` values.
1006
+ Defaults to *key_transform* when ``None``.
1007
+
1008
+ Returns:
1009
+ A new dictionary with transformed keys and ``ui:order`` values.
1010
+ """
1011
+ val_fn = value_transform if value_transform is not None else key_transform
1012
+ top_level_fields = frozenset(ui_schema.get("ui:order", []))
1013
+ return _transform_obj(ui_schema, key_transform, val_fn, top_level_fields)
1014
+
1015
+
1016
+ def _transform_obj(
1017
+ obj: Any,
1018
+ key_fn: Callable[[str], str],
1019
+ val_fn: Callable[[str], str],
1020
+ field_names: frozenset[str] | None = None,
1021
+ ) -> Any:
1022
+ if isinstance(obj, dict):
1023
+ result: dict[str, Any] = {}
1024
+ child_fields = frozenset(obj.get("ui:order", [])) if "ui:order" in obj else None
1025
+ names = field_names if child_fields is None else child_fields
1026
+ for k, v in obj.items():
1027
+ new_key = k if _is_metadata_key(k, names) else key_fn(k)
1028
+ if k == "ui:order" and isinstance(v, list):
1029
+ result[new_key] = [val_fn(s) if isinstance(s, str) else s for s in v]
1030
+ else:
1031
+ result[new_key] = _transform_obj(v, key_fn, val_fn)
1032
+ return result
1033
+ if isinstance(obj, list):
1034
+ return [_transform_obj(item, key_fn, val_fn) for item in obj]
1035
+ return obj
1036
+
1037
+
907
1038
  # --------- Example ---------
908
1039
  if __name__ == "__main__":
909
1040
 
@@ -13,10 +13,17 @@ class DebugInfoManager:
13
13
  loop_iteration_index: int | None = None,
14
14
  ):
15
15
  for tool_call_response in tool_call_responses:
16
- tool_info = {
16
+ debug_info = (
17
+ tool_call_response.debug_info.copy()
18
+ if tool_call_response.debug_info
19
+ else {}
20
+ )
21
+ tool_info: dict = {
17
22
  "name": tool_call_response.name,
18
- "info": tool_call_response.debug_info,
23
+ "info": debug_info,
19
24
  }
25
+ if debug_info.get("mcp_server"):
26
+ tool_info["mcp_server"] = debug_info["mcp_server"]
20
27
  if loop_iteration_index is not None:
21
28
  tool_info["info"]["loop_iteration"] = loop_iteration_index
22
29
  self.debug_info["tools"].append(tool_info)
@@ -138,6 +138,43 @@ class TestDebugInfoManager:
138
138
  assert debug_info["tools"][0]["name"] == "MinimalTool"
139
139
  assert debug_info["tools"][0]["info"] == {}
140
140
 
141
+ def test_extract_tool_debug_info__includes_mcp_server__when_present_in_debug_info(
142
+ self,
143
+ ):
144
+ """Test that mcp_server is promoted from debug_info to the tool level."""
145
+ manager = DebugInfoManager()
146
+ tool_call_response = ToolCallResponse(
147
+ id="tool_1",
148
+ name="MCPSearchTool",
149
+ debug_info={
150
+ "mcp_tool": "MCPSearchTool",
151
+ "mcp_server": "my-mcp-server",
152
+ "arguments": {"query": "test"},
153
+ },
154
+ )
155
+
156
+ manager.extract_tool_debug_info([tool_call_response])
157
+
158
+ debug_info = manager.get()
159
+ assert len(debug_info["tools"]) == 1
160
+ assert debug_info["tools"][0]["name"] == "MCPSearchTool"
161
+ assert debug_info["tools"][0]["mcp_server"] == "my-mcp-server"
162
+
163
+ def test_extract_tool_debug_info__omits_mcp_server__when_not_present(self):
164
+ """Test that mcp_server is not included for non-MCP tools."""
165
+ manager = DebugInfoManager()
166
+ tool_call_response = ToolCallResponse(
167
+ id="tool_1",
168
+ name="InternalSearch",
169
+ debug_info={"query": "test"},
170
+ )
171
+
172
+ manager.extract_tool_debug_info([tool_call_response])
173
+
174
+ debug_info = manager.get()
175
+ assert len(debug_info["tools"]) == 1
176
+ assert "mcp_server" not in debug_info["tools"][0]
177
+
141
178
  def test_extract_tool_debug_info__handles_empty_list__without_error(self):
142
179
  """Test that passing an empty list doesn't cause errors."""
143
180
  manager = DebugInfoManager()
@@ -5,6 +5,7 @@ from typing import Annotated, Generic, Literal, TypeVar
5
5
  from pydantic import Field
6
6
  from pydantic.main import BaseModel
7
7
 
8
+ from unique_toolkit._common.pydantic.rjsf_tags import RJSFMetaTag
8
9
  from unique_toolkit._common.pydantic_helpers import get_configuration_dict
9
10
  from unique_toolkit.agentic.tools.schemas import BaseToolConfig
10
11
 
@@ -118,27 +119,37 @@ class SubAgentToolConfig(BaseToolConfig):
118
119
  description="The list of tool names that will be forced to be called for this sub-agent.",
119
120
  )
120
121
 
121
- tool_description_for_system_prompt: str = Field(
122
+ tool_description_for_system_prompt: Annotated[
123
+ str, RJSFMetaTag.StringWidget.textarea(rows=5)
124
+ ] = Field(
122
125
  default="",
123
126
  description="Description of the tool that will be included in the system prompt.",
124
127
  )
125
- tool_description: str = Field(
128
+ tool_description: Annotated[str, RJSFMetaTag.StringWidget.textarea(rows=5)] = Field(
126
129
  default="",
127
130
  description="Description of the tool that will be included in the tools sent to the model.",
128
131
  )
129
- param_description_sub_agent_user_message: str = Field(
132
+ param_description_sub_agent_user_message: Annotated[
133
+ str, RJSFMetaTag.StringWidget.textarea(rows=5)
134
+ ] = Field(
130
135
  default=DEFAULT_PARAM_DESCRIPTION_SUB_AGENT_USER_MESSAGE,
131
136
  description="Description of the user message parameter that will be sent to the model.",
132
137
  )
133
- tool_format_information_for_system_prompt: str = Field(
138
+ tool_format_information_for_system_prompt: Annotated[
139
+ str, RJSFMetaTag.StringWidget.textarea(rows=5)
140
+ ] = Field(
134
141
  default="",
135
142
  description="Format information that will be included in the system prompt to guide response formatting.",
136
143
  )
137
- tool_description_for_user_prompt: str = Field(
144
+ tool_description_for_user_prompt: Annotated[
145
+ str, RJSFMetaTag.StringWidget.textarea(rows=5)
146
+ ] = Field(
138
147
  default="",
139
148
  description="Description of the tool that will be included in the user prompt.",
140
149
  )
141
- tool_format_information_for_user_prompt: str = Field(
150
+ tool_format_information_for_user_prompt: Annotated[
151
+ str, RJSFMetaTag.StringWidget.textarea(rows=5)
152
+ ] = Field(
142
153
  default="",
143
154
  description="Format information that will be included in the user prompt to guide response formatting.",
144
155
  )
@@ -156,7 +167,9 @@ class SubAgentToolConfig(BaseToolConfig):
156
167
  description="The condition that will be used to stop the polling for the sub-agent response.",
157
168
  )
158
169
 
159
- tool_input_json_schema: str | None = Field(
170
+ tool_input_json_schema: (
171
+ Annotated[str, RJSFMetaTag.StringWidget.textarea(rows=5)] | None
172
+ ) = Field(
160
173
  default=None,
161
174
  description="A custom JSON schema to send to the llm as the tool input schema.",
162
175
  )
@@ -139,6 +139,7 @@ class MCPToolWrapper(Tool[MCPToolConfig]):
139
139
  name=self.name,
140
140
  debug_info={
141
141
  "mcp_tool": self.name,
142
+ "mcp_server": self._mcp_server.name,
142
143
  "arguments": arguments,
143
144
  },
144
145
  error_message="",
@@ -196,6 +197,7 @@ class MCPToolWrapper(Tool[MCPToolConfig]):
196
197
  name=self.name,
197
198
  debug_info={
198
199
  "mcp_tool": self.name,
200
+ "mcp_server": self._mcp_server.name,
199
201
  "error": str(e),
200
202
  "original_arguments": getattr(tool_call, "arguments", None),
201
203
  },
File without changes