unique_toolkit 1.59.0__tar.gz → 1.59.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 (290) hide show
  1. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/PKG-INFO +1 -1
  2. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/pyproject.toml +1 -1
  3. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +5 -2
  4. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/tool.py +11 -5
  5. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/app/unique_settings.py +176 -19
  6. unique_toolkit-1.59.1/unique_toolkit/services/__init__.py +23 -0
  7. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/services/chat_service.py +70 -8
  8. unique_toolkit-1.59.1/unique_toolkit/services/factory.py +210 -0
  9. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/services/knowledge_base.py +36 -4
  10. unique_toolkit-1.59.0/unique_toolkit/services/__init__.py +0 -7
  11. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/README.md +0 -0
  12. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/__init__.py +0 -0
  13. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/__init__.py +0 -0
  14. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/_base_service.py +0 -0
  15. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/_time_utils.py +0 -0
  16. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  17. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  18. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  19. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  20. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  21. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  22. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  23. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/README.md +0 -0
  24. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/__init__.py +0 -0
  25. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/__main__.py +0 -0
  26. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/cli.py +0 -0
  27. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/differ.py +0 -0
  28. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/exporter.py +0 -0
  29. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/models.py +0 -0
  30. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/registry.py +0 -0
  31. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/validator.py +0 -0
  32. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/default_language_model.py +0 -0
  33. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
  34. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/docx_generator/config.py +0 -0
  35. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
  36. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
  37. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/docx_generator/service.py +0 -0
  38. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
  39. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/endpoint_builder.py +0 -0
  40. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  41. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/event_bus.py +0 -0
  42. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/exception.py +0 -0
  43. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/execution.py +0 -0
  44. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
  45. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
  46. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
  47. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
  48. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
  49. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
  50. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
  51. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
  52. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
  53. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
  54. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
  55. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
  56. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
  57. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
  58. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
  59. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
  60. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
  61. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
  62. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
  63. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
  64. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
  65. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
  66. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
  67. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
  68. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
  69. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
  70. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
  71. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  72. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  73. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  74. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/referencing.py +0 -0
  75. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/string_utilities.py +0 -0
  76. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/tests/test_referencing.py +0 -0
  77. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
  78. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/token/__init__.py +0 -0
  79. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  80. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/token/token_counting.py +0 -0
  81. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
  82. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
  83. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/__init__.py +0 -0
  84. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/files.py +0 -0
  85. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/image/encode.py +0 -0
  86. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
  87. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/jinja/render.py +0 -0
  88. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
  89. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
  90. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  91. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  92. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  93. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/validate_required_values.py +0 -0
  94. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/_common/validators.py +0 -0
  95. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/__init__.py +0 -0
  96. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
  97. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
  98. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/config.py +0 -0
  99. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
  100. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
  101. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
  102. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  103. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
  104. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
  105. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  106. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  107. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
  108. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
  109. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
  110. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
  111. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  112. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
  113. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  114. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
  115. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
  116. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
  117. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  118. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
  119. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -0
  120. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  121. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
  122. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/utils.py +0 -0
  123. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
  124. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/feature_flags/feature_flags.py +0 -0
  125. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  126. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  127. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  128. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/__init__.py +0 -0
  129. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
  130. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
  131. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
  132. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
  133. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/base.py +0 -0
  134. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
  135. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
  136. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +0 -0
  137. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
  138. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
  139. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
  140. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
  141. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
  142. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
  143. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
  144. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
  145. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
  146. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
  147. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
  148. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  149. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
  150. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
  151. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
  152. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
  153. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  154. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  155. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/__init__.py +0 -0
  156. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  157. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  158. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  159. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  160. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  161. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
  162. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  163. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  164. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  165. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
  166. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
  167. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  168. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
  169. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
  170. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  171. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
  172. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
  173. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  174. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
  175. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
  176. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  177. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  178. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  179. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  180. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  181. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
  182. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  183. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/config.py +0 -0
  184. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/factory.py +0 -0
  185. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  186. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  187. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  188. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
  189. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
  190. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
  191. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
  192. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
  193. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
  194. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +0 -0
  195. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +0 -0
  196. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +0 -0
  197. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +0 -0
  198. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
  199. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/schemas.py +0 -0
  200. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  201. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  202. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
  203. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  204. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  205. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  206. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  207. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  208. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  209. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic_table/__init__.py +0 -0
  210. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic_table/schemas.py +0 -0
  211. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/agentic_table/service.py +0 -0
  212. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/app/__init__.py +0 -0
  213. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/app/dev_util.py +0 -0
  214. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/app/fast_api_factory.py +0 -0
  215. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/app/init_logging.py +0 -0
  216. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/app/init_sdk.py +0 -0
  217. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/app/performance/async_tasks.py +0 -0
  218. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  219. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/app/schemas.py +0 -0
  220. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/app/verification.py +0 -0
  221. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/app/webhook.py +0 -0
  222. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/chat/__init__.py +0 -0
  223. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/chat/cancellation.py +0 -0
  224. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/chat/constants.py +0 -0
  225. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/chat/deprecated/service.py +0 -0
  226. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/chat/functions.py +0 -0
  227. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/chat/rendering.py +0 -0
  228. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/chat/responses_api.py +0 -0
  229. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/chat/schemas.py +0 -0
  230. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/chat/service.py +0 -0
  231. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/chat/state.py +0 -0
  232. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/chat/utils.py +0 -0
  233. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/content/__init__.py +0 -0
  234. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/content/constants.py +0 -0
  235. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/content/functions.py +0 -0
  236. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/content/schemas.py +0 -0
  237. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/content/service.py +0 -0
  238. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/content/smart_rules.py +0 -0
  239. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/content/utils.py +0 -0
  240. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/README.md +0 -0
  241. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/__init__.py +0 -0
  242. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
  243. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/augmented/service.py +0 -0
  244. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/base.py +0 -0
  245. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
  246. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/basic/config.py +0 -0
  247. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
  248. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/basic/service.py +0 -0
  249. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/elicitation/__init__.py +0 -0
  250. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/elicitation/constants.py +0 -0
  251. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/elicitation/exceptions.py +0 -0
  252. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/elicitation/functions.py +0 -0
  253. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/elicitation/schemas.py +0 -0
  254. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/elicitation/service.py +0 -0
  255. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/embedding/__init__.py +0 -0
  256. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/embedding/constants.py +0 -0
  257. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/embedding/functions.py +0 -0
  258. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/embedding/schemas.py +0 -0
  259. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/embedding/service.py +0 -0
  260. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/embedding/utils.py +0 -0
  261. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/__init__.py +0 -0
  262. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
  263. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  264. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  265. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  266. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  267. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  268. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/utils.py +0 -0
  269. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/language_model/__init__.py +0 -0
  270. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
  271. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/language_model/builder.py +0 -0
  272. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/language_model/constants.py +0 -0
  273. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/language_model/default_language_model.py +0 -0
  274. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/language_model/functions.py +0 -0
  275. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/language_model/infos.py +0 -0
  276. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/language_model/prompt.py +0 -0
  277. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/language_model/reference.py +0 -0
  278. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/language_model/schemas.py +0 -0
  279. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/language_model/service.py +0 -0
  280. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/language_model/stream_transform.py +0 -0
  281. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/language_model/utils.py +0 -0
  282. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/protocols/support.py +0 -0
  283. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/short_term_memory/__init__.py +0 -0
  284. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/short_term_memory/constants.py +0 -0
  285. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/short_term_memory/functions.py +0 -0
  286. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/short_term_memory/schemas.py +0 -0
  287. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/short_term_memory/service.py +0 -0
  288. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/smart_rules/__init__.py +0 -0
  289. {unique_toolkit-1.59.0 → unique_toolkit-1.59.1}/unique_toolkit/smart_rules/compile.py +0 -0
  290. {unique_toolkit-1.59.0 → unique_toolkit-1.59.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.59.0
3
+ Version: 1.59.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.59.0"
3
+ version = "1.59.1"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -14,7 +14,7 @@ from unique_toolkit.agentic.history_manager.history_construction_with_contents i
14
14
  )
15
15
  from unique_toolkit.agentic.reference_manager.reference_manager import ReferenceManager
16
16
  from unique_toolkit.app.schemas import ChatEvent
17
- from unique_toolkit.chat.service import ChatService
17
+ from unique_toolkit.app.unique_settings import UniqueSettings
18
18
  from unique_toolkit.content.schemas import ContentChunk
19
19
  from unique_toolkit.content.service import ContentService
20
20
  from unique_toolkit.language_model.schemas import (
@@ -26,6 +26,7 @@ from unique_toolkit.language_model.schemas import (
26
26
  LanguageModelToolMessage,
27
27
  LanguageModelUserMessage,
28
28
  )
29
+ from unique_toolkit.services.factory import UniqueServiceFactory
29
30
 
30
31
  MAX_INPUT_TOKENS_SAFETY_PERCENTAGE = (
31
32
  0.1 # 10% safety margin for input tokens we need 10% less does not work.
@@ -59,7 +60,9 @@ class LoopTokenReducer:
59
60
  self._reference_manager = reference_manager
60
61
  self._language_model = language_model
61
62
  self._encoder = self._get_encoder(language_model)
62
- self._chat_service = ChatService(event)
63
+ self._chat_service = UniqueServiceFactory(
64
+ settings=UniqueSettings.from_chat_event(event)
65
+ ).chat_service()
63
66
  self._content_service = ContentService.from_event(event)
64
67
  self._user_message = event.payload.user_message
65
68
  self._chat_id = event.payload.chat_id
@@ -1,6 +1,8 @@
1
+ from __future__ import annotations
2
+
1
3
  from abc import ABC, abstractmethod
2
4
  from logging import getLogger
3
- from typing import Any, Generic, TypeVar, cast
5
+ from typing import TYPE_CHECKING, Any, Generic, TypeVar, cast
4
6
 
5
7
  from typing_extensions import deprecated
6
8
 
@@ -14,10 +16,12 @@ from unique_toolkit.agentic.tools.schemas import (
14
16
  )
15
17
  from unique_toolkit.agentic.tools.tool_progress_reporter import ToolProgressReporter
16
18
  from unique_toolkit.app.schemas import ChatEvent
17
- from unique_toolkit.chat.service import (
18
- ChatService,
19
- )
19
+ from unique_toolkit.app.unique_settings import UniqueSettings
20
20
  from unique_toolkit.language_model import LanguageModelToolDescription
21
+ from unique_toolkit.services.factory import UniqueServiceFactory
22
+
23
+ if TYPE_CHECKING:
24
+ from unique_toolkit.services.chat_service import ChatService
21
25
  from unique_toolkit.language_model.schemas import (
22
26
  LanguageModelFunction,
23
27
  )
@@ -180,7 +184,9 @@ class Tool(ABC, Generic[ConfigType]):
180
184
  tool_progress_reporter
181
185
  )
182
186
 
183
- self._chat_service = ChatService(event)
187
+ self._chat_service = UniqueServiceFactory(
188
+ settings=UniqueSettings.from_chat_event(event)
189
+ ).chat_service()
184
190
  self._language_model_service = LanguageModelService(event)
185
191
  self._message_step_logger = MessageStepLogger(
186
192
  chat_service=self._chat_service,
@@ -3,19 +3,26 @@ from __future__ import annotations
3
3
  import os
4
4
  from logging import getLogger
5
5
  from pathlib import Path
6
- from typing import TYPE_CHECKING, Self, TypeVar
6
+ from typing import TYPE_CHECKING, Any, Self, TypeVar
7
7
  from urllib.parse import ParseResult, urlparse, urlunparse
8
8
 
9
9
  import unique_sdk
10
10
  from platformdirs import user_config_dir
11
- from pydantic import AliasChoices, BaseModel, Field, SecretStr, model_validator
11
+ from pydantic import (
12
+ AliasChoices,
13
+ BaseModel,
14
+ Field,
15
+ PrivateAttr,
16
+ SecretStr,
17
+ model_validator,
18
+ )
12
19
  from pydantic_settings import BaseSettings, SettingsConfigDict
13
20
  from typing_extensions import Protocol, deprecated
14
21
 
15
22
  from unique_toolkit._common.config_checker import register_config
16
23
 
17
24
  if TYPE_CHECKING:
18
- from unique_toolkit.app.schemas import BaseEvent
25
+ from unique_toolkit.app.schemas import BaseEvent, ChatEvent
19
26
 
20
27
 
21
28
  logger = getLogger(__name__)
@@ -63,6 +70,13 @@ class AuthContext(BaseModel):
63
70
  def get_confidential_user_id(self) -> str:
64
71
  return self.user_id.get_secret_value()
65
72
 
73
+ @classmethod
74
+ def from_event(cls, event: BaseEvent) -> Self:
75
+ return cls(
76
+ company_id=SecretStr(event.company_id),
77
+ user_id=SecretStr(event.user_id),
78
+ )
79
+
66
80
 
67
81
  @register_config()
68
82
  class UniqueAuth(BaseSettings):
@@ -100,7 +114,7 @@ class UniqueAuth(BaseSettings):
100
114
  return warn_about_defaults(self)
101
115
 
102
116
  @classmethod
103
- def from_event(cls, event: "BaseEvent") -> Self:
117
+ def from_event(cls, event: BaseEvent) -> Self:
104
118
  return cls(
105
119
  company_id=SecretStr(event.company_id),
106
120
  user_id=SecretStr(event.user_id),
@@ -114,19 +128,110 @@ class UniqueAuth(BaseSettings):
114
128
 
115
129
 
116
130
  # Chat
117
- # BaseModel only as only obtained from a request.
118
131
  class ChatContextProtocol(Protocol):
119
132
  chat_id: str
120
133
  assistant_id: str
121
- last_assistant_message_id: str
134
+
135
+ @property
136
+ def last_assistant_message_id(self) -> str: ...
137
+ @property
138
+ def last_user_message_id(self) -> str: ...
139
+ @property
140
+ def last_user_message_text(self) -> str: ...
141
+
142
+ @property
143
+ def metadata_filter(self) -> dict[str, Any] | None: ...
144
+ @property
145
+ def parent_chat_id(self) -> str | None: ...
122
146
 
123
147
 
124
148
  class ChatContext(BaseModel):
125
149
  chat_id: str = Field(..., description="The chat ID.")
126
150
  assistant_id: str = Field(..., description="The assistant ID.")
127
- last_assistant_message_id: str = Field(
128
- ..., description="The last assistant message ID."
129
- )
151
+
152
+ _last_assistant_message_id: str | None = PrivateAttr(default=None)
153
+ _last_user_message_id: str | None = PrivateAttr(default=None)
154
+ _last_user_message_text: str | None = PrivateAttr(default=None)
155
+ _metadata_filter: dict[str, Any] | None = PrivateAttr(default=None)
156
+ _parent_chat_id: str | None = PrivateAttr(default=None)
157
+
158
+ def __init__(
159
+ self,
160
+ *,
161
+ chat_id: str,
162
+ assistant_id: str,
163
+ last_assistant_message_id: str | None = None,
164
+ last_user_message_id: str | None = None,
165
+ last_user_message_text: str | None = None,
166
+ metadata_filter: dict[str, Any] | None = None,
167
+ parent_chat_id: str | None = None,
168
+ **data: Any,
169
+ ) -> None:
170
+ super().__init__(chat_id=chat_id, assistant_id=assistant_id, **data)
171
+ if last_assistant_message_id is not None:
172
+ self._last_assistant_message_id = last_assistant_message_id
173
+ if last_user_message_id is not None:
174
+ self._last_user_message_id = last_user_message_id
175
+ if last_user_message_text is not None:
176
+ self._last_user_message_text = last_user_message_text
177
+ if metadata_filter is not None:
178
+ self._metadata_filter = metadata_filter
179
+ if parent_chat_id is not None:
180
+ self._parent_chat_id = parent_chat_id
181
+
182
+ @property
183
+ def last_assistant_message_id(self) -> str:
184
+ if self._last_assistant_message_id is None:
185
+ raise ValueError("Last assistant message id is not set")
186
+ return self._last_assistant_message_id
187
+
188
+ @property
189
+ def last_user_message_id(self) -> str:
190
+ if self._last_user_message_id is None:
191
+ raise ValueError("User message id is not set")
192
+ return self._last_user_message_id
193
+
194
+ @property
195
+ def last_user_message_text(self) -> str:
196
+ if self._last_user_message_text is None:
197
+ raise ValueError("User message text is not set")
198
+ return self._last_user_message_text
199
+
200
+ @property
201
+ def metadata_filter(self) -> dict[str, Any] | None:
202
+ return self._metadata_filter
203
+
204
+ @metadata_filter.setter
205
+ def metadata_filter(self, value: dict[str, Any]) -> None:
206
+ self._metadata_filter = value
207
+
208
+ @property
209
+ def parent_chat_id(self) -> str | None:
210
+ return self._parent_chat_id
211
+
212
+ @parent_chat_id.setter
213
+ def parent_chat_id(self, value: str) -> None:
214
+ self._parent_chat_id = value
215
+
216
+ @classmethod
217
+ def from_chat_event(cls, event: ChatEvent) -> Self:
218
+ return cls(
219
+ chat_id=event.payload.chat_id,
220
+ assistant_id=event.payload.assistant_id,
221
+ last_assistant_message_id=event.payload.assistant_message.id,
222
+ last_user_message_id=event.payload.user_message.id
223
+ if event.payload.user_message
224
+ else None,
225
+ last_user_message_text=event.payload.user_message.text
226
+ if event.payload.user_message
227
+ else None,
228
+ metadata_filter=event.payload.metadata_filter
229
+ if event.payload.metadata_filter
230
+ else None,
231
+ parent_chat_id=event.payload.correlation.parent_chat_id
232
+ if event.payload.correlation
233
+ else None,
234
+ )
130
235
 
131
236
 
132
237
  # App
@@ -293,7 +398,7 @@ class UniqueEnvironment:
293
398
  return self._api
294
399
 
295
400
 
296
- class UniqueRequestContext:
401
+ class UniqueContext:
297
402
  """
298
403
  Contains all settings/configuration that come from a request or an environment.
299
404
  """
@@ -320,11 +425,32 @@ class UniqueRequestContext:
320
425
  self._auth = value
321
426
 
322
427
  @property
323
- def chat(self) -> ChatContextProtocol:
324
- if self._chat is None:
325
- raise ValueError("Chat context not set")
428
+ def chat(self) -> ChatContextProtocol | None:
326
429
  return self._chat
327
430
 
431
+ @classmethod
432
+ def from_chat_event(cls, event: ChatEvent) -> UniqueContext:
433
+ """Build a full (auth + chat) context from a ChatEvent."""
434
+
435
+ return cls(
436
+ auth=AuthContext.from_event(event),
437
+ chat=ChatContext.from_chat_event(event),
438
+ )
439
+
440
+ @classmethod
441
+ def from_event(cls, event: BaseEvent) -> Self:
442
+ """Build an auth-only context from any BaseEvent."""
443
+ return cls(
444
+ auth=AuthContext.from_event(event),
445
+ )
446
+
447
+ @classmethod
448
+ def from_settings(cls, settings: UniqueSettings | None = None) -> UniqueContext:
449
+ """Build an auth-only context from UniqueSettings (auto-loads from env if None)."""
450
+ if settings is None:
451
+ settings = UniqueSettings.from_env_auto_with_sdk_init()
452
+ return cls(auth=settings.authcontext)
453
+
328
454
 
329
455
  # Bundling: Build this object for every request.
330
456
  class UniqueSettings:
@@ -335,10 +461,11 @@ class UniqueSettings:
335
461
  api: UniqueApi,
336
462
  *,
337
463
  chat_event_filter_options: UniqueChatEventFilterOptions | None = None,
464
+ chat: ChatContextProtocol | None = None,
338
465
  env_file: Path | None = None,
339
466
  ):
340
467
  self._env = UniqueEnvironment(app=app, api=api)
341
- self._request_context = UniqueRequestContext(auth=auth, chat=None)
468
+ self._context = UniqueContext(auth=auth, chat=chat)
342
469
  self._chat_event_filter_options = chat_event_filter_options
343
470
  self._env_file: Path | None = (
344
471
  env_file if (env_file and env_file.exists()) else None
@@ -471,8 +598,38 @@ class UniqueSettings:
471
598
  settings.init_sdk()
472
599
  return settings
473
600
 
601
+ @classmethod
602
+ def from_chat_event(cls, event: ChatEvent) -> UniqueSettings:
603
+ """Build a :class:`UniqueSettings` from a :class:`ChatEvent`.
604
+
605
+ Auth and chat context are extracted from the event. App and API
606
+ settings are left at their default values; override them via the
607
+ returned instance's properties if needed.
608
+
609
+ Args:
610
+ event: The incoming chat event.
611
+
612
+ Returns:
613
+ UniqueSettings with auth + chat context populated from the event.
614
+ """
615
+ return cls(
616
+ auth=AuthContext.from_event(event),
617
+ app=UniqueApp(),
618
+ api=UniqueApi(),
619
+ chat=ChatContext.from_chat_event(event),
620
+ )
621
+
622
+ @property
623
+ def context(self) -> UniqueContext:
624
+ """The request-level context (auth + optional chat) for this settings object."""
625
+ return self._context
626
+
474
627
  def update_from_event(self, event: BaseEvent) -> None:
475
- self._request_context.auth = UniqueAuth.from_event(event)
628
+ # Use UniqueAuth.from_event so the deprecated settings.auth property
629
+ # keeps working for callers that haven't migrated yet.
630
+ self._context = UniqueContext(
631
+ auth=UniqueAuth.from_event(event), chat=self._context.chat
632
+ )
476
633
 
477
634
  @property
478
635
  def api(self) -> UniqueApi:
@@ -485,18 +642,18 @@ class UniqueSettings:
485
642
  @property
486
643
  @deprecated("Use authcontext instead")
487
644
  def auth(self) -> UniqueAuth:
488
- if not isinstance(self._request_context.auth, UniqueAuth):
645
+ if not isinstance(self._context.auth, UniqueAuth):
489
646
  raise ValueError("Auth context is not a UniqueAuth instance")
490
- return self._request_context.auth
647
+ return self._context.auth
491
648
 
492
649
  @auth.setter
493
650
  @deprecated("Use authcontext instead")
494
651
  def auth(self, value: UniqueAuth) -> None:
495
- self._request_context.auth = value
652
+ self._context.auth = value
496
653
 
497
654
  @property
498
655
  def authcontext(self) -> AuthContextProtocol:
499
- return self._request_context.auth
656
+ return self._context.auth
500
657
 
501
658
  @property
502
659
  def chat_event_filter_options(self) -> UniqueChatEventFilterOptions | None:
@@ -0,0 +1,23 @@
1
+ from unique_toolkit.app.unique_settings import (
2
+ AuthContext,
3
+ ChatContext,
4
+ UniqueContext,
5
+ )
6
+ from unique_toolkit.services.chat_service import ChatService
7
+ from unique_toolkit.services.factory import (
8
+ ServiceNotRegisteredError,
9
+ UniqueServiceFactory,
10
+ )
11
+ from unique_toolkit.services.knowledge_base import KnowledgeBaseService
12
+
13
+ UniqueServiceFactory.register_known_services()
14
+
15
+ __all__ = [
16
+ "AuthContext",
17
+ "ChatContext",
18
+ "ChatService",
19
+ "KnowledgeBaseService",
20
+ "UniqueContext",
21
+ "UniqueServiceFactory",
22
+ "ServiceNotRegisteredError",
23
+ ]
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from typing import Any, Sequence, overload
2
+ from typing import TYPE_CHECKING, Any, Sequence, overload
3
3
 
4
4
  import unique_sdk
5
5
  from openai.types.chat import ChatCompletionToolChoiceOptionParam
@@ -14,10 +14,11 @@ from openai.types.responses import (
14
14
  )
15
15
  from openai.types.shared_params import Metadata, Reasoning
16
16
  from pydantic import BaseModel
17
- from typing_extensions import deprecated
17
+ from typing_extensions import Self, deprecated
18
18
 
19
19
  from unique_toolkit._common.utils.files import is_file_content, is_image_content
20
20
  from unique_toolkit.agentic.feature_flags import feature_flags
21
+ from unique_toolkit.app.unique_settings import UniqueContext, UniqueSettings
21
22
  from unique_toolkit.chat.cancellation import CancellationWatcher
22
23
  from unique_toolkit.chat.constants import (
23
24
  DEFAULT_MAX_MESSAGES,
@@ -107,24 +108,77 @@ from unique_toolkit.short_term_memory.functions import (
107
108
  )
108
109
  from unique_toolkit.short_term_memory.schemas import ShortTermMemory
109
110
 
111
+ if TYPE_CHECKING:
112
+ from unique_toolkit.app.schemas import ChatEvent
113
+
110
114
  logger = logging.getLogger(f"toolkit.{DOMAIN_NAME}.{__name__}")
111
115
 
112
116
 
113
117
  class ChatService(ChatServiceDeprecated):
114
118
  """Provides all functionalities to manage the chat session."""
115
119
 
116
- def __init__(self, *args, **kwargs):
117
- """Initialize ChatService with lazy-loaded service properties."""
118
- super().__init__(*args, **kwargs)
120
+ @deprecated(
121
+ "Use UniqueContext.from_chat_event(event) with UniqueServiceFactory instead."
122
+ )
123
+ def __init__(
124
+ self,
125
+ event: "ChatEvent",
126
+ content_scope_chat_id: str | None = None,
127
+ ) -> None:
128
+ """Initialize ChatService from an event (deprecated). Use :meth:`from_context` instead."""
129
+ super().__init__(event, content_scope_chat_id)
119
130
  self._elicitation_service: ElicitationService | None = None
120
-
121
- self._cancellation_watcher = CancellationWatcher(
131
+ self._elicitation_message_id: str | None = None
132
+ self._cancellation_watcher: CancellationWatcher = CancellationWatcher(
122
133
  user_id=self._user_id,
123
134
  company_id=self._company_id,
124
135
  chat_id=self._chat_id,
125
136
  assistant_message_id=self._assistant_message_id,
126
137
  )
127
138
 
139
+ @classmethod
140
+ def from_settings(cls, settings: UniqueSettings, **kwargs: Any) -> Self:
141
+ """Create a ChatService from a :class:`UniqueSettings` or :class:`UniqueContext`.
142
+
143
+ This is the preferred constructor when using the service factory pattern.
144
+
145
+ Args:
146
+ settings: Either a :class:`UniqueSettings` (whose ``context`` is used)
147
+ or a :class:`UniqueContext` carrying auth and chat information directly.
148
+
149
+ Raises:
150
+ ValueError: If the resolved context has no chat or ``last_user_message_id`` is missing.
151
+ """
152
+ return cls.from_context(context=settings.context)
153
+
154
+ @classmethod
155
+ def from_context(cls, context: UniqueContext) -> Self:
156
+ if context.chat is None:
157
+ raise ValueError(
158
+ "ChatService requires a chat context (context.chat is None)"
159
+ )
160
+ chat = context.chat
161
+ user_message_id = chat.last_user_message_id
162
+ instance: ChatService = cls.__new__(cls)
163
+ instance._event = None
164
+ instance._company_id = context.auth.get_confidential_company_id()
165
+ instance._user_id = context.auth.get_confidential_user_id()
166
+ instance._chat_id = chat.chat_id
167
+ instance._assistant_id = chat.assistant_id
168
+ instance._assistant_message_id = chat.last_assistant_message_id
169
+ instance._user_message_id = user_message_id
170
+ instance._user_message_text = chat.last_user_message_text
171
+ instance._content_scope_chat_id = chat.parent_chat_id or chat.chat_id
172
+ instance._elicitation_service = None
173
+ instance._elicitation_message_id = chat.last_assistant_message_id
174
+ instance._cancellation_watcher = CancellationWatcher(
175
+ user_id=instance._user_id,
176
+ company_id=instance._company_id,
177
+ chat_id=instance._chat_id,
178
+ assistant_message_id=instance._assistant_message_id,
179
+ )
180
+ return instance
181
+
128
182
  @property
129
183
  def cancellation(self) -> CancellationWatcher:
130
184
  """Cancellation watcher for this chat session."""
@@ -136,7 +190,15 @@ class ChatService(ChatServiceDeprecated):
136
190
  if self._elicitation_service is not None:
137
191
  return self._elicitation_service
138
192
 
139
- self._elicitation_service = ElicitationService.from_chat_event(self._event)
193
+ if self._event is not None:
194
+ self._elicitation_service = ElicitationService.from_chat_event(self._event)
195
+ else:
196
+ self._elicitation_service = ElicitationService(
197
+ user_id=self._user_id,
198
+ company_id=self._company_id,
199
+ chat_id=self._content_scope_chat_id,
200
+ message_id=self._elicitation_message_id,
201
+ )
140
202
 
141
203
  return self._elicitation_service
142
204