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.

@@ -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 react agent's logging.")
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)
@@ -27,6 +27,7 @@ class EvalInputItem(BaseModel):
27
27
  output_obj: typing.Any
28
28
  expected_trajectory: list[IntermediateStep]
29
29
  trajectory: list[IntermediateStep]
30
+ full_dataset_entry: typing.Any
30
31
 
31
32
 
32
33
  class EvalInput(BaseModel):
@@ -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.evaluator_model import EvalInput
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 evaluate(self, eval_input: EvalInput) -> EvalOutput:
47
+ async def evaluate_item(self, item: EvalInputItem) -> EvalOutputItem:
54
48
  """
55
- Evaluates the agent trajectories using trajectory evaluation chain.
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
- async def process_item(item: EvalInputItem) -> tuple[float, dict]:
67
- """
68
- Evaluate a single EvalInputItem asynchronously and return a tuple of-
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
- tqdm_position = TqdmPositionRegistry.claim()
100
- pbar = tqdm(total=len(eval_input.eval_input_items), desc="Evaluating Trajectory", position=tqdm_position)
101
- results = await asyncio.gather(*[wrapped_process(item) for item in eval_input.eval_input_items])
102
- finally:
103
- pbar.close()
104
- TqdmPositionRegistry.release(tqdm_position)
105
-
106
- # Extract scores and reasonings
107
- sample_scores, sample_reasonings = zip(*results) if results else ([], [])
108
-
109
- # Compute average score
110
- avg_score = round(sum(sample_scores) / len(sample_scores), 2) if sample_scores else 0.0
111
-
112
- # Construct EvalOutputItems
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)
@@ -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)
@@ -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
- default_value = field_properties.get("default", ...)
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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiqtoolkit
3
- Version: 1.2.0a20250612
3
+ Version: 1.2.0a20250614
4
4
  Summary: NVIDIA Agent Intelligence toolkit
5
5
  Author: NVIDIA Corporation
6
6
  Maintainer: NVIDIA Corporation
@@ -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=qWY1KmDhpG9AIwM3fO5nsF8zE7lWln5qeLa72sFgUpU,5401
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=cqdGVgHm6tsKk3TwFcFhptxAvcHVlZTOh4bXuBsfCYs,7797
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/evaluator_model.py,sha256=alO8bVoGmvej1LpN5wZ5HG29TSrL4IMWdVcMew8IOzM,1405
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=pfcrFGMmunHS8lG13Rdi0Vf4dw7cTwY0uUN5eOXAA1s,5064
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=XsQK8BPTWLkolRUd5wZtQpUITukLCmE_bOlY2tjFvGs,13844
132
- aiq/eval/tunable_rag_evaluator/register.py,sha256=uV36xONVxQW8qBO_bsvbvZk4-J4IhowxiRKErnYsbzA,2369
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=CoYr6-rt7Go3fhJZHlQg52SfPqHqySaexBxlv4xtRwA,6619
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=HWyYsbpA5IysWWdB3XipWzqCfYUio7cJWymt4TbQKyM,7496
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.0a20250612.dist-info/licenses/LICENSE-3rd-party.txt,sha256=8o7aySJa9CBvFshPcsRdJbczzdNyDGJ8b0J67WRUQ2k,183936
312
- aiqtoolkit-1.2.0a20250612.dist-info/licenses/LICENSE.md,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
313
- aiqtoolkit-1.2.0a20250612.dist-info/METADATA,sha256=1SStcP6v0If09VOfwJk8W0EHi7waeCGhJ8KVMW2Q5-o,20274
314
- aiqtoolkit-1.2.0a20250612.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
315
- aiqtoolkit-1.2.0a20250612.dist-info/entry_points.txt,sha256=gRlPfR5g21t328WNEQ4CcEz80S1sJNS8A7rMDYnzl4A,452
316
- aiqtoolkit-1.2.0a20250612.dist-info/top_level.txt,sha256=fo7AzYcNhZ_tRWrhGumtxwnxMew4xrT1iwouDy_f0Kc,4
317
- aiqtoolkit-1.2.0a20250612.dist-info/RECORD,,
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,,