unique-toolkit 2026.20.0.dev33__tar.gz → 2026.20.0.dev35__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/PKG-INFO +1 -1
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/pyproject.toml +6 -1
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/event_bus.py +25 -4
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/loop_runner/_responses_stream_handler_utils.py +2 -11
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/loop_runner/base.py +3 -11
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/loop_runner/middleware/planning/planning.py +49 -3
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/tool/service.py +2 -2
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/chat/responses_api.py +7 -24
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/content/schemas.py +16 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/_internal/streaming/__init__.py +35 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/_internal/streaming/common.py +208 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/_internal/streaming/pattern_replacer.py +222 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/__init__.py +1 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/__init__.py +1 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/__init__.py +93 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/_async_bridge.py +46 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/__init__.py +15 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/complete_with_references.py +484 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/stream_event_router.py +163 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/text_event_handler.py +140 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/chat_completions/tool_call_event_handler.py +87 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/events.py +174 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/__init__.py +34 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/chat_completions.py +43 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/protocols/responses.py +97 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/__init__.py +23 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/code_interpreter_event_handler.py +111 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/complete_with_references.py +621 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/completed_event_handler.py +49 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/stream_event_router.py +215 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/text_delta_event_handler.py +97 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/tool_call_event_handler.py +103 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/__init__.py +8 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/message_persister.py +178 -0
- unique_toolkit-2026.20.0.dev35/unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/progress_log_persister.py +90 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/language_model/reference.py +11 -55
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/language_model/schemas.py +12 -1
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/protocols/support.py +5 -19
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/services/chat_service.py +3 -15
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/README.md +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/_base_service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/_time_utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/config_checker/README.md +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/config_checker/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/config_checker/__main__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/config_checker/cli.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/config_checker/differ.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/config_checker/exporter.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/config_checker/models.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/config_checker/registry.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/config_checker/validator.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/default_language_model.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/docx_generator/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/docx_generator/config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/docx_generator/pandoc_converter.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/docx_generator/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/docx_generator/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/endpoint_builder.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/endpoint_requestor.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/exception.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/execution.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/endpoint_builder.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/endpoint_requestor.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/README.md +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/agent.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/experimental/write_up_agent/utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/feature_flags/schema.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/metadata_filter_scope.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/pydantic_helpers.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/referencing.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/string_utilities.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/tests/test_referencing.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/tests/test_string_utilities.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/token/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/token/image_token_counting.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/token/token_counting.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/token/tokenizers/deepseek/tokenizer.json +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/token/tokenizers/qwen/tokenizer.json +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/utils/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/utils/files.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/utils/image/encode.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/utils/jinja/helpers.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/utils/jinja/render.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/utils/jinja/schema.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/utils/jinja/utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/utils/write_configuration.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/validate_required_values.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/_common/validators.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/context_relevancy/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/exception.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2 +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/tests/fixtures.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/tests/test_config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/evaluation/utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/feature_flags/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/feature_flags/feature_flags.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/history_manager/utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/loop_runner/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/loop_runner/_iteration_handler_utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/loop_runner/_responses_iteration_handler_utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/loop_runner/_stream_handler_utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/loop_runner/middleware/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/loop_runner/middleware/planning/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/loop_runner/middleware/planning/schema.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/loop_runner/runners/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/loop_runner/runners/basic.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/loop_runner/runners/mistral/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/loop_runner/runners/mistral/mistral_runner.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/message_log_manager/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/message_log_manager/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/message_log_order.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/responses_api/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/responses_api/postprocessors/code_display.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/responses_api/stream_handler.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/evaluation/config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/postprocessing/config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/postprocessing/references.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_references.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/prompts.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/response_watcher/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/tool/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/tool/_memory.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/tool/_schema.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/tool/config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/a2a/tool/test/test_service_utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/experimental/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/experimental/open_file_tool/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/experimental/open_file_tool/config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/experimental/open_file_tool/runtime.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/experimental/open_file_tool/tool.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/experimental/retrieve_search_scope_tool/tool.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/experimental/todo/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/experimental/todo/config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/experimental/todo/prompts/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/experimental/todo/prompts/execution_reminder.j2 +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/experimental/todo/prompts/system_prompt.j2 +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/experimental/todo/prompts/tool_description.j2 +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/experimental/todo/prompts/verification_nudge.j2 +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/experimental/todo/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/experimental/todo/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/factory.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/names.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/openai_builtin/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/openai_builtin/base.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/code_display.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/postprocessors/generated_files.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/openai_builtin/manager.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/tool.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/tool_manager.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic_table/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic_table/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/agentic_table/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/app/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/app/chat_event_filter_options_settings.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/app/dev_util.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/app/fast_api_factory.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/app/feature_flags.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/app/find_env_file.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/app/init_logging.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/app/init_sdk.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/app/performance/async_tasks.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/app/performance/async_wrapper.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/app/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/app/unique_settings.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/app/verification.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/app/webhook.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/chat/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/chat/cancellation.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/chat/constants.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/chat/deprecated/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/chat/functions.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/chat/rendering.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/chat/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/chat/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/chat/state.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/chat/utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/content/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/content/constants.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/content/functions.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/content/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/content/smart_rules.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/content/utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/data_extraction/README.md +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/data_extraction/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/data_extraction/augmented/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/data_extraction/augmented/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/data_extraction/base.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/data_extraction/basic/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/data_extraction/basic/config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/data_extraction/basic/prompt.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/data_extraction/basic/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/elicitation/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/elicitation/constants.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/elicitation/exceptions.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/elicitation/functions.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/elicitation/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/elicitation/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/embedding/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/embedding/constants.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/embedding/functions.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/embedding/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/embedding/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/embedding/utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/README.md +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/_internal/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/_base.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/content_tree/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/content_tree/functions.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/content_tree/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/content_tree/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/internal_search/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/internal_search/base/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/internal_search/base/config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/internal_search/base/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/internal_search/base/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/internal_search/base/utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/internal_search/chat/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/internal_search/chat/config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/internal_search/chat/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/internal_search/chat/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/internal_search/knowledge_base/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/internal_search/knowledge_base/config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/internal_search/knowledge_base/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/internal_search/knowledge_base/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/internal_search/post_processing/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/internal_search/post_processing/config.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/components/internal_search/post_processing/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/content_tree/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/identity/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/integrations/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/content_folder/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/content_folder/functions.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/content_folder/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/content_folder/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/facades/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/facades/identity/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/facades/identity/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/group/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/group/functions.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/group/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/group/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/scheduled_task/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/scheduled_task/cron.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/scheduled_task/functions.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/scheduled_task/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/scheduled_task/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/user/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/user/functions.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/user/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/resources/user/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/experimental/testing/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/framework_utilities/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/framework_utilities/langchain/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/framework_utilities/openai/client.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/framework_utilities/utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/language_model/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/language_model/_responses_api_utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/language_model/builder.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/language_model/constants.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/language_model/default_language_model.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/language_model/functions.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/language_model/infos.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/language_model/prompt.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/language_model/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/language_model/stream_transform.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/language_model/utils.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/monitoring/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/monitoring/middleware.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/monitoring/registry.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/services/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/services/factory.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/services/knowledge_base.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/short_term_memory/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/short_term_memory/constants.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/short_term_memory/functions.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/short_term_memory/schemas.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/short_term_memory/service.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/smart_rules/__init__.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/smart_rules/compile.py +0 -0
- {unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/test_utilities/events.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: unique-toolkit
|
|
3
|
-
Version: 2026.20.0.
|
|
3
|
+
Version: 2026.20.0.dev35
|
|
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>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "unique_toolkit"
|
|
3
|
-
version = "2026.20.0.
|
|
3
|
+
version = "2026.20.0.dev35"
|
|
4
4
|
description = ""
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12"
|
|
@@ -137,6 +137,10 @@ DEP004 = ["langchain_openai", "langchain_core"]
|
|
|
137
137
|
# 7. components never call unique_sdk directly (go through a resource)
|
|
138
138
|
# 8. each integrations/<framework>/ stands alone — enabled when real modules land
|
|
139
139
|
#
|
|
140
|
+
# Imports under ``if TYPE_CHECKING:`` are excluded from the graph (see
|
|
141
|
+
# ``exclude_type_checking_imports``) so type-only imports (e.g. ``unique_sdk``)
|
|
142
|
+
# do not violate layer/forbidden contracts. Runtime imports are still enforced.
|
|
143
|
+
#
|
|
140
144
|
# Preference rules from the README that are NOT machine-enforced (import-linter
|
|
141
145
|
# is pass/fail, not tiered): integrations prefer facades over primitives;
|
|
142
146
|
# integrations importing components is "discouraged but allowed".
|
|
@@ -144,6 +148,7 @@ DEP004 = ["langchain_openai", "langchain_core"]
|
|
|
144
148
|
[tool.importlinter]
|
|
145
149
|
root_packages = ["unique_toolkit"]
|
|
146
150
|
include_external_packages = true
|
|
151
|
+
exclude_type_checking_imports = true
|
|
147
152
|
|
|
148
153
|
[[tool.importlinter.contracts]]
|
|
149
154
|
name = "experimental: integrations stack (integrations → resources → _internal)"
|
|
@@ -96,7 +96,28 @@ class TypedEventBus(Generic[T]):
|
|
|
96
96
|
async def publish_and_wait_async(
|
|
97
97
|
self, event: T, *, return_exceptions: bool = False
|
|
98
98
|
) -> None:
|
|
99
|
-
"""Invoke every handler and await completion.
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
99
|
+
"""Invoke every handler and await completion.
|
|
100
|
+
|
|
101
|
+
When ``return_exceptions=True`` failures from one subscriber do not
|
|
102
|
+
cancel the others, and each swallowed exception is logged. Use this
|
|
103
|
+
at hot-path publish sites (e.g. ``text_delta``) where a single flaky
|
|
104
|
+
analytics subscriber should not abort the stream.
|
|
105
|
+
"""
|
|
106
|
+
handlers = list(self._handlers)
|
|
107
|
+
coros = [self._invoke(h, event) for h in handlers]
|
|
108
|
+
if not coros:
|
|
109
|
+
return
|
|
110
|
+
if return_exceptions:
|
|
111
|
+
results = await asyncio.gather(*coros, return_exceptions=True)
|
|
112
|
+
for handler, result in zip(handlers, results):
|
|
113
|
+
if isinstance(result, BaseException) and not isinstance(
|
|
114
|
+
result, asyncio.CancelledError
|
|
115
|
+
):
|
|
116
|
+
logger.error(
|
|
117
|
+
"Subscriber %r raised during publish; swallowing: %r",
|
|
118
|
+
handler,
|
|
119
|
+
result,
|
|
120
|
+
exc_info=result,
|
|
121
|
+
)
|
|
122
|
+
else:
|
|
123
|
+
await asyncio.gather(*coros)
|
|
@@ -2,8 +2,6 @@ from typing import Any, Required, Sequence
|
|
|
2
2
|
|
|
3
3
|
from openai.types.responses import (
|
|
4
4
|
ResponseIncludable,
|
|
5
|
-
ResponseInputItemParam,
|
|
6
|
-
ResponseOutputItem,
|
|
7
5
|
ResponseTextConfigParam,
|
|
8
6
|
ToolParam,
|
|
9
7
|
response_create_params,
|
|
@@ -13,22 +11,15 @@ from typing_extensions import TypedDict
|
|
|
13
11
|
|
|
14
12
|
from unique_toolkit import LanguageModelToolDescription
|
|
15
13
|
from unique_toolkit.agentic.loop_runner.base import _ResponsesLoopIterationRunnerKwargs
|
|
16
|
-
from unique_toolkit.chat.service import LanguageModelMessages
|
|
17
14
|
from unique_toolkit.content import ContentChunk
|
|
18
15
|
from unique_toolkit.language_model.schemas import (
|
|
19
|
-
LanguageModelMessageOptions,
|
|
20
16
|
ResponsesLanguageModelStreamResponse,
|
|
17
|
+
ResponsesMessageInput,
|
|
21
18
|
)
|
|
22
19
|
|
|
23
20
|
|
|
24
21
|
class _ResponsesStreamingHandlerKwargs(TypedDict, total=False):
|
|
25
|
-
messages: Required[
|
|
26
|
-
str
|
|
27
|
-
| LanguageModelMessages
|
|
28
|
-
| Sequence[
|
|
29
|
-
ResponseInputItemParam | LanguageModelMessageOptions | ResponseOutputItem
|
|
30
|
-
]
|
|
31
|
-
]
|
|
22
|
+
messages: Required[ResponsesMessageInput]
|
|
32
23
|
model_name: Required[str]
|
|
33
24
|
tools: Sequence[LanguageModelToolDescription | ToolParam]
|
|
34
25
|
content_chunks: list[ContentChunk]
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
from typing import Any, Protocol, Required,
|
|
1
|
+
from typing import Any, Protocol, Required, Unpack
|
|
2
2
|
|
|
3
3
|
from openai.types.chat import ChatCompletionNamedToolChoiceParam
|
|
4
4
|
from openai.types.responses import (
|
|
5
5
|
ResponseIncludable,
|
|
6
|
-
ResponseInputItemParam,
|
|
7
|
-
ResponseOutputItem,
|
|
8
6
|
ResponseTextConfigParam,
|
|
9
7
|
ToolParam,
|
|
10
8
|
response_create_params,
|
|
@@ -18,8 +16,8 @@ from unique_toolkit.chat.service import LanguageModelMessages
|
|
|
18
16
|
from unique_toolkit.content import ContentChunk
|
|
19
17
|
from unique_toolkit.language_model.infos import LanguageModelInfo
|
|
20
18
|
from unique_toolkit.language_model.schemas import (
|
|
21
|
-
LanguageModelMessageOptions,
|
|
22
19
|
ResponsesLanguageModelStreamResponse,
|
|
20
|
+
ResponsesMessageInput,
|
|
23
21
|
)
|
|
24
22
|
from unique_toolkit.protocols.support import (
|
|
25
23
|
ResponsesSupportCompleteWithReferences,
|
|
@@ -55,13 +53,7 @@ class LoopIterationRunner(Protocol):
|
|
|
55
53
|
class _ResponsesLoopIterationRunnerKwargs(TypedDict, total=False):
|
|
56
54
|
iteration_index: Required[int]
|
|
57
55
|
streaming_handler: Required[ResponsesSupportCompleteWithReferences]
|
|
58
|
-
messages: Required[
|
|
59
|
-
str
|
|
60
|
-
| LanguageModelMessages
|
|
61
|
-
| Sequence[
|
|
62
|
-
ResponseInputItemParam | LanguageModelMessageOptions | ResponseOutputItem
|
|
63
|
-
]
|
|
64
|
-
]
|
|
56
|
+
messages: Required[ResponsesMessageInput]
|
|
65
57
|
model: Required[LanguageModelInfo]
|
|
66
58
|
tools: list[LanguageModelToolDescription | ToolParam]
|
|
67
59
|
content_chunks: list[ContentChunk]
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
|
-
from
|
|
3
|
+
from collections.abc import Sequence
|
|
4
|
+
from typing import Any, TypeGuard, Unpack
|
|
4
5
|
|
|
5
6
|
from openai import AsyncOpenAI
|
|
6
7
|
from openai.types.responses import (
|
|
7
8
|
Response,
|
|
8
9
|
ResponseFunctionToolCall,
|
|
9
10
|
ResponseInputItemParam,
|
|
11
|
+
ResponseOutputItem,
|
|
10
12
|
ToolParam,
|
|
11
13
|
)
|
|
12
14
|
from openai.types.responses.function_tool_param import FunctionToolParam
|
|
@@ -26,13 +28,17 @@ from unique_toolkit.agentic.loop_runner.middleware.planning.schema import (
|
|
|
26
28
|
PlanningSchemaConfig,
|
|
27
29
|
get_planning_schema,
|
|
28
30
|
)
|
|
29
|
-
from unique_toolkit.chat.responses_api import
|
|
31
|
+
from unique_toolkit.chat.responses_api import (
|
|
32
|
+
_convert_messages_to_openai,
|
|
33
|
+
convert_messages_to_openai,
|
|
34
|
+
)
|
|
30
35
|
from unique_toolkit.chat.service import LanguageModelStreamResponse
|
|
31
36
|
from unique_toolkit.language_model import (
|
|
32
37
|
LanguageModelAssistantMessage,
|
|
33
38
|
LanguageModelUserMessage,
|
|
34
39
|
)
|
|
35
40
|
from unique_toolkit.language_model.schemas import (
|
|
41
|
+
LanguageModelMessageOptions,
|
|
36
42
|
LanguageModelMessages,
|
|
37
43
|
ResponsesLanguageModelStreamResponse,
|
|
38
44
|
)
|
|
@@ -45,6 +51,30 @@ _PLAN_TOOL_DESCRIPTION = (
|
|
|
45
51
|
"Record the plan for the next step. Call this tool exactly once."
|
|
46
52
|
)
|
|
47
53
|
|
|
54
|
+
|
|
55
|
+
def _is_language_model_messages(
|
|
56
|
+
msgs: Sequence[object],
|
|
57
|
+
) -> TypeGuard[list[LanguageModelMessageOptions]]:
|
|
58
|
+
return len(msgs) > 0 and all(
|
|
59
|
+
isinstance(m, LanguageModelMessageOptions) for m in msgs
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _is_response_input_items(
|
|
64
|
+
msgs: Sequence[object],
|
|
65
|
+
) -> TypeGuard[list[ResponseInputItemParam]]:
|
|
66
|
+
return len(msgs) > 0 and all(isinstance(m, dict) for m in msgs)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _is_response_output_items(
|
|
70
|
+
msgs: Sequence[object],
|
|
71
|
+
) -> TypeGuard[list[ResponseOutputItem]]:
|
|
72
|
+
return len(msgs) > 0 and all(
|
|
73
|
+
isinstance(m, BaseModel) and not isinstance(m, LanguageModelMessageOptions)
|
|
74
|
+
for m in msgs
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
|
|
48
78
|
# Kwargs from _ResponsesLoopIterationRunnerKwargs that make sense to forward to
|
|
49
79
|
# the planning `responses.create` call. We deliberately exclude anything that
|
|
50
80
|
# conflicts with the forced-tool-call setup (`tools`, `tool_choices`, `text`,
|
|
@@ -270,6 +300,22 @@ class ResponsesPlanningMiddleware(ResponsesLoopIterationRunner):
|
|
|
270
300
|
kwargs["messages"].builder().append(assistant_message).build()
|
|
271
301
|
)
|
|
272
302
|
else:
|
|
273
|
-
|
|
303
|
+
message_items = list(kwargs["messages"])
|
|
304
|
+
assistant_items = _convert_messages_to_openai([assistant_message])
|
|
305
|
+
if _is_language_model_messages(message_items):
|
|
306
|
+
kwargs["messages"] = [*message_items, assistant_message]
|
|
307
|
+
elif _is_response_input_items(message_items):
|
|
308
|
+
kwargs["messages"] = [*message_items, *assistant_items]
|
|
309
|
+
elif _is_response_output_items(message_items):
|
|
310
|
+
kwargs["messages"] = [
|
|
311
|
+
*_convert_messages_to_openai(message_items),
|
|
312
|
+
*assistant_items,
|
|
313
|
+
]
|
|
314
|
+
else:
|
|
315
|
+
raise TypeError(
|
|
316
|
+
"messages must be a homogeneous list of "
|
|
317
|
+
"LanguageModelMessageOptions, ResponseInputItemParam dicts, "
|
|
318
|
+
"or ResponseOutputItem models"
|
|
319
|
+
)
|
|
274
320
|
|
|
275
321
|
return await self._loop_runner(**kwargs)
|
|
@@ -198,7 +198,7 @@ class SubAgentTool(Tool[SubAgentToolConfig]):
|
|
|
198
198
|
)
|
|
199
199
|
|
|
200
200
|
active_message_log = self._create_or_update_message_log(
|
|
201
|
-
progress_message=f"
|
|
201
|
+
progress_message=f"<em>Executing sub agent with input: {tool_input}</em>",
|
|
202
202
|
active_message_log=active_message_log,
|
|
203
203
|
)
|
|
204
204
|
|
|
@@ -268,7 +268,7 @@ class SubAgentTool(Tool[SubAgentToolConfig]):
|
|
|
268
268
|
|
|
269
269
|
# Update message log entry to completed
|
|
270
270
|
active_message_log = self._create_or_update_message_log(
|
|
271
|
-
progress_message=f"
|
|
271
|
+
progress_message=f"<em>Completed sub agent with input: {tool_input}</em>",
|
|
272
272
|
status=MessageLogStatus.COMPLETED,
|
|
273
273
|
active_message_log=active_message_log,
|
|
274
274
|
)
|
|
@@ -9,7 +9,6 @@ from openai.types.responses import (
|
|
|
9
9
|
ResponseIncludable,
|
|
10
10
|
ResponseInputItemParam,
|
|
11
11
|
ResponseInputParam,
|
|
12
|
-
ResponseOutputItem,
|
|
13
12
|
ResponseTextConfigParam,
|
|
14
13
|
ToolParam,
|
|
15
14
|
response_create_params,
|
|
@@ -50,6 +49,8 @@ from unique_toolkit.language_model.schemas import (
|
|
|
50
49
|
LanguageModelToolMessage,
|
|
51
50
|
LanguageModelUserMessage,
|
|
52
51
|
ResponsesLanguageModelStreamResponse,
|
|
52
|
+
ResponsesMessageInput,
|
|
53
|
+
ResponsesMessageSequence,
|
|
53
54
|
reasoning_effort_to_openai,
|
|
54
55
|
)
|
|
55
56
|
|
|
@@ -101,9 +102,7 @@ def _convert_to_specific_message(
|
|
|
101
102
|
|
|
102
103
|
|
|
103
104
|
def _convert_messages_to_openai(
|
|
104
|
-
messages:
|
|
105
|
-
ResponseInputItemParam | LanguageModelMessageOptions | ResponseOutputItem
|
|
106
|
-
],
|
|
105
|
+
messages: ResponsesMessageSequence,
|
|
107
106
|
) -> ResponseInputParam:
|
|
108
107
|
res = []
|
|
109
108
|
for message in messages:
|
|
@@ -121,11 +120,7 @@ def _convert_messages_to_openai(
|
|
|
121
120
|
|
|
122
121
|
|
|
123
122
|
def convert_messages_to_openai(
|
|
124
|
-
messages:
|
|
125
|
-
| LanguageModelMessages
|
|
126
|
-
| Sequence[
|
|
127
|
-
ResponseInputItemParam | LanguageModelMessageOptions | ResponseOutputItem
|
|
128
|
-
],
|
|
123
|
+
messages: ResponsesMessageInput,
|
|
129
124
|
) -> str | list[ResponseInputItemParam]:
|
|
130
125
|
if isinstance(messages, str):
|
|
131
126
|
return messages
|
|
@@ -149,11 +144,7 @@ def _prepare_responses_params_util(
|
|
|
149
144
|
content_chunks: list[ContentChunk] | None,
|
|
150
145
|
temperature: float,
|
|
151
146
|
tools: Sequence[LanguageModelToolDescription | ToolParam] | None,
|
|
152
|
-
messages:
|
|
153
|
-
| LanguageModelMessages
|
|
154
|
-
| Sequence[
|
|
155
|
-
ResponseInputItemParam | LanguageModelMessageOptions | ResponseOutputItem
|
|
156
|
-
],
|
|
147
|
+
messages: ResponsesMessageInput,
|
|
157
148
|
reasoning: Reasoning | None,
|
|
158
149
|
text: ResponseTextConfigParam | None,
|
|
159
150
|
other_options: dict[str, Any] | None = None,
|
|
@@ -463,11 +454,7 @@ def stream_responses_with_references(
|
|
|
463
454
|
chat_id: str,
|
|
464
455
|
assistant_id: str,
|
|
465
456
|
model_name: LanguageModelName | str,
|
|
466
|
-
messages:
|
|
467
|
-
| LanguageModelMessages
|
|
468
|
-
| Sequence[
|
|
469
|
-
ResponseInputItemParam | LanguageModelMessageOptions | ResponseOutputItem
|
|
470
|
-
],
|
|
457
|
+
messages: ResponsesMessageInput,
|
|
471
458
|
content_chunks: list[ContentChunk] | None = None,
|
|
472
459
|
tools: Sequence[LanguageModelToolDescription | ToolParam] | None = None,
|
|
473
460
|
temperature: float = DEFAULT_COMPLETE_TEMPERATURE,
|
|
@@ -531,11 +518,7 @@ async def stream_responses_with_references_async(
|
|
|
531
518
|
chat_id: str,
|
|
532
519
|
assistant_id: str,
|
|
533
520
|
model_name: LanguageModelName | str,
|
|
534
|
-
messages:
|
|
535
|
-
| LanguageModelMessages
|
|
536
|
-
| Sequence[
|
|
537
|
-
ResponseInputItemParam | LanguageModelMessageOptions | ResponseOutputItem
|
|
538
|
-
],
|
|
521
|
+
messages: ResponsesMessageInput,
|
|
539
522
|
content_chunks: list[ContentChunk] | None = None,
|
|
540
523
|
tools: Sequence[LanguageModelToolDescription | ToolParam] | None = None,
|
|
541
524
|
temperature: float = DEFAULT_COMPLETE_TEMPERATURE,
|
{unique_toolkit-2026.20.0.dev33 → unique_toolkit-2026.20.0.dev35}/unique_toolkit/content/schemas.py
RENAMED
|
@@ -76,6 +76,22 @@ class ContentChunk(BaseModel):
|
|
|
76
76
|
created_at: datetime | None = None
|
|
77
77
|
updated_at: datetime | None = None
|
|
78
78
|
|
|
79
|
+
def to_sdk_reference(
|
|
80
|
+
self,
|
|
81
|
+
sequence_number: int,
|
|
82
|
+
) -> unique_sdk.Message.Reference:
|
|
83
|
+
"""Convert ``ContentChunk`` objects to ``unique_sdk.Message.Reference`` TypedDicts."""
|
|
84
|
+
|
|
85
|
+
return unique_sdk.Message.Reference(
|
|
86
|
+
name=self.title or self.key or self.id or "",
|
|
87
|
+
url=self.url or f"unique://content/{self.id}",
|
|
88
|
+
sequenceNumber=sequence_number + 1,
|
|
89
|
+
sourceId=(f"{self.id}_{self.chunk_id}" if self.chunk_id else self.id or ""),
|
|
90
|
+
source="node-ingestion-chunks",
|
|
91
|
+
description=None,
|
|
92
|
+
originalIndex=[sequence_number + 1],
|
|
93
|
+
)
|
|
94
|
+
|
|
79
95
|
def to_reference(
|
|
80
96
|
self,
|
|
81
97
|
sequence_number: int,
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""Framework-agnostic streaming components.
|
|
2
|
+
|
|
3
|
+
This subpackage exposes streaming behaviour that is useful beyond a single
|
|
4
|
+
third-party framework: event handler contracts, text state payloads, citation
|
|
5
|
+
normalisation, and other provider-neutral primitives. Concrete framework
|
|
6
|
+
adapters live under :mod:`unique_toolkit.experimental.integrations`.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from .common import (
|
|
12
|
+
ActivityProducer,
|
|
13
|
+
ActivityProgressUpdate,
|
|
14
|
+
ActivityStatus,
|
|
15
|
+
AppendixProducer,
|
|
16
|
+
StreamEventHandlerProtocol,
|
|
17
|
+
StreamTextEventHandlerProtocol,
|
|
18
|
+
StreamToolCallEventHandlerProtocol,
|
|
19
|
+
TextFlushed,
|
|
20
|
+
TextState,
|
|
21
|
+
UsageProducer,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
__all__ = [
|
|
25
|
+
"ActivityProducer",
|
|
26
|
+
"ActivityProgressUpdate",
|
|
27
|
+
"ActivityStatus",
|
|
28
|
+
"AppendixProducer",
|
|
29
|
+
"StreamEventHandlerProtocol",
|
|
30
|
+
"StreamTextEventHandlerProtocol",
|
|
31
|
+
"StreamToolCallEventHandlerProtocol",
|
|
32
|
+
"TextFlushed",
|
|
33
|
+
"TextState",
|
|
34
|
+
"UsageProducer",
|
|
35
|
+
]
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"""Framework-agnostic streaming event handler types and lifecycle contract.
|
|
2
|
+
|
|
3
|
+
These types are **framework-agnostic** on purpose: they live in the
|
|
4
|
+
toolkit's domain-layer ``protocols`` package so alternative framework
|
|
5
|
+
adapters (future providers beyond OpenAI) can realize the same event handler
|
|
6
|
+
shape without pulling in OpenAI-specific imports. Concrete, OpenAI-typed
|
|
7
|
+
event handler protocols live next to their implementations under
|
|
8
|
+
``unique_toolkit.experimental.integrations.openai.streaming.event_routing.protocols``.
|
|
9
|
+
|
|
10
|
+
This module declares:
|
|
11
|
+
|
|
12
|
+
* The lifecycle contract every streaming event handler realizes
|
|
13
|
+
(:class:`StreamEventHandlerProtocol`) plus the accumulated-text value
|
|
14
|
+
(:class:`TextState`).
|
|
15
|
+
* Role-shaped base protocols that group members shared by every
|
|
16
|
+
implementation of a role, regardless of the underlying API:
|
|
17
|
+
:class:`StreamTextEventHandlerProtocol` for text accumulators and
|
|
18
|
+
:class:`StreamToolCallEventHandlerProtocol` for tool-call accumulators.
|
|
19
|
+
Framework-specific subprotocols only add the vendor-typed consumer
|
|
20
|
+
methods (e.g. ``on_chunk`` / ``on_text_delta``).
|
|
21
|
+
* Event-handler bus payload dataclasses (:class:`TextFlushed`,
|
|
22
|
+
:class:`ActivityProgressUpdate`) — carried on per-event handler
|
|
23
|
+
:class:`TypedEventBus` instances, adapted by the orchestrator onto the
|
|
24
|
+
outer :class:`StreamEventBus`.
|
|
25
|
+
* Structural capability protocols event routing aggregate across event handlers
|
|
26
|
+
(:class:`AppendixProducer`, :class:`ActivityProducer`,
|
|
27
|
+
:class:`UsageProducer`).
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
from __future__ import annotations
|
|
31
|
+
|
|
32
|
+
from dataclasses import dataclass
|
|
33
|
+
from typing import TYPE_CHECKING, Literal, Protocol, runtime_checkable
|
|
34
|
+
|
|
35
|
+
if TYPE_CHECKING:
|
|
36
|
+
from unique_toolkit._common.event_bus import TypedEventBus
|
|
37
|
+
from unique_toolkit.language_model.schemas import (
|
|
38
|
+
LanguageModelFunction,
|
|
39
|
+
LanguageModelTokenUsage,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
ActivityStatus = Literal["RUNNING", "COMPLETED", "FAILED"]
|
|
43
|
+
"""Lifecycle state of a tool-like activity exposed to subscribers.
|
|
44
|
+
|
|
45
|
+
Framework-agnostic: the values describe observable progress (running,
|
|
46
|
+
finished, failed) without coupling to any vendor's event taxonomy. Lives
|
|
47
|
+
with :class:`ActivityProgressUpdate` because one is the type of the
|
|
48
|
+
other's ``status`` field.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@dataclass
|
|
53
|
+
class TextState:
|
|
54
|
+
"""Accumulated assistant text: normalised (``full_text``) and raw model output (``original_text``)."""
|
|
55
|
+
|
|
56
|
+
full_text: str
|
|
57
|
+
original_text: str
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class StreamEventHandlerProtocol(Protocol):
|
|
61
|
+
"""Lifecycle methods shared by every event handler (any OpenAI streaming surface).
|
|
62
|
+
|
|
63
|
+
Event handlers that need to surface per-event signals (text flushes, tool
|
|
64
|
+
activity progress, …) expose an event-handler-owned :class:`TypedEventBus`
|
|
65
|
+
instead of returning a signal from their lifecycle methods — see
|
|
66
|
+
:class:`TextFlushed` / :class:`ActivityProgressUpdate` for payloads.
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
async def on_stream_end(self) -> None:
|
|
70
|
+
"""Finalize after the stream is exhausted (flush buffers, release resources)."""
|
|
71
|
+
...
|
|
72
|
+
|
|
73
|
+
def reset(self) -> None:
|
|
74
|
+
"""Clear all per-run state for reuse."""
|
|
75
|
+
...
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
@dataclass(frozen=True, slots=True)
|
|
79
|
+
class TextFlushed:
|
|
80
|
+
"""The text event handler crossed a flush boundary.
|
|
81
|
+
|
|
82
|
+
Carried on the event-handler-owned :class:`TypedEventBus` so subscribers
|
|
83
|
+
(typically the orchestrator) can adapt it into a full :class:`TextUpdate`
|
|
84
|
+
by attaching request context (``message_id`` / ``chat_id``). The
|
|
85
|
+
payload mirrors the event handler's current :meth:`get_text` state at the
|
|
86
|
+
moment of the flush.
|
|
87
|
+
|
|
88
|
+
Flush boundaries combine two concerns: replacer hold-back release
|
|
89
|
+
(e.g. a partial ``[source`` pattern finishing into ``[source1]``) and
|
|
90
|
+
throttling (e.g. ``send_every_n_events`` on the Chat Completions
|
|
91
|
+
event handler). The event handler stays ignorant of the outer bus and identity
|
|
92
|
+
context — it only reports "now is a good time to publish".
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
full_text: str
|
|
96
|
+
original_text: str
|
|
97
|
+
chunk_index: int | None = None
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
@dataclass(frozen=True, slots=True)
|
|
101
|
+
class ActivityProgressUpdate:
|
|
102
|
+
"""Event-handler-local description of a single tool-activity progress transition.
|
|
103
|
+
|
|
104
|
+
Carried on the event-handler-owned :class:`TypedEventBus` so the orchestrator
|
|
105
|
+
can adapt it into an :class:`ActivityProgress` outer-bus event by
|
|
106
|
+
attaching ``message_id`` / ``chat_id``. Event handlers that participate in
|
|
107
|
+
tool-activity tracking publish one of these per genuine state change
|
|
108
|
+
(deduplicated at the event handler level).
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
correlation_id: str
|
|
112
|
+
status: ActivityStatus
|
|
113
|
+
text: str
|
|
114
|
+
order: int = 0
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
@runtime_checkable
|
|
118
|
+
class AppendixProducer(Protocol):
|
|
119
|
+
"""Optional capability: the event handler contributes to the final assistant message.
|
|
120
|
+
|
|
121
|
+
When present, the event routing aggregates appendices across event handlers and
|
|
122
|
+
attaches the tuple to :class:`StreamEnded`, so the message persister
|
|
123
|
+
writes ``full_text + "".join(appendices)`` in a single round-trip. A
|
|
124
|
+
return value of ``None`` means "nothing to append this run".
|
|
125
|
+
"""
|
|
126
|
+
|
|
127
|
+
def get_appendix(self) -> str | None:
|
|
128
|
+
"""Return the text to append, or ``None`` if this run contributed nothing."""
|
|
129
|
+
...
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
@runtime_checkable
|
|
133
|
+
class ActivityProducer(Protocol):
|
|
134
|
+
"""Optional capability: the event handler reports tool-activity progress.
|
|
135
|
+
|
|
136
|
+
Realizers expose an event-handler-owned :class:`TypedEventBus` publishing
|
|
137
|
+
:class:`ActivityProgressUpdate` payloads on each genuine state
|
|
138
|
+
transition (deduplicated at the event handler level). The orchestrator
|
|
139
|
+
subscribes to this bus and adapts the updates onto the outer
|
|
140
|
+
:class:`StreamEventBus` by attaching request context. Mirrors
|
|
141
|
+
:class:`AppendixProducer` in spirit: both are named capabilities the
|
|
142
|
+
event routing discovers on event handlers at wire-up time.
|
|
143
|
+
"""
|
|
144
|
+
|
|
145
|
+
@property
|
|
146
|
+
def activity_bus(self) -> TypedEventBus[ActivityProgressUpdate]:
|
|
147
|
+
"""Event-handler-owned bus publishing progress updates per state transition."""
|
|
148
|
+
...
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
@runtime_checkable
|
|
152
|
+
class UsageProducer(Protocol):
|
|
153
|
+
"""Optional capability: the event handler exposes token usage for a completed stream.
|
|
154
|
+
|
|
155
|
+
Different streaming APIs surface usage in different places (for example,
|
|
156
|
+
Responses has a completed event while other APIs may attach usage to a
|
|
157
|
+
terminal chunk). This capability lets provider-specific event handlers expose
|
|
158
|
+
the normalized toolkit usage shape without coupling the base lifecycle
|
|
159
|
+
protocol to token accounting.
|
|
160
|
+
"""
|
|
161
|
+
|
|
162
|
+
def get_usage(self) -> LanguageModelTokenUsage | None:
|
|
163
|
+
"""Return normalized token usage, or ``None`` when unavailable."""
|
|
164
|
+
...
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
class StreamTextEventHandlerProtocol(StreamEventHandlerProtocol, Protocol):
|
|
168
|
+
"""Base contract for any event handler that accumulates assistant text from a stream.
|
|
169
|
+
|
|
170
|
+
Captures the role members shared by every text event handler regardless of
|
|
171
|
+
the upstream API: an event-handler-owned :class:`TypedEventBus` publishing
|
|
172
|
+
:class:`TextFlushed` at flush boundaries, plus :meth:`get_text` for
|
|
173
|
+
inspecting the accumulated state. Framework-specific subprotocols
|
|
174
|
+
add only the vendor-typed consumer method (e.g.
|
|
175
|
+
``on_chunk(ChatCompletionChunk)`` for Chat Completions,
|
|
176
|
+
``on_text_delta(ResponseTextDeltaEvent)`` for Responses).
|
|
177
|
+
|
|
178
|
+
Pure state machine by design: no SDK, no outer bus, no knowledge of
|
|
179
|
+
retrieved chunks — subscribers (typically the orchestrator) adapt
|
|
180
|
+
:class:`TextFlushed` into full :class:`TextUpdate` events by attaching
|
|
181
|
+
request context.
|
|
182
|
+
"""
|
|
183
|
+
|
|
184
|
+
@property
|
|
185
|
+
def text_bus(self) -> TypedEventBus[TextFlushed]:
|
|
186
|
+
"""Event-handler-owned bus publishing :class:`TextFlushed` at flush boundaries."""
|
|
187
|
+
...
|
|
188
|
+
|
|
189
|
+
def get_text(self) -> TextState:
|
|
190
|
+
"""Return accumulated normalised and original text."""
|
|
191
|
+
...
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
class StreamToolCallEventHandlerProtocol(StreamEventHandlerProtocol, Protocol):
|
|
195
|
+
"""Base contract for any event handler that accumulates tool calls from a stream.
|
|
196
|
+
|
|
197
|
+
Captures the role members shared by every tool-call event handler
|
|
198
|
+
regardless of the upstream API: :meth:`get_tool_calls` returns the
|
|
199
|
+
accumulated list of :class:`LanguageModelFunction`. Framework-specific
|
|
200
|
+
subprotocols add only the vendor-typed consumer method(s) (e.g.
|
|
201
|
+
``on_chunk(ChatCompletionChunk)`` for Chat Completions, or the pair
|
|
202
|
+
``on_output_item_added`` / ``on_function_arguments_done`` for
|
|
203
|
+
Responses).
|
|
204
|
+
"""
|
|
205
|
+
|
|
206
|
+
def get_tool_calls(self) -> list[LanguageModelFunction]:
|
|
207
|
+
"""Return the list of tool calls observed so far, in arrival order."""
|
|
208
|
+
...
|