unique_toolkit 1.58.1__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.58.1 → unique_toolkit-1.59.1}/PKG-INFO +1 -1
  2. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/pyproject.toml +1 -1
  3. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +5 -2
  4. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/tool.py +11 -5
  5. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/unique_settings.py +336 -56
  6. unique_toolkit-1.59.1/unique_toolkit/services/__init__.py +23 -0
  7. {unique_toolkit-1.58.1 → 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.58.1 → unique_toolkit-1.59.1}/unique_toolkit/services/knowledge_base.py +36 -4
  10. unique_toolkit-1.58.1/unique_toolkit/services/__init__.py +0 -7
  11. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/README.md +0 -0
  12. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/__init__.py +0 -0
  13. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/__init__.py +0 -0
  14. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/_base_service.py +0 -0
  15. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/_time_utils.py +0 -0
  16. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
  17. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
  18. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
  19. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
  20. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
  21. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
  22. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
  23. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/README.md +0 -0
  24. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/__init__.py +0 -0
  25. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/__main__.py +0 -0
  26. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/cli.py +0 -0
  27. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/differ.py +0 -0
  28. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/exporter.py +0 -0
  29. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/models.py +0 -0
  30. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/registry.py +0 -0
  31. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/validator.py +0 -0
  32. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/default_language_model.py +0 -0
  33. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
  34. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/docx_generator/config.py +0 -0
  35. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
  36. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
  37. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/docx_generator/service.py +0 -0
  38. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
  39. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/endpoint_builder.py +0 -0
  40. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/endpoint_requestor.py +0 -0
  41. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/event_bus.py +0 -0
  42. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/exception.py +0 -0
  43. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/execution.py +0 -0
  44. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
  45. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
  46. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
  47. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
  48. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
  49. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
  50. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
  51. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
  52. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
  53. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
  54. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
  55. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
  56. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
  57. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
  58. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
  59. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
  60. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
  61. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
  62. {unique_toolkit-1.58.1 → 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.58.1 → 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.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
  65. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
  66. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
  67. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
  68. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
  69. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
  70. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
  71. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/feature_flags/schema.py +0 -0
  72. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
  73. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/pydantic_helpers.py +0 -0
  74. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/referencing.py +0 -0
  75. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/string_utilities.py +0 -0
  76. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/tests/test_referencing.py +0 -0
  77. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
  78. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/token/__init__.py +0 -0
  79. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  80. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/token/token_counting.py +0 -0
  81. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
  82. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
  83. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/__init__.py +0 -0
  84. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/files.py +0 -0
  85. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/image/encode.py +0 -0
  86. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
  87. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/jinja/render.py +0 -0
  88. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
  89. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
  90. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
  91. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
  92. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/write_configuration.py +0 -0
  93. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/validate_required_values.py +0 -0
  94. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/validators.py +0 -0
  95. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/__init__.py +0 -0
  96. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
  97. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
  98. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/config.py +0 -0
  99. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
  100. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
  101. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
  102. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
  103. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
  104. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
  105. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/exception.py +0 -0
  106. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
  107. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
  108. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
  109. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
  110. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
  111. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
  112. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
  113. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
  114. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
  115. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
  116. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
  117. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
  118. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
  119. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -0
  120. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
  121. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
  122. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/utils.py +0 -0
  123. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
  124. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/feature_flags/feature_flags.py +0 -0
  125. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
  126. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
  127. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/history_manager/utils.py +0 -0
  128. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/__init__.py +0 -0
  129. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
  130. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
  131. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
  132. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
  133. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/base.py +0 -0
  134. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
  135. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
  136. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +0 -0
  137. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
  138. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
  139. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
  140. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
  141. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
  142. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
  143. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
  144. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
  145. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
  146. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
  147. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
  148. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
  149. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
  150. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
  151. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
  152. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
  153. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
  154. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
  155. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/__init__.py +0 -0
  156. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
  157. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
  158. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
  159. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
  160. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
  161. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
  162. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
  163. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
  164. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
  165. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
  166. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
  167. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
  168. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
  169. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
  170. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
  171. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
  172. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
  173. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
  174. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
  175. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
  176. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
  177. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
  178. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
  179. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
  180. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
  181. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
  182. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
  183. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/config.py +0 -0
  184. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/factory.py +0 -0
  185. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
  186. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
  187. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
  188. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
  189. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
  190. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
  191. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
  192. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
  193. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
  194. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +0 -0
  195. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +0 -0
  196. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +0 -0
  197. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +0 -0
  198. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
  199. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/schemas.py +0 -0
  200. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
  201. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
  202. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
  203. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
  204. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
  205. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  206. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
  207. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
  208. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
  209. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic_table/__init__.py +0 -0
  210. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic_table/schemas.py +0 -0
  211. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic_table/service.py +0 -0
  212. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/__init__.py +0 -0
  213. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/dev_util.py +0 -0
  214. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/fast_api_factory.py +0 -0
  215. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/init_logging.py +0 -0
  216. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/init_sdk.py +0 -0
  217. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/performance/async_tasks.py +0 -0
  218. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  219. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/schemas.py +0 -0
  220. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/verification.py +0 -0
  221. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/webhook.py +0 -0
  222. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/__init__.py +0 -0
  223. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/cancellation.py +0 -0
  224. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/constants.py +0 -0
  225. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/deprecated/service.py +0 -0
  226. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/functions.py +0 -0
  227. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/rendering.py +0 -0
  228. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/responses_api.py +0 -0
  229. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/schemas.py +0 -0
  230. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/service.py +0 -0
  231. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/state.py +0 -0
  232. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/utils.py +0 -0
  233. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/content/__init__.py +0 -0
  234. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/content/constants.py +0 -0
  235. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/content/functions.py +0 -0
  236. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/content/schemas.py +0 -0
  237. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/content/service.py +0 -0
  238. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/content/smart_rules.py +0 -0
  239. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/content/utils.py +0 -0
  240. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/README.md +0 -0
  241. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/__init__.py +0 -0
  242. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
  243. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/augmented/service.py +0 -0
  244. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/base.py +0 -0
  245. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
  246. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/basic/config.py +0 -0
  247. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
  248. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/basic/service.py +0 -0
  249. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/elicitation/__init__.py +0 -0
  250. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/elicitation/constants.py +0 -0
  251. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/elicitation/exceptions.py +0 -0
  252. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/elicitation/functions.py +0 -0
  253. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/elicitation/schemas.py +0 -0
  254. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/elicitation/service.py +0 -0
  255. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/embedding/__init__.py +0 -0
  256. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/embedding/constants.py +0 -0
  257. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/embedding/functions.py +0 -0
  258. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/embedding/schemas.py +0 -0
  259. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/embedding/service.py +0 -0
  260. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/embedding/utils.py +0 -0
  261. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/__init__.py +0 -0
  262. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
  263. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  264. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  265. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
  266. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  267. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  268. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/utils.py +0 -0
  269. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/__init__.py +0 -0
  270. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
  271. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/builder.py +0 -0
  272. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/constants.py +0 -0
  273. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/default_language_model.py +0 -0
  274. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/functions.py +0 -0
  275. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/infos.py +0 -0
  276. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/prompt.py +0 -0
  277. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/reference.py +0 -0
  278. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/schemas.py +0 -0
  279. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/service.py +0 -0
  280. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/stream_transform.py +0 -0
  281. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/utils.py +0 -0
  282. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/protocols/support.py +0 -0
  283. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/short_term_memory/__init__.py +0 -0
  284. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/short_term_memory/constants.py +0 -0
  285. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/short_term_memory/functions.py +0 -0
  286. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/short_term_memory/schemas.py +0 -0
  287. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/short_term_memory/service.py +0 -0
  288. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/smart_rules/__init__.py +0 -0
  289. {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/smart_rules/compile.py +0 -0
  290. {unique_toolkit-1.58.1 → 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.58.1
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.58.1"
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,
@@ -1,18 +1,28 @@
1
+ from __future__ import annotations
2
+
1
3
  import os
2
4
  from logging import getLogger
3
5
  from pathlib import Path
4
- from typing import TYPE_CHECKING, Self, TypeVar
6
+ from typing import TYPE_CHECKING, Any, Self, TypeVar
5
7
  from urllib.parse import ParseResult, urlparse, urlunparse
6
8
 
7
9
  import unique_sdk
8
10
  from platformdirs import user_config_dir
9
- from pydantic import AliasChoices, Field, SecretStr, model_validator
11
+ from pydantic import (
12
+ AliasChoices,
13
+ BaseModel,
14
+ Field,
15
+ PrivateAttr,
16
+ SecretStr,
17
+ model_validator,
18
+ )
10
19
  from pydantic_settings import BaseSettings, SettingsConfigDict
20
+ from typing_extensions import Protocol, deprecated
11
21
 
12
22
  from unique_toolkit._common.config_checker import register_config
13
23
 
14
24
  if TYPE_CHECKING:
15
- from unique_toolkit.app.schemas import BaseEvent
25
+ from unique_toolkit.app.schemas import BaseEvent, ChatEvent
16
26
 
17
27
 
18
28
  logger = getLogger(__name__)
@@ -37,6 +47,195 @@ def warn_about_defaults(instance: T) -> T:
37
47
  return instance
38
48
 
39
49
 
50
+ # Auth
51
+ # We have a BaseModel and a BaseSetting class here because the context can be
52
+ # obtained from the environment and or a request. In the case of a request we
53
+ # should be using the AuthContext.
54
+ # Both classes implement the protocol that can be used for typing.
55
+ class AuthContextProtocol(Protocol):
56
+ company_id: SecretStr
57
+ user_id: SecretStr
58
+
59
+ def get_confidential_company_id(self) -> str: ...
60
+ def get_confidential_user_id(self) -> str: ...
61
+
62
+
63
+ class AuthContext(BaseModel):
64
+ company_id: SecretStr = Field(..., description="The company ID.")
65
+ user_id: SecretStr = Field(..., description="The user ID.")
66
+
67
+ def get_confidential_company_id(self) -> str:
68
+ return self.company_id.get_secret_value()
69
+
70
+ def get_confidential_user_id(self) -> str:
71
+ return self.user_id.get_secret_value()
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
+
80
+
81
+ @register_config()
82
+ class UniqueAuth(BaseSettings):
83
+ company_id: SecretStr = Field(
84
+ default=SecretStr("dummy_company_id"),
85
+ validation_alias=AliasChoices(
86
+ "unique_auth_company_id",
87
+ "company_id",
88
+ "UNIQUE_AUTH_COMPANY_ID",
89
+ "COMPANY_ID",
90
+ ),
91
+ )
92
+ user_id: SecretStr = Field(
93
+ default=SecretStr("dummy_user_id"),
94
+ validation_alias=AliasChoices(
95
+ "unique_auth_user_id", "user_id", "UNIQUE_AUTH_USER_ID", "USER_ID"
96
+ ),
97
+ )
98
+
99
+ model_config = SettingsConfigDict(
100
+ env_prefix="unique_auth_",
101
+ env_file_encoding="utf-8",
102
+ case_sensitive=False,
103
+ extra="ignore",
104
+ )
105
+
106
+ def get_confidential_company_id(self) -> str:
107
+ return self.company_id.get_secret_value()
108
+
109
+ def get_confidential_user_id(self) -> str:
110
+ return self.user_id.get_secret_value()
111
+
112
+ @model_validator(mode="after")
113
+ def _warn_about_defaults(self) -> Self:
114
+ return warn_about_defaults(self)
115
+
116
+ @classmethod
117
+ def from_event(cls, event: BaseEvent) -> Self:
118
+ return cls(
119
+ company_id=SecretStr(event.company_id),
120
+ user_id=SecretStr(event.user_id),
121
+ )
122
+
123
+ def to_auth_context(self) -> AuthContext:
124
+ return AuthContext(
125
+ company_id=self.company_id,
126
+ user_id=self.user_id,
127
+ )
128
+
129
+
130
+ # Chat
131
+ class ChatContextProtocol(Protocol):
132
+ chat_id: str
133
+ assistant_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: ...
146
+
147
+
148
+ class ChatContext(BaseModel):
149
+ chat_id: str = Field(..., description="The chat ID.")
150
+ assistant_id: str = Field(..., description="The assistant ID.")
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
+ )
235
+
236
+
237
+ # App
238
+ # Settings only as only obtained from the environment.
40
239
  @register_config()
41
240
  class UniqueApp(BaseSettings):
42
241
  id: SecretStr = Field(
@@ -79,6 +278,10 @@ class UniqueApp(BaseSettings):
79
278
  )
80
279
 
81
280
 
281
+ # Api
282
+ # Settings only as only obtained from the environment.
283
+
284
+
82
285
  @register_config()
83
286
  class UniqueApi(BaseSettings):
84
287
  base_url: str = Field(
@@ -147,43 +350,8 @@ class UniqueApi(BaseSettings):
147
350
  return urlunparse(parsed._replace(path=path, query=None, fragment=None))
148
351
 
149
352
 
150
- @register_config()
151
- class UniqueAuth(BaseSettings):
152
- company_id: SecretStr = Field(
153
- default=SecretStr("dummy_company_id"),
154
- validation_alias=AliasChoices(
155
- "unique_auth_company_id",
156
- "company_id",
157
- "UNIQUE_AUTH_COMPANY_ID",
158
- "COMPANY_ID",
159
- ),
160
- )
161
- user_id: SecretStr = Field(
162
- default=SecretStr("dummy_user_id"),
163
- validation_alias=AliasChoices(
164
- "unique_auth_user_id", "user_id", "UNIQUE_AUTH_USER_ID", "USER_ID"
165
- ),
166
- )
167
-
168
- model_config = SettingsConfigDict(
169
- env_prefix="unique_auth_",
170
- env_file_encoding="utf-8",
171
- case_sensitive=False,
172
- extra="ignore",
173
- )
174
-
175
- @model_validator(mode="after")
176
- def _warn_about_defaults(self) -> Self:
177
- return warn_about_defaults(self)
178
-
179
- @classmethod
180
- def from_event(cls, event: "BaseEvent") -> Self:
181
- return cls(
182
- company_id=SecretStr(event.company_id),
183
- user_id=SecretStr(event.user_id),
184
- )
185
-
186
-
353
+ # EventFilterOptions
354
+ # Settings only as only obtained from the environment.
187
355
  class UniqueChatEventFilterOptions(BaseSettings):
188
356
  # Empty string evals to False
189
357
  assistant_ids: list[str] = Field(
@@ -211,19 +379,93 @@ class EnvFileNotFoundError(FileNotFoundError):
211
379
  """Raised when no environment file can be found in any of the expected locations."""
212
380
 
213
381
 
382
+ class UniqueEnvironment:
383
+ """
384
+ Contains all settings that come exclusively from the environment.
385
+ This means if a setting can be intialized from either request or the environment, this class will not contain it.
386
+ """
387
+
388
+ def __init__(self, app: UniqueApp, api: UniqueApi) -> None:
389
+ self._app = app
390
+ self._api = api
391
+
392
+ @property
393
+ def app(self) -> UniqueApp:
394
+ return self._app
395
+
396
+ @property
397
+ def api(self) -> UniqueApi:
398
+ return self._api
399
+
400
+
401
+ class UniqueContext:
402
+ """
403
+ Contains all settings/configuration that come from a request or an environment.
404
+ """
405
+
406
+ def __init__(
407
+ self,
408
+ auth: AuthContextProtocol | None = None,
409
+ chat: ChatContextProtocol | None = None,
410
+ ) -> None:
411
+ self._auth = auth
412
+ self._chat = chat
413
+
414
+ @property
415
+ def auth(self) -> AuthContextProtocol:
416
+ if self._auth is None:
417
+ raise ValueError("Auth context not set")
418
+ return self._auth
419
+
420
+ @auth.setter
421
+ @deprecated(
422
+ "Avoid this, rather create a new request context with the new auth context. Kept for backwards compatibility."
423
+ )
424
+ def auth(self, value: AuthContextProtocol) -> None:
425
+ self._auth = value
426
+
427
+ @property
428
+ def chat(self) -> ChatContextProtocol | None:
429
+ return self._chat
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
+
454
+
455
+ # Bundling: Build this object for every request.
214
456
  class UniqueSettings:
215
457
  def __init__(
216
458
  self,
217
- auth: UniqueAuth,
459
+ auth: AuthContextProtocol,
218
460
  app: UniqueApp,
219
461
  api: UniqueApi,
220
462
  *,
221
463
  chat_event_filter_options: UniqueChatEventFilterOptions | None = None,
464
+ chat: ChatContextProtocol | None = None,
222
465
  env_file: Path | None = None,
223
466
  ):
224
- self._app = app
225
- self._auth = auth
226
- self._api = api
467
+ self._env = UniqueEnvironment(app=app, api=api)
468
+ self._context = UniqueContext(auth=auth, chat=chat)
227
469
  self._chat_event_filter_options = chat_event_filter_options
228
470
  self._env_file: Path | None = (
229
471
  env_file if (env_file and env_file.exists()) else None
@@ -274,7 +516,7 @@ class UniqueSettings:
274
516
  def from_env(
275
517
  cls,
276
518
  env_file: Path | None = None,
277
- ) -> "UniqueSettings":
519
+ ) -> UniqueSettings:
278
520
  """Initialize settings from environment variables and/or env file.
279
521
 
280
522
  Args:
@@ -305,7 +547,7 @@ class UniqueSettings:
305
547
  )
306
548
 
307
549
  @classmethod
308
- def from_env_auto(cls, filename: str = "unique.env") -> "UniqueSettings":
550
+ def from_env_auto(cls, filename: str = "unique.env") -> UniqueSettings:
309
551
  """Initialize settings by automatically finding environment file.
310
552
 
311
553
  This method will automatically search for an environment file in standard locations
@@ -334,14 +576,14 @@ class UniqueSettings:
334
576
  This method configures the global unique_sdk module with the API key,
335
577
  app ID, and base URL from these settings.
336
578
  """
337
- unique_sdk.api_key = self._app.key.get_secret_value()
338
- unique_sdk.app_id = self._app.id.get_secret_value()
339
- unique_sdk.api_base = self._api.sdk_url()
579
+ unique_sdk.api_key = self.app.key.get_secret_value()
580
+ unique_sdk.app_id = self.app.id.get_secret_value()
581
+ unique_sdk.api_base = self.api.sdk_url()
340
582
 
341
583
  @classmethod
342
584
  def from_env_auto_with_sdk_init(
343
585
  cls, filename: str = "unique.env"
344
- ) -> "UniqueSettings":
586
+ ) -> UniqueSettings:
345
587
  """Initialize settings and SDK in one convenient call.
346
588
 
347
589
  This method combines from_env_auto() and init_sdk() for the most common use case.
@@ -356,24 +598,62 @@ class UniqueSettings:
356
598
  settings.init_sdk()
357
599
  return settings
358
600
 
359
- def update_from_event(self, event: "BaseEvent") -> None:
360
- self._auth = UniqueAuth.from_event(event)
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
+
627
+ def update_from_event(self, event: BaseEvent) -> None:
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
+ )
361
633
 
362
634
  @property
363
635
  def api(self) -> UniqueApi:
364
- return self._api
636
+ return self._env.api
365
637
 
366
638
  @property
367
639
  def app(self) -> UniqueApp:
368
- return self._app
640
+ return self._env.app
369
641
 
370
642
  @property
643
+ @deprecated("Use authcontext instead")
371
644
  def auth(self) -> UniqueAuth:
372
- return self._auth
645
+ if not isinstance(self._context.auth, UniqueAuth):
646
+ raise ValueError("Auth context is not a UniqueAuth instance")
647
+ return self._context.auth
373
648
 
374
649
  @auth.setter
650
+ @deprecated("Use authcontext instead")
375
651
  def auth(self, value: UniqueAuth) -> None:
376
- self._auth = value
652
+ self._context.auth = value
653
+
654
+ @property
655
+ def authcontext(self) -> AuthContextProtocol:
656
+ return self._context.auth
377
657
 
378
658
  @property
379
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
+ ]