unique_toolkit 1.76.0__tar.gz → 1.77.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.76.0 → unique_toolkit-1.77.0}/PKG-INFO +1 -1
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/pyproject.toml +1 -1
- unique_toolkit-1.77.0/unique_toolkit/agentic/tools/experimental/__init__.py +27 -0
- unique_toolkit-1.77.0/unique_toolkit/agentic/tools/experimental/todo/__init__.py +24 -0
- unique_toolkit-1.77.0/unique_toolkit/agentic/tools/experimental/todo/config.py +94 -0
- unique_toolkit-1.77.0/unique_toolkit/agentic/tools/experimental/todo/prompts/__init__.py +13 -0
- unique_toolkit-1.77.0/unique_toolkit/agentic/tools/experimental/todo/prompts/execution_reminder.j2 +11 -0
- unique_toolkit-1.77.0/unique_toolkit/agentic/tools/experimental/todo/prompts/system_prompt.j2 +41 -0
- unique_toolkit-1.77.0/unique_toolkit/agentic/tools/experimental/todo/prompts/tool_description.j2 +9 -0
- unique_toolkit-1.77.0/unique_toolkit/agentic/tools/experimental/todo/prompts/verification_nudge.j2 +1 -0
- unique_toolkit-1.77.0/unique_toolkit/agentic/tools/experimental/todo/schemas.py +137 -0
- unique_toolkit-1.77.0/unique_toolkit/agentic/tools/experimental/todo/service.py +271 -0
- unique_toolkit-1.76.0/unique_toolkit/agentic/tools/experimental/__init__.py +0 -11
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/README.md +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/_base_service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/_time_utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/config_checker/README.md +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/config_checker/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/config_checker/__main__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/config_checker/cli.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/config_checker/differ.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/config_checker/exporter.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/config_checker/models.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/config_checker/registry.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/config_checker/validator.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/default_language_model.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/docx_generator/config.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/docx_generator/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/endpoint_builder.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/endpoint_requestor.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/event_bus.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/exception.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/execution.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/feature_flags/schema.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/pydantic_helpers.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/referencing.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/string_utilities.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/tests/test_referencing.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/token/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/token/image_token_counting.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/token/token_counting.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/utils/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/utils/files.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/utils/image/encode.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/utils/jinja/render.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/utils/write_configuration.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/validate_required_values.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/_common/validators.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/config.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/exception.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/evaluation/utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/feature_flags/feature_flags.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/history_manager/utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/loop_runner/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/loop_runner/base.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/config.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/config.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/runtime.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/experimental/open_file_tool/tool.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/factory.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/schemas.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/tool.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic_table/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic_table/schemas.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/agentic_table/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/app/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/app/chat_event_filter_options_settings.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/app/dev_util.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/app/fast_api_factory.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/app/feature_flags.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/app/find_env_file.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/app/init_logging.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/app/init_sdk.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/app/performance/async_tasks.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/app/performance/async_wrapper.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/app/schemas.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/app/unique_settings.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/app/verification.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/app/webhook.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/chat/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/chat/cancellation.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/chat/constants.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/chat/deprecated/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/chat/functions.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/chat/rendering.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/chat/responses_api.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/chat/schemas.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/chat/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/chat/state.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/chat/utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/content/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/content/constants.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/content/functions.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/content/schemas.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/content/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/content/smart_rules.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/content/utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/data_extraction/README.md +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/data_extraction/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/data_extraction/augmented/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/data_extraction/base.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/data_extraction/basic/config.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/data_extraction/basic/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/elicitation/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/elicitation/constants.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/elicitation/exceptions.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/elicitation/functions.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/elicitation/schemas.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/elicitation/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/embedding/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/embedding/constants.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/embedding/functions.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/embedding/schemas.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/embedding/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/embedding/utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/framework_utilities/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/framework_utilities/openai/client.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/framework_utilities/utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/language_model/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/language_model/builder.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/language_model/constants.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/language_model/default_language_model.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/language_model/functions.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/language_model/infos.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/language_model/prompt.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/language_model/reference.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/language_model/schemas.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/language_model/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/language_model/stream_transform.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/language_model/utils.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/monitoring/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/monitoring/middleware.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/monitoring/registry.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/protocols/support.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/services/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/services/chat_service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/services/factory.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/services/knowledge_base.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/short_term_memory/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/short_term_memory/constants.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/short_term_memory/functions.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/short_term_memory/schemas.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/short_term_memory/service.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/smart_rules/__init__.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.0}/unique_toolkit/smart_rules/compile.py +0 -0
- {unique_toolkit-1.76.0 → unique_toolkit-1.77.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.77.0
|
|
4
4
|
Summary:
|
|
5
5
|
Author: Cedric Klinkert, Martin Fadler, Sadique Sheik, Fabian Schläpfer, Pascal Hauri, Ejiroghene Oki-Peter, Rami Azouz, Ricardo Visini, Sanzio Monti
|
|
6
6
|
Author-email: Cedric Klinkert <cedric.klinkert@unique.ch>, Martin Fadler <martin.fadler@unique.ch>, Sadique Sheik <sadique@unique.ch>, Fabian Schläpfer <fabian@unique.ch>, Pascal Hauri <pascal@unique.ch>, Ejiroghene Oki-Peter <oki-peter.ejiroghene@unique.ai>, Rami Azouz <rami.ext@unique.ch>, Ricardo Visini <ricardo.visini@unique.ch>, Sanzio Monti <sanzio.monti@unique.ai>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from unique_toolkit.agentic.tools.experimental.open_file_tool import (
|
|
2
|
+
OpenFileTool,
|
|
3
|
+
OpenFileToolRuntime,
|
|
4
|
+
OpenFileToolRuntimeConfig,
|
|
5
|
+
)
|
|
6
|
+
from unique_toolkit.agentic.tools.experimental.todo import (
|
|
7
|
+
TodoConfig,
|
|
8
|
+
TodoItem,
|
|
9
|
+
TodoItemInput,
|
|
10
|
+
TodoList,
|
|
11
|
+
TodoStatus,
|
|
12
|
+
TodoWriteInput,
|
|
13
|
+
TodoWriteTool,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"OpenFileTool",
|
|
18
|
+
"OpenFileToolRuntime",
|
|
19
|
+
"OpenFileToolRuntimeConfig",
|
|
20
|
+
"TodoConfig",
|
|
21
|
+
"TodoItem",
|
|
22
|
+
"TodoItemInput",
|
|
23
|
+
"TodoList",
|
|
24
|
+
"TodoStatus",
|
|
25
|
+
"TodoWriteInput",
|
|
26
|
+
"TodoWriteTool",
|
|
27
|
+
]
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from unique_toolkit.agentic.tools.experimental.todo.config import TodoConfig
|
|
2
|
+
from unique_toolkit.agentic.tools.experimental.todo.schemas import (
|
|
3
|
+
TodoItem,
|
|
4
|
+
TodoItemInput,
|
|
5
|
+
TodoList,
|
|
6
|
+
TodoStatus,
|
|
7
|
+
TodoWriteInput,
|
|
8
|
+
)
|
|
9
|
+
from unique_toolkit.agentic.tools.experimental.todo.service import (
|
|
10
|
+
TodoWriteTool,
|
|
11
|
+
)
|
|
12
|
+
from unique_toolkit.agentic.tools.factory import ToolFactory
|
|
13
|
+
|
|
14
|
+
ToolFactory.register_tool(TodoWriteTool, TodoConfig)
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"TodoConfig",
|
|
18
|
+
"TodoItem",
|
|
19
|
+
"TodoItemInput",
|
|
20
|
+
"TodoList",
|
|
21
|
+
"TodoStatus",
|
|
22
|
+
"TodoWriteInput",
|
|
23
|
+
"TodoWriteTool",
|
|
24
|
+
]
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
from typing import Annotated
|
|
2
|
+
|
|
3
|
+
from pydantic import Field
|
|
4
|
+
|
|
5
|
+
from unique_toolkit._common.pydantic.rjsf_tags import RJSFMetaTag
|
|
6
|
+
from unique_toolkit.agentic.tools.experimental.todo.prompts import (
|
|
7
|
+
EXECUTION_REMINDER_TEMPLATE,
|
|
8
|
+
SYSTEM_PROMPT_TEMPLATE,
|
|
9
|
+
TOOL_DESCRIPTION_TEMPLATE,
|
|
10
|
+
VERIFICATION_NUDGE_TEMPLATE,
|
|
11
|
+
)
|
|
12
|
+
from unique_toolkit.agentic.tools.schemas import BaseToolConfig
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class TodoConfig(BaseToolConfig):
|
|
16
|
+
display_name: str = Field(
|
|
17
|
+
default="Progress",
|
|
18
|
+
description="Human-readable label for task tracking shown in the Steps panel.",
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
tool_description: Annotated[
|
|
22
|
+
str,
|
|
23
|
+
RJSFMetaTag.StringWidget.textarea(rows=3),
|
|
24
|
+
] = Field(
|
|
25
|
+
default=TOOL_DESCRIPTION_TEMPLATE,
|
|
26
|
+
description="Edit this Jinja template to customize the tool description passed to the LLM."
|
|
27
|
+
"Available variable: parallel_mode (bool).",
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
system_prompt: Annotated[
|
|
31
|
+
str,
|
|
32
|
+
RJSFMetaTag.StringWidget.textarea(rows=15),
|
|
33
|
+
] = Field(
|
|
34
|
+
default=SYSTEM_PROMPT_TEMPLATE,
|
|
35
|
+
description="Edit this Jinja template to customize the system prompt injected for task tracking. "
|
|
36
|
+
"Available variable: parallel_mode (bool).",
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
execution_reminder: Annotated[
|
|
40
|
+
str,
|
|
41
|
+
RJSFMetaTag.StringWidget.textarea(rows=5),
|
|
42
|
+
] = Field(
|
|
43
|
+
default=EXECUTION_REMINDER_TEMPLATE,
|
|
44
|
+
description="Edit this Jinja template to customize the reminder appended to tool responses "
|
|
45
|
+
"during execution phase. Available variable: parallel_mode (bool).",
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
parallel_mode: Annotated[
|
|
49
|
+
bool,
|
|
50
|
+
RJSFMetaTag.BooleanWidget.checkbox(
|
|
51
|
+
help=(
|
|
52
|
+
"When enabled, the agent may combine task tracking with other "
|
|
53
|
+
"tool calls in the same turn and mark multiple items "
|
|
54
|
+
"in_progress simultaneously. When disabled (default), the "
|
|
55
|
+
"agent works through items one at a time with sequential "
|
|
56
|
+
"status updates."
|
|
57
|
+
),
|
|
58
|
+
),
|
|
59
|
+
] = Field(
|
|
60
|
+
default=False,
|
|
61
|
+
title="Track tasks alongside other tool calls",
|
|
62
|
+
description="Parallel Mode for Task Tracking",
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
show_triggered_tool_calls: Annotated[
|
|
66
|
+
bool,
|
|
67
|
+
RJSFMetaTag.BooleanWidget.checkbox(
|
|
68
|
+
help=(
|
|
69
|
+
"Show 'Triggered Tool Calls' entries in the Steps panel "
|
|
70
|
+
"listing which tools the agent called each iteration. "
|
|
71
|
+
),
|
|
72
|
+
),
|
|
73
|
+
] = Field(
|
|
74
|
+
default=True,
|
|
75
|
+
title="Display triggered tool calls in the Steps panel",
|
|
76
|
+
description="Display Triggered Tool Calls",
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
verification_threshold: int = Field(
|
|
80
|
+
default=5,
|
|
81
|
+
ge=0,
|
|
82
|
+
title="Verification Nudge Threshold",
|
|
83
|
+
description="After this many task completions, nudge the agent to verify its work "
|
|
84
|
+
"before continuing. Set to 0 to disable.",
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
verification_nudge: Annotated[
|
|
88
|
+
str,
|
|
89
|
+
RJSFMetaTag.StringWidget.textarea(rows=2),
|
|
90
|
+
] = Field(
|
|
91
|
+
default=VERIFICATION_NUDGE_TEMPLATE,
|
|
92
|
+
description="Jinja template for the verification nudge message. "
|
|
93
|
+
"Available variable: completed (int).",
|
|
94
|
+
)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
|
|
3
|
+
_PROMPTS_DIR = Path(__file__).parent
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def _load(name: str) -> str:
|
|
7
|
+
return (_PROMPTS_DIR / name).read_text().strip()
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
TOOL_DESCRIPTION_TEMPLATE = _load("tool_description.j2")
|
|
11
|
+
SYSTEM_PROMPT_TEMPLATE = _load("system_prompt.j2")
|
|
12
|
+
EXECUTION_REMINDER_TEMPLATE = _load("execution_reminder.j2")
|
|
13
|
+
VERIFICATION_NUDGE_TEMPLATE = _load("verification_nudge.j2")
|
unique_toolkit-1.77.0/unique_toolkit/agentic/tools/experimental/todo/prompts/execution_reminder.j2
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
You are in the EXECUTION PHASE.
|
|
2
|
+
Do NOT ask the user any questions or request confirmation.
|
|
3
|
+
You MUST process every pending item — do not skip or summarize.
|
|
4
|
+
{%- if parallel_mode %}
|
|
5
|
+
- Always include a TodoWrite call alongside your work tool calls in the same response — mark items in_progress before executing and completed after.
|
|
6
|
+
- Do not use a separate turn just for status updates.
|
|
7
|
+
{%- else %}
|
|
8
|
+
- Mark exactly one item in_progress, complete it, then move to the next.
|
|
9
|
+
- Do not batch completions.
|
|
10
|
+
{%- endif %}
|
|
11
|
+
- Do NOT write a final text response while items are still pending or in_progress — keep executing until every item reaches a terminal state (completed/cancelled), then call TodoWrite one final time before responding.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
You have access to a task tracking tool (TodoWrite). Use it proactively — the user sees the task list as a live progress indicator.
|
|
2
|
+
|
|
3
|
+
## When to Use
|
|
4
|
+
|
|
5
|
+
Use for any task with 3+ steps, batch operations, or when the user gives a numbered list. For batch operations (e.g. "process all invoices"), create one task per item so none are skipped. When receiving new instructions mid-conversation, immediately capture them as tasks. Skip for single-step lookups or simple factual questions.
|
|
6
|
+
|
|
7
|
+
Examples:
|
|
8
|
+
- "Research competitor pricing and write a comparison" → create tasks per competitor + comparison + summary
|
|
9
|
+
- "Process all invoices in uploads" → one task per invoice
|
|
10
|
+
- "What's the capital of France?" → do NOT use TodoWrite
|
|
11
|
+
|
|
12
|
+
## Workflow
|
|
13
|
+
|
|
14
|
+
1. CLARIFICATION PHASE: Ask ALL clarifying questions in a single message upfront.
|
|
15
|
+
2. EXECUTION PHASE: After creating the task list, execute every step autonomously. Do NOT ask follow-up questions — use sensible defaults and document your assumptions.
|
|
16
|
+
|
|
17
|
+
## Task Design
|
|
18
|
+
|
|
19
|
+
- Break into 3-7 specific, actionable items with clear outcomes
|
|
20
|
+
- Provide active_form for each (e.g. content: "Search pricing data", active_form: "Searching pricing data")
|
|
21
|
+
- For complex tasks, include a final "verify and synthesize" item
|
|
22
|
+
|
|
23
|
+
## Execution Rules
|
|
24
|
+
|
|
25
|
+
- Execute immediately after creating the list. Do NOT ask for confirmation between steps.
|
|
26
|
+
{% if parallel_mode -%}
|
|
27
|
+
- Mark multiple items in_progress simultaneously. Combine TodoWrite with work tool calls in the same response — do not waste a turn on bookkeeping alone.
|
|
28
|
+
{%- else -%}
|
|
29
|
+
- Mark exactly ONE item in_progress at a time. Complete and mark it immediately before starting the next — do not batch completions.
|
|
30
|
+
{%- endif %}
|
|
31
|
+
- After completing a task, check if follow-up tasks need to be added.
|
|
32
|
+
- When unclear, if there is a reasonable default, choose it rather than stopping to ask. Document your assumption.
|
|
33
|
+
- Do NOT summarize remaining items or ask if you should continue. Just keep going.
|
|
34
|
+
- The ONLY reason to stop is a hard blocker: missing credentials, nonexistent resource, or unrecoverable error.
|
|
35
|
+
|
|
36
|
+
## Completion
|
|
37
|
+
|
|
38
|
+
- Never write a final response while items are still pending — if items remain, keep executing.
|
|
39
|
+
- You MUST call TodoWrite to mark every item completed/cancelled before your final response. Zero pending/in_progress items must remain.
|
|
40
|
+
- You have a limited iteration budget. Mark all items terminal BEFORE the final iteration when tools are removed.
|
|
41
|
+
- Items needing only analysis (no tool call) should be marked completed as soon as you have the data.
|
unique_toolkit-1.77.0/unique_toolkit/agentic/tools/experimental/todo/prompts/tool_description.j2
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
Create or update a task list to track progress. Use for any task involving multiple steps — the user sees this as a live progress indicator.
|
|
2
|
+
|
|
3
|
+
Provide active_form (present continuous, e.g. "Searching documents") for each task — this is shown to the user as live status text.
|
|
4
|
+
|
|
5
|
+
{% if parallel_mode -%}
|
|
6
|
+
Mark items in_progress when starting, completed when done. You can mark multiple items in_progress if working on them in parallel.
|
|
7
|
+
{%- else -%}
|
|
8
|
+
Mark exactly one item in_progress at a time. Mark it completed immediately when done, then move to the next item. Do not batch completions.
|
|
9
|
+
{%- endif %}
|
unique_toolkit-1.77.0/unique_toolkit/agentic/tools/experimental/todo/prompts/verification_nudge.j2
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[Checkpoint: {{ completed }} tasks completed. Before continuing, briefly verify recent results are correct.]
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections import Counter
|
|
4
|
+
from enum import StrEnum
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class TodoStatus(StrEnum):
|
|
10
|
+
PENDING = "pending"
|
|
11
|
+
IN_PROGRESS = "in_progress"
|
|
12
|
+
COMPLETED = "completed"
|
|
13
|
+
CANCELLED = "cancelled"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
_STATUS_ICONS: dict[TodoStatus, str] = {
|
|
17
|
+
TodoStatus.PENDING: "[ ]",
|
|
18
|
+
TodoStatus.IN_PROGRESS: "[>]",
|
|
19
|
+
TodoStatus.COMPLETED: "[x]",
|
|
20
|
+
TodoStatus.CANCELLED: "[-]",
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
_TERMINAL_STATUSES: frozenset[TodoStatus] = frozenset(
|
|
24
|
+
{TodoStatus.COMPLETED, TodoStatus.CANCELLED}
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
model_config = ConfigDict(extra="forbid")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class TodoItem(BaseModel):
|
|
32
|
+
"""Stored todo item — always has content."""
|
|
33
|
+
|
|
34
|
+
model_config = model_config
|
|
35
|
+
|
|
36
|
+
id: str = Field(
|
|
37
|
+
description="Unique identifier for this TODO (model-generated, free-form string e.g. 'research-apis', 'step-1')",
|
|
38
|
+
)
|
|
39
|
+
content: str = Field(description="Description of the task")
|
|
40
|
+
status: TodoStatus
|
|
41
|
+
active_form: str | None = Field(
|
|
42
|
+
description="Present-continuous form of the task shown as live status text "
|
|
43
|
+
"(e.g. 'Searching documents', 'Analyzing results'). "
|
|
44
|
+
"Provide when creating or updating an item.",
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class TodoItemInput(BaseModel):
|
|
49
|
+
"""Input todo item — content is optional for merge updates (status-only changes)."""
|
|
50
|
+
|
|
51
|
+
model_config = model_config
|
|
52
|
+
id: str = Field(
|
|
53
|
+
description="Unique identifier for this TODO (model-generated, free-form string e.g. 'research-apis', 'step-1')",
|
|
54
|
+
)
|
|
55
|
+
content: str | None = Field(
|
|
56
|
+
description="Description of the task. Required when creating new items, optional when updating existing ones via merge.",
|
|
57
|
+
)
|
|
58
|
+
status: TodoStatus
|
|
59
|
+
active_form: str | None = Field(
|
|
60
|
+
description="Present-continuous form shown as live status text "
|
|
61
|
+
"(e.g. 'Searching documents'). Provide for richer UI display.",
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class TodoList(BaseModel):
|
|
66
|
+
"""Full TODO state for a session. Stored in ShortTermMemory."""
|
|
67
|
+
|
|
68
|
+
model_config = model_config
|
|
69
|
+
todos: list[TodoItem] = Field(description="The list of todo items.")
|
|
70
|
+
last_updated_iteration: int = Field(
|
|
71
|
+
description="The iteration number of the last update."
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
def update(self, incoming: list[TodoItemInput]) -> TodoList:
|
|
75
|
+
"""Update by ID: overwrite existing, append new, preserve unmentioned.
|
|
76
|
+
|
|
77
|
+
When an incoming item omits content, the existing content is preserved.
|
|
78
|
+
active_form falls back to existing value when not supplied.
|
|
79
|
+
New items without content get an empty string as fallback.
|
|
80
|
+
"""
|
|
81
|
+
existing_by_id = {t.id: t for t in self.todos}
|
|
82
|
+
for item in incoming:
|
|
83
|
+
existing = existing_by_id.get(item.id)
|
|
84
|
+
content = (
|
|
85
|
+
item.content
|
|
86
|
+
if item.content is not None
|
|
87
|
+
else (existing.content if existing else "")
|
|
88
|
+
)
|
|
89
|
+
active_form = (
|
|
90
|
+
item.active_form
|
|
91
|
+
if item.active_form is not None
|
|
92
|
+
else (existing.active_form if existing else None)
|
|
93
|
+
)
|
|
94
|
+
existing_by_id[item.id] = TodoItem(
|
|
95
|
+
id=item.id,
|
|
96
|
+
content=content,
|
|
97
|
+
status=item.status,
|
|
98
|
+
active_form=active_form,
|
|
99
|
+
)
|
|
100
|
+
return TodoList(
|
|
101
|
+
todos=list(existing_by_id.values()),
|
|
102
|
+
last_updated_iteration=self.last_updated_iteration,
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
def has_active_items(self) -> bool:
|
|
106
|
+
return any(t.status not in _TERMINAL_STATUSES for t in self.todos)
|
|
107
|
+
|
|
108
|
+
def format(self) -> str:
|
|
109
|
+
"""Format as human-readable text for tool responses."""
|
|
110
|
+
if not self.todos:
|
|
111
|
+
return "No tasks tracked."
|
|
112
|
+
summary = self._summarize()
|
|
113
|
+
return f"Task list ({summary}):\n" + "\n".join(self._format_lines())
|
|
114
|
+
|
|
115
|
+
def status_counter(self) -> Counter[str]:
|
|
116
|
+
"""Return a Counter of status values. Missing keys auto-return 0."""
|
|
117
|
+
return Counter(t.status.value for t in self.todos)
|
|
118
|
+
|
|
119
|
+
def _format_lines(self) -> list[str]:
|
|
120
|
+
return [
|
|
121
|
+
f" {_STATUS_ICONS.get(t.status, '[ ]')} {t.content} (id: {t.id})"
|
|
122
|
+
for t in self.todos
|
|
123
|
+
]
|
|
124
|
+
|
|
125
|
+
def _summarize(self) -> str:
|
|
126
|
+
completed = sum(1 for t in self.todos if t.status == TodoStatus.COMPLETED)
|
|
127
|
+
return f"{completed}/{len(self.todos)} completed"
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class TodoWriteInput(BaseModel):
|
|
131
|
+
model_config = model_config
|
|
132
|
+
todos: list[TodoItemInput] = Field(
|
|
133
|
+
min_length=1, description="The list of todo items to update."
|
|
134
|
+
)
|
|
135
|
+
merge: bool = Field(
|
|
136
|
+
description="If true, merge with existing todos by ID. If false, replace entirely.",
|
|
137
|
+
)
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections import Counter
|
|
4
|
+
from logging import getLogger
|
|
5
|
+
|
|
6
|
+
from unique_toolkit._common.utils.jinja.render import render_template
|
|
7
|
+
from unique_toolkit.agentic.evaluation.schemas import EvaluationMetricName
|
|
8
|
+
from unique_toolkit.agentic.short_term_memory_manager.persistent_short_term_memory_manager import (
|
|
9
|
+
PersistentShortMemoryManager,
|
|
10
|
+
)
|
|
11
|
+
from unique_toolkit.agentic.tools.experimental.todo.config import TodoConfig
|
|
12
|
+
from unique_toolkit.agentic.tools.experimental.todo.schemas import (
|
|
13
|
+
TodoItem,
|
|
14
|
+
TodoList,
|
|
15
|
+
TodoStatus,
|
|
16
|
+
TodoWriteInput,
|
|
17
|
+
)
|
|
18
|
+
from unique_toolkit.agentic.tools.schemas import ToolCallResponse
|
|
19
|
+
from unique_toolkit.agentic.tools.tool import Tool
|
|
20
|
+
from unique_toolkit.agentic.tools.tool_progress_reporter import ToolProgressReporter
|
|
21
|
+
from unique_toolkit.app.schemas import ChatEvent
|
|
22
|
+
from unique_toolkit.chat.schemas import MessageLog, MessageLogStatus
|
|
23
|
+
from unique_toolkit.language_model import LanguageModelToolDescription
|
|
24
|
+
from unique_toolkit.language_model.schemas import LanguageModelFunction
|
|
25
|
+
from unique_toolkit.short_term_memory.service import ShortTermMemoryService
|
|
26
|
+
|
|
27
|
+
logger = getLogger(__name__)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
MEMORY_KEY = "agent_todo_state"
|
|
31
|
+
|
|
32
|
+
_STATUS_ICON = {
|
|
33
|
+
TodoStatus.COMPLETED: "✓",
|
|
34
|
+
TodoStatus.IN_PROGRESS: "→",
|
|
35
|
+
TodoStatus.CANCELLED: "✗",
|
|
36
|
+
TodoStatus.PENDING: "○",
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class TodoWriteTool(Tool[TodoConfig]):
|
|
41
|
+
name: str = "TodoWrite"
|
|
42
|
+
|
|
43
|
+
def __init__(
|
|
44
|
+
self,
|
|
45
|
+
config: TodoConfig,
|
|
46
|
+
event: ChatEvent,
|
|
47
|
+
tool_progress_reporter: ToolProgressReporter | None = None,
|
|
48
|
+
) -> None:
|
|
49
|
+
super().__init__(config, event, tool_progress_reporter)
|
|
50
|
+
stm_service = ShortTermMemoryService(
|
|
51
|
+
company_id=event.company_id,
|
|
52
|
+
user_id=event.user_id,
|
|
53
|
+
chat_id=event.payload.chat_id,
|
|
54
|
+
message_id=None,
|
|
55
|
+
)
|
|
56
|
+
self._memory_manager: PersistentShortMemoryManager[TodoList] = (
|
|
57
|
+
PersistentShortMemoryManager(
|
|
58
|
+
short_term_memory_service=stm_service,
|
|
59
|
+
short_term_memory_schema=TodoList,
|
|
60
|
+
short_term_memory_name=MEMORY_KEY,
|
|
61
|
+
)
|
|
62
|
+
)
|
|
63
|
+
self._cached_state: TodoList | None = None
|
|
64
|
+
self._plan_log: MessageLog | None = None
|
|
65
|
+
|
|
66
|
+
def display_name(self) -> str:
|
|
67
|
+
return self.config.display_name
|
|
68
|
+
|
|
69
|
+
def tool_description(self) -> LanguageModelToolDescription:
|
|
70
|
+
return LanguageModelToolDescription(
|
|
71
|
+
name=self.name,
|
|
72
|
+
description=render_template(
|
|
73
|
+
self.config.tool_description,
|
|
74
|
+
parallel_mode=self.config.parallel_mode,
|
|
75
|
+
),
|
|
76
|
+
parameters=TodoWriteInput.model_json_schema(),
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
def tool_description_for_system_prompt(self) -> str:
|
|
80
|
+
return render_template(
|
|
81
|
+
self.config.system_prompt,
|
|
82
|
+
parallel_mode=self.config.parallel_mode,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
async def run(self, tool_call: LanguageModelFunction) -> ToolCallResponse:
|
|
86
|
+
try:
|
|
87
|
+
input_data = TodoWriteInput.model_validate(tool_call.arguments)
|
|
88
|
+
except Exception as e:
|
|
89
|
+
logger.warning("TodoWriteTool: input validation failed: %s", e)
|
|
90
|
+
return ToolCallResponse(
|
|
91
|
+
id=tool_call.id,
|
|
92
|
+
name=self.name,
|
|
93
|
+
content=f"Error: invalid input — {e}. "
|
|
94
|
+
"When using merge=True, each item needs at least 'id' and 'status'. "
|
|
95
|
+
"When using merge=False (new list), each item also needs 'content'.",
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
logger.debug(
|
|
99
|
+
"TodoWriteTool input: merge=%s, items=%s",
|
|
100
|
+
input_data.merge,
|
|
101
|
+
[
|
|
102
|
+
{"id": t.id, "content": t.content, "status": t.status}
|
|
103
|
+
for t in input_data.todos
|
|
104
|
+
],
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
current_state = await self._load_state()
|
|
108
|
+
|
|
109
|
+
if input_data.merge:
|
|
110
|
+
current_state = current_state.update(input_data.todos)
|
|
111
|
+
else:
|
|
112
|
+
current_state = TodoList(
|
|
113
|
+
todos=[
|
|
114
|
+
TodoItem(
|
|
115
|
+
id=t.id,
|
|
116
|
+
content=t.content or "",
|
|
117
|
+
status=t.status,
|
|
118
|
+
active_form=t.active_form,
|
|
119
|
+
)
|
|
120
|
+
for t in input_data.todos
|
|
121
|
+
],
|
|
122
|
+
last_updated_iteration=current_state.last_updated_iteration,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
current_state.last_updated_iteration += 1
|
|
126
|
+
self._cached_state = current_state
|
|
127
|
+
|
|
128
|
+
try:
|
|
129
|
+
await self._memory_manager.save_async(current_state)
|
|
130
|
+
except Exception:
|
|
131
|
+
logger.warning(
|
|
132
|
+
"TodoWriteTool: failed to persist state, continuing with in-memory state",
|
|
133
|
+
exc_info=True,
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
logger.info(
|
|
137
|
+
"TodoWriteTool: saved %d items (merge=%s) — %s",
|
|
138
|
+
len(current_state.todos),
|
|
139
|
+
input_data.merge,
|
|
140
|
+
current_state.format(),
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
counts = current_state.status_counter()
|
|
144
|
+
await self._log_step(current_state)
|
|
145
|
+
|
|
146
|
+
content = current_state.format()
|
|
147
|
+
content = self._maybe_add_verification_nudge(content, counts)
|
|
148
|
+
|
|
149
|
+
return ToolCallResponse(
|
|
150
|
+
id=tool_call.id,
|
|
151
|
+
name=self.name,
|
|
152
|
+
content=content,
|
|
153
|
+
system_reminder=render_template(
|
|
154
|
+
self.config.execution_reminder,
|
|
155
|
+
parallel_mode=self.config.parallel_mode,
|
|
156
|
+
)
|
|
157
|
+
if current_state.has_active_items()
|
|
158
|
+
else "",
|
|
159
|
+
debug_info={
|
|
160
|
+
"input": {
|
|
161
|
+
"merge": input_data.merge,
|
|
162
|
+
"items": [t.model_dump() for t in input_data.todos],
|
|
163
|
+
},
|
|
164
|
+
"state": {
|
|
165
|
+
**counts,
|
|
166
|
+
"items": [t.model_dump() for t in current_state.todos],
|
|
167
|
+
},
|
|
168
|
+
"iteration": current_state.last_updated_iteration,
|
|
169
|
+
},
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
async def _log_step(self, state: TodoList) -> None:
|
|
173
|
+
"""Write a single Steps panel entry summarising the current todo state.
|
|
174
|
+
|
|
175
|
+
Shows a numbered list of all items with status indicators (✓/→/○)
|
|
176
|
+
and a completion count header. In-progress items display their
|
|
177
|
+
``active_form`` (present-continuous description) when available.
|
|
178
|
+
"""
|
|
179
|
+
try:
|
|
180
|
+
counts = state.status_counter()
|
|
181
|
+
completed = counts["completed"]
|
|
182
|
+
total = len(state.todos)
|
|
183
|
+
|
|
184
|
+
if total == 0:
|
|
185
|
+
return
|
|
186
|
+
|
|
187
|
+
all_done = not counts["in_progress"] and not counts["pending"]
|
|
188
|
+
|
|
189
|
+
lines = []
|
|
190
|
+
for i, t in enumerate(state.todos, 1):
|
|
191
|
+
icon = _STATUS_ICON.get(t.status, "○")
|
|
192
|
+
if t.status == TodoStatus.IN_PROGRESS:
|
|
193
|
+
label = t.active_form or t.content
|
|
194
|
+
else:
|
|
195
|
+
label = t.content
|
|
196
|
+
lines.append(f"{icon} {i}. {label}")
|
|
197
|
+
plan_text = "\n".join(lines)
|
|
198
|
+
|
|
199
|
+
self._plan_log = (
|
|
200
|
+
await self._message_step_logger.create_or_update_message_log_async(
|
|
201
|
+
active_message_log=self._plan_log,
|
|
202
|
+
header=self.display_name(),
|
|
203
|
+
progress_message=f"{completed}/{total} completed\n{plan_text}",
|
|
204
|
+
status=(
|
|
205
|
+
MessageLogStatus.COMPLETED
|
|
206
|
+
if all_done
|
|
207
|
+
else MessageLogStatus.RUNNING
|
|
208
|
+
),
|
|
209
|
+
)
|
|
210
|
+
)
|
|
211
|
+
except Exception:
|
|
212
|
+
logger.debug("TodoWriteTool: failed to write step log", exc_info=True)
|
|
213
|
+
|
|
214
|
+
def _maybe_add_verification_nudge(self, content: str, counts: Counter[str]) -> str:
|
|
215
|
+
"""Append a verification nudge after N consecutive completions."""
|
|
216
|
+
threshold = self.config.verification_threshold
|
|
217
|
+
if threshold <= 0:
|
|
218
|
+
return content
|
|
219
|
+
completed = counts["completed"]
|
|
220
|
+
if completed > 0 and completed % threshold == 0 and counts["pending"]:
|
|
221
|
+
nudge = render_template(self.config.verification_nudge, completed=completed)
|
|
222
|
+
content += f"\n\n{nudge}"
|
|
223
|
+
return content
|
|
224
|
+
|
|
225
|
+
async def _load_state(self) -> TodoList:
|
|
226
|
+
"""Load state from persistence, falling back to in-memory cache.
|
|
227
|
+
|
|
228
|
+
When both persisted and cached state exist, prefer whichever has the
|
|
229
|
+
higher ``last_updated_iteration`` — the cache may be ahead if a
|
|
230
|
+
previous ``save_async`` failed.
|
|
231
|
+
"""
|
|
232
|
+
persisted: TodoList | None = None
|
|
233
|
+
try:
|
|
234
|
+
persisted = await self._memory_manager.load_async()
|
|
235
|
+
except Exception:
|
|
236
|
+
logger.warning(
|
|
237
|
+
"TodoWriteTool: failed to load persisted state",
|
|
238
|
+
exc_info=True,
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
if persisted is not None and self._cached_state is not None:
|
|
242
|
+
if (
|
|
243
|
+
self._cached_state.last_updated_iteration
|
|
244
|
+
> persisted.last_updated_iteration
|
|
245
|
+
):
|
|
246
|
+
logger.info(
|
|
247
|
+
"TodoWriteTool: cache (iter %d) is ahead of persisted (iter %d), keeping cache",
|
|
248
|
+
self._cached_state.last_updated_iteration,
|
|
249
|
+
persisted.last_updated_iteration,
|
|
250
|
+
)
|
|
251
|
+
return self._cached_state
|
|
252
|
+
self._cached_state = persisted
|
|
253
|
+
return persisted
|
|
254
|
+
|
|
255
|
+
if persisted is not None:
|
|
256
|
+
self._cached_state = persisted
|
|
257
|
+
return persisted
|
|
258
|
+
|
|
259
|
+
if self._cached_state is not None:
|
|
260
|
+
logger.debug("TodoWriteTool: using in-memory cached state")
|
|
261
|
+
return self._cached_state
|
|
262
|
+
|
|
263
|
+
return TodoList(todos=[], last_updated_iteration=0)
|
|
264
|
+
|
|
265
|
+
def evaluation_check_list(self) -> list[EvaluationMetricName]:
|
|
266
|
+
return []
|
|
267
|
+
|
|
268
|
+
def get_evaluation_checks_based_on_tool_response(
|
|
269
|
+
self, tool_response: ToolCallResponse
|
|
270
|
+
) -> list[EvaluationMetricName]:
|
|
271
|
+
return []
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|