unique_toolkit 2026.38.0.dev17__tar.gz → 2026.40.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-2026.38.0.dev17 → unique_toolkit-2026.40.0}/PKG-INFO +2 -2
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/pyproject.toml +2 -2
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/hallucination/utils.py +3 -2
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +64 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/feature_flags/feature_flags.py +14 -6
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/__init__.py +2 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/runners/__init__.py +6 -0
- unique_toolkit-2026.40.0/unique_toolkit/agentic/loop_runner/runners/prompt_forced_tool/__init__.py +9 -0
- unique_toolkit-2026.40.0/unique_toolkit/agentic/loop_runner/runners/prompt_forced_tool/helpers.py +32 -0
- unique_toolkit-2026.40.0/unique_toolkit/agentic/loop_runner/runners/prompt_forced_tool/runner.py +53 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/ask_user_tool/config.py +24 -5
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/ask_user_tool/tool.py +10 -1
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +20 -14
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +24 -37
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/tool/config.py +3 -3
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic_table/service.py +22 -17
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/chat/functions.py +40 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/chat/schemas.py +6 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/infos.py +209 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/services/chat_service.py +31 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/README.md +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/_base_service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/_time_utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/config_checker/README.md +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/config_checker/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/config_checker/__main__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/config_checker/cli.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/config_checker/differ.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/config_checker/exporter.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/config_checker/models.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/config_checker/registry.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/config_checker/validator.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/default_language_model.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/docx_generator/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/docx_generator/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/endpoint_builder.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/endpoint_requestor.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/event_bus.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/exception.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/execution.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/feature_flags/schema.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/metadata_filter_scope.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/pydantic_helpers.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/referencing.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/string_utilities.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/tests/test_referencing.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/token/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/token/image_token_counting.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/token/token_counting.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/utils/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/utils/files.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/utils/image/encode.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/utils/jinja/render.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/utils/write_configuration.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/validate_required_values.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/_common/validators.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/exception.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/tests/test_hallucination_external_context.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/evaluation/utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/history_manager/settings.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/history_manager/utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/base.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/message_log_order.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/reference_manager/tests/test_external_context.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_references.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/ask_user_tool/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/runtime.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/tool.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/tool.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/todo/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/todo/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/todo/prompts/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/todo/prompts/execution_reminder.j2 +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/todo/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/todo/prompts/tool_description.j2 +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/todo/prompts/verification_nudge.j2 +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/todo/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/experimental/todo/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/factory.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/names.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/activator/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/activator/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/activator/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/_container.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/_files.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/_memory.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/builder/builder.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/artifacts.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/office_preview.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/tool/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/tool/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/run_context.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/tool.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic_table/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic_table/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/agentic_table/synthetic_chat_event.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/app/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/app/chat_event_filter_options_settings.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/app/dev_util.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/app/fast_api_factory.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/app/feature_flags.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/app/find_env_file.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/app/init_logging.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/app/init_sdk.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/app/performance/async_tasks.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/app/performance/async_wrapper.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/app/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/app/unique_settings.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/app/verification.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/app/webhook.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/chat/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/chat/cancellation.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/chat/constants.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/chat/deprecated/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/chat/deprecated/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/chat/rendering.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/chat/responses_api.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/chat/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/chat/state.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/chat/utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/content/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/content/constants.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/content/functions.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/content/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/content/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/content/smart_rules.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/content/utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/data_extraction/README.md +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/data_extraction/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/data_extraction/augmented/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/data_extraction/base.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/data_extraction/basic/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/data_extraction/basic/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/elicitation/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/elicitation/constants.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/elicitation/exceptions.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/elicitation/functions.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/elicitation/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/elicitation/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/embedding/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/embedding/constants.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/embedding/functions.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/embedding/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/embedding/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/embedding/utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/README.md +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/_internal/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/_internal/streaming/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/_internal/streaming/common.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/_internal/streaming/pattern_replacer.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/_base.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/content_tree/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/content_tree/functions.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/content_tree/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/content_tree/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/base/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/base/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/base/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/base/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/base/utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/chat/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/chat/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/chat/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/chat/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/knowledge_base/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/knowledge_base/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/knowledge_base/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/knowledge_base/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/post_processing/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/post_processing/config.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/components/internal_search/post_processing/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/content_tree/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/identity/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/_async_bridge.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/_model_params.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/complete_with_references.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/stream_event_router.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/text_event_handler.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/tool_call_event_handler.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/events.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/chat_completions.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/responses.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/code_interpreter_event_handler.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/complete_with_references.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/completed_event_handler.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/stream_event_router.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/text_delta_event_handler.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/tool_call_event_handler.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/message_persister.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/progress_log_persister.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/content_folder/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/content_folder/functions.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/content_folder/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/content_folder/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/facades/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/facades/identity/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/facades/identity/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/feature_flags/README.md +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/feature_flags/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/feature_flags/_graphql_client.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/feature_flags/_ttl_cache.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/feature_flags/client.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/feature_flags/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/feature_flags/settings.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/group/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/group/functions.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/group/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/group/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/scheduled_task/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/scheduled_task/cron.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/scheduled_task/functions.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/scheduled_task/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/scheduled_task/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/user/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/user/functions.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/user/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/resources/user/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/experimental/testing/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/framework_utilities/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/framework_utilities/openai/client.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/framework_utilities/utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/builder.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/constants.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/default_language_model.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/functions.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/invocation_stats.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/model_costs.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/prompt.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/reference.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/settings.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/stream_transform.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/language_model/utils.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/monitoring/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/monitoring/gunicorn.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/monitoring/memory.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/monitoring/middleware.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/monitoring/registry.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/monitoring/tracing.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/protocols/support.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/services/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/services/factory.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/services/knowledge_base.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/short_term_memory/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/short_term_memory/constants.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/short_term_memory/functions.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/short_term_memory/schemas.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/short_term_memory/service.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/smart_rules/__init__.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.0}/unique_toolkit/smart_rules/compile.py +0 -0
- {unique_toolkit-2026.38.0.dev17 → unique_toolkit-2026.40.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: 2026.
|
|
3
|
+
Version: 2026.40.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>
|
|
@@ -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.
|
|
19
|
+
Requires-Dist: unique-sdk>=2026.40.0
|
|
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.
|
|
3
|
+
version = "2026.40.0"
|
|
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.
|
|
31
|
+
"unique-sdk>=2026.40.0",
|
|
32
32
|
"jambo>=0.1.2,<0.2",
|
|
33
33
|
"jinja2>=3.1.6,<4",
|
|
34
34
|
"docxtpl>=0.20.1,<0.21",
|
|
@@ -203,7 +203,8 @@ def _compose_msgs(
|
|
|
203
203
|
)
|
|
204
204
|
system_msg = LanguageModelSystemMessage(content=system_msg_content)
|
|
205
205
|
|
|
206
|
-
# Render user message
|
|
206
|
+
# Render user message. Pass history text only when history exists so the
|
|
207
|
+
# template can omit an empty conversation section.
|
|
207
208
|
user_msg_content = render_template(
|
|
208
209
|
user_template,
|
|
209
210
|
input_text=input.input_text,
|
|
@@ -211,7 +212,7 @@ def _compose_msgs(
|
|
|
211
212
|
if has_context
|
|
212
213
|
else None,
|
|
213
214
|
history_messages_text=input.get_joined_history_texts(tag_name="conversation")
|
|
214
|
-
if has_context
|
|
215
|
+
if has_context and input.history_messages
|
|
215
216
|
else None,
|
|
216
217
|
output_text=input.output_text,
|
|
217
218
|
)
|
|
@@ -1224,3 +1224,67 @@ def test_get_msgs__ignores_context_images__when_model_lacks_vision() -> None:
|
|
|
1224
1224
|
# Assert
|
|
1225
1225
|
assert result.root[0].content == no_context_result.root[0].content
|
|
1226
1226
|
assert isinstance(result.root[1].content, str)
|
|
1227
|
+
|
|
1228
|
+
|
|
1229
|
+
@pytest.mark.unit
|
|
1230
|
+
def test_compose_msgs__omits_conversation_section__when_history_is_empty():
|
|
1231
|
+
"""A single-turn evaluation must not be shown an empty conversation.
|
|
1232
|
+
|
|
1233
|
+
The template guards the section with `{% if history_messages_text %}`,
|
|
1234
|
+
and the getter returns a truthy placeholder when there is no history, so
|
|
1235
|
+
the guard used to never fire: every caller evaluating one turn shipped a
|
|
1236
|
+
`Conversation:` section whose body said there was no conversation, while
|
|
1237
|
+
the system prompt announced one.
|
|
1238
|
+
"""
|
|
1239
|
+
msgs = _compose_msgs(
|
|
1240
|
+
EvaluationMetricInput(
|
|
1241
|
+
input_text="What is the policy rate?",
|
|
1242
|
+
context_texts=["The policy rate is 0.25%."],
|
|
1243
|
+
history_messages=[],
|
|
1244
|
+
output_text="0.25%.",
|
|
1245
|
+
),
|
|
1246
|
+
HallucinationConfig(),
|
|
1247
|
+
has_context=True,
|
|
1248
|
+
)
|
|
1249
|
+
|
|
1250
|
+
user_content = msgs.root[-1].content
|
|
1251
|
+
assert isinstance(user_content, str)
|
|
1252
|
+
assert "Conversation:" not in user_content
|
|
1253
|
+
assert "<No conversation texts provided>" not in user_content
|
|
1254
|
+
# The references the model does have must still be there.
|
|
1255
|
+
assert "The policy rate is 0.25%." in user_content
|
|
1256
|
+
|
|
1257
|
+
|
|
1258
|
+
@pytest.mark.unit
|
|
1259
|
+
def test_compose_msgs__keeps_conversation_section__when_history_is_present():
|
|
1260
|
+
msgs = _compose_msgs(
|
|
1261
|
+
EvaluationMetricInput(
|
|
1262
|
+
input_text="And in March?",
|
|
1263
|
+
context_texts=["The March rate was 0.50%."],
|
|
1264
|
+
history_messages=[
|
|
1265
|
+
ChatMessage(
|
|
1266
|
+
id="msg_1",
|
|
1267
|
+
chat_id="chat_1",
|
|
1268
|
+
previous_message_id=None,
|
|
1269
|
+
role=LanguageModelMessageRole.USER,
|
|
1270
|
+
text="What is the policy rate?",
|
|
1271
|
+
),
|
|
1272
|
+
ChatMessage(
|
|
1273
|
+
id="msg_2",
|
|
1274
|
+
chat_id="chat_1",
|
|
1275
|
+
previous_message_id="msg_1",
|
|
1276
|
+
role=LanguageModelMessageRole.ASSISTANT,
|
|
1277
|
+
text="0.25%.",
|
|
1278
|
+
),
|
|
1279
|
+
],
|
|
1280
|
+
output_text="0.50%.",
|
|
1281
|
+
),
|
|
1282
|
+
HallucinationConfig(),
|
|
1283
|
+
has_context=True,
|
|
1284
|
+
)
|
|
1285
|
+
|
|
1286
|
+
user_content = msgs.root[-1].content
|
|
1287
|
+
assert isinstance(user_content, str)
|
|
1288
|
+
assert "Conversation:" in user_content
|
|
1289
|
+
assert "What is the policy rate?" in user_content
|
|
1290
|
+
assert "<No conversation texts provided>" not in user_content
|
|
@@ -23,10 +23,6 @@ class FeatureFlagNames(StrEnum):
|
|
|
23
23
|
"FEATURE_FLAG_ENABLE_MCP_METADATA_FALLBACK_UN_19145"
|
|
24
24
|
)
|
|
25
25
|
enable_html_rendering_un_15131 = "FEATURE_FLAG_ENABLE_HTML_RENDERING_UN_15131"
|
|
26
|
-
enable_code_execution_fence_un_17972 = (
|
|
27
|
-
"FEATURE_FLAG_ENABLE_CODE_EXECUTION_FENCE_UN_17972"
|
|
28
|
-
)
|
|
29
|
-
enable_html_with_fence_un_17927 = "FEATURE_FLAG_ENABLE_HTML_WITH_FENCE_UN_17927"
|
|
30
26
|
enable_web_search_argument_screening_un_18741 = (
|
|
31
27
|
"FEATURE_FLAG_ENABLE_WEB_SEARCH_ARGUMENT_SCREENING_UN_18741"
|
|
32
28
|
)
|
|
@@ -110,12 +106,24 @@ class FeatureFlags(BaseSettings):
|
|
|
110
106
|
|
|
111
107
|
enable_code_execution_fence_un_17972: FeatureFlag = Field(
|
|
112
108
|
default=FeatureFlag(False),
|
|
113
|
-
description=
|
|
109
|
+
description=(
|
|
110
|
+
"Retired: replaced by the `enable_code_execution_fence` config field "
|
|
111
|
+
"on ShowExecutedCodePostprocessorConfig (default true). "
|
|
112
|
+
"No code reads this field anymore. Kept only so removing it doesn't "
|
|
113
|
+
"trip the config-checker's breaking-change gate on this settings "
|
|
114
|
+
"model; delete once that checker allows field removal."
|
|
115
|
+
),
|
|
114
116
|
)
|
|
115
117
|
|
|
116
118
|
enable_html_with_fence_un_17927: FeatureFlag = Field(
|
|
117
119
|
default=FeatureFlag(False),
|
|
118
|
-
description=
|
|
120
|
+
description=(
|
|
121
|
+
"Retired: replaced by the `enable_html_with_fence` config field "
|
|
122
|
+
"on ShowExecutedCodePostprocessorConfig (default true). "
|
|
123
|
+
"No code reads this field anymore. Kept only so removing it doesn't "
|
|
124
|
+
"trip the config-checker's breaking-change gate on this settings "
|
|
125
|
+
"model; delete once that checker allows field removal."
|
|
126
|
+
),
|
|
119
127
|
)
|
|
120
128
|
|
|
121
129
|
enable_web_search_argument_screening_un_18741: FeatureFlag = Field(
|
|
@@ -21,6 +21,7 @@ from unique_toolkit.agentic.loop_runner.runners import (
|
|
|
21
21
|
BasicLoopIterationRunner,
|
|
22
22
|
BasicLoopIterationRunnerConfig,
|
|
23
23
|
MistralLoopIterationRunner,
|
|
24
|
+
PromptForcedToolLoopIterationRunner,
|
|
24
25
|
QwenLoopIterationRunner,
|
|
25
26
|
ResponsesBasicLoopIterationRunner,
|
|
26
27
|
)
|
|
@@ -34,6 +35,7 @@ __all__ = [
|
|
|
34
35
|
"BasicLoopIterationRunnerConfig",
|
|
35
36
|
"BasicLoopIterationRunner",
|
|
36
37
|
"MistralLoopIterationRunner",
|
|
38
|
+
"PromptForcedToolLoopIterationRunner",
|
|
37
39
|
"QwenLoopIterationRunner",
|
|
38
40
|
"handle_forced_tools_iteration",
|
|
39
41
|
"handle_last_iteration",
|
|
@@ -6,6 +6,10 @@ from unique_toolkit.agentic.loop_runner.runners.basic import (
|
|
|
6
6
|
from unique_toolkit.agentic.loop_runner.runners.mistral import (
|
|
7
7
|
MistralLoopIterationRunner,
|
|
8
8
|
)
|
|
9
|
+
from unique_toolkit.agentic.loop_runner.runners.prompt_forced_tool import (
|
|
10
|
+
PROMPT_FORCED_TOOL_CALL_INSTRUCTION,
|
|
11
|
+
PromptForcedToolLoopIterationRunner,
|
|
12
|
+
)
|
|
9
13
|
from unique_toolkit.agentic.loop_runner.runners.qwen import (
|
|
10
14
|
QWEN_FORCED_TOOL_CALL_INSTRUCTION,
|
|
11
15
|
QWEN_LAST_ITERATION_INSTRUCTION,
|
|
@@ -18,6 +22,8 @@ __all__ = [
|
|
|
18
22
|
"BasicLoopIterationRunner",
|
|
19
23
|
"ResponsesBasicLoopIterationRunner",
|
|
20
24
|
"MistralLoopIterationRunner",
|
|
25
|
+
"PROMPT_FORCED_TOOL_CALL_INSTRUCTION",
|
|
26
|
+
"PromptForcedToolLoopIterationRunner",
|
|
21
27
|
"QwenLoopIterationRunner",
|
|
22
28
|
"QWEN_FORCED_TOOL_CALL_INSTRUCTION",
|
|
23
29
|
"QWEN_LAST_ITERATION_INSTRUCTION",
|
unique_toolkit-2026.40.0/unique_toolkit/agentic/loop_runner/runners/prompt_forced_tool/__init__.py
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
from unique_toolkit.agentic.loop_runner.runners.prompt_forced_tool.runner import (
|
|
2
|
+
PROMPT_FORCED_TOOL_CALL_INSTRUCTION,
|
|
3
|
+
PromptForcedToolLoopIterationRunner,
|
|
4
|
+
)
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
"PROMPT_FORCED_TOOL_CALL_INSTRUCTION",
|
|
8
|
+
"PromptForcedToolLoopIterationRunner",
|
|
9
|
+
]
|
unique_toolkit-2026.40.0/unique_toolkit/agentic/loop_runner/runners/prompt_forced_tool/helpers.py
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Message helpers for models that reject a forced tool_choice."""
|
|
2
|
+
|
|
3
|
+
from unique_toolkit.language_model.schemas import (
|
|
4
|
+
LanguageModelMessageRole,
|
|
5
|
+
LanguageModelMessages,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def append_prompt_forced_tool_instruction(
|
|
10
|
+
*,
|
|
11
|
+
messages: LanguageModelMessages,
|
|
12
|
+
instruction: str,
|
|
13
|
+
) -> LanguageModelMessages:
|
|
14
|
+
"""Append a must-call instruction to the last user message.
|
|
15
|
+
|
|
16
|
+
Args:
|
|
17
|
+
messages (LanguageModelMessages): Conversation copied for this tool.
|
|
18
|
+
instruction (str): Instruction that names the tool to call.
|
|
19
|
+
|
|
20
|
+
Returns:
|
|
21
|
+
LanguageModelMessages: A new message list with the instruction appended
|
|
22
|
+
when the last user message has string content.
|
|
23
|
+
"""
|
|
24
|
+
messages_list = list(messages)
|
|
25
|
+
for i in range(len(messages_list) - 1, -1, -1):
|
|
26
|
+
msg = messages_list[i]
|
|
27
|
+
if msg.role == LanguageModelMessageRole.USER and isinstance(msg.content, str):
|
|
28
|
+
messages_list[i] = msg.model_copy(
|
|
29
|
+
update={"content": msg.content + "\n" + instruction}
|
|
30
|
+
)
|
|
31
|
+
break
|
|
32
|
+
return LanguageModelMessages(root=messages_list)
|
unique_toolkit-2026.40.0/unique_toolkit/agentic/loop_runner/runners/prompt_forced_tool/runner.py
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""Loop runner for models that reject forced tool_choice values."""
|
|
2
|
+
|
|
3
|
+
from typing import Unpack
|
|
4
|
+
|
|
5
|
+
from unique_toolkit.agentic.loop_runner._iteration_handler_utils import (
|
|
6
|
+
run_forced_tools_iteration,
|
|
7
|
+
)
|
|
8
|
+
from unique_toolkit.agentic.loop_runner.base import _LoopIterationRunnerKwargs
|
|
9
|
+
from unique_toolkit.agentic.loop_runner.runners.basic import (
|
|
10
|
+
BasicLoopIterationRunner,
|
|
11
|
+
)
|
|
12
|
+
from unique_toolkit.agentic.loop_runner.runners.prompt_forced_tool.helpers import (
|
|
13
|
+
append_prompt_forced_tool_instruction,
|
|
14
|
+
)
|
|
15
|
+
from unique_toolkit.chat.functions import LanguageModelStreamResponse
|
|
16
|
+
|
|
17
|
+
PROMPT_FORCED_TOOL_CALL_INSTRUCTION = (
|
|
18
|
+
"You must call the tool {TOOL_NAME}. Call it instead of replying with text."
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class PromptForcedToolLoopIterationRunner(BasicLoopIterationRunner):
|
|
23
|
+
"""Runner for models that reject named and ``any`` tool choices.
|
|
24
|
+
|
|
25
|
+
Claude Opus 5.5 and Fable 5.1 return HTTP 400 for those ``tool_choice``
|
|
26
|
+
types. This runner keeps one request per forced tool, limits ``tools`` to
|
|
27
|
+
that tool, sends ``tool_choice="auto"``, and asks for the call in the prompt.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
async def _handle_forced_tools(
|
|
31
|
+
self,
|
|
32
|
+
**kwargs: Unpack[_LoopIterationRunnerKwargs],
|
|
33
|
+
) -> LanguageModelStreamResponse:
|
|
34
|
+
original_messages = kwargs["messages"].model_copy(deep=True)
|
|
35
|
+
|
|
36
|
+
def _prepare(
|
|
37
|
+
func_name: str | None,
|
|
38
|
+
per_choice_kwargs: _LoopIterationRunnerKwargs,
|
|
39
|
+
) -> _LoopIterationRunnerKwargs:
|
|
40
|
+
instruction = PROMPT_FORCED_TOOL_CALL_INSTRUCTION.format(
|
|
41
|
+
TOOL_NAME=func_name or ""
|
|
42
|
+
)
|
|
43
|
+
per_choice_kwargs["messages"] = append_prompt_forced_tool_instruction(
|
|
44
|
+
messages=original_messages,
|
|
45
|
+
instruction=instruction,
|
|
46
|
+
)
|
|
47
|
+
return per_choice_kwargs
|
|
48
|
+
|
|
49
|
+
return await run_forced_tools_iteration(
|
|
50
|
+
loop_runner_kwargs=kwargs,
|
|
51
|
+
prepare_loop_runner_kwargs=_prepare,
|
|
52
|
+
tool_choice_override="auto",
|
|
53
|
+
)
|
|
@@ -11,26 +11,32 @@ from unique_toolkit.elicitation import (
|
|
|
11
11
|
)
|
|
12
12
|
|
|
13
13
|
_DEFAULT_TOOL_DESCRIPTION = """
|
|
14
|
-
Ask the user a question through a structured form and block until they answer. Use whenever you need information, a decision, or confirmation before continuing correctly: clarifying questions, confirmation before destructive or irreversible work, missing parameters, or choosing among plausible options. Do not ask the user in normal chat text while this tool is available—call AskUser, wait for the result, then continue. If unsure which interpretation, scope, or value applies, call AskUser instead of guessing.
|
|
14
|
+
Ask the user a question through a structured form and block until they answer. Use whenever you need information, a decision, or confirmation before continuing correctly: clarifying questions, confirmation before destructive or irreversible work, missing parameters, or choosing among plausible options. Do not ask the user in normal chat text while this tool is available—call AskUser, wait for the result, then continue. If unsure which interpretation, scope, or value applies, call AskUser instead of guessing. The form's Confirm/Decline buttons are the user's consent: for destructive actions state the consequence in `message` and proceed only when the user confirms; use an empty-properties schema when there is nothing else to ask. Form and chat anchoring are handled for you; the call blocks until the user responds, declines, cancels, or times out.
|
|
15
15
|
""".strip()
|
|
16
16
|
|
|
17
17
|
_DEFAULT_TOOL_DESCRIPTION_FOR_SYSTEM_PROMPT = """
|
|
18
18
|
- If your next message would ask the user for information, a decision, or confirmation, call AskUser instead of writing the question in chat.
|
|
19
19
|
- If more than one reasonable reading of the request exists, call AskUser before acting—do not silently pick a default.
|
|
20
|
-
- Destructive or irreversible actions
|
|
20
|
+
- Destructive or irreversible actions need the user's confirmation: state the consequence in `message` and proceed only on an accepted result. The Confirm button is the consent on any form, so never model it as a boolean `confirm` field; if there is nothing else to ask, use `response_schema` `{"type":"object","properties":{}}`.
|
|
21
21
|
""".strip()
|
|
22
22
|
|
|
23
23
|
_DEFAULT_MESSAGE_DESCRIPTION = "The question or prompt shown to the user"
|
|
24
24
|
|
|
25
25
|
_DEFAULT_RESPONSE_SCHEMA_DESCRIPTION = """
|
|
26
|
-
JSON Schema object (root type "object") for the form shown to the user; you construct it.
|
|
26
|
+
JSON Schema object (root type "object") for the form shown to the user; you construct it. The Confirm/Decline buttons are the user's consent on any form, so a confirmation needs no field of its own: empty properties for a plain yes/no; single string property for free-text; string + enum for one choice (dropdown); array with items.enum for choose-many; boolean only for a genuine data field where unchecked (false) is a valid answer. Mark needed fields required and add short property descriptions (shown as help text). A required boolean means "must be answered", not "must be ticked": the user can submit it unchecked. Give every boolean a title, it is the checkbox label. Prefer one small form over many calls.
|
|
27
27
|
Examples:
|
|
28
|
+
- confirm: {"type":"object","properties":{}};
|
|
28
29
|
- free-text: {"type":"object","properties":{"answer":{"type":"string"}},"required":["answer"]};
|
|
29
|
-
- confirm: {"type":"object","properties":{"confirm":{"type":"boolean"}},"required":["confirm"]};
|
|
30
30
|
- choice: {"type":"object","properties":{"region":{"type":"string","enum":["EU","US"]}},"required":["region"]};
|
|
31
|
-
- multi: {"type":"object","properties":{"topics":{"type":"array","items":{"type":"string","enum":["a","b"]}}}}
|
|
31
|
+
- multi: {"type":"object","properties":{"topics":{"type":"array","items":{"type":"string","enum":["a","b"]}}}};
|
|
32
|
+
- yes/no data: {"type":"object","properties":{"include_appendix":{"type":"boolean","title":"Include appendix"}}}.
|
|
32
33
|
""".strip()
|
|
33
34
|
|
|
35
|
+
_DEFAULT_ACCEPTED_MESSAGE = (
|
|
36
|
+
"The user confirmed the request. The form had no fields, so there is no "
|
|
37
|
+
"response content. Proceed with the confirmed action."
|
|
38
|
+
)
|
|
39
|
+
|
|
34
40
|
_TIMEOUT_SECONDS_MIN = 1
|
|
35
41
|
_TIMOUT_SECONDS_MAX = 3600
|
|
36
42
|
|
|
@@ -81,6 +87,19 @@ class AskUserToolConfig(BaseToolConfig):
|
|
|
81
87
|
title="`response_schema` tool input field description",
|
|
82
88
|
)
|
|
83
89
|
|
|
90
|
+
accepted_message: Annotated[
|
|
91
|
+
str,
|
|
92
|
+
RJSFMetaTag.StringWidget.textarea(rows=2),
|
|
93
|
+
] = Field(
|
|
94
|
+
default=_DEFAULT_ACCEPTED_MESSAGE,
|
|
95
|
+
description=(
|
|
96
|
+
"Message returned to the model when the user accepts a form without "
|
|
97
|
+
"fields (empty-properties confirmation schema). Forms with fields "
|
|
98
|
+
"return the submitted values as JSON instead."
|
|
99
|
+
),
|
|
100
|
+
title="Accepted response (empty form)",
|
|
101
|
+
)
|
|
102
|
+
|
|
84
103
|
declined_message: Annotated[
|
|
85
104
|
str,
|
|
86
105
|
RJSFMetaTag.StringWidget.textarea(
|
|
@@ -158,8 +158,17 @@ class AskUserTool(Tool[AskUserToolConfig]):
|
|
|
158
158
|
|
|
159
159
|
_LOGGER.info("User responded to elicitation request")
|
|
160
160
|
|
|
161
|
+
# Decide on the schema, not the payload: a form with optional fields left
|
|
162
|
+
# blank also comes back empty, and that is an answer ("{}"), not consent.
|
|
163
|
+
if not params.response_schema.get("properties"):
|
|
164
|
+
return ToolCallResponse(
|
|
165
|
+
id=tool_call.id,
|
|
166
|
+
name=self.name,
|
|
167
|
+
content=self.config.accepted_message,
|
|
168
|
+
)
|
|
169
|
+
|
|
161
170
|
return ToolCallResponse(
|
|
162
171
|
id=tool_call.id,
|
|
163
172
|
name=self.name,
|
|
164
|
-
content=json.dumps(elicitation.response_content, ensure_ascii=False),
|
|
173
|
+
content=json.dumps(elicitation.response_content or {}, ensure_ascii=False),
|
|
165
174
|
)
|
|
@@ -6,15 +6,10 @@ from typing import override
|
|
|
6
6
|
from pydantic import BaseModel, Field
|
|
7
7
|
from pydantic.json_schema import SkipJsonSchema
|
|
8
8
|
|
|
9
|
-
from unique_toolkit.agentic.feature_flags import FeatureFlagNames
|
|
10
9
|
from unique_toolkit.agentic.postprocessor.postprocessor_manager import (
|
|
11
10
|
ResponsesApiPostprocessor,
|
|
12
11
|
)
|
|
13
12
|
from unique_toolkit.agentic.tools.config import get_configuration_dict
|
|
14
|
-
from unique_toolkit.experimental.resources.feature_flags import (
|
|
15
|
-
COMPANY_ID_PLACEHOLDER,
|
|
16
|
-
is_flag_enabled,
|
|
17
|
-
)
|
|
18
13
|
from unique_toolkit.language_model.schemas import ResponsesLanguageModelStreamResponse
|
|
19
14
|
|
|
20
15
|
_TEMPLATE = """
|
|
@@ -37,7 +32,23 @@ class ShowExecutedCodePostprocessorConfig(BaseModel):
|
|
|
37
32
|
model_config = get_configuration_dict()
|
|
38
33
|
enable: bool = Field(
|
|
39
34
|
default=True,
|
|
40
|
-
description="
|
|
35
|
+
description="Show the executed source code to the user",
|
|
36
|
+
)
|
|
37
|
+
enable_code_execution_fence: bool = Field(
|
|
38
|
+
default=True,
|
|
39
|
+
description=(
|
|
40
|
+
"Show generated files as interactive cards with a built-in code view "
|
|
41
|
+
"and hide the legacy collapsible code block below."
|
|
42
|
+
),
|
|
43
|
+
)
|
|
44
|
+
enable_html_with_fence: bool = Field(
|
|
45
|
+
default=True,
|
|
46
|
+
description=(
|
|
47
|
+
"Show generated HTML files as interactive cards with a built-in code "
|
|
48
|
+
"view instead of a plain rendered HTML block. Has no effect on its "
|
|
49
|
+
"own: 'enable_code_execution_fence' must be on as well. While that "
|
|
50
|
+
"switch is off, HTML files stay a plain rendered HTML block."
|
|
51
|
+
),
|
|
41
52
|
)
|
|
42
53
|
remove_from_history: SkipJsonSchema[bool] = (
|
|
43
54
|
Field( # At the moment, it's not possible to keep executed code in the history
|
|
@@ -55,20 +66,15 @@ class ShowExecutedCodePostprocessor(ResponsesApiPostprocessor):
|
|
|
55
66
|
def __init__(
|
|
56
67
|
self,
|
|
57
68
|
config: ShowExecutedCodePostprocessorConfig,
|
|
58
|
-
company_id: str | None = None,
|
|
59
69
|
):
|
|
60
70
|
super().__init__(self.__class__.__name__)
|
|
61
71
|
self._config = config
|
|
62
|
-
|
|
63
|
-
#
|
|
64
|
-
self._is_enabled =
|
|
72
|
+
# When fences are enabled, the fence itself shows the executed code,
|
|
73
|
+
# so this legacy <details> display must stay off.
|
|
74
|
+
self._is_enabled = config.enable and not config.enable_code_execution_fence
|
|
65
75
|
|
|
66
76
|
@override
|
|
67
77
|
async def run(self, loop_response: ResponsesLanguageModelStreamResponse) -> None:
|
|
68
|
-
self._is_enabled = self._config.enable and not await is_flag_enabled(
|
|
69
|
-
FeatureFlagNames.enable_code_execution_fence_un_17972,
|
|
70
|
-
company_id=self._company_id or COMPANY_ID_PLACEHOLDER,
|
|
71
|
-
)
|
|
72
78
|
if self._is_enabled:
|
|
73
79
|
await asyncio.sleep(self._config.sleep_time_before_display)
|
|
74
80
|
|
|
@@ -21,7 +21,6 @@ from tenacity import (
|
|
|
21
21
|
|
|
22
22
|
from unique_toolkit import ChatService
|
|
23
23
|
from unique_toolkit._common.execution import failsafe_async
|
|
24
|
-
from unique_toolkit.agentic.feature_flags import FeatureFlagNames
|
|
25
24
|
from unique_toolkit.agentic.postprocessor.postprocessor_manager import (
|
|
26
25
|
ResponsesApiPostprocessor,
|
|
27
26
|
)
|
|
@@ -40,10 +39,6 @@ from unique_toolkit.agentic.tools.openai_builtin.code_interpreter.schemas import
|
|
|
40
39
|
)
|
|
41
40
|
from unique_toolkit.content.schemas import ContentReference
|
|
42
41
|
from unique_toolkit.content.service import ContentService
|
|
43
|
-
from unique_toolkit.experimental.resources.feature_flags import (
|
|
44
|
-
COMPANY_ID_PLACEHOLDER,
|
|
45
|
-
is_flag_enabled,
|
|
46
|
-
)
|
|
47
42
|
from unique_toolkit.language_model.schemas import ResponsesLanguageModelStreamResponse
|
|
48
43
|
from unique_toolkit.services.knowledge_base import KnowledgeBaseService
|
|
49
44
|
from unique_toolkit.short_term_memory.service import ShortTermMemoryService
|
|
@@ -376,6 +371,8 @@ class DisplayCodeInterpreterFilesPostProcessor(
|
|
|
376
371
|
company_id: str | None = None,
|
|
377
372
|
user_id: str | None = None,
|
|
378
373
|
chat_id: str | None = None,
|
|
374
|
+
code_execution_fence_enabled: bool = True,
|
|
375
|
+
html_with_fence_enabled: bool = True,
|
|
379
376
|
) -> None:
|
|
380
377
|
super().__init__(self.__class__.__name__)
|
|
381
378
|
|
|
@@ -383,7 +380,6 @@ class DisplayCodeInterpreterFilesPostProcessor(
|
|
|
383
380
|
self._chat_service = chat_service
|
|
384
381
|
self._client = client
|
|
385
382
|
self._config = config
|
|
386
|
-
self._company_id = company_id
|
|
387
383
|
|
|
388
384
|
if self._chat_service is None:
|
|
389
385
|
raise ValueError("ChatService is required if uploadToChat is True")
|
|
@@ -404,9 +400,11 @@ class DisplayCodeInterpreterFilesPostProcessor(
|
|
|
404
400
|
self._file_size_map: dict[str, int] = {}
|
|
405
401
|
self._container_files: list[CodeInterpreterContainerFile] = []
|
|
406
402
|
|
|
407
|
-
#
|
|
408
|
-
|
|
409
|
-
|
|
403
|
+
# Both switches are plain config values now (were FFs UN-17972 / UN-17927).
|
|
404
|
+
# They live on ShowExecutedCodePostprocessorConfig ("Code display" on the
|
|
405
|
+
# config page) and are passed in by the orchestrator.
|
|
406
|
+
self._fence_enabled = code_execution_fence_enabled
|
|
407
|
+
self._html_fence_enabled = html_with_fence_enabled
|
|
410
408
|
|
|
411
409
|
def _build_retry(self) -> AsyncRetrying:
|
|
412
410
|
"""Build a tenacity retry policy from the current config.
|
|
@@ -511,17 +509,6 @@ class DisplayCodeInterpreterFilesPostProcessor(
|
|
|
511
509
|
run_t0 = time.monotonic()
|
|
512
510
|
self._log.info("run() started — fetching and uploading code interpreter files")
|
|
513
511
|
|
|
514
|
-
self._fence_ff_on = await is_flag_enabled(
|
|
515
|
-
FeatureFlagNames.enable_code_execution_fence_un_17972,
|
|
516
|
-
company_id=self._company_id or COMPANY_ID_PLACEHOLDER,
|
|
517
|
-
)
|
|
518
|
-
# htmlWithSource requires BOTH the fence FF and the HTML-fence FF on; default
|
|
519
|
-
# (FF off) keeps HtmlRendering, so existing deployments are unaffected.
|
|
520
|
-
self._html_fence_ff_on = await is_flag_enabled(
|
|
521
|
-
FeatureFlagNames.enable_html_with_fence_un_17927,
|
|
522
|
-
company_id=self._company_id or COMPANY_ID_PLACEHOLDER,
|
|
523
|
-
)
|
|
524
|
-
|
|
525
512
|
container_files = await self._resolve_container_files(loop_response)
|
|
526
513
|
self._container_files = container_files
|
|
527
514
|
self._log.info(
|
|
@@ -668,9 +655,9 @@ class DisplayCodeInterpreterFilesPostProcessor(
|
|
|
668
655
|
) -> bool:
|
|
669
656
|
apply_t0 = time.monotonic()
|
|
670
657
|
self._log.info(
|
|
671
|
-
"apply_postprocessing started — %d file(s) in content_map,
|
|
658
|
+
"apply_postprocessing started — %d file(s) in content_map, fence_enabled=%s",
|
|
672
659
|
len(self._content_map),
|
|
673
|
-
self.
|
|
660
|
+
self._fence_enabled,
|
|
674
661
|
)
|
|
675
662
|
|
|
676
663
|
if loop_response.message.references is None:
|
|
@@ -711,9 +698,9 @@ class DisplayCodeInterpreterFilesPostProcessor(
|
|
|
711
698
|
)
|
|
712
699
|
changed |= replaced
|
|
713
700
|
|
|
714
|
-
# HTML
|
|
715
|
-
#
|
|
716
|
-
elif is_html and not self.
|
|
701
|
+
# HTML uses HtmlRendering unless BOTH switches are on (htmlWithSource
|
|
702
|
+
# needs the code-execution fence too).
|
|
703
|
+
elif is_html and not (self._html_fence_enabled and self._fence_enabled):
|
|
717
704
|
loop_response.message.text, replaced = _replace_container_html_citation(
|
|
718
705
|
text=loop_response.message.text or "",
|
|
719
706
|
filename=filename,
|
|
@@ -721,15 +708,15 @@ class DisplayCodeInterpreterFilesPostProcessor(
|
|
|
721
708
|
)
|
|
722
709
|
changed |= replaced
|
|
723
710
|
|
|
724
|
-
# Non-HTML files, or HTML when
|
|
725
|
-
# subsequent fence injection
|
|
711
|
+
# Non-HTML files, or HTML when both fence switches are on → inline
|
|
712
|
+
# content link for subsequent fence injection
|
|
726
713
|
else:
|
|
727
714
|
loop_response.message.text, replaced = _replace_container_file_citation(
|
|
728
715
|
text=loop_response.message.text or "",
|
|
729
716
|
filename=filename,
|
|
730
717
|
content_id=content_id,
|
|
731
718
|
ref_number=ref_number,
|
|
732
|
-
use_content_link=self.
|
|
719
|
+
use_content_link=self._fence_enabled,
|
|
733
720
|
)
|
|
734
721
|
changed |= replaced
|
|
735
722
|
|
|
@@ -746,7 +733,7 @@ class DisplayCodeInterpreterFilesPostProcessor(
|
|
|
746
733
|
|
|
747
734
|
# HtmlRendering and htmlWithSource both embed contentId directly — no ContentReference needed
|
|
748
735
|
is_html_rendered = is_html
|
|
749
|
-
if replaced and not (is_image or is_html_rendered or self.
|
|
736
|
+
if replaced and not (is_image or is_html_rendered or self._fence_enabled):
|
|
750
737
|
loop_response.message.references.append(
|
|
751
738
|
ContentReference(
|
|
752
739
|
sequence_number=ref_number,
|
|
@@ -765,12 +752,12 @@ class DisplayCodeInterpreterFilesPostProcessor(
|
|
|
765
752
|
error_files,
|
|
766
753
|
)
|
|
767
754
|
|
|
768
|
-
if self.
|
|
755
|
+
if self._fence_enabled:
|
|
769
756
|
code_blocks = _build_code_blocks(
|
|
770
757
|
loop_response,
|
|
771
758
|
self._content_map,
|
|
772
759
|
self._container_files,
|
|
773
|
-
include_html=self.
|
|
760
|
+
include_html=self._html_fence_enabled,
|
|
774
761
|
)
|
|
775
762
|
self._log.info(
|
|
776
763
|
"Fence injection — %d code block(s), files: %s",
|
|
@@ -778,7 +765,7 @@ class DisplayCodeInterpreterFilesPostProcessor(
|
|
|
778
765
|
[f.filename for b in code_blocks for f in b.files],
|
|
779
766
|
)
|
|
780
767
|
_warn_unmatched_code_blocks(
|
|
781
|
-
self._content_map, code_blocks, include_html=self.
|
|
768
|
+
self._content_map, code_blocks, include_html=self._html_fence_enabled
|
|
782
769
|
)
|
|
783
770
|
text_before = loop_response.message.text
|
|
784
771
|
loop_response.message.text = _inject_code_execution_fences(
|
|
@@ -1503,7 +1490,7 @@ def _warn_unmatched_code_blocks(
|
|
|
1503
1490
|
) -> None:
|
|
1504
1491
|
"""Warn for files that were uploaded but could not be matched to any code block.
|
|
1505
1492
|
|
|
1506
|
-
When
|
|
1493
|
+
When fence rendering is enabled, every uploaded file should map to a code block
|
|
1507
1494
|
via its /mnt/data/<filename> path so it can receive a fence. If a file is not
|
|
1508
1495
|
matched (e.g. the LLM used a variable for the output path rather than a literal
|
|
1509
1496
|
string) it falls back to a plain unique://content/ link with no code context.
|
|
@@ -1634,10 +1621,10 @@ def _replace_container_file_citation(
|
|
|
1634
1621
|
) -> tuple[str, bool]:
|
|
1635
1622
|
"""Replace a sandbox file link with either an inline content link or a superscript ref.
|
|
1636
1623
|
|
|
1637
|
-
When
|
|
1638
|
-
replaced with [filename](unique://content/{id}) so the subsequent fence
|
|
1639
|
-
step can locate and wrap it. When
|
|
1640
|
-
original pre-fence behaviour is restored: the link is replaced with <sup>N</sup>
|
|
1624
|
+
When fence rendering is enabled in the config (use_content_link=True), the sandbox
|
|
1625
|
+
link is replaced with [filename](unique://content/{id}) so the subsequent fence
|
|
1626
|
+
injection step can locate and wrap it. When it is disabled (use_content_link=False),
|
|
1627
|
+
the original pre-fence behaviour is restored: the link is replaced with <sup>N</sup>
|
|
1641
1628
|
and the file remains accessible via the references panel.
|
|
1642
1629
|
"""
|
|
1643
1630
|
file_markdown = _sandbox_link_pattern(filename)
|
|
@@ -96,9 +96,9 @@ DEFAULT_TOOL_DESCRIPTION_FOR_SYSTEM_PROMPT = (
|
|
|
96
96
|
_TOOL_DESCRIPTION_FOR_SYSTEM_PROMPT_BASE + _TOOL_DESCRIPTION_FILES_SUFFIX
|
|
97
97
|
).strip()
|
|
98
98
|
|
|
99
|
-
#
|
|
100
|
-
#
|
|
101
|
-
#
|
|
99
|
+
# Default system prompt. The frontend derives the artifact title from the
|
|
100
|
+
# filename itself, so the LLM does not need to produce a markdown heading
|
|
101
|
+
# before the sandbox link.
|
|
102
102
|
#
|
|
103
103
|
# UN-19711 / Horizon follow-up: The HTML rules in the fence prompt reduce iframe height
|
|
104
104
|
# collapse when chat auto-measures the embedded document. Remaining gaps belong in the
|