unique_toolkit 1.71.3__tar.gz → 1.73.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/PKG-INFO +1 -1
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/pyproject.toml +1 -1
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/loop_runner/__init__.py +2 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +2 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +7 -1
- unique_toolkit-1.73.0/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +189 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/chat/responses_api.py +15 -8
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/content/functions.py +43 -4
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/services/knowledge_base.py +182 -45
- unique_toolkit-1.71.3/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +0 -94
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/README.md +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/_base_service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/_time_utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/config_checker/README.md +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/config_checker/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/config_checker/__main__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/config_checker/cli.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/config_checker/differ.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/config_checker/exporter.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/config_checker/models.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/config_checker/registry.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/config_checker/validator.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/default_language_model.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/docx_generator/config.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/docx_generator/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/endpoint_builder.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/endpoint_requestor.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/event_bus.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/exception.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/execution.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/feature_flags/schema.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/pydantic_helpers.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/referencing.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/string_utilities.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/tests/test_referencing.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/token/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/token/image_token_counting.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/token/token_counting.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/utils/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/utils/files.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/utils/image/encode.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/utils/jinja/render.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/utils/write_configuration.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/validate_required_values.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/_common/validators.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/config.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/exception.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/evaluation/utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/feature_flags/feature_flags.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/history_manager/utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/loop_runner/base.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/config.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/experimental/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/config.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/runtime.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/tool.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/factory.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/schemas.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/tool.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic_table/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic_table/schemas.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic_table/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/app/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/app/chat_event_filter_options_settings.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/app/dev_util.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/app/fast_api_factory.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/app/feature_flags.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/app/find_env_file.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/app/init_logging.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/app/init_sdk.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/app/performance/async_tasks.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/app/performance/async_wrapper.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/app/schemas.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/app/unique_settings.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/app/verification.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/app/webhook.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/chat/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/chat/cancellation.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/chat/constants.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/chat/deprecated/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/chat/functions.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/chat/rendering.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/chat/schemas.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/chat/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/chat/state.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/chat/utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/content/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/content/constants.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/content/schemas.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/content/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/content/smart_rules.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/content/utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/data_extraction/README.md +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/data_extraction/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/data_extraction/augmented/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/data_extraction/base.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/data_extraction/basic/config.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/data_extraction/basic/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/elicitation/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/elicitation/constants.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/elicitation/exceptions.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/elicitation/functions.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/elicitation/schemas.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/elicitation/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/embedding/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/embedding/constants.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/embedding/functions.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/embedding/schemas.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/embedding/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/embedding/utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/framework_utilities/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/framework_utilities/openai/client.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/framework_utilities/utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/language_model/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/language_model/builder.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/language_model/constants.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/language_model/default_language_model.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/language_model/functions.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/language_model/infos.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/language_model/prompt.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/language_model/reference.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/language_model/schemas.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/language_model/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/language_model/stream_transform.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/language_model/utils.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/monitoring/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/monitoring/middleware.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/monitoring/registry.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/protocols/support.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/services/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/services/chat_service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/services/factory.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/short_term_memory/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/short_term_memory/constants.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/short_term_memory/functions.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/short_term_memory/schemas.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/short_term_memory/service.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/smart_rules/__init__.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/smart_rules/compile.py +0 -0
- {unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/test_utilities/events.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: unique-toolkit
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.73.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>
|
{unique_toolkit-1.71.3 → unique_toolkit-1.73.0}/unique_toolkit/agentic/loop_runner/__init__.py
RENAMED
|
@@ -11,6 +11,7 @@ from unique_toolkit.agentic.loop_runner.middleware import (
|
|
|
11
11
|
PlanningConfig,
|
|
12
12
|
PlanningMiddleware,
|
|
13
13
|
PlanningSchemaConfig,
|
|
14
|
+
ResponsesPlanningMiddleware,
|
|
14
15
|
)
|
|
15
16
|
from unique_toolkit.agentic.loop_runner.runners import (
|
|
16
17
|
QWEN_FORCED_TOOL_CALL_INSTRUCTION,
|
|
@@ -28,6 +29,7 @@ __all__ = [
|
|
|
28
29
|
"PlanningConfig",
|
|
29
30
|
"PlanningMiddleware",
|
|
30
31
|
"PlanningSchemaConfig",
|
|
32
|
+
"ResponsesPlanningMiddleware",
|
|
31
33
|
"BasicLoopIterationRunnerConfig",
|
|
32
34
|
"BasicLoopIterationRunner",
|
|
33
35
|
"MistralLoopIterationRunner",
|
|
@@ -2,10 +2,12 @@ from unique_toolkit.agentic.loop_runner.middleware.planning import (
|
|
|
2
2
|
PlanningConfig,
|
|
3
3
|
PlanningMiddleware,
|
|
4
4
|
PlanningSchemaConfig,
|
|
5
|
+
ResponsesPlanningMiddleware,
|
|
5
6
|
)
|
|
6
7
|
|
|
7
8
|
__all__ = [
|
|
8
9
|
"PlanningConfig",
|
|
9
10
|
"PlanningMiddleware",
|
|
10
11
|
"PlanningSchemaConfig",
|
|
12
|
+
"ResponsesPlanningMiddleware",
|
|
11
13
|
]
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
from unique_toolkit.agentic.loop_runner.middleware.planning.planning import (
|
|
2
2
|
PlanningConfig,
|
|
3
3
|
PlanningMiddleware,
|
|
4
|
+
ResponsesPlanningMiddleware,
|
|
4
5
|
)
|
|
5
6
|
from unique_toolkit.agentic.loop_runner.middleware.planning.schema import (
|
|
6
7
|
PlanningSchemaConfig,
|
|
7
8
|
)
|
|
8
9
|
|
|
9
|
-
__all__ = [
|
|
10
|
+
__all__ = [
|
|
11
|
+
"PlanningMiddleware",
|
|
12
|
+
"ResponsesPlanningMiddleware",
|
|
13
|
+
"PlanningConfig",
|
|
14
|
+
"PlanningSchemaConfig",
|
|
15
|
+
]
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
from typing import Unpack
|
|
4
|
+
|
|
5
|
+
from openai import AsyncOpenAI
|
|
6
|
+
from openai.types.responses import (
|
|
7
|
+
Response,
|
|
8
|
+
ResponseFormatTextJSONSchemaConfigParam,
|
|
9
|
+
ResponseInputItemParam,
|
|
10
|
+
ResponseTextConfigParam,
|
|
11
|
+
)
|
|
12
|
+
from pydantic import BaseModel, Field
|
|
13
|
+
|
|
14
|
+
from unique_toolkit import LanguageModelService
|
|
15
|
+
from unique_toolkit._common.execution import failsafe_async
|
|
16
|
+
from unique_toolkit._common.pydantic_helpers import get_configuration_dict
|
|
17
|
+
from unique_toolkit.agentic.history_manager.history_manager import HistoryManager
|
|
18
|
+
from unique_toolkit.agentic.loop_runner.base import (
|
|
19
|
+
LoopIterationRunner,
|
|
20
|
+
ResponsesLoopIterationRunner,
|
|
21
|
+
_LoopIterationRunnerKwargs,
|
|
22
|
+
_ResponsesLoopIterationRunnerKwargs,
|
|
23
|
+
)
|
|
24
|
+
from unique_toolkit.agentic.loop_runner.middleware.planning.schema import (
|
|
25
|
+
PlanningSchemaConfig,
|
|
26
|
+
get_planning_schema,
|
|
27
|
+
)
|
|
28
|
+
from unique_toolkit.chat.responses_api import convert_messages_to_openai
|
|
29
|
+
from unique_toolkit.chat.service import LanguageModelStreamResponse
|
|
30
|
+
from unique_toolkit.language_model import (
|
|
31
|
+
LanguageModelAssistantMessage,
|
|
32
|
+
LanguageModelUserMessage,
|
|
33
|
+
)
|
|
34
|
+
from unique_toolkit.language_model.schemas import (
|
|
35
|
+
LanguageModelMessages,
|
|
36
|
+
ResponsesLanguageModelStreamResponse,
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
_LOGGER = logging.getLogger(__name__)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class PlanningConfig(BaseModel):
|
|
43
|
+
model_config = get_configuration_dict()
|
|
44
|
+
|
|
45
|
+
planning_schema_config: PlanningSchemaConfig = PlanningSchemaConfig()
|
|
46
|
+
ignored_options: list[str] = Field(
|
|
47
|
+
default=["parallel_tool_calls"],
|
|
48
|
+
description="A list of options to ignore when calling the LLM for the planning step.",
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class PlanningMiddleware(LoopIterationRunner):
|
|
53
|
+
def __init__(
|
|
54
|
+
self,
|
|
55
|
+
*,
|
|
56
|
+
loop_runner: LoopIterationRunner,
|
|
57
|
+
config: PlanningConfig,
|
|
58
|
+
llm_service: LanguageModelService,
|
|
59
|
+
history_manager: HistoryManager | None = None,
|
|
60
|
+
) -> None:
|
|
61
|
+
self._config = config
|
|
62
|
+
self._loop_runner = loop_runner
|
|
63
|
+
self._history_manager = history_manager
|
|
64
|
+
self._llm_service = llm_service
|
|
65
|
+
|
|
66
|
+
@failsafe_async(failure_return_value=None, logger=_LOGGER)
|
|
67
|
+
async def _run_plan_step(
|
|
68
|
+
self, **kwargs: Unpack[_LoopIterationRunnerKwargs]
|
|
69
|
+
) -> LanguageModelAssistantMessage | None:
|
|
70
|
+
planning_schema = get_planning_schema(self._config.planning_schema_config)
|
|
71
|
+
|
|
72
|
+
other_options = {
|
|
73
|
+
k: v
|
|
74
|
+
for k, v in kwargs.get("other_options", {}).items()
|
|
75
|
+
if k not in self._config.ignored_options
|
|
76
|
+
}
|
|
77
|
+
response = await self._llm_service.complete_async(
|
|
78
|
+
messages=kwargs["messages"],
|
|
79
|
+
model_name=kwargs["model"].name,
|
|
80
|
+
structured_output_model=planning_schema,
|
|
81
|
+
other_options=other_options,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
if response.choices[0].message.parsed is None:
|
|
85
|
+
_LOGGER.info("Error parsing planning response")
|
|
86
|
+
return None
|
|
87
|
+
|
|
88
|
+
return LanguageModelAssistantMessage(
|
|
89
|
+
content=json.dumps(response.choices[0].message.parsed)
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
async def __call__(
|
|
93
|
+
self, **kwargs: Unpack[_LoopIterationRunnerKwargs]
|
|
94
|
+
) -> LanguageModelStreamResponse:
|
|
95
|
+
assistant_message = await self._run_plan_step(**kwargs)
|
|
96
|
+
|
|
97
|
+
if assistant_message is None:
|
|
98
|
+
_LOGGER.info(
|
|
99
|
+
"Error executing planning step, proceeding without planning step"
|
|
100
|
+
)
|
|
101
|
+
return await self._loop_runner(**kwargs)
|
|
102
|
+
|
|
103
|
+
if self._history_manager is not None:
|
|
104
|
+
self._history_manager.add_assistant_message(assistant_message)
|
|
105
|
+
|
|
106
|
+
kwargs["messages"] = (
|
|
107
|
+
kwargs["messages"].builder().append(assistant_message).build()
|
|
108
|
+
)
|
|
109
|
+
return await self._loop_runner(**kwargs)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class ResponsesPlanningMiddleware(ResponsesLoopIterationRunner):
|
|
113
|
+
def __init__(
|
|
114
|
+
self,
|
|
115
|
+
*,
|
|
116
|
+
loop_runner: ResponsesLoopIterationRunner,
|
|
117
|
+
config: PlanningConfig,
|
|
118
|
+
openai_client: AsyncOpenAI,
|
|
119
|
+
history_manager: HistoryManager | None = None,
|
|
120
|
+
) -> None:
|
|
121
|
+
self._config = config
|
|
122
|
+
self._loop_runner = loop_runner
|
|
123
|
+
self._history_manager = history_manager
|
|
124
|
+
self._openai_client = openai_client
|
|
125
|
+
|
|
126
|
+
@failsafe_async(failure_return_value=None, logger=_LOGGER)
|
|
127
|
+
async def _run_plan_step(
|
|
128
|
+
self,
|
|
129
|
+
openai_messages: str | list[ResponseInputItemParam],
|
|
130
|
+
model_name: str,
|
|
131
|
+
) -> Response | None:
|
|
132
|
+
planning_schema = get_planning_schema(self._config.planning_schema_config)
|
|
133
|
+
|
|
134
|
+
response = await self._openai_client.responses.create(
|
|
135
|
+
model=model_name,
|
|
136
|
+
input=openai_messages,
|
|
137
|
+
text=ResponseTextConfigParam(
|
|
138
|
+
{
|
|
139
|
+
"format": ResponseFormatTextJSONSchemaConfigParam(
|
|
140
|
+
{
|
|
141
|
+
"type": "json_schema",
|
|
142
|
+
"name": planning_schema.get("title", "Plan"),
|
|
143
|
+
"schema": planning_schema,
|
|
144
|
+
}
|
|
145
|
+
)
|
|
146
|
+
}
|
|
147
|
+
),
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
if not response.output_text:
|
|
151
|
+
_LOGGER.info("Empty planning response")
|
|
152
|
+
return None
|
|
153
|
+
|
|
154
|
+
return response
|
|
155
|
+
|
|
156
|
+
async def __call__(
|
|
157
|
+
self, **kwargs: Unpack[_ResponsesLoopIterationRunnerKwargs]
|
|
158
|
+
) -> ResponsesLanguageModelStreamResponse:
|
|
159
|
+
openai_messages = convert_messages_to_openai(kwargs["messages"])
|
|
160
|
+
|
|
161
|
+
response = await self._run_plan_step(
|
|
162
|
+
openai_messages=openai_messages,
|
|
163
|
+
model_name=kwargs["model"].name,
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
if response is None:
|
|
167
|
+
_LOGGER.info(
|
|
168
|
+
"Error executing planning step, proceeding without planning step"
|
|
169
|
+
)
|
|
170
|
+
return await self._loop_runner(**kwargs)
|
|
171
|
+
|
|
172
|
+
assistant_message = LanguageModelAssistantMessage(content=response.output_text)
|
|
173
|
+
|
|
174
|
+
if self._history_manager is not None:
|
|
175
|
+
self._history_manager.add_assistant_message(assistant_message)
|
|
176
|
+
|
|
177
|
+
if isinstance(kwargs["messages"], str):
|
|
178
|
+
kwargs["messages"] = [
|
|
179
|
+
LanguageModelUserMessage(content=kwargs["messages"]),
|
|
180
|
+
assistant_message,
|
|
181
|
+
]
|
|
182
|
+
elif isinstance(kwargs["messages"], LanguageModelMessages):
|
|
183
|
+
kwargs["messages"] = (
|
|
184
|
+
kwargs["messages"].builder().append(assistant_message).build()
|
|
185
|
+
)
|
|
186
|
+
else:
|
|
187
|
+
kwargs["messages"] = list(kwargs["messages"]) + [assistant_message]
|
|
188
|
+
|
|
189
|
+
return await self._loop_runner(**kwargs)
|
|
@@ -122,6 +122,20 @@ def _convert_messages_to_openai(
|
|
|
122
122
|
return res
|
|
123
123
|
|
|
124
124
|
|
|
125
|
+
def convert_messages_to_openai(
|
|
126
|
+
messages: str
|
|
127
|
+
| LanguageModelMessages
|
|
128
|
+
| Sequence[
|
|
129
|
+
ResponseInputItemParam | LanguageModelMessageOptions | ResponseOutputItem
|
|
130
|
+
],
|
|
131
|
+
) -> str | list[ResponseInputItemParam]:
|
|
132
|
+
if isinstance(messages, str):
|
|
133
|
+
return messages
|
|
134
|
+
if isinstance(messages, LanguageModelMessages):
|
|
135
|
+
return _convert_messages_to_openai(messages.root)
|
|
136
|
+
return _convert_messages_to_openai(messages)
|
|
137
|
+
|
|
138
|
+
|
|
125
139
|
class _ResponsesParams(NamedTuple):
|
|
126
140
|
temperature: float
|
|
127
141
|
model_name: str
|
|
@@ -189,14 +203,7 @@ def _prepare_responses_params_util(
|
|
|
189
203
|
"low" # Code interpreter cannot be used with minimal effort
|
|
190
204
|
)
|
|
191
205
|
|
|
192
|
-
messages_res =
|
|
193
|
-
if isinstance(messages, LanguageModelMessages):
|
|
194
|
-
messages_res = _convert_messages_to_openai(messages.root)
|
|
195
|
-
elif isinstance(messages, list):
|
|
196
|
-
messages_res = _convert_messages_to_openai(messages)
|
|
197
|
-
else:
|
|
198
|
-
assert isinstance(messages, str)
|
|
199
|
-
messages_res = messages
|
|
206
|
+
messages_res = convert_messages_to_openai(messages)
|
|
200
207
|
|
|
201
208
|
return _ResponsesParams(
|
|
202
209
|
temperature, model, search_context, messages_res, tools_res, reasoning, text
|
|
@@ -876,17 +876,17 @@ def get_content_info(
|
|
|
876
876
|
skip: int | None = None,
|
|
877
877
|
take: int | None = None,
|
|
878
878
|
file_path: str | None = None,
|
|
879
|
-
):
|
|
879
|
+
) -> PaginatedContentInfos:
|
|
880
880
|
"""Gets the info of a content."""
|
|
881
881
|
|
|
882
882
|
get_info_params = unique_sdk.Content.ContentInfoParams(
|
|
883
883
|
metadataFilter=metadata_filter or None, # Dict cannot be empty
|
|
884
884
|
)
|
|
885
|
-
if skip:
|
|
885
|
+
if skip is not None:
|
|
886
886
|
get_info_params["skip"] = skip
|
|
887
|
-
if take:
|
|
887
|
+
if take is not None:
|
|
888
888
|
get_info_params["take"] = take
|
|
889
|
-
if file_path:
|
|
889
|
+
if file_path is not None:
|
|
890
890
|
get_info_params["filePath"] = file_path
|
|
891
891
|
|
|
892
892
|
content_info = unique_sdk.Content.get_infos(
|
|
@@ -897,6 +897,35 @@ def get_content_info(
|
|
|
897
897
|
)
|
|
898
898
|
|
|
899
899
|
|
|
900
|
+
async def get_content_info_async(
|
|
901
|
+
user_id: str,
|
|
902
|
+
company_id: str,
|
|
903
|
+
*,
|
|
904
|
+
metadata_filter: dict[str, Any] | None = None,
|
|
905
|
+
skip: int | None = None,
|
|
906
|
+
take: int | None = None,
|
|
907
|
+
file_path: str | None = None,
|
|
908
|
+
) -> PaginatedContentInfos:
|
|
909
|
+
"""Gets the info of a content."""
|
|
910
|
+
|
|
911
|
+
get_info_params = unique_sdk.Content.ContentInfoParams(
|
|
912
|
+
metadataFilter=metadata_filter or None, # Dict cannot be empty
|
|
913
|
+
)
|
|
914
|
+
if skip is not None:
|
|
915
|
+
get_info_params["skip"] = skip
|
|
916
|
+
if take is not None:
|
|
917
|
+
get_info_params["take"] = take
|
|
918
|
+
if file_path is not None:
|
|
919
|
+
get_info_params["filePath"] = file_path
|
|
920
|
+
|
|
921
|
+
content_info = unique_sdk.Content.get_infos_async(
|
|
922
|
+
user_id=user_id, company_id=company_id, **get_info_params
|
|
923
|
+
)
|
|
924
|
+
return PaginatedContentInfos.model_validate(
|
|
925
|
+
await content_info, by_alias=True, by_name=True
|
|
926
|
+
)
|
|
927
|
+
|
|
928
|
+
|
|
900
929
|
def get_folder_info(user_id: str, company_id: str, *, scope_id: str) -> FolderInfo:
|
|
901
930
|
info = unique_sdk.Folder.get_info(
|
|
902
931
|
user_id=user_id, company_id=company_id, scopeId=scope_id
|
|
@@ -905,6 +934,16 @@ def get_folder_info(user_id: str, company_id: str, *, scope_id: str) -> FolderIn
|
|
|
905
934
|
return FolderInfo.model_validate(info, by_alias=True, by_name=True)
|
|
906
935
|
|
|
907
936
|
|
|
937
|
+
async def get_folder_info_async(
|
|
938
|
+
user_id: str, company_id: str, *, scope_id: str
|
|
939
|
+
) -> FolderInfo:
|
|
940
|
+
info = unique_sdk.Folder.get_info_async(
|
|
941
|
+
user_id=user_id, company_id=company_id, scopeId=scope_id
|
|
942
|
+
)
|
|
943
|
+
|
|
944
|
+
return FolderInfo.model_validate(await info, by_alias=True, by_name=True)
|
|
945
|
+
|
|
946
|
+
|
|
908
947
|
def update_content(
|
|
909
948
|
user_id: str,
|
|
910
949
|
company_id: str,
|
|
@@ -23,7 +23,9 @@ from unique_toolkit.content.functions import (
|
|
|
23
23
|
download_content_to_bytes_async,
|
|
24
24
|
download_content_to_file_by_id,
|
|
25
25
|
get_content_info,
|
|
26
|
+
get_content_info_async,
|
|
26
27
|
get_folder_info,
|
|
28
|
+
get_folder_info_async,
|
|
27
29
|
search_content_chunks,
|
|
28
30
|
search_content_chunks_async,
|
|
29
31
|
search_contents,
|
|
@@ -685,6 +687,80 @@ class KnowledgeBaseService:
|
|
|
685
687
|
file_path=file_path,
|
|
686
688
|
)
|
|
687
689
|
|
|
690
|
+
async def get_paginated_content_infos_async(
|
|
691
|
+
self,
|
|
692
|
+
*,
|
|
693
|
+
metadata_filter: dict[str, Any] | None = None,
|
|
694
|
+
skip: int | None = None,
|
|
695
|
+
take: int | None = None,
|
|
696
|
+
file_path: str | None = None,
|
|
697
|
+
) -> PaginatedContentInfos:
|
|
698
|
+
return await get_content_info_async(
|
|
699
|
+
user_id=self._user_id,
|
|
700
|
+
company_id=self._company_id,
|
|
701
|
+
metadata_filter=metadata_filter,
|
|
702
|
+
skip=skip,
|
|
703
|
+
take=take,
|
|
704
|
+
file_path=file_path,
|
|
705
|
+
)
|
|
706
|
+
|
|
707
|
+
async def get_content_infos_async(
|
|
708
|
+
self,
|
|
709
|
+
*,
|
|
710
|
+
metadata_filter: dict[str, Any] | None = None,
|
|
711
|
+
step_size: int = 100,
|
|
712
|
+
max_concurrent_requests: int = 10,
|
|
713
|
+
) -> list[ContentInfo]:
|
|
714
|
+
"""
|
|
715
|
+
Fetches all content infos from the knowledge base using parallel pagination.
|
|
716
|
+
The API limits responses to 100 items per request, so this method fetches
|
|
717
|
+
the total count first, then retrieves all pages concurrently (bounded by
|
|
718
|
+
``max_concurrent_requests`` to avoid rate limiting or connection exhaustion).
|
|
719
|
+
|
|
720
|
+
Args:
|
|
721
|
+
metadata_filter (dict[str, Any] | None): The metadata filter to use. Defaults to None.
|
|
722
|
+
step_size (int): Number of items per page. Defaults to 100.
|
|
723
|
+
max_concurrent_requests (int): Maximum number of concurrent API calls.
|
|
724
|
+
Defaults to 10.
|
|
725
|
+
|
|
726
|
+
Returns:
|
|
727
|
+
list[ContentInfo]: All content infos visible to the user.
|
|
728
|
+
"""
|
|
729
|
+
|
|
730
|
+
info_for_count_of_total_content = await self.get_paginated_content_infos_async(
|
|
731
|
+
metadata_filter=metadata_filter,
|
|
732
|
+
take=1,
|
|
733
|
+
)
|
|
734
|
+
|
|
735
|
+
total_count = info_for_count_of_total_content.total_count
|
|
736
|
+
|
|
737
|
+
semaphore = asyncio.Semaphore(max_concurrent_requests)
|
|
738
|
+
|
|
739
|
+
async def _fetch_page(skip: int) -> PaginatedContentInfos:
|
|
740
|
+
async with semaphore:
|
|
741
|
+
return await self.get_paginated_content_infos_async(
|
|
742
|
+
metadata_filter=metadata_filter,
|
|
743
|
+
skip=skip,
|
|
744
|
+
take=step_size,
|
|
745
|
+
)
|
|
746
|
+
|
|
747
|
+
results: list[PaginatedContentInfos | BaseException] = await asyncio.gather(
|
|
748
|
+
*[_fetch_page(i) for i in range(0, total_count, step_size)],
|
|
749
|
+
return_exceptions=True,
|
|
750
|
+
)
|
|
751
|
+
|
|
752
|
+
# Log any exceptions that occurred during parallel fetching
|
|
753
|
+
for result in results:
|
|
754
|
+
if isinstance(result, BaseException):
|
|
755
|
+
_LOGGER.error("Error fetching paginated content infos", exc_info=result)
|
|
756
|
+
|
|
757
|
+
return [
|
|
758
|
+
content_info
|
|
759
|
+
for result in results
|
|
760
|
+
if not isinstance(result, BaseException)
|
|
761
|
+
for content_info in result.content_infos
|
|
762
|
+
]
|
|
763
|
+
|
|
688
764
|
def get_file_names_in_folder(self, *, scope_id: str) -> list[str]:
|
|
689
765
|
"""
|
|
690
766
|
Get the list of file names in a knowledge base folder
|
|
@@ -717,71 +793,132 @@ class KnowledgeBaseService:
|
|
|
717
793
|
scope_id=scope_id,
|
|
718
794
|
)
|
|
719
795
|
|
|
720
|
-
def
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
continue
|
|
796
|
+
async def get_folder_info_async(
|
|
797
|
+
self,
|
|
798
|
+
*,
|
|
799
|
+
scope_id: str,
|
|
800
|
+
) -> FolderInfo:
|
|
801
|
+
return await get_folder_info_async(
|
|
802
|
+
user_id=self._user_id,
|
|
803
|
+
company_id=self._company_id,
|
|
804
|
+
scope_id=scope_id,
|
|
805
|
+
)
|
|
731
806
|
|
|
807
|
+
# File Tree Resolution
|
|
808
|
+
# ------------------------------------------------------------------------------------------------
|
|
809
|
+
|
|
810
|
+
@staticmethod
|
|
811
|
+
def extract_scope_ids(content_infos: list[ContentInfo]) -> set[str]:
|
|
812
|
+
"""Extracts all unique scope IDs from the ``folderIdPath`` metadata field.
|
|
813
|
+
|
|
814
|
+
Args:
|
|
815
|
+
content_infos: The content infos to extract scope IDs from.
|
|
816
|
+
|
|
817
|
+
Returns:
|
|
818
|
+
set[str]: All unique scope IDs found across content infos.
|
|
819
|
+
"""
|
|
820
|
+
scope_ids: set[str] = set()
|
|
821
|
+
for content_info in content_infos:
|
|
732
822
|
if (
|
|
733
823
|
content_info.metadata
|
|
734
|
-
and content_info.metadata.get("folderIdPath")
|
|
824
|
+
and (folder_id_path := content_info.metadata.get("folderIdPath"))
|
|
825
|
+
is not None
|
|
826
|
+
and isinstance(folder_id_path, str)
|
|
735
827
|
):
|
|
736
|
-
|
|
828
|
+
scope_ids.update(
|
|
829
|
+
sid
|
|
830
|
+
for sid in folder_id_path.replace("uniquepathid://", "").split("/")
|
|
831
|
+
if sid
|
|
832
|
+
)
|
|
833
|
+
return scope_ids
|
|
737
834
|
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
scope_ids_list = set(fp.replace("uniquepathid://", "").split("/"))
|
|
741
|
-
scope_ids.update(scope_ids_list)
|
|
835
|
+
async def _translate_scope_id_async(self, scope_id: str) -> str | None:
|
|
836
|
+
"""Resolve a single scope ID to its folder name.
|
|
742
837
|
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
838
|
+
Returns the folder name, or ``None`` if the lookup fails.
|
|
839
|
+
"""
|
|
840
|
+
try:
|
|
841
|
+
folder_info = await self.get_folder_info_async(scope_id=scope_id)
|
|
842
|
+
return folder_info.name
|
|
843
|
+
except Exception as e:
|
|
844
|
+
_LOGGER.warning(
|
|
845
|
+
f"Could not resolve folder for scope_id {scope_id}", exc_info=e
|
|
747
846
|
)
|
|
748
|
-
|
|
847
|
+
return None
|
|
749
848
|
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
849
|
+
async def _translate_scope_ids_async(
|
|
850
|
+
self,
|
|
851
|
+
scope_ids: set[str],
|
|
852
|
+
*,
|
|
853
|
+
max_concurrent_requests: int = 25,
|
|
854
|
+
) -> dict[str, str]:
|
|
855
|
+
"""Translate a set of scope IDs to folder names concurrently.
|
|
753
856
|
|
|
754
|
-
|
|
755
|
-
folder_path = [
|
|
756
|
-
scope_id_to_folder_name[scope_id] for scope_id in scope_ids_list
|
|
757
|
-
]
|
|
758
|
-
folder_paths.add("/".join(folder_path))
|
|
857
|
+
Scope IDs that cannot be resolved are silently omitted from the result.
|
|
759
858
|
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
859
|
+
Args:
|
|
860
|
+
scope_ids: The scope IDs to translate.
|
|
861
|
+
max_concurrent_requests: Maximum number of concurrent API calls.
|
|
862
|
+
Defaults to 25.
|
|
764
863
|
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
) -> list[str]:
|
|
864
|
+
Returns:
|
|
865
|
+
dict[str, str]: Mapping from scope ID to folder name.
|
|
768
866
|
"""
|
|
769
|
-
|
|
867
|
+
scope_id_list = list(scope_ids)
|
|
868
|
+
semaphore = asyncio.Semaphore(max_concurrent_requests)
|
|
770
869
|
|
|
771
|
-
|
|
772
|
-
|
|
870
|
+
async def _resolve(sid: str) -> str | None:
|
|
871
|
+
async with semaphore:
|
|
872
|
+
return await self._translate_scope_id_async(sid)
|
|
773
873
|
|
|
774
|
-
|
|
775
|
-
|
|
874
|
+
results = await asyncio.gather(*[_resolve(sid) for sid in scope_id_list])
|
|
875
|
+
return {
|
|
876
|
+
sid: name for sid, name in zip(scope_id_list, results) if name is not None
|
|
877
|
+
}
|
|
776
878
|
|
|
879
|
+
async def resolve_visible_file_paths_async(
|
|
880
|
+
self,
|
|
881
|
+
*,
|
|
882
|
+
metadata_filter: dict[str, Any] | None = None,
|
|
883
|
+
) -> list[tuple[ContentInfo, list[str]]]:
|
|
884
|
+
"""Resolves file paths visible to the current user asynchronously.
|
|
777
885
|
|
|
886
|
+
Returns each content item paired with its resolved file path segments.
|
|
778
887
|
|
|
888
|
+
Args:
|
|
889
|
+
metadata_filter: Optional metadata filter to narrow the content scope.
|
|
890
|
+
|
|
891
|
+
Returns:
|
|
892
|
+
list[tuple[ContentInfo, list[str]]]: Each tuple is
|
|
893
|
+
``(content_info, [folder1, folder2, ..., filename])``.
|
|
779
894
|
"""
|
|
780
|
-
|
|
781
|
-
metadata_filter=metadata_filter
|
|
895
|
+
content_infos = await self.get_content_infos_async(
|
|
896
|
+
metadata_filter=metadata_filter
|
|
782
897
|
)
|
|
783
898
|
|
|
784
|
-
|
|
899
|
+
scope_ids = self.extract_scope_ids(content_infos)
|
|
900
|
+
scope_id_to_folder_name = await self._translate_scope_ids_async(scope_ids)
|
|
901
|
+
|
|
902
|
+
resolved: list[tuple[ContentInfo, list[str]]] = []
|
|
903
|
+
for content_info in content_infos:
|
|
904
|
+
if (
|
|
905
|
+
content_info.metadata
|
|
906
|
+
and (folder_id_path := content_info.metadata.get("folderIdPath"))
|
|
907
|
+
is not None
|
|
908
|
+
and isinstance(folder_id_path, str)
|
|
909
|
+
):
|
|
910
|
+
file_path = [
|
|
911
|
+
scope_id_to_folder_name.get(sid, sid)
|
|
912
|
+
for sid in folder_id_path.replace("uniquepathid://", "").split("/")
|
|
913
|
+
if sid
|
|
914
|
+
]
|
|
915
|
+
else:
|
|
916
|
+
file_path = ["_no_folder_path"]
|
|
917
|
+
|
|
918
|
+
file_path.append(content_info.key)
|
|
919
|
+
resolved.append((content_info, file_path))
|
|
920
|
+
|
|
921
|
+
return resolved
|
|
785
922
|
|
|
786
923
|
def _pop_forbidden_metadata_keys(self, metadata: dict[str, Any]) -> dict[str, Any]:
|
|
787
924
|
forbidden_keys = [
|