unique_toolkit 1.52.0__tar.gz → 1.53.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.52.0 → unique_toolkit-1.53.0}/PKG-INFO +2 -1
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/pyproject.toml +2 -1
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/chat/responses_api.py +127 -3
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/services/chat_service.py +30 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/README.md +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/_base_service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/_time_utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/config_checker/README.md +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/config_checker/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/config_checker/__main__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/config_checker/cli.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/config_checker/differ.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/config_checker/exporter.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/config_checker/models.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/config_checker/registry.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/config_checker/validator.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/default_language_model.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/docx_generator/config.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/docx_generator/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/endpoint_builder.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/endpoint_requestor.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/event_bus.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/exception.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/execution.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/feature_flags/schema.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/pydantic_helpers.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/referencing.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/string_utilities.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/tests/test_referencing.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/token/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/token/image_token_counting.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/token/token_counting.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/utils/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/utils/files.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/utils/image/encode.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/utils/jinja/render.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/utils/write_configuration.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/validate_required_values.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/validators.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/config.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/exception.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/feature_flags/feature_flags.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/history_manager/utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/loop_runner/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/loop_runner/base.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/tool/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/config.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/factory.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/schemas.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/tool.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic_table/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic_table/schemas.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic_table/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/app/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/app/dev_util.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/app/fast_api_factory.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/app/init_logging.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/app/init_sdk.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/app/performance/async_tasks.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/app/performance/async_wrapper.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/app/schemas.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/app/unique_settings.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/app/verification.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/app/webhook.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/chat/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/chat/cancellation.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/chat/constants.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/chat/deprecated/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/chat/functions.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/chat/rendering.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/chat/schemas.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/chat/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/chat/state.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/chat/utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/content/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/content/constants.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/content/functions.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/content/schemas.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/content/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/content/smart_rules.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/content/utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/data_extraction/README.md +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/data_extraction/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/data_extraction/augmented/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/data_extraction/base.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/data_extraction/basic/config.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/data_extraction/basic/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/elicitation/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/elicitation/constants.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/elicitation/exceptions.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/elicitation/functions.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/elicitation/schemas.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/elicitation/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/embedding/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/embedding/constants.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/embedding/functions.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/embedding/schemas.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/embedding/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/embedding/utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/framework_utilities/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/framework_utilities/openai/client.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/framework_utilities/utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/language_model/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/language_model/builder.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/language_model/constants.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/language_model/default_language_model.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/language_model/functions.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/language_model/infos.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/language_model/prompt.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/language_model/reference.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/language_model/schemas.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/language_model/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/language_model/stream_transform.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/language_model/utils.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/protocols/support.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/services/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/services/knowledge_base.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/short_term_memory/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/short_term_memory/constants.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/short_term_memory/functions.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/short_term_memory/schemas.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/short_term_memory/service.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/smart_rules/__init__.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/smart_rules/compile.py +0 -0
- {unique_toolkit-1.52.0 → unique_toolkit-1.53.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.53.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>
|
|
@@ -29,6 +29,7 @@ Requires-Dist: pandas>=2.3.0,<3
|
|
|
29
29
|
Requires-Dist: click>=8.1.0,<9
|
|
30
30
|
Requires-Dist: deepdiff>=8.6.1,<9
|
|
31
31
|
Requires-Dist: pypandoc>=1.16.2,<2
|
|
32
|
+
Requires-Dist: tenacity>=9.1.4
|
|
32
33
|
Requires-Dist: fastapi>=0.121.0,<0.122 ; extra == 'fastapi'
|
|
33
34
|
Requires-Dist: starlette>=0.49.1 ; extra == 'fastapi'
|
|
34
35
|
Requires-Dist: uvicorn>=0.37.0,<0.38 ; extra == 'fastapi'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "unique_toolkit"
|
|
3
|
-
version = "1.
|
|
3
|
+
version = "1.53.0"
|
|
4
4
|
description = ""
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12"
|
|
@@ -41,6 +41,7 @@ dependencies = [
|
|
|
41
41
|
"click>=8.1.0,<9",
|
|
42
42
|
"deepdiff>=8.6.1,<9",
|
|
43
43
|
"pypandoc>=1.16.2,<2",
|
|
44
|
+
"tenacity>=9.1.4",
|
|
44
45
|
]
|
|
45
46
|
|
|
46
47
|
[project.optional-dependencies]
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
|
+
import random
|
|
4
|
+
from collections.abc import Awaitable, Callable
|
|
3
5
|
from typing import Any, NamedTuple, Sequence
|
|
4
6
|
|
|
5
7
|
import unique_sdk
|
|
@@ -13,7 +15,14 @@ from openai.types.responses import (
|
|
|
13
15
|
response_create_params,
|
|
14
16
|
)
|
|
15
17
|
from openai.types.shared_params import Metadata, Reasoning
|
|
16
|
-
from pydantic import BaseModel, TypeAdapter, ValidationError
|
|
18
|
+
from pydantic import BaseModel, Field, TypeAdapter, ValidationError
|
|
19
|
+
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
20
|
+
from tenacity import (
|
|
21
|
+
AsyncRetrying,
|
|
22
|
+
RetryCallState,
|
|
23
|
+
retry_if_exception,
|
|
24
|
+
stop_after_attempt,
|
|
25
|
+
)
|
|
17
26
|
|
|
18
27
|
from unique_toolkit._common.execution import (
|
|
19
28
|
failsafe,
|
|
@@ -329,6 +338,114 @@ def _prepare_responses_args(
|
|
|
329
338
|
return options
|
|
330
339
|
|
|
331
340
|
|
|
341
|
+
_RATE_LIMIT_KEYWORDS = ("too_many_requests", "too many requests", "ratelimitreached")
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
class RateLimitRetryConfig(BaseSettings):
|
|
345
|
+
"""Config for Responses API rate-limit retry. Set via env vars with prefix RATE_LIMIT_RETRY_."""
|
|
346
|
+
|
|
347
|
+
initial_delay_seconds: float = Field(
|
|
348
|
+
default=30.0,
|
|
349
|
+
description="First wait after SDK retries exhausted. Backoff then 2x (30→60→120s).",
|
|
350
|
+
)
|
|
351
|
+
max_attempts: int = Field(
|
|
352
|
+
default=2,
|
|
353
|
+
ge=1,
|
|
354
|
+
le=10,
|
|
355
|
+
description="Total attempts (1 initial + retries). Default 2 = 1 retry (~30s wait). Set to 1 to disable.",
|
|
356
|
+
)
|
|
357
|
+
log_message_on_retry: bool = Field(
|
|
358
|
+
default=True,
|
|
359
|
+
description="Write a message-log entry when a retry is about to sleep (e.g. 'Retrying in 30s').",
|
|
360
|
+
)
|
|
361
|
+
|
|
362
|
+
model_config = SettingsConfigDict(
|
|
363
|
+
env_prefix="RATE_LIMIT_RETRY_",
|
|
364
|
+
env_file=".env",
|
|
365
|
+
env_file_encoding="utf-8",
|
|
366
|
+
case_sensitive=False,
|
|
367
|
+
extra="ignore",
|
|
368
|
+
)
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
rate_limit_retry_config = RateLimitRetryConfig()
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
def _rate_limit_wait(retry_state: RetryCallState) -> float:
|
|
375
|
+
"""Exponential backoff with up to 10% jitter: initial_delay → 2x → 4x."""
|
|
376
|
+
n = retry_state.attempt_number - 1 # 0-indexed
|
|
377
|
+
base = rate_limit_retry_config.initial_delay_seconds * (2.0**n)
|
|
378
|
+
return base + random.uniform(0.0, base * 0.1)
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
async def _responses_stream_with_rate_limit_retry(
|
|
382
|
+
responses_args: dict[str, Any],
|
|
383
|
+
model_name: str,
|
|
384
|
+
on_rate_limit_retry: Callable[[int, float], Awaitable[None]] | None = None,
|
|
385
|
+
) -> "unique_sdk.Integrated.ResponsesStreamResult":
|
|
386
|
+
"""Wrap responses_stream_async with exponential backoff for rate-limit errors.
|
|
387
|
+
|
|
388
|
+
The SDK already retries 3× (1s/2s/4s) before raising. This layer adds further
|
|
389
|
+
retries with longer delays, which are needed for models with tighter RPM limits
|
|
390
|
+
(e.g. GPT-4o) when large-token requests (web search, code execution) are in the loop.
|
|
391
|
+
|
|
392
|
+
Args:
|
|
393
|
+
responses_args: Keyword arguments forwarded to responses_stream_async.
|
|
394
|
+
model_name: Model name used in log messages.
|
|
395
|
+
on_rate_limit_retry: Optional async callback invoked before each retry sleep.
|
|
396
|
+
Receives (attempt_1based, wait_seconds). Useful for writing a message-log
|
|
397
|
+
entry so the user sees progress during long waits.
|
|
398
|
+
"""
|
|
399
|
+
|
|
400
|
+
def _is_rate_limit(exc: BaseException) -> bool:
|
|
401
|
+
return isinstance(exc, unique_sdk.APIError) and any(
|
|
402
|
+
kw in str(exc).lower() for kw in _RATE_LIMIT_KEYWORDS
|
|
403
|
+
)
|
|
404
|
+
|
|
405
|
+
max_attempts = rate_limit_retry_config.max_attempts
|
|
406
|
+
max_retries = max_attempts - 1
|
|
407
|
+
|
|
408
|
+
def _log_attempt(retry_state: RetryCallState) -> None:
|
|
409
|
+
exc = retry_state.outcome.exception() if retry_state.outcome else None
|
|
410
|
+
if exc is None:
|
|
411
|
+
return
|
|
412
|
+
logger.error(
|
|
413
|
+
"responses_stream_async error on toolkit attempt %d/%d "
|
|
414
|
+
"model=%s code=%s http_status=%s is_rate_limit=%s original_error=%r",
|
|
415
|
+
retry_state.attempt_number,
|
|
416
|
+
max_attempts,
|
|
417
|
+
model_name,
|
|
418
|
+
getattr(exc, "code", None),
|
|
419
|
+
getattr(exc, "http_status", None),
|
|
420
|
+
_is_rate_limit(exc),
|
|
421
|
+
getattr(exc, "original_error", None),
|
|
422
|
+
)
|
|
423
|
+
|
|
424
|
+
async def _before_sleep(retry_state: RetryCallState) -> None:
|
|
425
|
+
wait_secs = retry_state.upcoming_sleep
|
|
426
|
+
logger.warning(
|
|
427
|
+
"Rate limit hit for model=%s. Toolkit-level retry %d/%d in %.1fs",
|
|
428
|
+
model_name,
|
|
429
|
+
retry_state.attempt_number,
|
|
430
|
+
max_retries,
|
|
431
|
+
wait_secs,
|
|
432
|
+
)
|
|
433
|
+
if on_rate_limit_retry is not None:
|
|
434
|
+
await on_rate_limit_retry(retry_state.attempt_number, wait_secs)
|
|
435
|
+
|
|
436
|
+
async def _call() -> "unique_sdk.Integrated.ResponsesStreamResult":
|
|
437
|
+
return await unique_sdk.Integrated.responses_stream_async(**responses_args)
|
|
438
|
+
|
|
439
|
+
return await AsyncRetrying(
|
|
440
|
+
retry=retry_if_exception(_is_rate_limit),
|
|
441
|
+
stop=stop_after_attempt(max_attempts),
|
|
442
|
+
wait=_rate_limit_wait,
|
|
443
|
+
after=_log_attempt,
|
|
444
|
+
before_sleep=_before_sleep,
|
|
445
|
+
reraise=True,
|
|
446
|
+
)(_call)
|
|
447
|
+
|
|
448
|
+
|
|
332
449
|
def stream_responses_with_references(
|
|
333
450
|
*,
|
|
334
451
|
company_id: str,
|
|
@@ -426,6 +543,7 @@ async def stream_responses_with_references_async(
|
|
|
426
543
|
top_p: float | None = None,
|
|
427
544
|
reasoning: Reasoning | None = None,
|
|
428
545
|
other_options: dict | None = None,
|
|
546
|
+
on_rate_limit_retry: Callable[[int, float], Awaitable[None]] | None = None,
|
|
429
547
|
) -> ResponsesLanguageModelStreamResponse:
|
|
430
548
|
responses_params = _prepare_responses_params_util(
|
|
431
549
|
model_name=model_name,
|
|
@@ -458,8 +576,14 @@ async def stream_responses_with_references_async(
|
|
|
458
576
|
other_options=other_options,
|
|
459
577
|
)
|
|
460
578
|
|
|
579
|
+
logger.info(
|
|
580
|
+
"Calling responses_stream_async model=%s",
|
|
581
|
+
responses_params.model_name,
|
|
582
|
+
)
|
|
461
583
|
return ResponsesLanguageModelStreamResponse.model_validate(
|
|
462
|
-
await
|
|
463
|
-
|
|
584
|
+
await _responses_stream_with_rate_limit_retry(
|
|
585
|
+
responses_args=responses_args,
|
|
586
|
+
model_name=responses_params.model_name,
|
|
587
|
+
on_rate_limit_retry=on_rate_limit_retry,
|
|
464
588
|
)
|
|
465
589
|
)
|
|
@@ -17,6 +17,7 @@ from pydantic import BaseModel
|
|
|
17
17
|
from typing_extensions import deprecated
|
|
18
18
|
|
|
19
19
|
from unique_toolkit._common.utils.files import is_file_content, is_image_content
|
|
20
|
+
from unique_toolkit.agentic.feature_flags import feature_flags
|
|
20
21
|
from unique_toolkit.chat.cancellation import CancellationWatcher
|
|
21
22
|
from unique_toolkit.chat.constants import (
|
|
22
23
|
DEFAULT_MAX_MESSAGES,
|
|
@@ -50,6 +51,7 @@ from unique_toolkit.chat.functions import (
|
|
|
50
51
|
update_message_log_async,
|
|
51
52
|
)
|
|
52
53
|
from unique_toolkit.chat.responses_api import (
|
|
54
|
+
rate_limit_retry_config,
|
|
53
55
|
stream_responses_with_references,
|
|
54
56
|
stream_responses_with_references_async,
|
|
55
57
|
)
|
|
@@ -1637,6 +1639,33 @@ class ChatService(ChatServiceDeprecated):
|
|
|
1637
1639
|
reasoning: Reasoning | None = None,
|
|
1638
1640
|
other_options: dict | None = None,
|
|
1639
1641
|
) -> ResponsesLanguageModelStreamResponse:
|
|
1642
|
+
async def _on_rate_limit_retry(attempt: int, wait_secs: float) -> None:
|
|
1643
|
+
if not rate_limit_retry_config.log_message_on_retry:
|
|
1644
|
+
return
|
|
1645
|
+
if not feature_flags.enable_new_answers_ui_un_14411.is_enabled(
|
|
1646
|
+
self._company_id
|
|
1647
|
+
):
|
|
1648
|
+
return
|
|
1649
|
+
from unique_toolkit.agentic.message_log_manager.service import (
|
|
1650
|
+
_request_counters,
|
|
1651
|
+
)
|
|
1652
|
+
|
|
1653
|
+
msg_id = self._assistant_message_id
|
|
1654
|
+
_request_counters[msg_id] += 1
|
|
1655
|
+
order = _request_counters[msg_id]
|
|
1656
|
+
try:
|
|
1657
|
+
await self.create_message_log_async(
|
|
1658
|
+
message_id=msg_id,
|
|
1659
|
+
text=f"Rate limit reached; retrying in {wait_secs:.0f}s (attempt {attempt})",
|
|
1660
|
+
status=MessageLogStatus.RUNNING,
|
|
1661
|
+
order=order,
|
|
1662
|
+
)
|
|
1663
|
+
except Exception:
|
|
1664
|
+
logger.warning(
|
|
1665
|
+
"Failed to write rate-limit retry message log",
|
|
1666
|
+
exc_info=True,
|
|
1667
|
+
)
|
|
1668
|
+
|
|
1640
1669
|
return await stream_responses_with_references_async(
|
|
1641
1670
|
company_id=self._company_id,
|
|
1642
1671
|
user_id=self._user_id,
|
|
@@ -1661,6 +1690,7 @@ class ChatService(ChatServiceDeprecated):
|
|
|
1661
1690
|
top_p=top_p,
|
|
1662
1691
|
reasoning=reasoning,
|
|
1663
1692
|
other_options=other_options,
|
|
1693
|
+
on_rate_limit_retry=_on_rate_limit_retry,
|
|
1664
1694
|
)
|
|
1665
1695
|
|
|
1666
1696
|
# Chat Content Methods
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/base_model_type_attribute.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/config_checker/README.md
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/config_checker/__init__.py
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/config_checker/__main__.py
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/config_checker/cli.py
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/config_checker/differ.py
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/config_checker/exporter.py
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/config_checker/models.py
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/config_checker/registry.py
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/config_checker/validator.py
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/default_language_model.py
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/docx_generator/__init__.py
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/docx_generator/config.py
RENAMED
|
File without changes
|
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/docx_generator/schemas.py
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/docx_generator/service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/endpoint_requestor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/feature_flags/schema.py
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/pydantic/rjsf_tags.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/tests/test_referencing.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/token/image_token_counting.py
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/token/token_counting.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/utils/image/encode.py
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/utils/jinja/helpers.py
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/utils/jinja/render.py
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/utils/jinja/schema.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/utils/write_configuration.py
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/_common/validate_required_values.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/exception.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/output_parser.py
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/schemas.py
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/evaluation/tests/fixtures.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/feature_flags/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/history_manager/utils.py
RENAMED
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/loop_runner/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{unique_toolkit-1.52.0 → unique_toolkit-1.53.0}/unique_toolkit/agentic/loop_runner/runners/basic.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|