aiqtoolkit 1.2.0a20250612__py3-none-any.whl → 1.2.0a20250614__py3-none-any.whl
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.
Potentially problematic release.
This version of aiqtoolkit might be problematic. Click here for more details.
- aiq/agent/tool_calling_agent/register.py +1 -1
- aiq/eval/dataset_handler/dataset_handler.py +1 -0
- aiq/eval/evaluator/base_evaluator.py +73 -0
- aiq/eval/evaluator/evaluator_model.py +1 -0
- aiq/eval/trajectory_evaluator/evaluate.py +22 -65
- aiq/eval/tunable_rag_evaluator/evaluate.py +30 -1
- aiq/eval/tunable_rag_evaluator/register.py +2 -0
- aiq/observability/register.py +24 -0
- aiq/tool/mcp/mcp_client.py +12 -1
- {aiqtoolkit-1.2.0a20250612.dist-info → aiqtoolkit-1.2.0a20250614.dist-info}/METADATA +1 -1
- {aiqtoolkit-1.2.0a20250612.dist-info → aiqtoolkit-1.2.0a20250614.dist-info}/RECORD +16 -15
- {aiqtoolkit-1.2.0a20250612.dist-info → aiqtoolkit-1.2.0a20250614.dist-info}/WHEEL +0 -0
- {aiqtoolkit-1.2.0a20250612.dist-info → aiqtoolkit-1.2.0a20250614.dist-info}/entry_points.txt +0 -0
- {aiqtoolkit-1.2.0a20250612.dist-info → aiqtoolkit-1.2.0a20250614.dist-info}/licenses/LICENSE-3rd-party.txt +0 -0
- {aiqtoolkit-1.2.0a20250612.dist-info → aiqtoolkit-1.2.0a20250614.dist-info}/licenses/LICENSE.md +0 -0
- {aiqtoolkit-1.2.0a20250612.dist-info → aiqtoolkit-1.2.0a20250614.dist-info}/top_level.txt +0 -0
|
@@ -38,7 +38,7 @@ class ToolCallAgentWorkflowConfig(FunctionBaseConfig, name="tool_calling_agent")
|
|
|
38
38
|
tool_names: list[FunctionRef] = Field(default_factory=list,
|
|
39
39
|
description="The list of tools to provide to the tool calling agent.")
|
|
40
40
|
llm_name: LLMRef = Field(description="The LLM model to use with the tool calling agent.")
|
|
41
|
-
verbose: bool = Field(default=False, description="Set the verbosity of the
|
|
41
|
+
verbose: bool = Field(default=False, description="Set the verbosity of the tool calling agent's logging.")
|
|
42
42
|
handle_tool_errors: bool = Field(default=True, description="Specify ability to handle tool calling errors.")
|
|
43
43
|
description: str = Field(default="Tool Calling Agent Workflow", description="Description of this functions use.")
|
|
44
44
|
max_iterations: int = Field(default=15, description="Number of tool calls before stoping the tool calling agent.")
|
|
@@ -81,6 +81,7 @@ class DatasetHandler:
|
|
|
81
81
|
output_obj=row.get(self.generated_answer_key, "") if structured else "",
|
|
82
82
|
trajectory=row.get(self.trajectory_key, []) if structured else [],
|
|
83
83
|
expected_trajectory=row.get(self.expected_trajectory_key, []) if structured else [],
|
|
84
|
+
full_dataset_entry=row.to_dict(),
|
|
84
85
|
)
|
|
85
86
|
|
|
86
87
|
# if input dataframe is empty return an empty list
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import asyncio
|
|
17
|
+
from abc import ABC
|
|
18
|
+
from abc import abstractmethod
|
|
19
|
+
|
|
20
|
+
from tqdm import tqdm
|
|
21
|
+
|
|
22
|
+
from aiq.eval.evaluator.evaluator_model import EvalInput
|
|
23
|
+
from aiq.eval.evaluator.evaluator_model import EvalInputItem
|
|
24
|
+
from aiq.eval.evaluator.evaluator_model import EvalOutput
|
|
25
|
+
from aiq.eval.evaluator.evaluator_model import EvalOutputItem
|
|
26
|
+
from aiq.eval.utils.tqdm_position_registry import TqdmPositionRegistry
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class BaseEvaluator(ABC):
|
|
30
|
+
"""
|
|
31
|
+
Base class for custom evaluators.
|
|
32
|
+
|
|
33
|
+
Each custom evaluator must implement the `evaluate_item` method which is used to evaluate a
|
|
34
|
+
single EvalInputItem.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
def __init__(self, max_concurrency: int = 4, tqdm_desc: str = "Evaluating"):
|
|
38
|
+
self.max_concurrency = max_concurrency
|
|
39
|
+
self.semaphore = asyncio.Semaphore(max_concurrency)
|
|
40
|
+
self.tqdm_desc = tqdm_desc
|
|
41
|
+
|
|
42
|
+
@abstractmethod
|
|
43
|
+
async def evaluate_item(self, item: EvalInputItem) -> EvalOutputItem:
|
|
44
|
+
"""Each evaluator must implement this for item-level evaluation"""
|
|
45
|
+
pass
|
|
46
|
+
|
|
47
|
+
async def evaluate(self, eval_input: EvalInput) -> EvalOutput:
|
|
48
|
+
pbar = None
|
|
49
|
+
try:
|
|
50
|
+
tqdm_position = TqdmPositionRegistry.claim()
|
|
51
|
+
pbar = tqdm(total=len(eval_input.eval_input_items), desc=self.tqdm_desc, position=tqdm_position)
|
|
52
|
+
|
|
53
|
+
async def wrapped(item):
|
|
54
|
+
async with self.semaphore:
|
|
55
|
+
try:
|
|
56
|
+
output_item = await self.evaluate_item(item)
|
|
57
|
+
pbar.update(1)
|
|
58
|
+
return output_item
|
|
59
|
+
except Exception as e:
|
|
60
|
+
# If the evaluator fails, return an error item with a score of 0.0
|
|
61
|
+
pbar.update(1)
|
|
62
|
+
return EvalOutputItem(id=item.id, score=0.0, reasoning={"error": f"Evaluator error: {str(e)}"})
|
|
63
|
+
|
|
64
|
+
output_items = await asyncio.gather(*[wrapped(item) for item in eval_input.eval_input_items])
|
|
65
|
+
finally:
|
|
66
|
+
pbar.close()
|
|
67
|
+
TqdmPositionRegistry.release(tqdm_position)
|
|
68
|
+
|
|
69
|
+
# Compute average if possible
|
|
70
|
+
numeric_scores = [item.score for item in output_items if isinstance(item.score, (int, float))]
|
|
71
|
+
avg_score = round(sum(numeric_scores) / len(numeric_scores), 2) if numeric_scores else None
|
|
72
|
+
|
|
73
|
+
return EvalOutput(average_score=avg_score, eval_output_items=output_items)
|
|
@@ -13,24 +13,20 @@
|
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
|
-
import asyncio
|
|
17
16
|
import logging
|
|
18
17
|
|
|
19
18
|
from langchain.evaluation import TrajectoryEvalChain
|
|
20
19
|
from langchain_core.language_models import BaseChatModel
|
|
21
20
|
from langchain_core.tools import BaseTool
|
|
22
|
-
from tqdm import tqdm
|
|
23
21
|
|
|
24
|
-
from aiq.eval.evaluator.
|
|
22
|
+
from aiq.eval.evaluator.base_evaluator import BaseEvaluator
|
|
25
23
|
from aiq.eval.evaluator.evaluator_model import EvalInputItem
|
|
26
|
-
from aiq.eval.evaluator.evaluator_model import EvalOutput
|
|
27
24
|
from aiq.eval.evaluator.evaluator_model import EvalOutputItem
|
|
28
|
-
from aiq.eval.utils.tqdm_position_registry import TqdmPositionRegistry
|
|
29
25
|
|
|
30
26
|
logger = logging.getLogger(__name__)
|
|
31
27
|
|
|
32
28
|
|
|
33
|
-
class TrajectoryEvaluator:
|
|
29
|
+
class TrajectoryEvaluator(BaseEvaluator):
|
|
34
30
|
|
|
35
31
|
def __init__(
|
|
36
32
|
self,
|
|
@@ -38,11 +34,9 @@ class TrajectoryEvaluator:
|
|
|
38
34
|
tools: list[BaseTool] | None = None,
|
|
39
35
|
max_concurrency: int = 8,
|
|
40
36
|
):
|
|
41
|
-
|
|
37
|
+
super().__init__(max_concurrency=max_concurrency, tqdm_desc="Evaluating Trajectory")
|
|
42
38
|
self.llm = llm
|
|
43
39
|
self.tools = tools
|
|
44
|
-
self.max_concurrency = max_concurrency
|
|
45
|
-
self.semaphore = asyncio.Semaphore(self.max_concurrency)
|
|
46
40
|
# Initialize trajectory evaluation chain
|
|
47
41
|
self.traj_eval_chain = TrajectoryEvalChain.from_llm(llm=self.llm,
|
|
48
42
|
tools=self.tools,
|
|
@@ -50,69 +44,32 @@ class TrajectoryEvaluator:
|
|
|
50
44
|
requires_reference=True)
|
|
51
45
|
logger.debug("Trajectory evaluation chain initialized.")
|
|
52
46
|
|
|
53
|
-
async def
|
|
47
|
+
async def evaluate_item(self, item: EvalInputItem) -> EvalOutputItem:
|
|
54
48
|
"""
|
|
55
|
-
|
|
49
|
+
Evaluate a single EvalInputItem and return an EvalOutputItem.
|
|
56
50
|
"""
|
|
57
|
-
|
|
58
|
-
num_records = len(eval_input.eval_input_items)
|
|
59
|
-
logger.info("Running trajectory evaluation with %d records", num_records)
|
|
60
51
|
from aiq.data_models.intermediate_step import IntermediateStepType
|
|
61
52
|
from aiq.eval.intermediate_step_adapter import IntermediateStepAdapter
|
|
62
53
|
|
|
63
54
|
intermediate_step_adapter = IntermediateStepAdapter()
|
|
64
55
|
event_filter = [IntermediateStepType.LLM_END, IntermediateStepType.TOOL_END]
|
|
65
56
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
1. score
|
|
70
|
-
2. reasoning for the score
|
|
71
|
-
"""
|
|
72
|
-
question = item.input_obj
|
|
73
|
-
generated_answer = item.output_obj
|
|
74
|
-
agent_trajectory = intermediate_step_adapter.get_agent_actions(item.trajectory, event_filter)
|
|
75
|
-
try:
|
|
76
|
-
eval_result = await self.traj_eval_chain.aevaluate_agent_trajectory(
|
|
77
|
-
input=question,
|
|
78
|
-
agent_trajectory=agent_trajectory,
|
|
79
|
-
prediction=generated_answer,
|
|
80
|
-
)
|
|
81
|
-
except Exception as e:
|
|
82
|
-
logger.exception("Error evaluating trajectory for question: %s, Error: %s", question, e, exc_info=True)
|
|
83
|
-
return 0.0, f"Error evaluating trajectory: {e}"
|
|
84
|
-
|
|
85
|
-
reasoning = {
|
|
86
|
-
"reasoning": eval_result["reasoning"],
|
|
87
|
-
"trajectory": [(action.model_dump(), output) for (action, output) in agent_trajectory]
|
|
88
|
-
}
|
|
89
|
-
return eval_result["score"], reasoning
|
|
90
|
-
|
|
91
|
-
async def wrapped_process(item: EvalInputItem) -> tuple[float, dict]:
|
|
92
|
-
async with self.semaphore:
|
|
93
|
-
result = await process_item(item)
|
|
94
|
-
pbar.update(1)
|
|
95
|
-
return result
|
|
57
|
+
question = item.input_obj
|
|
58
|
+
generated_answer = item.output_obj
|
|
59
|
+
agent_trajectory = intermediate_step_adapter.get_agent_actions(item.trajectory, event_filter)
|
|
96
60
|
|
|
97
|
-
# Execute all evaluations asynchronously
|
|
98
61
|
try:
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
eval_output_items = [
|
|
114
|
-
EvalOutputItem(id=item.id, score=score, reasoning=reasoning)
|
|
115
|
-
for item, score, reasoning in zip(eval_input.eval_input_items, sample_scores, sample_reasonings)
|
|
116
|
-
]
|
|
117
|
-
|
|
118
|
-
return EvalOutput(average_score=avg_score, eval_output_items=eval_output_items)
|
|
62
|
+
eval_result = await self.traj_eval_chain.aevaluate_agent_trajectory(
|
|
63
|
+
input=question,
|
|
64
|
+
agent_trajectory=agent_trajectory,
|
|
65
|
+
prediction=generated_answer,
|
|
66
|
+
)
|
|
67
|
+
except Exception as e:
|
|
68
|
+
logger.exception("Error evaluating trajectory for question: %s, Error: %s", question, e, exc_info=True)
|
|
69
|
+
return EvalOutputItem(id=item.id, score=0.0, reasoning=f"Error evaluating trajectory: {e}")
|
|
70
|
+
|
|
71
|
+
reasoning = {
|
|
72
|
+
"reasoning": eval_result["reasoning"],
|
|
73
|
+
"trajectory": [(action.model_dump(), output) for (action, output) in agent_trajectory]
|
|
74
|
+
}
|
|
75
|
+
return EvalOutputItem(id=item.id, score=eval_result["score"], reasoning=reasoning)
|
|
@@ -15,12 +15,14 @@
|
|
|
15
15
|
|
|
16
16
|
import asyncio
|
|
17
17
|
import logging
|
|
18
|
+
from typing import Callable
|
|
18
19
|
|
|
19
20
|
from langchain.output_parsers import ResponseSchema
|
|
20
21
|
from langchain.output_parsers import StructuredOutputParser
|
|
21
22
|
from langchain.schema import HumanMessage
|
|
22
23
|
from langchain.schema import SystemMessage
|
|
23
24
|
from langchain_core.language_models import BaseChatModel
|
|
25
|
+
from langchain_core.runnables import RunnableLambda
|
|
24
26
|
from tqdm import tqdm
|
|
25
27
|
|
|
26
28
|
from aiq.eval.evaluator.evaluator_model import EvalInput
|
|
@@ -69,18 +71,45 @@ def evaluation_prompt(judge_llm_prompt: str,
|
|
|
69
71
|
return EVAL_PROMPT if not default_scoring else DEFAULT_EVAL_PROMPT
|
|
70
72
|
|
|
71
73
|
|
|
74
|
+
def runnable_with_retries(original_fn: Callable, llm_retry_control_params: dict | None = None):
|
|
75
|
+
runnable = RunnableLambda(original_fn)
|
|
76
|
+
|
|
77
|
+
if llm_retry_control_params is None:
|
|
78
|
+
llm_retry_control_params = {
|
|
79
|
+
"stop_after_attempt": 3, "initial_backoff_delay_seconds": 1, "has_exponential_jitter": True
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if llm_retry_control_params["has_exponential_jitter"] is None:
|
|
83
|
+
llm_retry_control_params["has_exponential_jitter"] = True
|
|
84
|
+
if llm_retry_control_params["stop_after_attempt"] is None:
|
|
85
|
+
llm_retry_control_params["stop_after_attempt"] = 3
|
|
86
|
+
if llm_retry_control_params["initial_backoff_delay_seconds"] is None:
|
|
87
|
+
llm_retry_control_params["initial_backoff_delay_seconds"] = 1
|
|
88
|
+
|
|
89
|
+
# Add retry logic with exponential backoff and jitter
|
|
90
|
+
return runnable.with_retry(
|
|
91
|
+
retry_if_exception_type=(Exception, ), # Retry on any error
|
|
92
|
+
wait_exponential_jitter=llm_retry_control_params["has_exponential_jitter"], # Add jitter to exponential backoff
|
|
93
|
+
stop_after_attempt=llm_retry_control_params["stop_after_attempt"],
|
|
94
|
+
exponential_jitter_params={"initial": llm_retry_control_params["initial_backoff_delay_seconds"]
|
|
95
|
+
} # Optional: set initial backoff (seconds)
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
|
|
72
99
|
class TunableRagEvaluator:
|
|
73
100
|
'''Tunable RAG evaluator class with customizable LLM prompt for scoring.'''
|
|
74
101
|
|
|
75
102
|
def __init__(self,
|
|
76
103
|
llm: BaseChatModel,
|
|
77
104
|
judge_llm_prompt: str,
|
|
105
|
+
llm_retry_control_params: dict | None,
|
|
78
106
|
max_concurrency: int,
|
|
79
107
|
default_scoring: bool,
|
|
80
108
|
default_score_weights: dict):
|
|
81
109
|
self.llm = llm
|
|
82
110
|
self.max_concurrency = max_concurrency
|
|
83
111
|
self.judge_llm_prompt = judge_llm_prompt
|
|
112
|
+
self.llm_retry_control_params = llm_retry_control_params
|
|
84
113
|
self.semaphore = asyncio.Semaphore(self.max_concurrency)
|
|
85
114
|
self.default_scoring = default_scoring
|
|
86
115
|
# Use user-provided weights if available; otherwise, set equal weights for each score
|
|
@@ -149,7 +178,7 @@ class TunableRagEvaluator:
|
|
|
149
178
|
SystemMessage(content="You must respond only in JSON format."), HumanMessage(content=eval_prompt)
|
|
150
179
|
]
|
|
151
180
|
|
|
152
|
-
response = await self.llm.ainvoke(messages)
|
|
181
|
+
response = await runnable_with_retries(self.llm.ainvoke, self.llm_retry_control_params).ainvoke(messages)
|
|
153
182
|
|
|
154
183
|
# Initialize default values to handle service errors
|
|
155
184
|
coverage_score = 0.0
|
|
@@ -26,6 +26,7 @@ from aiq.data_models.evaluator import EvaluatorBaseConfig
|
|
|
26
26
|
class TunableRagEvaluatorConfig(EvaluatorBaseConfig, name="tunable_rag_evaluator"):
|
|
27
27
|
'''Configuration for tunable RAG evaluator'''
|
|
28
28
|
llm_name: LLMRef = Field(description="Name of the judge LLM")
|
|
29
|
+
llm_retry_control_params: dict | None = Field(description="Parameters to control LLM retry behavior", default=None)
|
|
29
30
|
judge_llm_prompt: str = Field(description="LLM prompt for the judge LLM")
|
|
30
31
|
default_scoring: bool = Field(description="Whether to use default scoring", default=False)
|
|
31
32
|
default_score_weights: dict = Field(
|
|
@@ -43,6 +44,7 @@ async def register_tunable_rag_evaluator(config: TunableRagEvaluatorConfig, buil
|
|
|
43
44
|
llm = await builder.get_llm(config.llm_name, wrapper_type=LLMFrameworkEnum.LANGCHAIN)
|
|
44
45
|
evaluator = TunableRagEvaluator(llm,
|
|
45
46
|
config.judge_llm_prompt,
|
|
47
|
+
config.llm_retry_control_params,
|
|
46
48
|
builder.get_max_concurrency(),
|
|
47
49
|
config.default_scoring,
|
|
48
50
|
config.default_score_weights)
|
aiq/observability/register.py
CHANGED
|
@@ -154,3 +154,27 @@ async def file_logging_method(config: FileLoggingMethod, builder: Builder):
|
|
|
154
154
|
handler = logging.FileHandler(filename=config.path, mode="a", encoding="utf-8")
|
|
155
155
|
handler.setLevel(level)
|
|
156
156
|
yield handler
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
class PatronusTelemetryExporter(TelemetryExporterBaseConfig, name="patronus"):
|
|
160
|
+
"""A telemetry exporter to transmit traces to Patronus service."""
|
|
161
|
+
|
|
162
|
+
endpoint: str = Field(description="The Patronus OTEL endpoint")
|
|
163
|
+
api_key: str = Field(description="The Patronus API key", default="")
|
|
164
|
+
project: str = Field(description="The project name to group the telemetry traces.")
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
@register_telemetry_exporter(config_type=PatronusTelemetryExporter)
|
|
168
|
+
async def patronus_telemetry_exporter(config: PatronusTelemetryExporter, builder: Builder):
|
|
169
|
+
"""Create a Patronus telemetry exporter."""
|
|
170
|
+
trace_exporter = telemetry_optional_import("opentelemetry.exporter.otlp.proto.grpc.trace_exporter")
|
|
171
|
+
|
|
172
|
+
api_key = config.api_key or os.environ.get("PATRONUS_API_KEY")
|
|
173
|
+
if not api_key:
|
|
174
|
+
raise ValueError("API key is required for Patronus")
|
|
175
|
+
|
|
176
|
+
headers = {
|
|
177
|
+
"x-api-key": api_key,
|
|
178
|
+
"pat-project-name": config.project,
|
|
179
|
+
}
|
|
180
|
+
yield trace_exporter.OTLPSpanExporter(endpoint=config.endpoint, headers=headers)
|
aiq/tool/mcp/mcp_client.py
CHANGED
|
@@ -45,6 +45,7 @@ def model_from_mcp_schema(name: str, mcp_input_schema: dict) -> type[BaseModel]:
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
properties = mcp_input_schema.get("properties", {})
|
|
48
|
+
required_fields = set(mcp_input_schema.get("required", []))
|
|
48
49
|
schema_dict = {}
|
|
49
50
|
|
|
50
51
|
def _generate_valid_classname(class_name: str):
|
|
@@ -70,7 +71,17 @@ def model_from_mcp_schema(name: str, mcp_input_schema: dict) -> type[BaseModel]:
|
|
|
70
71
|
else:
|
|
71
72
|
field_type = _type_map.get(json_type, Any)
|
|
72
73
|
|
|
73
|
-
|
|
74
|
+
# Determine the default value based on whether the field is required
|
|
75
|
+
if field_name in required_fields:
|
|
76
|
+
# Field is required - use explicit default if provided, otherwise make it required
|
|
77
|
+
default_value = field_properties.get("default", ...)
|
|
78
|
+
else:
|
|
79
|
+
# Field is optional - use explicit default if provided, otherwise None
|
|
80
|
+
default_value = field_properties.get("default", None)
|
|
81
|
+
# Make the type optional if no default was provided
|
|
82
|
+
if "default" not in field_properties:
|
|
83
|
+
field_type = field_type | None
|
|
84
|
+
|
|
74
85
|
nullable = field_properties.get("nullable", False)
|
|
75
86
|
description = field_properties.get("description", "")
|
|
76
87
|
|
|
@@ -15,7 +15,7 @@ aiq/agent/rewoo_agent/prompt.py,sha256=2XsuI-db_qmH02ypx_IDvi6jTak15cqt_4pZkUv9T
|
|
|
15
15
|
aiq/agent/rewoo_agent/register.py,sha256=MRd2s3nOMYlLzr5Rq5wkl6_HJGhT3im09ylzllyOXT8,8120
|
|
16
16
|
aiq/agent/tool_calling_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
17
|
aiq/agent/tool_calling_agent/agent.py,sha256=U6PD3_fxfdXe6O4WSGC2Hch-Hz_tqvlbiAkpKj7dgkQ,6034
|
|
18
|
-
aiq/agent/tool_calling_agent/register.py,sha256=
|
|
18
|
+
aiq/agent/tool_calling_agent/register.py,sha256=kqcN2uovVBQxrIx5MszBS65opbhBrCRlAw00TlG2i30,5408
|
|
19
19
|
aiq/builder/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
20
|
aiq/builder/builder.py,sha256=JE3uCw6qTmWX2akUfS-Ga5WSiJVTzBjDQPniiONMjy4,7448
|
|
21
21
|
aiq/builder/component_utils.py,sha256=2jIXWSLIlKxDKAO7kdXz_4BHqQNWw4t9GmcQfw0ER4g,12923
|
|
@@ -115,9 +115,10 @@ aiq/eval/runtime_event_subscriber.py,sha256=2VM8MqmPc_EWPxxrDDR9naiioZirkJUfGwzb
|
|
|
115
115
|
aiq/eval/dataset_handler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
116
116
|
aiq/eval/dataset_handler/dataset_downloader.py,sha256=Zvfbd-fPOhB9n8ZiCBaBKW0y-5v97mQAy3dkBL0OFZ0,4553
|
|
117
117
|
aiq/eval/dataset_handler/dataset_filter.py,sha256=mop6wa4P_QtQ5QkfXv-hVBm3EMerfNECSTJGGDB1YWE,2115
|
|
118
|
-
aiq/eval/dataset_handler/dataset_handler.py,sha256=
|
|
118
|
+
aiq/eval/dataset_handler/dataset_handler.py,sha256=z4trKYPnqSrLvsKctU9d5WrQW7ddbZZx0zOrYVLqbAA,7847
|
|
119
119
|
aiq/eval/evaluator/__init__.py,sha256=GUJrgGtpvyMUCjUBvR3faAdv-tZzbU9W-izgx9aMEQg,680
|
|
120
|
-
aiq/eval/evaluator/
|
|
120
|
+
aiq/eval/evaluator/base_evaluator.py,sha256=5kqOcTYNecnh9us_XvV58pj5tZI82NGkVN4tg9-R_ZE,3040
|
|
121
|
+
aiq/eval/evaluator/evaluator_model.py,sha256=5cxe3mqznlNGzv29v_VseYU7OzoT1eTf7hgSPQxytsM,1440
|
|
121
122
|
aiq/eval/rag_evaluator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
122
123
|
aiq/eval/rag_evaluator/evaluate.py,sha256=lEjXKiuELAHyWckz-bM91dZ6AT2J6NC7SfvtedR-Qdk,6548
|
|
123
124
|
aiq/eval/rag_evaluator/register.py,sha256=2NzxkgqyoZ4wC8ARj3tiVoE8ENCmplBCIKrNOFh6_VI,5642
|
|
@@ -125,11 +126,11 @@ aiq/eval/swe_bench_evaluator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
|
|
|
125
126
|
aiq/eval/swe_bench_evaluator/evaluate.py,sha256=kNukRruq1EM1RsGLvpVuC22xcP0gpn9acF3edGak9vY,9858
|
|
126
127
|
aiq/eval/swe_bench_evaluator/register.py,sha256=sTb74F7w4iuI0ROsEJ4bV13Nt1GEWQn7UvO2O0HXwXk,1537
|
|
127
128
|
aiq/eval/trajectory_evaluator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
128
|
-
aiq/eval/trajectory_evaluator/evaluate.py,sha256=
|
|
129
|
+
aiq/eval/trajectory_evaluator/evaluate.py,sha256=Y51KMhJ9t8AoYWrQlrwipc2CtgIXA9IUGZTbKegtsnw,3257
|
|
129
130
|
aiq/eval/trajectory_evaluator/register.py,sha256=kktT4fu5_1Cou-iohD3YhQevsWiR3TA5NpFSweVz0eQ,1709
|
|
130
131
|
aiq/eval/tunable_rag_evaluator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
131
|
-
aiq/eval/tunable_rag_evaluator/evaluate.py,sha256=
|
|
132
|
-
aiq/eval/tunable_rag_evaluator/register.py,sha256=
|
|
132
|
+
aiq/eval/tunable_rag_evaluator/evaluate.py,sha256=xo7gtBI-cOrmk8s6FNLDoMhn2F0ODOxdAtg37i4Vu24,15387
|
|
133
|
+
aiq/eval/tunable_rag_evaluator/register.py,sha256=q4p2rFyMzWmaINJc961ZV4jzIlAN4GfWsoImHo0ovsY,2558
|
|
133
134
|
aiq/eval/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
134
135
|
aiq/eval/utils/output_uploader.py,sha256=SaQbZPkw-Q0H7t5yG60Kh-p1cflR7gPklVkilC4uPbU,5141
|
|
135
136
|
aiq/eval/utils/tqdm_position_registry.py,sha256=9CtpCk1wtYCSyieHPaSp8nlZu6EcNUOaUz2RTqfekrA,1286
|
|
@@ -175,7 +176,7 @@ aiq/meta/module_to_distro.json,sha256=1XV7edobFrdDKvsSoynfodXg_hczUWpDrQzGkW9qqE
|
|
|
175
176
|
aiq/meta/pypi.md,sha256=N1fvWaio3KhnAw9yigeM-oWaLuT5i_C7U_2UVzyPbks,4386
|
|
176
177
|
aiq/observability/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
177
178
|
aiq/observability/async_otel_listener.py,sha256=2Ye9bkHfAssuxFS_ECyRyl-bTa73yYvsPyO4BaK5Beg,19662
|
|
178
|
-
aiq/observability/register.py,sha256=
|
|
179
|
+
aiq/observability/register.py,sha256=mejMBVr3dHHfShIiyn1fIbA0Gb6z9Ayg8WRMgB0wf5E,7646
|
|
179
180
|
aiq/plugins/.namespace,sha256=Gace0pOC3ETEJf-TBVuNw0TQV6J_KtOPpEiSzMH-odo,215
|
|
180
181
|
aiq/profiler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
181
182
|
aiq/profiler/data_frame_row.py,sha256=vudqk1ZzZtlZln2Ir43mPl3nwNc0pQlhwbtdY9oSKtI,1755
|
|
@@ -277,7 +278,7 @@ aiq/tool/github_tools/get_github_issue.py,sha256=vwLNkNOszLlymkQju0cR8BNvfdH4Enm
|
|
|
277
278
|
aiq/tool/github_tools/get_github_pr.py,sha256=b7eCOqrVoejGjRwmUVdU45uF07ihbY8lRacMYOSgMrY,9716
|
|
278
279
|
aiq/tool/github_tools/update_github_issue.py,sha256=TUElxUuzjZr_QldL_48RcqSx0A9b23NB_lA82QwFjkM,4103
|
|
279
280
|
aiq/tool/mcp/__init__.py,sha256=GUJrgGtpvyMUCjUBvR3faAdv-tZzbU9W-izgx9aMEQg,680
|
|
280
|
-
aiq/tool/mcp/mcp_client.py,sha256=
|
|
281
|
+
aiq/tool/mcp/mcp_client.py,sha256=lYbf669ATqGKkL0jjd76r0aAtAFnWeruWw-lOPsmYu8,8103
|
|
281
282
|
aiq/tool/mcp/mcp_tool.py,sha256=rQQcaCT-GHQcDmG5weX-2Y-HxBPX-0cC73LjL1u0FUU,4009
|
|
282
283
|
aiq/tool/memory_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
283
284
|
aiq/tool/memory_tools/add_memory_tool.py,sha256=9EjB3DpYhxwasz7o3O8Rq__Ys5986fciv44ahC6mVCo,3349
|
|
@@ -308,10 +309,10 @@ aiq/utils/reactive/base/observer_base.py,sha256=UAlyAY_ky4q2t0P81RVFo2Bs_R7z5Nde
|
|
|
308
309
|
aiq/utils/reactive/base/subject_base.py,sha256=Ed-AC6P7cT3qkW1EXjzbd5M9WpVoeN_9KCe3OM3FLU4,2521
|
|
309
310
|
aiq/utils/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
310
311
|
aiq/utils/settings/global_settings.py,sha256=U9TCLdoZsKq5qOVGjREipGVv9e-FlStzqy5zv82_VYk,7454
|
|
311
|
-
aiqtoolkit-1.2.
|
|
312
|
-
aiqtoolkit-1.2.
|
|
313
|
-
aiqtoolkit-1.2.
|
|
314
|
-
aiqtoolkit-1.2.
|
|
315
|
-
aiqtoolkit-1.2.
|
|
316
|
-
aiqtoolkit-1.2.
|
|
317
|
-
aiqtoolkit-1.2.
|
|
312
|
+
aiqtoolkit-1.2.0a20250614.dist-info/licenses/LICENSE-3rd-party.txt,sha256=8o7aySJa9CBvFshPcsRdJbczzdNyDGJ8b0J67WRUQ2k,183936
|
|
313
|
+
aiqtoolkit-1.2.0a20250614.dist-info/licenses/LICENSE.md,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
|
|
314
|
+
aiqtoolkit-1.2.0a20250614.dist-info/METADATA,sha256=4jdt6HGMhOX43rgDHWjrVKutpccXZODrtZPAtJuAzfU,20274
|
|
315
|
+
aiqtoolkit-1.2.0a20250614.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
316
|
+
aiqtoolkit-1.2.0a20250614.dist-info/entry_points.txt,sha256=gRlPfR5g21t328WNEQ4CcEz80S1sJNS8A7rMDYnzl4A,452
|
|
317
|
+
aiqtoolkit-1.2.0a20250614.dist-info/top_level.txt,sha256=fo7AzYcNhZ_tRWrhGumtxwnxMew4xrT1iwouDy_f0Kc,4
|
|
318
|
+
aiqtoolkit-1.2.0a20250614.dist-info/RECORD,,
|
|
File without changes
|
{aiqtoolkit-1.2.0a20250612.dist-info → aiqtoolkit-1.2.0a20250614.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
{aiqtoolkit-1.2.0a20250612.dist-info → aiqtoolkit-1.2.0a20250614.dist-info}/licenses/LICENSE.md
RENAMED
|
File without changes
|
|
File without changes
|