unique_toolkit 2026.28.0__tar.gz → 2026.28.0.dev1__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-2026.28.0 → unique_toolkit-2026.28.0.dev1}/PKG-INFO +2 -2
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/pyproject.toml +2 -2
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +1 -1
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/pydantic/rjsf_tags.py +7 -16
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +1 -1
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -12
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -11
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/hallucination/utils.py +5 -46
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/schemas.py +0 -10
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -163
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -16
- unique_toolkit-2026.28.0.dev1/unique_toolkit/agentic/tools/a2a/manager.py +55 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/tool/service.py +6 -14
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/config.py +21 -69
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/__init__.py +0 -6
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/tool.py +1 -1
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/todo/service.py +2 -18
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/mcp/manager.py +8 -29
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +7 -15
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/tool.py +5 -57
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/tool_manager.py +22 -207
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic_table/schemas.py +24 -62
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/schemas.py +15 -54
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/unique_settings.py +1 -83
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/functions.py +2 -40
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/schemas.py +1 -9
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/content/schemas.py +1 -22
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/content/service.py +40 -79
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/elicitation/service.py +0 -46
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/message_persister.py +4 -14
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/infos.py +0 -115
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/service.py +21 -21
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/settings.py +0 -1
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/services/chat_service.py +0 -24
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/services/factory.py +2 -10
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/services/knowledge_base.py +2 -2
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/short_term_memory/service.py +17 -27
- unique_toolkit-2026.28.0/unique_toolkit/agentic/evaluation/tests/test_hallucination_external_context.py +0 -122
- unique_toolkit-2026.28.0/unique_toolkit/agentic/reference_manager/tests/test_external_context.py +0 -35
- unique_toolkit-2026.28.0/unique_toolkit/agentic/tools/a2a/manager.py +0 -93
- unique_toolkit-2026.28.0/unique_toolkit/agentic/tools/experimental/ask_user_tool/__init__.py +0 -14
- unique_toolkit-2026.28.0/unique_toolkit/agentic/tools/experimental/ask_user_tool/config.py +0 -138
- unique_toolkit-2026.28.0/unique_toolkit/agentic/tools/experimental/ask_user_tool/tool.py +0 -165
- unique_toolkit-2026.28.0/unique_toolkit/agentic/tools/run_context.py +0 -24
- unique_toolkit-2026.28.0/unique_toolkit/agentic_table/synthetic_chat_event.py +0 -67
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/README.md +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/_base_service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/_time_utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/config_checker/README.md +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/config_checker/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/config_checker/__main__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/config_checker/cli.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/config_checker/differ.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/config_checker/exporter.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/config_checker/models.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/config_checker/registry.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/config_checker/validator.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/default_language_model.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/docx_generator/config.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/docx_generator/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/endpoint_builder.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/endpoint_requestor.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/event_bus.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/exception.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/execution.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/feature_flags/schema.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/metadata_filter_scope.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/pydantic_helpers.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/referencing.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/string_utilities.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/tests/test_referencing.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/token/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/token/image_token_counting.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/token/token_counting.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/utils/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/utils/files.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/utils/image/encode.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/utils/jinja/render.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/utils/write_configuration.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/validate_required_values.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/_common/validators.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/config.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/exception.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/evaluation/utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/feature_flags/feature_flags.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/history_manager/settings.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/history_manager/utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/base.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/message_log_order.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_references.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/open_file_tool/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/open_file_tool/config.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/open_file_tool/runtime.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/open_file_tool/tool.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/config.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/todo/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/todo/config.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/todo/prompts/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/todo/prompts/execution_reminder.j2 +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/todo/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/todo/prompts/tool_description.j2 +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/todo/prompts/verification_nudge.j2 +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/experimental/todo/schemas.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/factory.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/names.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/artifacts.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/schemas.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic_table/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic_table/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/chat_event_filter_options_settings.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/dev_util.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/fast_api_factory.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/feature_flags.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/find_env_file.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/init_logging.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/init_sdk.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/performance/async_tasks.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/performance/async_wrapper.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/verification.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/app/webhook.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/cancellation.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/constants.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/deprecated/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/rendering.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/responses_api.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/state.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/chat/utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/content/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/content/constants.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/content/functions.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/content/smart_rules.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/content/utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/data_extraction/README.md +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/data_extraction/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/data_extraction/augmented/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/data_extraction/base.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/data_extraction/basic/config.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/data_extraction/basic/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/elicitation/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/elicitation/constants.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/elicitation/exceptions.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/elicitation/functions.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/elicitation/schemas.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/embedding/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/embedding/constants.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/embedding/functions.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/embedding/schemas.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/embedding/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/embedding/utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/README.md +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/_internal/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/_internal/streaming/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/_internal/streaming/common.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/_internal/streaming/pattern_replacer.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/_base.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/content_tree/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/content_tree/functions.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/content_tree/schemas.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/content_tree/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/base/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/base/config.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/base/schemas.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/base/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/base/utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/chat/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/chat/config.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/chat/schemas.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/chat/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/knowledge_base/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/knowledge_base/config.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/knowledge_base/schemas.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/knowledge_base/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/post_processing/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/post_processing/config.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/components/internal_search/post_processing/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/content_tree/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/identity/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/_async_bridge.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/complete_with_references.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/stream_event_router.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/text_event_handler.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/tool_call_event_handler.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/events.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/chat_completions.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/responses.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/code_interpreter_event_handler.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/complete_with_references.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/completed_event_handler.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/stream_event_router.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/text_delta_event_handler.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/tool_call_event_handler.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/progress_log_persister.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/content_folder/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/content_folder/functions.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/content_folder/schemas.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/content_folder/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/facades/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/facades/identity/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/facades/identity/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/feature_flags/README.md +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/feature_flags/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/feature_flags/_graphql_client.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/feature_flags/_ttl_cache.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/feature_flags/client.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/feature_flags/schemas.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/feature_flags/settings.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/group/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/group/functions.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/group/schemas.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/group/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/scheduled_task/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/scheduled_task/cron.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/scheduled_task/functions.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/scheduled_task/schemas.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/scheduled_task/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/user/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/user/functions.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/user/schemas.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/resources/user/service.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/experimental/testing/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/framework_utilities/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/framework_utilities/openai/client.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/framework_utilities/utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/builder.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/constants.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/default_language_model.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/functions.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/prompt.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/reference.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/schemas.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/stream_transform.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/language_model/utils.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/monitoring/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/monitoring/gunicorn.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/monitoring/middleware.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/monitoring/registry.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/protocols/support.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/services/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/short_term_memory/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/short_term_memory/constants.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/short_term_memory/functions.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/short_term_memory/schemas.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/smart_rules/__init__.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/smart_rules/compile.py +0 -0
- {unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/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: 2026.28.0
|
|
3
|
+
Version: 2026.28.0.dev1
|
|
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>
|
|
@@ -16,7 +16,7 @@ Requires-Dist: sseclient>=0.0.27,<0.0.28
|
|
|
16
16
|
Requires-Dist: openai>=1.105.0,<3
|
|
17
17
|
Requires-Dist: platformdirs>=4.0.0,<5
|
|
18
18
|
Requires-Dist: pillow>=12.1.1
|
|
19
|
-
Requires-Dist: unique-sdk>=2026.28.0
|
|
19
|
+
Requires-Dist: unique-sdk>=2026.28.0.dev2,<2026.28.0rc0
|
|
20
20
|
Requires-Dist: jambo>=0.1.2,<0.2
|
|
21
21
|
Requires-Dist: jinja2>=3.1.6,<4
|
|
22
22
|
Requires-Dist: docxtpl>=0.20.1,<0.21
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "unique_toolkit"
|
|
3
|
-
version = "2026.28.0"
|
|
3
|
+
version = "2026.28.0.dev1"
|
|
4
4
|
description = ""
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12"
|
|
@@ -28,7 +28,7 @@ dependencies = [
|
|
|
28
28
|
"openai>=1.105.0,<3",
|
|
29
29
|
"platformdirs>=4.0.0,<5",
|
|
30
30
|
"pillow>=12.1.1",
|
|
31
|
-
"unique-sdk>=2026.28.0",
|
|
31
|
+
"unique-sdk>=2026.28.0.dev2,<2026.28.0rc0",
|
|
32
32
|
"jambo>=0.1.2,<0.2",
|
|
33
33
|
"jinja2>=3.1.6,<4",
|
|
34
34
|
"docxtpl>=0.20.1,<0.21",
|
|
@@ -71,7 +71,7 @@ class ChunkRelevancySorter:
|
|
|
71
71
|
company_id: str | None = None,
|
|
72
72
|
user_id: str | None = None,
|
|
73
73
|
):
|
|
74
|
-
if isinstance(event, BaseEvent):
|
|
74
|
+
if isinstance(event, (ChatEvent, BaseEvent)):
|
|
75
75
|
self.chunk_relevancy_evaluator = ContextRelevancyEvaluator.from_event(event)
|
|
76
76
|
else:
|
|
77
77
|
[company_id, user_id] = validate_required_values([company_id, user_id])
|
|
@@ -928,7 +928,6 @@ def ui_schema_for_model(
|
|
|
928
928
|
ui: dict[str, Any] = {}
|
|
929
929
|
|
|
930
930
|
for fname in model_cls.model_fields:
|
|
931
|
-
field_info = model_cls.model_fields[fname]
|
|
932
931
|
ann = hints[fname]
|
|
933
932
|
node: dict[str, Any] = {}
|
|
934
933
|
|
|
@@ -1020,21 +1019,13 @@ def ui_schema_for_model(
|
|
|
1020
1019
|
_maybe_set_string_empty_value(branch, alt_b, default_string_empty_value)
|
|
1021
1020
|
branches.append(branch)
|
|
1022
1021
|
if branches:
|
|
1023
|
-
#
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
# per-branch widget and fall back to default widgets.
|
|
1031
|
-
branch_key = (
|
|
1032
|
-
"oneOf" if field_info.discriminator is not None else "anyOf"
|
|
1033
|
-
)
|
|
1034
|
-
# Keep any branch structure already supplied by a composer
|
|
1035
|
-
# (Optional/Union write their own ``anyOf`` into ``meta``).
|
|
1036
|
-
if "anyOf" not in node and "oneOf" not in node:
|
|
1037
|
-
node[branch_key] = branches
|
|
1022
|
+
# Check if the metadata already has an anyOf structure (from Union composer)
|
|
1023
|
+
if "anyOf" in node:
|
|
1024
|
+
# Use the anyOf from the metadata (from Union composer)
|
|
1025
|
+
pass # Keep the existing anyOf from the Union composer
|
|
1026
|
+
else:
|
|
1027
|
+
# Create anyOf structure for Union types
|
|
1028
|
+
node["anyOf"] = branches
|
|
1038
1029
|
|
|
1039
1030
|
# Scalars: node already has metadata if any
|
|
1040
1031
|
_maybe_set_string_empty_value(node, base, default_string_empty_value)
|
|
@@ -81,7 +81,7 @@ class ContextRelevancyEvaluator:
|
|
|
81
81
|
company_id: str | None = None,
|
|
82
82
|
user_id: str | None = None,
|
|
83
83
|
):
|
|
84
|
-
if isinstance(event, BaseEvent):
|
|
84
|
+
if isinstance(event, (ChatEvent, BaseEvent)):
|
|
85
85
|
self.language_model_service = LanguageModelService.from_event(event)
|
|
86
86
|
else:
|
|
87
87
|
[company_id, user_id] = validate_required_values([company_id, user_id])
|
|
@@ -52,18 +52,6 @@ class HallucinationConfig(EvaluationMetricConfig):
|
|
|
52
52
|
default={},
|
|
53
53
|
description="Additional options to pass to the language model.",
|
|
54
54
|
)
|
|
55
|
-
max_external_context_chars_per_source: SkipJsonSchema[int] = Field(
|
|
56
|
-
default=20_000,
|
|
57
|
-
ge=0,
|
|
58
|
-
description=(
|
|
59
|
-
"Per-source character cap applied to external (non-chunk) "
|
|
60
|
-
"context texts, e.g. MCP tool output. Raw/large tool results "
|
|
61
|
-
"inflate the judge prompt and the eval-LLM call; each external "
|
|
62
|
-
"text is truncated to this many characters before being added "
|
|
63
|
-
"to the context. 0 disables truncation. Does not affect "
|
|
64
|
-
"chunk-derived context."
|
|
65
|
-
),
|
|
66
|
-
)
|
|
67
55
|
score_to_label: dict[str, str] = {
|
|
68
56
|
"LOW": "GREEN",
|
|
69
57
|
"MEDIUM": "YELLOW",
|
|
@@ -54,17 +54,6 @@ class HallucinationEvaluation(Evaluation):
|
|
|
54
54
|
reference_pattern=self.config.reference_pattern,
|
|
55
55
|
)
|
|
56
56
|
|
|
57
|
-
# Append non-chunk groundedness context (e.g. MCP tool output). These
|
|
58
|
-
# are added in full ("all retrieved output as context") rather than via
|
|
59
|
-
# source-marker selection, since they carry no [sourceN] markers.
|
|
60
|
-
external_context_texts = self._reference_manager.get_external_context_texts()
|
|
61
|
-
max_chars = self.config.max_external_context_chars_per_source
|
|
62
|
-
if max_chars > 0:
|
|
63
|
-
external_context_texts = [
|
|
64
|
-
text[:max_chars] for text in external_context_texts
|
|
65
|
-
]
|
|
66
|
-
context_texts = context_texts + external_context_texts
|
|
67
|
-
|
|
68
57
|
evaluation_result: EvaluationMetricResult = await check_hallucination(
|
|
69
58
|
company_id=self._company_id,
|
|
70
59
|
user_id=self._user_id,
|
|
@@ -16,8 +16,6 @@ from unique_toolkit.agentic.evaluation.schemas import (
|
|
|
16
16
|
)
|
|
17
17
|
from unique_toolkit.content import ContentReference
|
|
18
18
|
from unique_toolkit.content.schemas import ContentChunk
|
|
19
|
-
from unique_toolkit.language_model.builder import MessagesBuilder
|
|
20
|
-
from unique_toolkit.language_model.infos import ModelCapabilities
|
|
21
19
|
from unique_toolkit.language_model.schemas import (
|
|
22
20
|
LanguageModelMessages,
|
|
23
21
|
LanguageModelStreamResponse,
|
|
@@ -106,28 +104,19 @@ def _get_msgs(
|
|
|
106
104
|
"""
|
|
107
105
|
Composes the messages for hallucination analysis based on the provided input and configuration.
|
|
108
106
|
|
|
109
|
-
This method composes messages with or without context based on the availability of context texts
|
|
110
|
-
history message texts
|
|
107
|
+
This method composes messages with or without context based on the availability of context texts
|
|
108
|
+
and history message texts in the input.
|
|
111
109
|
|
|
112
110
|
Args:
|
|
113
|
-
input (EvaluationMetricInput): The input data that includes context texts
|
|
114
|
-
|
|
111
|
+
input (EvaluationMetricInput): The input data that includes context texts and history message texts
|
|
112
|
+
for the analysis.
|
|
115
113
|
config (EvaluationMetricConfig): The configuration settings for composing messages.
|
|
116
114
|
logger (Optional[logging.Logger], optional): The logger used for logging debug information.
|
|
117
115
|
|
|
118
116
|
Returns:
|
|
119
117
|
The composed messages as per the provided input and configuration.
|
|
120
118
|
"""
|
|
121
|
-
|
|
122
|
-
# them; otherwise _compose_msgs drops them and the message would be text-only.
|
|
123
|
-
model_supports_vision = (
|
|
124
|
-
ModelCapabilities.VISION in config.language_model.capabilities
|
|
125
|
-
)
|
|
126
|
-
has_context = bool(
|
|
127
|
-
input.context_texts
|
|
128
|
-
or input.history_messages
|
|
129
|
-
or (input.context_images and model_supports_vision)
|
|
130
|
-
)
|
|
119
|
+
has_context = bool(input.context_texts or input.history_messages)
|
|
131
120
|
|
|
132
121
|
if has_context:
|
|
133
122
|
_LOGGER.debug("Using context / history for hallucination evaluation.")
|
|
@@ -176,36 +165,6 @@ def _compose_msgs(
|
|
|
176
165
|
else None,
|
|
177
166
|
output_text=input.output_text,
|
|
178
167
|
)
|
|
179
|
-
|
|
180
|
-
# When images are provided AND the configured model is vision-capable, build
|
|
181
|
-
# a multimodal user message (rendered user text + one image part per data
|
|
182
|
-
# URL) so the model can ground the check against the rendered pages. If the
|
|
183
|
-
# model lacks VISION we drop the images and fall back to the text-only
|
|
184
|
-
# message: attaching images to a non-vision model would make the LLM call
|
|
185
|
-
# fail. Without images the message stays the exact text-only form, so
|
|
186
|
-
# existing callers are unaffected.
|
|
187
|
-
context_images = input.context_images or []
|
|
188
|
-
model_supports_vision = (
|
|
189
|
-
ModelCapabilities.VISION in config.language_model.capabilities
|
|
190
|
-
)
|
|
191
|
-
# When has_context is True for an images-only input, the caller already
|
|
192
|
-
# confirmed the model is vision-capable, so this branch stays unreachable in
|
|
193
|
-
# that case and only logs for a genuine non-vision misconfiguration.
|
|
194
|
-
if context_images and not model_supports_vision:
|
|
195
|
-
_LOGGER.warning(
|
|
196
|
-
"Hallucination model %s lacks VISION capability; ignoring "
|
|
197
|
-
"%d context image(s) and grounding on text only.",
|
|
198
|
-
config.language_model.name,
|
|
199
|
-
len(context_images),
|
|
200
|
-
)
|
|
201
|
-
if context_images and model_supports_vision:
|
|
202
|
-
return (
|
|
203
|
-
MessagesBuilder()
|
|
204
|
-
.append(system_msg)
|
|
205
|
-
.image_message_append(content=user_msg_content, images=context_images)
|
|
206
|
-
.build()
|
|
207
|
-
)
|
|
208
|
-
|
|
209
168
|
user_msg = LanguageModelUserMessage(content=user_msg_content)
|
|
210
169
|
|
|
211
170
|
return LanguageModelMessages([system_msg, user_msg])
|
|
@@ -34,16 +34,6 @@ class EvaluationMetricInput(BaseModel):
|
|
|
34
34
|
context_texts: Optional[list[str]] = None
|
|
35
35
|
history_messages: Optional[list[ChatMessage]] = None
|
|
36
36
|
output_text: Optional[str] = None
|
|
37
|
-
context_images: Optional[list[str]] = Field(
|
|
38
|
-
default=None,
|
|
39
|
-
description=(
|
|
40
|
-
"Optional base64 data URLs (e.g. 'data:image/png;base64,...') of "
|
|
41
|
-
"context the metric should evaluate against visually, in addition "
|
|
42
|
-
"to context_texts. Used by metrics that support a multimodal "
|
|
43
|
-
"(vision) check; ignored by metrics that do not. Defaults to None "
|
|
44
|
-
"so existing text-only callers are unaffected."
|
|
45
|
-
),
|
|
46
|
-
)
|
|
47
37
|
|
|
48
38
|
def get_joined_context_texts(self, tag_name: str = "reference") -> str:
|
|
49
39
|
"""
|
|
@@ -20,10 +20,6 @@ from unique_toolkit.agentic.evaluation.schemas import EvaluationMetricInput
|
|
|
20
20
|
from unique_toolkit.chat.schemas import ChatMessage
|
|
21
21
|
from unique_toolkit.content import ContentReference
|
|
22
22
|
from unique_toolkit.content.schemas import ContentChunk
|
|
23
|
-
from unique_toolkit.language_model.infos import (
|
|
24
|
-
LanguageModelName,
|
|
25
|
-
ModelCapabilities,
|
|
26
|
-
)
|
|
27
23
|
from unique_toolkit.language_model.schemas import (
|
|
28
24
|
LanguageModelMessageRole,
|
|
29
25
|
LanguageModelMessages,
|
|
@@ -1017,162 +1013,3 @@ def test_compose_msgs__generates_non_empty_messages__from_config_prompts(
|
|
|
1017
1013
|
# Assert
|
|
1018
1014
|
assert len(result.root[0].content) > 0
|
|
1019
1015
|
assert len(result.root[1].content) > 0
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
_IMAGE_DATA_URL = "data:image/png;base64,QQ=="
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
@pytest.mark.ai
|
|
1026
|
-
def test_compose_msgs__builds_multimodal_user_message__with_context_images(
|
|
1027
|
-
hallucination_config: HallucinationConfig,
|
|
1028
|
-
) -> None:
|
|
1029
|
-
"""
|
|
1030
|
-
Purpose: Verify that context_images produce a multimodal user message.
|
|
1031
|
-
Why this matters: Vision faithfulness needs the rendered pages as image parts.
|
|
1032
|
-
Setup summary: Provide context_images, assert the user message carries text +
|
|
1033
|
-
one image part per data URL.
|
|
1034
|
-
"""
|
|
1035
|
-
# Arrange
|
|
1036
|
-
input_data: EvaluationMetricInput = EvaluationMetricInput(
|
|
1037
|
-
input_text="Question",
|
|
1038
|
-
output_text="Output",
|
|
1039
|
-
context_images=[_IMAGE_DATA_URL],
|
|
1040
|
-
)
|
|
1041
|
-
|
|
1042
|
-
# Act
|
|
1043
|
-
result: LanguageModelMessages = _compose_msgs(
|
|
1044
|
-
input_data, hallucination_config, has_context=True
|
|
1045
|
-
)
|
|
1046
|
-
|
|
1047
|
-
# Assert
|
|
1048
|
-
assert len(result.root) == 2
|
|
1049
|
-
user_content = result.root[1].content
|
|
1050
|
-
assert isinstance(user_content, list)
|
|
1051
|
-
text_parts = [p for p in user_content if p.get("type") == "text"]
|
|
1052
|
-
image_parts = [p for p in user_content if p.get("type") == "image_url"]
|
|
1053
|
-
assert len(text_parts) == 1
|
|
1054
|
-
assert len(image_parts) == 1
|
|
1055
|
-
assert image_parts[0]["imageUrl"]["url"] == _IMAGE_DATA_URL
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
@pytest.mark.ai
|
|
1059
|
-
def test_compose_msgs__stays_text_only__without_context_images(
|
|
1060
|
-
hallucination_config: HallucinationConfig,
|
|
1061
|
-
) -> None:
|
|
1062
|
-
"""
|
|
1063
|
-
Purpose: Verify that omitting context_images keeps the exact text-only message.
|
|
1064
|
-
Why this matters: Backward compatibility for all existing (non-vision) callers.
|
|
1065
|
-
Setup summary: No context_images -> user message content is a plain string.
|
|
1066
|
-
"""
|
|
1067
|
-
# Arrange
|
|
1068
|
-
input_data: EvaluationMetricInput = EvaluationMetricInput(
|
|
1069
|
-
input_text="Question",
|
|
1070
|
-
context_texts=["Context 1"],
|
|
1071
|
-
output_text="Output",
|
|
1072
|
-
)
|
|
1073
|
-
|
|
1074
|
-
# Act
|
|
1075
|
-
result: LanguageModelMessages = _compose_msgs(
|
|
1076
|
-
input_data, hallucination_config, has_context=True
|
|
1077
|
-
)
|
|
1078
|
-
|
|
1079
|
-
# Assert
|
|
1080
|
-
assert isinstance(result.root[1].content, str)
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
@pytest.mark.ai
|
|
1084
|
-
def test_compose_msgs__drops_images__when_model_lacks_vision() -> None:
|
|
1085
|
-
"""
|
|
1086
|
-
Purpose: Verify images are dropped when the configured model is not vision-capable.
|
|
1087
|
-
Why this matters: Attaching images to a non-vision model makes the LLM call fail;
|
|
1088
|
-
we must degrade gracefully to a text-only message instead.
|
|
1089
|
-
Setup summary: Configure a text-only model (no VISION capability) with
|
|
1090
|
-
context_images, assert the user message content stays a plain string.
|
|
1091
|
-
"""
|
|
1092
|
-
# Arrange
|
|
1093
|
-
text_only_config = HallucinationConfig(
|
|
1094
|
-
enabled=True,
|
|
1095
|
-
language_model=LanguageModelName.AZURE_GPT_4_0613,
|
|
1096
|
-
)
|
|
1097
|
-
assert ModelCapabilities.VISION not in (
|
|
1098
|
-
text_only_config.language_model.capabilities
|
|
1099
|
-
)
|
|
1100
|
-
input_data: EvaluationMetricInput = EvaluationMetricInput(
|
|
1101
|
-
input_text="Question",
|
|
1102
|
-
output_text="Output",
|
|
1103
|
-
context_images=[_IMAGE_DATA_URL],
|
|
1104
|
-
)
|
|
1105
|
-
|
|
1106
|
-
# Act
|
|
1107
|
-
result: LanguageModelMessages = _compose_msgs(
|
|
1108
|
-
input_data, text_only_config, has_context=True
|
|
1109
|
-
)
|
|
1110
|
-
|
|
1111
|
-
# Assert
|
|
1112
|
-
assert isinstance(result.root[1].content, str)
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
@pytest.mark.ai
|
|
1116
|
-
def test_get_msgs__treats_context_images_as_context(
|
|
1117
|
-
hallucination_config: HallucinationConfig,
|
|
1118
|
-
) -> None:
|
|
1119
|
-
"""
|
|
1120
|
-
Purpose: Verify that context_images alone count as context in _get_msgs.
|
|
1121
|
-
Why this matters: A vision-only turn must use the grounded (has_context) prompt
|
|
1122
|
-
and build the multimodal message.
|
|
1123
|
-
Setup summary: Provide only context_images; assert the system prompt matches the
|
|
1124
|
-
has_context variant and the user message is multimodal.
|
|
1125
|
-
"""
|
|
1126
|
-
# Arrange
|
|
1127
|
-
image_only: EvaluationMetricInput = EvaluationMetricInput(
|
|
1128
|
-
input_text="Question",
|
|
1129
|
-
output_text="Output",
|
|
1130
|
-
context_images=[_IMAGE_DATA_URL],
|
|
1131
|
-
)
|
|
1132
|
-
grounded: EvaluationMetricInput = EvaluationMetricInput(
|
|
1133
|
-
input_text="Question",
|
|
1134
|
-
context_texts=["Context 1"],
|
|
1135
|
-
output_text="Output",
|
|
1136
|
-
)
|
|
1137
|
-
|
|
1138
|
-
# Act
|
|
1139
|
-
result: LanguageModelMessages = _get_msgs(image_only, hallucination_config)
|
|
1140
|
-
grounded_result: LanguageModelMessages = _get_msgs(grounded, hallucination_config)
|
|
1141
|
-
|
|
1142
|
-
# Assert
|
|
1143
|
-
assert result.root[0].content == grounded_result.root[0].content
|
|
1144
|
-
assert isinstance(result.root[1].content, list)
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
@pytest.mark.ai
|
|
1148
|
-
def test_get_msgs__ignores_context_images__when_model_lacks_vision() -> None:
|
|
1149
|
-
"""
|
|
1150
|
-
Purpose: Verify image-only input is not treated as context for a non-vision model.
|
|
1151
|
-
Why this matters: _compose_msgs drops the images for a non-vision model, so the
|
|
1152
|
-
grounded prompt would otherwise claim references that are never sent. has_context
|
|
1153
|
-
must reflect the message actually delivered.
|
|
1154
|
-
Setup summary: Configure a text-only model with only context_images; assert the
|
|
1155
|
-
system prompt matches the ungrounded variant and the user message is text-only.
|
|
1156
|
-
"""
|
|
1157
|
-
# Arrange
|
|
1158
|
-
text_only_config = HallucinationConfig(
|
|
1159
|
-
enabled=True,
|
|
1160
|
-
language_model=LanguageModelName.AZURE_GPT_4_0613,
|
|
1161
|
-
)
|
|
1162
|
-
image_only: EvaluationMetricInput = EvaluationMetricInput(
|
|
1163
|
-
input_text="Question",
|
|
1164
|
-
output_text="Output",
|
|
1165
|
-
context_images=[_IMAGE_DATA_URL],
|
|
1166
|
-
)
|
|
1167
|
-
no_context: EvaluationMetricInput = EvaluationMetricInput(
|
|
1168
|
-
input_text="Question",
|
|
1169
|
-
output_text="Output",
|
|
1170
|
-
)
|
|
1171
|
-
|
|
1172
|
-
# Act
|
|
1173
|
-
result: LanguageModelMessages = _get_msgs(image_only, text_only_config)
|
|
1174
|
-
no_context_result: LanguageModelMessages = _get_msgs(no_context, text_only_config)
|
|
1175
|
-
|
|
1176
|
-
# Assert
|
|
1177
|
-
assert result.root[0].content == no_context_result.root[0].content
|
|
1178
|
-
assert isinstance(result.root[1].content, str)
|
|
@@ -32,7 +32,6 @@ class ReferenceManager:
|
|
|
32
32
|
self._tool_chunks: dict[str, tool_chunks] = {}
|
|
33
33
|
self._chunks: list[ContentChunk] = []
|
|
34
34
|
self._references: list[list[ContentReference]] = []
|
|
35
|
-
self._external_context_texts: list[str] = []
|
|
36
35
|
|
|
37
36
|
def extract_referenceable_chunks(
|
|
38
37
|
self, tool_responses: list[ToolCallResponse]
|
|
@@ -48,21 +47,6 @@ class ReferenceManager:
|
|
|
48
47
|
def get_chunks(self) -> list[ContentChunk]:
|
|
49
48
|
return self._chunks
|
|
50
49
|
|
|
51
|
-
def add_external_context_texts(self, texts: list[str]) -> None:
|
|
52
|
-
"""Register groundedness context that is not backed by ContentChunks.
|
|
53
|
-
|
|
54
|
-
Some retrieval sources (e.g. MCP tool output) provide text the answer
|
|
55
|
-
is built on but are deliberately *not* modelled as ContentChunks — they
|
|
56
|
-
are a different entity from ingested document chunks and must not flow
|
|
57
|
-
through the chunk/reference pipeline. They still need to ground the
|
|
58
|
-
hallucination check, so they are stored here and appended to the
|
|
59
|
-
evaluation context alongside the chunk-derived texts.
|
|
60
|
-
"""
|
|
61
|
-
self._external_context_texts.extend(text for text in texts if text)
|
|
62
|
-
|
|
63
|
-
def get_external_context_texts(self) -> list[str]:
|
|
64
|
-
return self._external_context_texts
|
|
65
|
-
|
|
66
50
|
def get_tool_chunks(self) -> dict[str, tool_chunks]:
|
|
67
51
|
return self._tool_chunks
|
|
68
52
|
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
from logging import Logger
|
|
2
|
+
|
|
3
|
+
from unique_toolkit.agentic.tools.a2a.response_watcher import SubAgentResponseWatcher
|
|
4
|
+
from unique_toolkit.agentic.tools.a2a.tool import SubAgentTool, SubAgentToolConfig
|
|
5
|
+
from unique_toolkit.agentic.tools.config import ToolBuildConfig
|
|
6
|
+
from unique_toolkit.agentic.tools.tool_progress_reporter import ToolProgressReporter
|
|
7
|
+
from unique_toolkit.app.schemas import ChatEvent
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class A2AManager:
|
|
11
|
+
def __init__(
|
|
12
|
+
self,
|
|
13
|
+
logger: Logger,
|
|
14
|
+
tool_progress_reporter: ToolProgressReporter,
|
|
15
|
+
response_watcher: SubAgentResponseWatcher,
|
|
16
|
+
):
|
|
17
|
+
self._logger = logger
|
|
18
|
+
self._tool_progress_reporter = tool_progress_reporter
|
|
19
|
+
self._response_watcher = response_watcher
|
|
20
|
+
|
|
21
|
+
def get_all_sub_agents(
|
|
22
|
+
self,
|
|
23
|
+
tool_configs: list[ToolBuildConfig],
|
|
24
|
+
event: ChatEvent,
|
|
25
|
+
) -> tuple[list[ToolBuildConfig], list[SubAgentTool]]:
|
|
26
|
+
sub_agents = []
|
|
27
|
+
|
|
28
|
+
for tool_config in tool_configs:
|
|
29
|
+
if not tool_config.is_sub_agent:
|
|
30
|
+
continue
|
|
31
|
+
|
|
32
|
+
if not isinstance(tool_config.configuration, SubAgentToolConfig):
|
|
33
|
+
self._logger.error(
|
|
34
|
+
"tool_config.configuration must be of type SubAgentToolConfig"
|
|
35
|
+
)
|
|
36
|
+
continue
|
|
37
|
+
|
|
38
|
+
sub_agent_tool_config = tool_config.configuration
|
|
39
|
+
|
|
40
|
+
sub_agents.append(
|
|
41
|
+
SubAgentTool(
|
|
42
|
+
configuration=sub_agent_tool_config,
|
|
43
|
+
event=event,
|
|
44
|
+
tool_progress_reporter=self._tool_progress_reporter,
|
|
45
|
+
name=tool_config.name,
|
|
46
|
+
display_name=tool_config.display_name,
|
|
47
|
+
response_watcher=self._response_watcher,
|
|
48
|
+
)
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
filtered_tool_config = [
|
|
52
|
+
tool_config for tool_config in tool_configs if not tool_config.is_sub_agent
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
return filtered_tool_config, sub_agents
|
|
@@ -20,6 +20,7 @@ from unique_toolkit._common.referencing import (
|
|
|
20
20
|
from unique_toolkit._common.utils.jinja.render import render_template
|
|
21
21
|
from unique_toolkit.agentic.evaluation.schemas import EvaluationMetricName
|
|
22
22
|
from unique_toolkit.agentic.feature_flags import feature_flags
|
|
23
|
+
from unique_toolkit.agentic.message_log_manager.service import MessageStepLogger
|
|
23
24
|
from unique_toolkit.agentic.tools.a2a.response_watcher import SubAgentResponseWatcher
|
|
24
25
|
from unique_toolkit.agentic.tools.a2a.tool._memory import (
|
|
25
26
|
get_sub_agent_short_term_memory_manager,
|
|
@@ -52,7 +53,6 @@ from unique_toolkit.chat.service import ChatService
|
|
|
52
53
|
from unique_toolkit.content import ContentChunk, ContentReference
|
|
53
54
|
from unique_toolkit.language_model import (
|
|
54
55
|
LanguageModelFunction,
|
|
55
|
-
LanguageModelService,
|
|
56
56
|
LanguageModelToolDescription,
|
|
57
57
|
)
|
|
58
58
|
|
|
@@ -72,20 +72,12 @@ class SubAgentTool(Tool[SubAgentToolConfig]):
|
|
|
72
72
|
name: str = "SubAgentTool",
|
|
73
73
|
display_name: str = "SubAgentTool",
|
|
74
74
|
response_watcher: SubAgentResponseWatcher | None = None,
|
|
75
|
-
*,
|
|
76
|
-
chat_service: ChatService | None = None,
|
|
77
|
-
language_model_service: LanguageModelService | None = None,
|
|
78
75
|
) -> None:
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
chat_service=chat_service,
|
|
85
|
-
language_model_service=language_model_service,
|
|
86
|
-
)
|
|
87
|
-
else:
|
|
88
|
-
super().__init__(configuration, event, tool_progress_reporter)
|
|
76
|
+
super().__init__(configuration)
|
|
77
|
+
self._event = event
|
|
78
|
+
self._tool_progress_reporter = tool_progress_reporter
|
|
79
|
+
self._chat_service = ChatService(event)
|
|
80
|
+
self._message_step_logger = MessageStepLogger(chat_service=self._chat_service)
|
|
89
81
|
self._user_id = event.user_id
|
|
90
82
|
self._company_id = event.company_id
|
|
91
83
|
|
{unique_toolkit-2026.28.0 → unique_toolkit-2026.28.0.dev1}/unique_toolkit/agentic/tools/config.py
RENAMED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import logging
|
|
2
1
|
from enum import StrEnum
|
|
3
2
|
from typing import Annotated, Any, Generic
|
|
4
3
|
|
|
@@ -15,36 +14,9 @@ from typing_extensions import TypeVar
|
|
|
15
14
|
from unique_toolkit._common.pydantic_helpers import get_configuration_dict
|
|
16
15
|
from unique_toolkit.agentic.tools.schemas import BaseToolConfig
|
|
17
16
|
|
|
18
|
-
logger = logging.getLogger(__name__)
|
|
19
|
-
|
|
20
17
|
T = TypeVar("T", bound=BaseToolConfig, default=BaseToolConfig)
|
|
21
18
|
|
|
22
19
|
|
|
23
|
-
def _ensure_base_tool_config(value: dict[str, Any]) -> None:
|
|
24
|
-
"""Make configuration parseable; disabled/demoted tools are never built at runtime."""
|
|
25
|
-
configuration = value.get("configuration")
|
|
26
|
-
if not isinstance(configuration, BaseToolConfig):
|
|
27
|
-
value["configuration"] = BaseToolConfig()
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
def _non_empty_str(value: dict[str, Any], snake_key: str, camel_key: str) -> str:
|
|
31
|
-
raw = value.get(snake_key, value.get(camel_key, ""))
|
|
32
|
-
if raw is None:
|
|
33
|
-
return ""
|
|
34
|
-
return str(raw)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def _is_mcp_tool_payload(value: dict[str, Any]) -> bool:
|
|
38
|
-
if _non_empty_str(value, "mcp_source_id", "mcpSourceId"):
|
|
39
|
-
return True
|
|
40
|
-
|
|
41
|
-
configuration = value.get("configuration", {})
|
|
42
|
-
if isinstance(configuration, dict):
|
|
43
|
-
if _non_empty_str(configuration, "mcp_source_id", "mcpSourceId"):
|
|
44
|
-
return True
|
|
45
|
-
return False
|
|
46
|
-
|
|
47
|
-
|
|
48
20
|
class ToolIcon(StrEnum):
|
|
49
21
|
ANALYTICS = "IconAnalytics"
|
|
50
22
|
BOOK = "IconBook"
|
|
@@ -104,18 +76,11 @@ class ToolBuildConfig(BaseModel, Generic[T]):
|
|
|
104
76
|
value: Any,
|
|
105
77
|
info: ValidationInfo,
|
|
106
78
|
) -> Any:
|
|
107
|
-
"""
|
|
108
|
-
|
|
109
|
-
Both enabled and disabled tools resolve to their concrete config type when
|
|
110
|
-
the stored configuration is valid, so downstream consumers that key off the
|
|
111
|
-
tool name keep seeing the expected config type regardless of the enabled
|
|
112
|
-
flag. A tool whose configuration is invalid is demoted to disabled with a
|
|
113
|
-
BaseToolConfig fallback instead of raising.
|
|
114
|
-
"""
|
|
79
|
+
"""Check the given values for."""
|
|
115
80
|
if not isinstance(value, dict):
|
|
116
81
|
return value
|
|
117
82
|
|
|
118
|
-
is_mcp_tool =
|
|
83
|
+
is_mcp_tool = value.get("mcp_source_id", "") != ""
|
|
119
84
|
mcp_configuration = value.get("configuration", {})
|
|
120
85
|
|
|
121
86
|
# Import at runtime to avoid circular imports
|
|
@@ -137,39 +102,26 @@ class ToolBuildConfig(BaseModel, Generic[T]):
|
|
|
137
102
|
|
|
138
103
|
configuration = value.get("configuration", {})
|
|
139
104
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
**configuration,
|
|
152
|
-
)
|
|
153
|
-
else:
|
|
154
|
-
# Check that the type of config matches the tool name
|
|
155
|
-
from unique_toolkit.agentic.tools.factory import ToolFactory
|
|
156
|
-
|
|
157
|
-
assert isinstance(
|
|
158
|
-
configuration,
|
|
159
|
-
ToolFactory.tool_config_map[value["name"]], # pyright: ignore[reportArgumentType]
|
|
160
|
-
)
|
|
161
|
-
config = configuration
|
|
162
|
-
except Exception:
|
|
163
|
-
tool_name = value.get("name", "<unknown>")
|
|
164
|
-
logger.warning(
|
|
165
|
-
"Tool '%s' has invalid configuration and will be disabled.",
|
|
166
|
-
tool_name,
|
|
167
|
-
exc_info=True,
|
|
105
|
+
if is_sub_agent_tool:
|
|
106
|
+
from unique_toolkit.agentic.tools.a2a import ExtendedSubAgentToolConfig
|
|
107
|
+
|
|
108
|
+
config = ExtendedSubAgentToolConfig.model_validate(configuration)
|
|
109
|
+
elif isinstance(configuration, dict):
|
|
110
|
+
# Local import to avoid circular import at module import time
|
|
111
|
+
from unique_toolkit.agentic.tools.factory import ToolFactory
|
|
112
|
+
|
|
113
|
+
config = ToolFactory.build_tool_config(
|
|
114
|
+
value["name"],
|
|
115
|
+
**configuration,
|
|
168
116
|
)
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
return value
|
|
117
|
+
else:
|
|
118
|
+
# Check that the type of config matches the tool name
|
|
119
|
+
from unique_toolkit.agentic.tools.factory import ToolFactory
|
|
173
120
|
|
|
121
|
+
assert isinstance(
|
|
122
|
+
configuration,
|
|
123
|
+
ToolFactory.tool_config_map[value["name"]], # pyright: ignore[reportArgumentType]
|
|
124
|
+
)
|
|
125
|
+
config = configuration
|
|
174
126
|
value["configuration"] = config
|
|
175
127
|
return value
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
from unique_toolkit.agentic.tools.experimental.ask_user_tool import (
|
|
2
|
-
AskUserTool,
|
|
3
|
-
AskUserToolConfig,
|
|
4
|
-
)
|
|
5
1
|
from unique_toolkit.agentic.tools.experimental.open_file_tool import (
|
|
6
2
|
OpenFileTool,
|
|
7
3
|
OpenFileToolRuntime,
|
|
@@ -23,8 +19,6 @@ from unique_toolkit.agentic.tools.experimental.todo import (
|
|
|
23
19
|
)
|
|
24
20
|
|
|
25
21
|
__all__ = [
|
|
26
|
-
"AskUserTool",
|
|
27
|
-
"AskUserToolConfig",
|
|
28
22
|
"DisplayMode",
|
|
29
23
|
"OpenFileTool",
|
|
30
24
|
"OpenFileToolRuntime",
|