unique_toolkit 1.79.0__tar.gz → 1.80.0__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.79.0 → unique_toolkit-1.80.0}/PKG-INFO +1 -1
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/pyproject.toml +1 -1
- unique_toolkit-1.80.0/unique_toolkit/experimental/__init__.py +8 -0
- unique_toolkit-1.80.0/unique_toolkit/experimental/content_tree/__init__.py +58 -0
- unique_toolkit-1.80.0/unique_toolkit/experimental/content_tree/functions.py +248 -0
- unique_toolkit-1.80.0/unique_toolkit/experimental/content_tree/schemas.py +106 -0
- unique_toolkit-1.80.0/unique_toolkit/experimental/content_tree/service.py +411 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/services/knowledge_base.py +1 -3
- unique_toolkit-1.79.0/unique_toolkit/experimental/__init__.py +0 -28
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/README.md +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/_base_service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/_time_utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/config_checker/README.md +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/config_checker/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/config_checker/__main__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/config_checker/cli.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/config_checker/differ.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/config_checker/exporter.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/config_checker/models.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/config_checker/registry.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/config_checker/validator.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/default_language_model.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/docx_generator/config.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/docx_generator/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/endpoint_builder.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/endpoint_requestor.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/event_bus.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/exception.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/execution.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/feature_flags/schema.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/pydantic_helpers.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/referencing.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/string_utilities.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/tests/test_referencing.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/token/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/token/image_token_counting.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/token/token_counting.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/utils/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/utils/files.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/utils/image/encode.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/utils/jinja/render.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/utils/write_configuration.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/validate_required_values.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/_common/validators.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/config.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/exception.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/evaluation/utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/feature_flags/feature_flags.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/history_manager/utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/loop_runner/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/loop_runner/base.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/config.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/experimental/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/config.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/runtime.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/tool.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/experimental/todo/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/experimental/todo/config.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/experimental/todo/prompts/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/experimental/todo/prompts/execution_reminder.j2 +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/experimental/todo/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/experimental/todo/prompts/tool_description.j2 +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/experimental/todo/prompts/verification_nudge.j2 +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/experimental/todo/schemas.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/experimental/todo/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/factory.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/schemas.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/tool.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic_table/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic_table/schemas.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/agentic_table/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/app/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/app/chat_event_filter_options_settings.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/app/dev_util.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/app/fast_api_factory.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/app/feature_flags.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/app/find_env_file.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/app/init_logging.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/app/init_sdk.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/app/performance/async_tasks.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/app/performance/async_wrapper.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/app/schemas.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/app/unique_settings.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/app/verification.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/app/webhook.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/chat/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/chat/cancellation.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/chat/constants.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/chat/deprecated/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/chat/functions.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/chat/rendering.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/chat/responses_api.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/chat/schemas.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/chat/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/chat/state.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/chat/utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/content/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/content/constants.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/content/functions.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/content/schemas.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/content/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/content/smart_rules.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/content/utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/data_extraction/README.md +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/data_extraction/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/data_extraction/augmented/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/data_extraction/base.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/data_extraction/basic/config.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/data_extraction/basic/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/elicitation/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/elicitation/constants.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/elicitation/exceptions.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/elicitation/functions.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/elicitation/schemas.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/elicitation/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/embedding/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/embedding/constants.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/embedding/functions.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/embedding/schemas.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/embedding/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/embedding/utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/experimental/content_folder/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/experimental/content_folder/functions.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/experimental/content_folder/schemas.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/experimental/content_folder/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/experimental/identity/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/experimental/identity/functions.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/experimental/identity/schemas.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/experimental/identity/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/experimental/scheduled_task/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/experimental/scheduled_task/cron.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/experimental/scheduled_task/functions.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/experimental/scheduled_task/schemas.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/experimental/scheduled_task/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/framework_utilities/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/framework_utilities/openai/client.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/framework_utilities/utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/language_model/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/language_model/builder.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/language_model/constants.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/language_model/default_language_model.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/language_model/functions.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/language_model/infos.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/language_model/prompt.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/language_model/reference.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/language_model/schemas.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/language_model/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/language_model/stream_transform.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/language_model/utils.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/monitoring/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/monitoring/middleware.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/monitoring/registry.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/protocols/support.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/services/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/services/chat_service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/services/factory.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/short_term_memory/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/short_term_memory/constants.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/short_term_memory/functions.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/short_term_memory/schemas.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/short_term_memory/service.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/smart_rules/__init__.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/unique_toolkit/smart_rules/compile.py +0 -0
- {unique_toolkit-1.79.0 → unique_toolkit-1.80.0}/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.80.0
|
|
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>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"""Experimental toolkit services.
|
|
2
|
+
|
|
3
|
+
Modules in :mod:`unique_toolkit.experimental` expose APIs that are still being
|
|
4
|
+
iterated on and may change without notice between minor releases. They are
|
|
5
|
+
intentionally not wired into :class:`~unique_toolkit.services.factory.UniqueServiceFactory`
|
|
6
|
+
and are not re-exported from top-level packages: import them explicitly from
|
|
7
|
+
their experimental subpackage.
|
|
8
|
+
"""
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""Experimental content-tree subpackage: visible-content listing, tree rendering, and fuzzy search.
|
|
2
|
+
|
|
3
|
+
!!! warning "Experimental"
|
|
4
|
+
This subpackage lives under :mod:`unique_toolkit.experimental` and is not
|
|
5
|
+
wired into :class:`~unique_toolkit.services.factory.UniqueServiceFactory`.
|
|
6
|
+
Its API may change between minor releases.
|
|
7
|
+
|
|
8
|
+
Typical usage::
|
|
9
|
+
|
|
10
|
+
from unique_toolkit.experimental.content_tree import ContentTree
|
|
11
|
+
|
|
12
|
+
tree = ContentTree.from_settings()
|
|
13
|
+
print(await tree.render_visible_tree_async(max_depth=2))
|
|
14
|
+
hits = await tree.search_visible_files_fuzzy_async("annual_report")
|
|
15
|
+
|
|
16
|
+
The subpackage is split into three modules to mirror the rest of the
|
|
17
|
+
``content`` domain:
|
|
18
|
+
|
|
19
|
+
- :mod:`unique_toolkit.experimental.content_tree.schemas` — data classes
|
|
20
|
+
(:class:`PathTrieNode`, :class:`FuzzyMatch`, :data:`MatchTarget`).
|
|
21
|
+
- :mod:`unique_toolkit.experimental.content_tree.functions` — pure helpers
|
|
22
|
+
for listing, scope-id resolution, trie construction, and ``tree(1)``-style
|
|
23
|
+
formatting.
|
|
24
|
+
- :mod:`unique_toolkit.experimental.content_tree.service` —
|
|
25
|
+
:class:`ContentTree`, the orchestrating service with per-instance caching.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from unique_toolkit.experimental.content_tree.functions import (
|
|
29
|
+
build_trie_from_resolved_paths,
|
|
30
|
+
extract_scope_ids_from_content_infos,
|
|
31
|
+
format_path_trie,
|
|
32
|
+
get_all_content_infos_async,
|
|
33
|
+
resolve_visible_file_paths_core,
|
|
34
|
+
translate_scope_id_async,
|
|
35
|
+
translate_scope_ids_async,
|
|
36
|
+
translate_scope_ids_batch,
|
|
37
|
+
)
|
|
38
|
+
from unique_toolkit.experimental.content_tree.schemas import (
|
|
39
|
+
FuzzyMatch,
|
|
40
|
+
MatchTarget,
|
|
41
|
+
PathTrieNode,
|
|
42
|
+
)
|
|
43
|
+
from unique_toolkit.experimental.content_tree.service import ContentTree
|
|
44
|
+
|
|
45
|
+
__all__ = [
|
|
46
|
+
"ContentTree",
|
|
47
|
+
"FuzzyMatch",
|
|
48
|
+
"MatchTarget",
|
|
49
|
+
"PathTrieNode",
|
|
50
|
+
"build_trie_from_resolved_paths",
|
|
51
|
+
"extract_scope_ids_from_content_infos",
|
|
52
|
+
"format_path_trie",
|
|
53
|
+
"get_all_content_infos_async",
|
|
54
|
+
"resolve_visible_file_paths_core",
|
|
55
|
+
"translate_scope_id_async",
|
|
56
|
+
"translate_scope_ids_async",
|
|
57
|
+
"translate_scope_ids_batch",
|
|
58
|
+
]
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
"""Pure functions behind the content-tree view.
|
|
2
|
+
|
|
3
|
+
These helpers are decoupled from :class:`~unique_toolkit.experimental.content_tree.service.ContentTree`
|
|
4
|
+
so that other callers (scripts, notebooks, ad-hoc tooling) can compose the same
|
|
5
|
+
listing + scope-id-resolution logic without constructing a service instance.
|
|
6
|
+
|
|
7
|
+
- :func:`get_all_content_infos_async` — paginated fetch of every visible
|
|
8
|
+
:class:`~unique_toolkit.content.schemas.ContentInfo`.
|
|
9
|
+
- :func:`translate_scope_id_async` / :func:`translate_scope_ids_async` —
|
|
10
|
+
resolve scope ids (folder ids) to their display names, concurrently.
|
|
11
|
+
- :func:`extract_scope_ids_from_content_infos` — collect every scope id
|
|
12
|
+
referenced by ``folderIdPath`` metadata.
|
|
13
|
+
- :func:`resolve_visible_file_paths_core` — the composition of the above,
|
|
14
|
+
returning ``(content_info, [folder, ..., filename])`` rows.
|
|
15
|
+
- :func:`format_path_trie` — render a :class:`PathTrieNode` as a ``tree(1)``-style
|
|
16
|
+
multi-line string.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import asyncio
|
|
22
|
+
import json
|
|
23
|
+
import logging
|
|
24
|
+
from collections.abc import Awaitable, Callable
|
|
25
|
+
from typing import Any
|
|
26
|
+
|
|
27
|
+
from unique_toolkit.content.functions import (
|
|
28
|
+
get_content_info_async,
|
|
29
|
+
get_folder_info_async,
|
|
30
|
+
)
|
|
31
|
+
from unique_toolkit.content.schemas import ContentInfo, PaginatedContentInfos
|
|
32
|
+
from unique_toolkit.experimental.content_tree.schemas import PathTrieNode
|
|
33
|
+
|
|
34
|
+
_LOGGER = logging.getLogger(f"toolkit.experimental.content_tree.{__name__}")
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def serialize_filter(metadata_filter: dict[str, Any] | None) -> str:
|
|
38
|
+
"""Serialize a filter dict to a stable, hashable cache key."""
|
|
39
|
+
try:
|
|
40
|
+
return json.dumps(metadata_filter, sort_keys=True, default=str)
|
|
41
|
+
except TypeError:
|
|
42
|
+
return repr(metadata_filter)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
async def get_all_content_infos_async(
|
|
46
|
+
user_id: str,
|
|
47
|
+
company_id: str,
|
|
48
|
+
*,
|
|
49
|
+
metadata_filter: dict[str, Any] | None = None,
|
|
50
|
+
step_size: int = 100,
|
|
51
|
+
max_concurrent_requests: int = 10,
|
|
52
|
+
) -> list[ContentInfo]:
|
|
53
|
+
"""Fetch every :class:`ContentInfo` visible to the caller using parallel pagination.
|
|
54
|
+
|
|
55
|
+
The API caps each response at 100 items, so this helper first asks for the
|
|
56
|
+
total count and then fetches all pages concurrently, bounded by
|
|
57
|
+
``max_concurrent_requests`` to avoid rate-limiting or connection exhaustion.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
user_id: Confidential user id of the caller.
|
|
61
|
+
company_id: Confidential company id of the caller.
|
|
62
|
+
metadata_filter: Optional UniqueQL metadata filter.
|
|
63
|
+
step_size: Page size (max 100).
|
|
64
|
+
max_concurrent_requests: Upper bound on concurrent page fetches.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
All content infos visible to ``user_id`` in ``company_id``.
|
|
68
|
+
"""
|
|
69
|
+
first_page = await get_content_info_async(
|
|
70
|
+
user_id=user_id,
|
|
71
|
+
company_id=company_id,
|
|
72
|
+
metadata_filter=metadata_filter,
|
|
73
|
+
take=1,
|
|
74
|
+
)
|
|
75
|
+
total_count = first_page.total_count
|
|
76
|
+
|
|
77
|
+
semaphore = asyncio.Semaphore(max_concurrent_requests)
|
|
78
|
+
|
|
79
|
+
async def _fetch_page(skip: int) -> PaginatedContentInfos:
|
|
80
|
+
async with semaphore:
|
|
81
|
+
return await get_content_info_async(
|
|
82
|
+
user_id=user_id,
|
|
83
|
+
company_id=company_id,
|
|
84
|
+
metadata_filter=metadata_filter,
|
|
85
|
+
skip=skip,
|
|
86
|
+
take=step_size,
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
results: list[PaginatedContentInfos | BaseException] = await asyncio.gather(
|
|
90
|
+
*[_fetch_page(i) for i in range(0, total_count, step_size)],
|
|
91
|
+
return_exceptions=True,
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
content_infos: list[ContentInfo] = []
|
|
95
|
+
for result in results:
|
|
96
|
+
if isinstance(result, BaseException):
|
|
97
|
+
_LOGGER.error("Error fetching paginated content infos", exc_info=result)
|
|
98
|
+
continue
|
|
99
|
+
content_infos.extend(result.content_infos)
|
|
100
|
+
return content_infos
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
async def translate_scope_id_async(
|
|
104
|
+
user_id: str,
|
|
105
|
+
company_id: str,
|
|
106
|
+
scope_id: str,
|
|
107
|
+
) -> str | None:
|
|
108
|
+
"""Resolve a single ``scope_id`` to a folder name.
|
|
109
|
+
|
|
110
|
+
Returns ``None`` (and logs a warning) if the folder lookup fails, so callers
|
|
111
|
+
can batch-resolve ids without a single missing folder aborting the whole
|
|
112
|
+
operation.
|
|
113
|
+
"""
|
|
114
|
+
try:
|
|
115
|
+
folder_info = await get_folder_info_async(
|
|
116
|
+
user_id=user_id,
|
|
117
|
+
company_id=company_id,
|
|
118
|
+
scope_id=scope_id,
|
|
119
|
+
)
|
|
120
|
+
return folder_info.name
|
|
121
|
+
except Exception as e:
|
|
122
|
+
_LOGGER.warning(f"Could not resolve folder for scope_id {scope_id}", exc_info=e)
|
|
123
|
+
return None
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
async def translate_scope_ids_batch(
|
|
127
|
+
translate_one: Callable[[str], Awaitable[str | None]],
|
|
128
|
+
scope_ids: set[str],
|
|
129
|
+
*,
|
|
130
|
+
max_concurrent_requests: int = 25,
|
|
131
|
+
) -> dict[str, str]:
|
|
132
|
+
"""Resolve many scope ids concurrently, honoring ``max_concurrent_requests``."""
|
|
133
|
+
scope_id_list = list(scope_ids)
|
|
134
|
+
semaphore = asyncio.Semaphore(max_concurrent_requests)
|
|
135
|
+
|
|
136
|
+
async def _resolve(sid: str) -> str | None:
|
|
137
|
+
async with semaphore:
|
|
138
|
+
return await translate_one(sid)
|
|
139
|
+
|
|
140
|
+
results = await asyncio.gather(*[_resolve(sid) for sid in scope_id_list])
|
|
141
|
+
return {sid: name for sid, name in zip(scope_id_list, results) if name is not None}
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
async def translate_scope_ids_async(
|
|
145
|
+
user_id: str,
|
|
146
|
+
company_id: str,
|
|
147
|
+
scope_ids: set[str],
|
|
148
|
+
*,
|
|
149
|
+
max_concurrent_requests: int = 25,
|
|
150
|
+
) -> dict[str, str]:
|
|
151
|
+
"""Batch version of :func:`translate_scope_id_async` bound to one caller."""
|
|
152
|
+
|
|
153
|
+
async def _translate_one(sid: str) -> str | None:
|
|
154
|
+
return await translate_scope_id_async(
|
|
155
|
+
user_id=user_id, company_id=company_id, scope_id=sid
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
return await translate_scope_ids_batch(
|
|
159
|
+
_translate_one,
|
|
160
|
+
scope_ids,
|
|
161
|
+
max_concurrent_requests=max_concurrent_requests,
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def extract_scope_ids_from_content_infos(content_infos: list[ContentInfo]) -> set[str]:
|
|
166
|
+
"""Collect unique scope ids from ``folderIdPath`` metadata (same rules as legacy API)."""
|
|
167
|
+
scope_ids: set[str] = set()
|
|
168
|
+
for content_info in content_infos:
|
|
169
|
+
if (
|
|
170
|
+
content_info.metadata
|
|
171
|
+
and (folder_id_path := content_info.metadata.get("folderIdPath"))
|
|
172
|
+
is not None
|
|
173
|
+
and isinstance(folder_id_path, str)
|
|
174
|
+
):
|
|
175
|
+
scope_ids.update(
|
|
176
|
+
sid
|
|
177
|
+
for sid in folder_id_path.replace("uniquepathid://", "").split("/")
|
|
178
|
+
if sid
|
|
179
|
+
)
|
|
180
|
+
return scope_ids
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
async def resolve_visible_file_paths_core(
|
|
184
|
+
user_id: str,
|
|
185
|
+
company_id: str,
|
|
186
|
+
*,
|
|
187
|
+
metadata_filter: dict[str, Any] | None,
|
|
188
|
+
max_concurrent_scope_lookups: int = 25,
|
|
189
|
+
) -> list[tuple[ContentInfo, list[str]]]:
|
|
190
|
+
"""List visible content and map each ``folderIdPath`` to folder-name segments."""
|
|
191
|
+
content_infos = await get_all_content_infos_async(
|
|
192
|
+
user_id=user_id,
|
|
193
|
+
company_id=company_id,
|
|
194
|
+
metadata_filter=metadata_filter,
|
|
195
|
+
)
|
|
196
|
+
scope_ids = extract_scope_ids_from_content_infos(content_infos)
|
|
197
|
+
scope_id_to_folder_name = await translate_scope_ids_async(
|
|
198
|
+
user_id=user_id,
|
|
199
|
+
company_id=company_id,
|
|
200
|
+
scope_ids=scope_ids,
|
|
201
|
+
max_concurrent_requests=max_concurrent_scope_lookups,
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
resolved: list[tuple[ContentInfo, list[str]]] = []
|
|
205
|
+
for content_info in content_infos:
|
|
206
|
+
if (
|
|
207
|
+
content_info.metadata
|
|
208
|
+
and (folder_id_path := content_info.metadata.get("folderIdPath"))
|
|
209
|
+
is not None
|
|
210
|
+
and isinstance(folder_id_path, str)
|
|
211
|
+
):
|
|
212
|
+
file_path = [
|
|
213
|
+
scope_id_to_folder_name.get(sid, sid)
|
|
214
|
+
for sid in folder_id_path.replace("uniquepathid://", "").split("/")
|
|
215
|
+
if sid
|
|
216
|
+
]
|
|
217
|
+
else:
|
|
218
|
+
file_path = ["_no_folder_path"]
|
|
219
|
+
|
|
220
|
+
file_path.append(content_info.key)
|
|
221
|
+
resolved.append((content_info, file_path))
|
|
222
|
+
return resolved
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def build_trie_from_resolved_paths(
|
|
226
|
+
resolved: list[tuple[ContentInfo, list[str]]],
|
|
227
|
+
) -> PathTrieNode:
|
|
228
|
+
"""Insert each ``(content, [dir, ..., filename])`` pair into a trie."""
|
|
229
|
+
root = PathTrieNode()
|
|
230
|
+
for _content_info, segments in resolved:
|
|
231
|
+
if not segments:
|
|
232
|
+
continue
|
|
233
|
+
*dirs, filename = segments
|
|
234
|
+
node = root
|
|
235
|
+
for part in dirs:
|
|
236
|
+
if part not in node.children:
|
|
237
|
+
node.children[part] = PathTrieNode()
|
|
238
|
+
node = node.children[part]
|
|
239
|
+
node.files.append(filename)
|
|
240
|
+
for node in root.walk_trie_nodes():
|
|
241
|
+
node.files = sorted(set(node.files))
|
|
242
|
+
return root
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def format_path_trie(root: PathTrieNode, *, max_depth: int | None = None) -> str:
|
|
246
|
+
"""Render *root* with UTF-8 box drawing (like ``tree``)."""
|
|
247
|
+
lines = root.format_trie_walk(prefix="", depth=0, max_depth=max_depth, lines=None)
|
|
248
|
+
return "\n".join(lines)
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""Data classes for the content-tree subpackage.
|
|
2
|
+
|
|
3
|
+
These types describe the *shape* of a content-tree snapshot:
|
|
4
|
+
|
|
5
|
+
- :class:`PathTrieNode` is the in-memory directory structure built from resolved
|
|
6
|
+
file paths.
|
|
7
|
+
- :class:`FuzzyMatch` is the result record returned by
|
|
8
|
+
:meth:`unique_toolkit.experimental.content_tree.service.ContentTree.search_visible_files_fuzzy_async`.
|
|
9
|
+
|
|
10
|
+
Kept free of behaviour so they can be imported and introspected without pulling
|
|
11
|
+
in the SDK/HTTP stack used by :mod:`unique_toolkit.experimental.content_tree.functions`.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
from dataclasses import dataclass, field
|
|
17
|
+
from typing import Literal
|
|
18
|
+
|
|
19
|
+
from unique_toolkit.content.schemas import ContentInfo
|
|
20
|
+
|
|
21
|
+
MatchTarget = Literal["key", "path", "both"]
|
|
22
|
+
"""Which representation of a file a fuzzy query is scored against.
|
|
23
|
+
|
|
24
|
+
- ``"key"`` — only the basename (``content_info.key``)
|
|
25
|
+
- ``"path"`` — only the slash-joined resolved folder path ``"a/b/c.pdf"``
|
|
26
|
+
- ``"both"`` — score against both and keep the higher of the two
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass
|
|
31
|
+
class PathTrieNode:
|
|
32
|
+
"""Nested directory structure; ``files`` are basenames in this directory."""
|
|
33
|
+
|
|
34
|
+
children: dict[str, PathTrieNode] = field(default_factory=dict)
|
|
35
|
+
files: list[str] = field(default_factory=list)
|
|
36
|
+
|
|
37
|
+
def walk_trie_nodes(self) -> list[PathTrieNode]:
|
|
38
|
+
out: list[PathTrieNode] = [self]
|
|
39
|
+
for child in self.children.values():
|
|
40
|
+
out.extend(child.walk_trie_nodes())
|
|
41
|
+
return out
|
|
42
|
+
|
|
43
|
+
def format_trie_walk(
|
|
44
|
+
self,
|
|
45
|
+
*,
|
|
46
|
+
prefix: str,
|
|
47
|
+
depth: int,
|
|
48
|
+
max_depth: int | None,
|
|
49
|
+
lines: list[str] | None = None,
|
|
50
|
+
) -> list[str]:
|
|
51
|
+
if lines is None:
|
|
52
|
+
lines = ["."]
|
|
53
|
+
|
|
54
|
+
if max_depth is not None and depth >= max_depth:
|
|
55
|
+
descendants = self.walk_trie_nodes()
|
|
56
|
+
# Exclude ``self`` from the directory count; the summary describes
|
|
57
|
+
# what is hidden *below* the cutoff, not the truncated node itself.
|
|
58
|
+
hidden_dirs = len(descendants) - 1
|
|
59
|
+
hidden_files = sum(len(node.files) for node in descendants)
|
|
60
|
+
if hidden_dirs or hidden_files:
|
|
61
|
+
lines.append(
|
|
62
|
+
f"{prefix}… ({hidden_dirs} dirs, {hidden_files} files below)"
|
|
63
|
+
)
|
|
64
|
+
return lines
|
|
65
|
+
|
|
66
|
+
dir_items = sorted(self.children.items())
|
|
67
|
+
file_items = [(name, None) for name in sorted(self.files)]
|
|
68
|
+
entries: list[tuple[str, PathTrieNode | None, bool]] = [
|
|
69
|
+
(name, child, True) for name, child in dir_items
|
|
70
|
+
]
|
|
71
|
+
entries.extend((name, None, False) for name, _ in file_items)
|
|
72
|
+
|
|
73
|
+
for i, (name, child, is_dir) in enumerate(entries):
|
|
74
|
+
is_last = i == len(entries) - 1
|
|
75
|
+
branch = "└── " if is_last else "├── "
|
|
76
|
+
extension = " " if is_last else "│ "
|
|
77
|
+
lines.append(f"{prefix}{branch}{name}")
|
|
78
|
+
if is_dir and child is not None:
|
|
79
|
+
child.format_trie_walk(
|
|
80
|
+
prefix=prefix + extension,
|
|
81
|
+
depth=depth + 1,
|
|
82
|
+
max_depth=max_depth,
|
|
83
|
+
lines=lines,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
return lines
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@dataclass(frozen=True)
|
|
90
|
+
class FuzzyMatch:
|
|
91
|
+
"""A single hit from :meth:`ContentTree.search_visible_files_fuzzy_async`.
|
|
92
|
+
|
|
93
|
+
Attributes:
|
|
94
|
+
content_info: The matched file.
|
|
95
|
+
score: Similarity score in ``[0.0, 1.0]``; ``1.0`` is an exact match.
|
|
96
|
+
path_segments: Full resolved path as segments ``[folder, ..., filename]``.
|
|
97
|
+
Callers that want a displayable string can ``"/".join(...)`` it.
|
|
98
|
+
matched_on: Whether the winning score came from matching the basename
|
|
99
|
+
(``"key"``) or the joined folder path (``"path"``). Always set, even
|
|
100
|
+
when ``match_on="both"`` was requested.
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
content_info: ContentInfo
|
|
104
|
+
score: float
|
|
105
|
+
path_segments: list[str]
|
|
106
|
+
matched_on: Literal["key", "path"]
|