unique_toolkit 1.3.2__tar.gz → 1.4.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.3.2 → unique_toolkit-1.4.0}/CHANGELOG.md +6 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/PKG-INFO +7 -1
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/pyproject.toml +1 -1
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/evaluation/schemas.py +1 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/a2a/config.py +6 -0
- unique_toolkit-1.4.0/unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +6 -0
- unique_toolkit-1.4.0/unique_toolkit/agentic/tools/a2a/evaluation/config.py +38 -0
- unique_toolkit-1.4.0/unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +175 -0
- unique_toolkit-1.4.0/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +9 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/a2a/service.py +6 -1
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/test/test_mcp_manager.py +2 -2
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/tool_manager.py +1 -5
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/LICENSE +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/README.md +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/__init__.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/_base_service.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/_time_utils.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/api_calling/human_verification_manager.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/base_model_type_attribute.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/chunk_relevancy_sorter/config.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/chunk_relevancy_sorter/exception.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/chunk_relevancy_sorter/service.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/default_language_model.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/endpoint_builder.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/endpoint_requestor.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/exception.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/feature_flags/schema.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/pydantic/rjsf_tags.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/pydantic_helpers.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/string_utilities.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/token/image_token_counting.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/token/token_counting.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/utils/__init__.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/utils/structured_output/__init__.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/utils/structured_output/schema.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/utils/write_configuration.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/validate_required_values.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/validators.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/__init__.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/evaluation/config.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/evaluation/context_relevancy/prompts.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/evaluation/context_relevancy/schema.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/evaluation/context_relevancy/service.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/evaluation/evaluation_manager.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/evaluation/exception.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/evaluation/hallucination/constants.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/evaluation/hallucination/prompts.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/evaluation/hallucination/service.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/evaluation/hallucination/utils.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/evaluation/output_parser.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/evaluation/tests/test_output_parser.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/history_manager/history_construction_with_contents.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/history_manager/history_manager.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/history_manager/loop_token_reducer.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/history_manager/utils.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/postprocessor/postprocessor_manager.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/reference_manager/reference_manager.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/thinking_manager/thinking_manager.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/__init__.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/a2a/__init__.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/a2a/manager.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/a2a/memory.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/a2a/postprocessing/display.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/a2a/postprocessing/postprocessor.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/a2a/schema.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/config.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/factory.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/mcp/__init__.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/mcp/manager.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/mcp/models.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/schemas.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/tool.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/tool_progress_reporter.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/utils/__init__.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/utils/execution/__init__.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/utils/execution/execution.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/utils/source_handling/schema.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/app/__init__.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/app/dev_util.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/app/init_logging.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/app/init_sdk.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/app/performance/async_tasks.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/app/performance/async_wrapper.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/app/schemas.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/app/unique_settings.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/app/verification.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/chat/__init__.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/chat/constants.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/chat/functions.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/chat/schemas.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/chat/service.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/chat/state.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/chat/utils.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/content/__init__.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/content/constants.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/content/functions.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/content/schemas.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/content/service.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/content/utils.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/embedding/__init__.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/embedding/constants.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/embedding/functions.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/embedding/schemas.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/embedding/service.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/embedding/utils.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/framework_utilities/__init__.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/framework_utilities/openai/__init__.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/framework_utilities/openai/client.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/framework_utilities/utils.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/language_model/__init__.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/language_model/builder.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/language_model/constants.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/language_model/functions.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/language_model/infos.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/language_model/prompt.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/language_model/reference.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/language_model/schemas.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/language_model/service.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/language_model/utils.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/protocols/support.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/short_term_memory/__init__.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/short_term_memory/constants.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/short_term_memory/functions.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/short_term_memory/schemas.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/short_term_memory/service.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/smart_rules/__init__.py +0 -0
- {unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/smart_rules/compile.py +0 -0
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
7
7
|
|
8
|
+
## [1.4.0] - 2025-09-29
|
9
|
+
- Add ability to consolidate sub agent's assessments.
|
10
|
+
|
11
|
+
## [1.3.3] - 2025-09-30
|
12
|
+
- fix bug in exclusive tools not making them selectable
|
13
|
+
|
8
14
|
## [1.3.2] - 2025-09-29
|
9
15
|
- Auto-update unique settings on event arrival in SSE client
|
10
16
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: unique_toolkit
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.4.0
|
4
4
|
Summary:
|
5
5
|
License: Proprietary
|
6
6
|
Author: Cedric Klinkert
|
@@ -118,6 +118,12 @@ All notable changes to this project will be documented in this file.
|
|
118
118
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
119
119
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
120
120
|
|
121
|
+
## [1.4.0] - 2025-09-29
|
122
|
+
- Add ability to consolidate sub agent's assessments.
|
123
|
+
|
124
|
+
## [1.3.3] - 2025-09-30
|
125
|
+
- fix bug in exclusive tools not making them selectable
|
126
|
+
|
121
127
|
## [1.3.2] - 2025-09-29
|
122
128
|
- Auto-update unique settings on event arrival in SSE client
|
123
129
|
|
@@ -23,6 +23,11 @@ class SubAgentToolDisplayConfig(BaseModel):
|
|
23
23
|
remove_from_history: bool = True
|
24
24
|
|
25
25
|
|
26
|
+
class SubAgentEvaluationConfig(BaseModel):
|
27
|
+
model_config = get_configuration_dict()
|
28
|
+
display_evalution: bool = True
|
29
|
+
|
30
|
+
|
26
31
|
class SubAgentToolConfig(BaseToolConfig):
|
27
32
|
model_config = get_configuration_dict()
|
28
33
|
|
@@ -43,3 +48,4 @@ class SubAgentToolConfig(BaseToolConfig):
|
|
43
48
|
max_wait: float = 120.0
|
44
49
|
|
45
50
|
response_display_config: SubAgentToolDisplayConfig = SubAgentToolDisplayConfig()
|
51
|
+
evaluation_config: SubAgentEvaluationConfig = SubAgentEvaluationConfig()
|
@@ -0,0 +1,38 @@
|
|
1
|
+
from pathlib import Path
|
2
|
+
|
3
|
+
from pydantic import BaseModel, Field
|
4
|
+
|
5
|
+
from unique_toolkit._common.default_language_model import DEFAULT_GPT_4o
|
6
|
+
from unique_toolkit._common.validators import LMI, get_LMI_default_field
|
7
|
+
from unique_toolkit.chat.schemas import (
|
8
|
+
ChatMessageAssessmentType,
|
9
|
+
)
|
10
|
+
|
11
|
+
DEFAULT_EVALUATION_SYSTEM_MESSAGE_TEMPLATE = """
|
12
|
+
You are a through and precise summarization model.
|
13
|
+
You will receive a list of "assessments" of one or more agent(s) response(s).
|
14
|
+
Your task is to give a brief summary (1-10 sentences) of the received assessments, following the following guidelines:
|
15
|
+
1. You must NOT in ANY case state a fact that is not stated in the given assessments.
|
16
|
+
2. You must focus first and foremost on the failing assessments, labeled `RED` below.
|
17
|
+
3. You must mention each agent's name when summarizing its list of assessments.
|
18
|
+
""".strip()
|
19
|
+
|
20
|
+
with open(Path(__file__).parent / "summarization_user_message.j2", "r") as file:
|
21
|
+
DEFAULT_SUMMARIZATION_USER_MESSAGE_TEMPLATE = file.read().strip()
|
22
|
+
|
23
|
+
|
24
|
+
class SubAgentEvaluationConfig(BaseModel):
|
25
|
+
assessment_type: ChatMessageAssessmentType = Field(
|
26
|
+
default=ChatMessageAssessmentType.COMPLIANCE,
|
27
|
+
description="The type of assessment to use in the display.",
|
28
|
+
)
|
29
|
+
|
30
|
+
summarization_model: LMI = get_LMI_default_field(DEFAULT_GPT_4o)
|
31
|
+
summarization_system_message: str = Field(
|
32
|
+
default=DEFAULT_EVALUATION_SYSTEM_MESSAGE_TEMPLATE,
|
33
|
+
description="The system message template for the summarization model.",
|
34
|
+
)
|
35
|
+
summarization_user_message_template: str = Field(
|
36
|
+
default=DEFAULT_SUMMARIZATION_USER_MESSAGE_TEMPLATE,
|
37
|
+
description="The user message template for the summarization model.",
|
38
|
+
)
|
@@ -0,0 +1,175 @@
|
|
1
|
+
import logging
|
2
|
+
from collections import defaultdict
|
3
|
+
from typing import override
|
4
|
+
|
5
|
+
import unique_sdk
|
6
|
+
from jinja2 import Template
|
7
|
+
from typing_extensions import TypedDict
|
8
|
+
|
9
|
+
from unique_toolkit.agentic.evaluation.evaluation_manager import Evaluation
|
10
|
+
from unique_toolkit.agentic.evaluation.schemas import (
|
11
|
+
EvaluationAssessmentMessage,
|
12
|
+
EvaluationMetricName,
|
13
|
+
EvaluationMetricResult,
|
14
|
+
)
|
15
|
+
from unique_toolkit.agentic.tools.a2a.evaluation.config import SubAgentEvaluationConfig
|
16
|
+
from unique_toolkit.agentic.tools.a2a.service import SubAgentTool
|
17
|
+
from unique_toolkit.chat.schemas import (
|
18
|
+
ChatMessageAssessmentLabel,
|
19
|
+
ChatMessageAssessmentStatus,
|
20
|
+
ChatMessageAssessmentType,
|
21
|
+
)
|
22
|
+
from unique_toolkit.language_model.builder import MessagesBuilder
|
23
|
+
from unique_toolkit.language_model.schemas import LanguageModelStreamResponse
|
24
|
+
from unique_toolkit.language_model.service import LanguageModelService
|
25
|
+
|
26
|
+
logger = logging.getLogger(__name__)
|
27
|
+
|
28
|
+
|
29
|
+
class _SubAgentToolInfo(TypedDict):
|
30
|
+
assessment: list[unique_sdk.Space.Assessment] | None
|
31
|
+
display_name: str
|
32
|
+
|
33
|
+
|
34
|
+
class SubAgentsEvaluation(Evaluation):
|
35
|
+
DISPLAY_NAME = "Sub Agents"
|
36
|
+
|
37
|
+
def __init__(
|
38
|
+
self,
|
39
|
+
config: SubAgentEvaluationConfig,
|
40
|
+
sub_agent_tools: list[SubAgentTool],
|
41
|
+
language_model_service: LanguageModelService,
|
42
|
+
):
|
43
|
+
super().__init__(EvaluationMetricName.SUB_AGENT)
|
44
|
+
self._config = config
|
45
|
+
|
46
|
+
self._assistant_id_to_tool_info: dict[str, _SubAgentToolInfo] = {}
|
47
|
+
self._language_model_service = language_model_service
|
48
|
+
|
49
|
+
for sub_agent_tool in sub_agent_tools:
|
50
|
+
if sub_agent_tool.config.evaluation_config.display_evalution:
|
51
|
+
sub_agent_tool.subscribe(self)
|
52
|
+
self._assistant_id_to_tool_info[sub_agent_tool.config.assistant_id] = {
|
53
|
+
"assessment": None,
|
54
|
+
"display_name": sub_agent_tool.display_name(),
|
55
|
+
}
|
56
|
+
|
57
|
+
@override
|
58
|
+
def get_assessment_type(self) -> ChatMessageAssessmentType:
|
59
|
+
return self._config.assessment_type
|
60
|
+
|
61
|
+
@override
|
62
|
+
async def run(
|
63
|
+
self, loop_response: LanguageModelStreamResponse
|
64
|
+
) -> EvaluationMetricResult:
|
65
|
+
logger.info("Running sub agents evaluation")
|
66
|
+
|
67
|
+
sub_agents_display_data = []
|
68
|
+
|
69
|
+
value = ChatMessageAssessmentLabel.GREEN
|
70
|
+
|
71
|
+
label_comparison_dict = defaultdict(
|
72
|
+
lambda: 3
|
73
|
+
) # Unkown labels are highest in the sorting
|
74
|
+
label_comparison_dict[ChatMessageAssessmentLabel.GREEN] = 2
|
75
|
+
label_comparison_dict[ChatMessageAssessmentLabel.YELLOW] = 1
|
76
|
+
label_comparison_dict[ChatMessageAssessmentLabel.RED] = 0
|
77
|
+
|
78
|
+
for assistant_id, tool_info in self._assistant_id_to_tool_info.items():
|
79
|
+
assessments = tool_info["assessment"]
|
80
|
+
if assessments is None or len(assessments) == 0:
|
81
|
+
logger.info("No assessment found for assistant %s", assistant_id)
|
82
|
+
continue
|
83
|
+
|
84
|
+
assessments_display_data = sorted(
|
85
|
+
assessments, key=lambda x: label_comparison_dict[x["label"]]
|
86
|
+
)
|
87
|
+
|
88
|
+
for assessment in assessments:
|
89
|
+
if label := assessment["label"]:
|
90
|
+
if label not in ChatMessageAssessmentLabel:
|
91
|
+
logger.warning(
|
92
|
+
"Unkown assistant label %s for assistant %s will be ignored",
|
93
|
+
label,
|
94
|
+
assistant_id,
|
95
|
+
)
|
96
|
+
continue
|
97
|
+
value = min(value, label, key=lambda x: label_comparison_dict[x])
|
98
|
+
|
99
|
+
sub_agents_display_data.append(
|
100
|
+
{
|
101
|
+
"name": tool_info["display_name"],
|
102
|
+
"assessments": assessments_display_data,
|
103
|
+
}
|
104
|
+
)
|
105
|
+
|
106
|
+
should_summarize = False
|
107
|
+
reason = ""
|
108
|
+
|
109
|
+
if len(sub_agents_display_data) > 1:
|
110
|
+
should_summarize = True
|
111
|
+
elif len(sub_agents_display_data) == 1:
|
112
|
+
if len(sub_agents_display_data[0]["assessments"]) > 1:
|
113
|
+
should_summarize = True
|
114
|
+
else:
|
115
|
+
reason = (
|
116
|
+
sub_agents_display_data[0]["assessments"][0]["explanation"] or ""
|
117
|
+
)
|
118
|
+
else:
|
119
|
+
assert False, "No sub agents assessments found"
|
120
|
+
|
121
|
+
if should_summarize:
|
122
|
+
messages = (
|
123
|
+
MessagesBuilder()
|
124
|
+
.system_message_append(self._config.summarization_system_message)
|
125
|
+
.user_message_append(
|
126
|
+
Template(self._config.summarization_user_message_template).render(
|
127
|
+
sub_agents=sub_agents_display_data,
|
128
|
+
)
|
129
|
+
)
|
130
|
+
.build()
|
131
|
+
)
|
132
|
+
|
133
|
+
reason = await self._language_model_service.complete_async(
|
134
|
+
messages=messages,
|
135
|
+
model_name=self._config.summarization_model.name,
|
136
|
+
temperature=0.0,
|
137
|
+
)
|
138
|
+
reason = str(reason.choices[0].message.content)
|
139
|
+
|
140
|
+
return EvaluationMetricResult(
|
141
|
+
name=self.get_name(),
|
142
|
+
value=value,
|
143
|
+
reason=reason,
|
144
|
+
is_positive=value == ChatMessageAssessmentLabel.GREEN,
|
145
|
+
)
|
146
|
+
|
147
|
+
@override
|
148
|
+
async def evaluation_metric_to_assessment(
|
149
|
+
self, evaluation_result: EvaluationMetricResult
|
150
|
+
) -> EvaluationAssessmentMessage:
|
151
|
+
return EvaluationAssessmentMessage(
|
152
|
+
status=ChatMessageAssessmentStatus.DONE,
|
153
|
+
explanation=evaluation_result.reason,
|
154
|
+
title=self.DISPLAY_NAME,
|
155
|
+
label=evaluation_result.value, # type: ignore
|
156
|
+
type=self.get_assessment_type(),
|
157
|
+
)
|
158
|
+
|
159
|
+
def notify_sub_agent_response(
|
160
|
+
self, sub_agent_assistant_id: str, response: unique_sdk.Space.Message
|
161
|
+
) -> None:
|
162
|
+
if sub_agent_assistant_id not in self._assistant_id_to_tool_info:
|
163
|
+
logger.warning(
|
164
|
+
"Unknown assistant id %s received, assessment will be ignored.",
|
165
|
+
sub_agent_assistant_id,
|
166
|
+
)
|
167
|
+
return
|
168
|
+
|
169
|
+
self._assistant_id_to_tool_info[sub_agent_assistant_id]["assessment"] = (
|
170
|
+
response[
|
171
|
+
"assessment"
|
172
|
+
].copy() # Shallow copy as we don't modify individual assessments
|
173
|
+
if response["assessment"] is not None
|
174
|
+
else None
|
175
|
+
)
|
unique_toolkit-1.4.0/unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
Here are the sub_agent(s) assessments:
|
2
|
+
|
3
|
+
{% for sub_agent in sub_agents %}
|
4
|
+
- Agent name: {{ sub_agent.name }}
|
5
|
+
{% for assessment in sub_agent.assessments %}
|
6
|
+
- {{ assessment.title }}: {{ assessment.label }}
|
7
|
+
{{ assessment.explanation }}
|
8
|
+
{% endfor %}
|
9
|
+
{% endfor %}
|
@@ -64,6 +64,7 @@ class SubAgentTool(Tool[SubAgentToolConfig]):
|
|
64
64
|
assistant_id=self.config.assistant_id,
|
65
65
|
)
|
66
66
|
self._subscribers: list[SubAgentResponseSubscriber] = []
|
67
|
+
self._should_run_evaluation = False
|
67
68
|
|
68
69
|
def display_name(self) -> str:
|
69
70
|
return self._display_name
|
@@ -99,7 +100,7 @@ class SubAgentTool(Tool[SubAgentToolConfig]):
|
|
99
100
|
return self.config.tool_format_information_for_user_prompt
|
100
101
|
|
101
102
|
def evaluation_check_list(self) -> list[EvaluationMetricName]:
|
102
|
-
return []
|
103
|
+
return [EvaluationMetricName.SUB_AGENT] if self._should_run_evaluation else []
|
103
104
|
|
104
105
|
def get_evaluation_checks_based_on_tool_response(
|
105
106
|
self,
|
@@ -194,6 +195,10 @@ class SubAgentTool(Tool[SubAgentToolConfig]):
|
|
194
195
|
tool_call=tool_call,
|
195
196
|
)
|
196
197
|
|
198
|
+
self._should_run_evaluation = (
|
199
|
+
response["assessment"] is not None and len(response["assessment"]) > 0
|
200
|
+
)
|
201
|
+
|
197
202
|
self._notify_subscribers(response)
|
198
203
|
|
199
204
|
if chat_id is None and self.config.reuse_chat:
|
{unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/test/test_mcp_manager.py
RENAMED
@@ -402,8 +402,8 @@ class TestMCPManager:
|
|
402
402
|
# Should only have the exclusive tool, MCP tools should be ignored
|
403
403
|
tools = tool_manager.get_tools()
|
404
404
|
tool_names = [tool.name for tool in tools]
|
405
|
-
assert "internal_search"
|
406
|
-
assert "mcp_test_tool" in tool_names
|
405
|
+
assert "internal_search" in tool_names
|
406
|
+
assert "mcp_test_tool" not in tool_names
|
407
407
|
assert len(tools) == 1
|
408
408
|
|
409
409
|
def test_init_tools_with_disabled_tool_config(
|
@@ -125,11 +125,7 @@ class ToolManager:
|
|
125
125
|
if len(self._tool_choices) > 0 and t.name not in self._tool_choices:
|
126
126
|
continue
|
127
127
|
# is the tool exclusive and has been choosen by the user?
|
128
|
-
if (
|
129
|
-
t.is_exclusive()
|
130
|
-
and len(tool_choices) > 0
|
131
|
-
and t.name not in tool_choices
|
132
|
-
):
|
128
|
+
if t.is_exclusive() and len(tool_choices) > 0 and t.name in tool_choices:
|
133
129
|
self._tools = [t] # override all other tools
|
134
130
|
break
|
135
131
|
# if the tool is exclusive but no tool choices are given, skip it
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{unique_toolkit-1.3.2 → unique_toolkit-1.4.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.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/default_language_model.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/feature_flags/schema.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/token/image_token_counting.py
RENAMED
File without changes
|
{unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/token/token_counting.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/_common/utils/write_configuration.py
RENAMED
File without changes
|
{unique_toolkit-1.3.2 → unique_toolkit-1.4.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
|
{unique_toolkit-1.3.2 → unique_toolkit-1.4.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
|
{unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/evaluation/output_parser.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/history_manager/utils.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
|
{unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/agent_chunks_hanlder.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/mcp/tool_wrapper.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/tool_progress_reporter.py
RENAMED
File without changes
|
{unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/agentic/tools/utils/__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
|
File without changes
|
{unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/app/performance/async_wrapper.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
|
{unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/framework_utilities/__init__.py
RENAMED
File without changes
|
{unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/framework_utilities/langchain/client.py
RENAMED
File without changes
|
File without changes
|
{unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/framework_utilities/openai/__init__.py
RENAMED
File without changes
|
{unique_toolkit-1.3.2 → unique_toolkit-1.4.0}/unique_toolkit/framework_utilities/openai/client.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
|