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.
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/PKG-INFO +1 -1
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/pyproject.toml +1 -1
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +5 -2
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/tool.py +11 -5
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/unique_settings.py +336 -56
- unique_toolkit-1.59.1/unique_toolkit/services/__init__.py +23 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/services/chat_service.py +70 -8
- unique_toolkit-1.59.1/unique_toolkit/services/factory.py +210 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/services/knowledge_base.py +36 -4
- unique_toolkit-1.58.1/unique_toolkit/services/__init__.py +0 -7
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/README.md +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/_base_service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/_time_utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/README.md +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/__main__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/cli.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/differ.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/exporter.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/models.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/registry.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/config_checker/validator.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/default_language_model.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/docx_generator/config.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/docx_generator/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/endpoint_builder.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/endpoint_requestor.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/event_bus.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/exception.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/execution.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
- {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
- {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
- {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
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
- {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
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/feature_flags/schema.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/pydantic_helpers.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/referencing.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/string_utilities.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/tests/test_referencing.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/token/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/token/image_token_counting.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/token/token_counting.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/files.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/image/encode.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/jinja/render.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/utils/write_configuration.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/validate_required_values.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/_common/validators.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/config.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/exception.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/evaluation/utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/feature_flags/feature_flags.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/history_manager/utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/base.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
- {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
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/config.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/factory.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/schemas.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic_table/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic_table/schemas.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/agentic_table/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/dev_util.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/fast_api_factory.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/init_logging.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/init_sdk.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/performance/async_tasks.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/performance/async_wrapper.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/schemas.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/verification.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/app/webhook.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/cancellation.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/constants.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/deprecated/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/functions.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/rendering.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/responses_api.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/schemas.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/state.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/chat/utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/content/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/content/constants.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/content/functions.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/content/schemas.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/content/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/content/smart_rules.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/content/utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/README.md +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/augmented/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/base.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/basic/config.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/data_extraction/basic/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/elicitation/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/elicitation/constants.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/elicitation/exceptions.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/elicitation/functions.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/elicitation/schemas.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/elicitation/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/embedding/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/embedding/constants.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/embedding/functions.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/embedding/schemas.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/embedding/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/embedding/utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/openai/client.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/framework_utilities/utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/builder.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/constants.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/default_language_model.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/functions.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/infos.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/prompt.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/reference.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/schemas.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/stream_transform.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/language_model/utils.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/protocols/support.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/short_term_memory/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/short_term_memory/constants.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/short_term_memory/functions.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/short_term_memory/schemas.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/short_term_memory/service.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/smart_rules/__init__.py +0 -0
- {unique_toolkit-1.58.1 → unique_toolkit-1.59.1}/unique_toolkit/smart_rules/compile.py +0 -0
- {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.
|
|
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>
|
|
@@ -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.
|
|
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 =
|
|
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.
|
|
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 =
|
|
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
|
|
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
|
-
|
|
151
|
-
|
|
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:
|
|
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.
|
|
225
|
-
self.
|
|
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
|
-
) ->
|
|
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") ->
|
|
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.
|
|
338
|
-
unique_sdk.app_id = self.
|
|
339
|
-
unique_sdk.api_base = self.
|
|
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
|
-
) ->
|
|
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
|
-
|
|
360
|
-
|
|
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.
|
|
636
|
+
return self._env.api
|
|
365
637
|
|
|
366
638
|
@property
|
|
367
639
|
def app(self) -> UniqueApp:
|
|
368
|
-
return self.
|
|
640
|
+
return self._env.app
|
|
369
641
|
|
|
370
642
|
@property
|
|
643
|
+
@deprecated("Use authcontext instead")
|
|
371
644
|
def auth(self) -> UniqueAuth:
|
|
372
|
-
|
|
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.
|
|
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
|
+
]
|