aiqtoolkit 1.2.0a20250627__py3-none-any.whl → 1.2.0a20250701__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/data_models/dataset_handler.py +2 -1
- aiq/eval/rag_evaluator/evaluate.py +30 -5
- aiq/eval/rag_evaluator/register.py +6 -2
- aiq/eval/utils/output_uploader.py +10 -1
- aiq/profiler/inference_metrics_model.py +3 -0
- aiq/profiler/profile_runner.py +40 -6
- aiq/tool/mcp/mcp_client.py +10 -0
- aiq/tool/mcp/mcp_tool.py +2 -1
- {aiqtoolkit-1.2.0a20250627.dist-info → aiqtoolkit-1.2.0a20250701.dist-info}/METADATA +1 -1
- {aiqtoolkit-1.2.0a20250627.dist-info → aiqtoolkit-1.2.0a20250701.dist-info}/RECORD +15 -15
- {aiqtoolkit-1.2.0a20250627.dist-info → aiqtoolkit-1.2.0a20250701.dist-info}/WHEEL +0 -0
- {aiqtoolkit-1.2.0a20250627.dist-info → aiqtoolkit-1.2.0a20250701.dist-info}/entry_points.txt +0 -0
- {aiqtoolkit-1.2.0a20250627.dist-info → aiqtoolkit-1.2.0a20250701.dist-info}/licenses/LICENSE-3rd-party.txt +0 -0
- {aiqtoolkit-1.2.0a20250627.dist-info → aiqtoolkit-1.2.0a20250701.dist-info}/licenses/LICENSE.md +0 -0
- {aiqtoolkit-1.2.0a20250627.dist-info → aiqtoolkit-1.2.0a20250701.dist-info}/top_level.txt +0 -0
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
import logging
|
|
17
17
|
from collections.abc import Sequence
|
|
18
18
|
|
|
19
|
+
from pydantic import BaseModel
|
|
19
20
|
from ragas import EvaluationDataset
|
|
20
21
|
from ragas import SingleTurnSample
|
|
21
22
|
from ragas.dataset_schema import EvaluationResult
|
|
@@ -25,6 +26,7 @@ from tqdm import tqdm
|
|
|
25
26
|
|
|
26
27
|
from aiq.data_models.intermediate_step import IntermediateStepType
|
|
27
28
|
from aiq.eval.evaluator.evaluator_model import EvalInput
|
|
29
|
+
from aiq.eval.evaluator.evaluator_model import EvalInputItem
|
|
28
30
|
from aiq.eval.evaluator.evaluator_model import EvalOutput
|
|
29
31
|
from aiq.eval.evaluator.evaluator_model import EvalOutputItem
|
|
30
32
|
from aiq.eval.utils.tqdm_position_registry import TqdmPositionRegistry
|
|
@@ -34,13 +36,36 @@ logger = logging.getLogger(__name__)
|
|
|
34
36
|
|
|
35
37
|
class RAGEvaluator:
|
|
36
38
|
|
|
37
|
-
def __init__(self,
|
|
39
|
+
def __init__(self,
|
|
40
|
+
evaluator_llm: LangchainLLMWrapper,
|
|
41
|
+
metrics: Sequence[Metric],
|
|
42
|
+
max_concurrency=8,
|
|
43
|
+
input_obj_field: str | None = None):
|
|
38
44
|
self.evaluator_llm = evaluator_llm
|
|
39
45
|
self.metrics = metrics
|
|
40
46
|
self.max_concurrency = max_concurrency
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def
|
|
47
|
+
self.input_obj_field = input_obj_field
|
|
48
|
+
|
|
49
|
+
def extract_input_obj(self, item: EvalInputItem) -> str:
|
|
50
|
+
"""Extracts the input object from EvalInputItem based on the configured input_obj_field."""
|
|
51
|
+
input_obj = item.input_obj
|
|
52
|
+
if isinstance(input_obj, BaseModel):
|
|
53
|
+
if self.input_obj_field and hasattr(input_obj, self.input_obj_field):
|
|
54
|
+
# If input_obj_field is specified, return the value of that field
|
|
55
|
+
return str(getattr(input_obj, self.input_obj_field, ""))
|
|
56
|
+
else:
|
|
57
|
+
# If no input_obj_field is specified, return the string representation of the model
|
|
58
|
+
return input_obj.model_dump_json()
|
|
59
|
+
|
|
60
|
+
if isinstance(input_obj, dict):
|
|
61
|
+
# If input_obj is a dict, return the JSON string representation
|
|
62
|
+
if self.input_obj_field and self.input_obj_field in input_obj:
|
|
63
|
+
# If input_obj_field is specified, return the value of that field
|
|
64
|
+
return str(input_obj[self.input_obj_field])
|
|
65
|
+
|
|
66
|
+
return str(input_obj) # Fallback to string representation of the dict
|
|
67
|
+
|
|
68
|
+
def eval_input_to_ragas(self, eval_input: EvalInput) -> EvaluationDataset:
|
|
44
69
|
"""Converts EvalInput into a Ragas-compatible EvaluationDataset."""
|
|
45
70
|
from aiq.eval.intermediate_step_adapter import IntermediateStepAdapter
|
|
46
71
|
event_filter = [IntermediateStepType.TOOL_END, IntermediateStepType.LLM_END, IntermediateStepType.CUSTOM_END]
|
|
@@ -49,7 +74,7 @@ class RAGEvaluator:
|
|
|
49
74
|
intermediate_step_adapter = IntermediateStepAdapter()
|
|
50
75
|
for item in eval_input.eval_input_items:
|
|
51
76
|
# Extract required fields from EvalInputItem
|
|
52
|
-
user_input = item
|
|
77
|
+
user_input = self.extract_input_obj(item) # Extract input object as string
|
|
53
78
|
reference = item.expected_output_obj # Reference correct answer
|
|
54
79
|
response = item.output_obj # Model's generated response
|
|
55
80
|
|
|
@@ -47,6 +47,8 @@ class RagasEvaluatorConfig(EvaluatorBaseConfig, name="ragas"):
|
|
|
47
47
|
# Ragas metric
|
|
48
48
|
metric: str | dict[str, RagasMetricConfig] = Field(default="AnswerAccuracy",
|
|
49
49
|
description="RAGAS metric callable with optional 'kwargs:'")
|
|
50
|
+
input_obj_field: str | None = Field(
|
|
51
|
+
default=None, description="The field in the input object that contains the content to evaluate.")
|
|
50
52
|
|
|
51
53
|
@model_validator(mode="before")
|
|
52
54
|
@classmethod
|
|
@@ -133,7 +135,9 @@ async def register_ragas_evaluator(config: RagasEvaluatorConfig, builder: EvalBu
|
|
|
133
135
|
metrics.append(metric_callable(**kwargs))
|
|
134
136
|
|
|
135
137
|
# Create the RAG evaluator
|
|
136
|
-
_evaluator = RAGEvaluator(evaluator_llm=llm,
|
|
137
|
-
|
|
138
|
+
_evaluator = RAGEvaluator(evaluator_llm=llm,
|
|
139
|
+
metrics=metrics,
|
|
140
|
+
max_concurrency=builder.get_max_concurrency(),
|
|
141
|
+
input_obj_field=config.input_obj_field) if metrics else None
|
|
138
142
|
|
|
139
143
|
yield EvaluatorInfo(config=config, evaluate_fn=evaluate_fn, description="Evaluator for RAGAS metrics")
|
|
@@ -78,9 +78,18 @@ class OutputUploader:
|
|
|
78
78
|
|
|
79
79
|
session = aioboto3.Session()
|
|
80
80
|
try:
|
|
81
|
+
if self.s3_config.endpoint_url:
|
|
82
|
+
region_name = None
|
|
83
|
+
endpoint_url = self.s3_config.endpoint_url
|
|
84
|
+
elif self.s3_config.region_name:
|
|
85
|
+
region_name = self.s3_config.region_name
|
|
86
|
+
endpoint_url = None
|
|
87
|
+
else:
|
|
88
|
+
raise ValueError("No endpoint_url or region_name provided in the config: eval.general.output.s3")
|
|
81
89
|
async with session.client(
|
|
82
90
|
"s3",
|
|
83
|
-
endpoint_url=
|
|
91
|
+
endpoint_url=endpoint_url,
|
|
92
|
+
region_name=region_name,
|
|
84
93
|
aws_access_key_id=self.s3_config.access_key,
|
|
85
94
|
aws_secret_access_key=self.s3_config.secret_key,
|
|
86
95
|
) as s3_client:
|
|
@@ -23,3 +23,6 @@ class InferenceMetricsModel(BaseModel):
|
|
|
23
23
|
ninetieth_interval: tuple[float, float] = Field(default=(0, 0), description="90% confidence interval")
|
|
24
24
|
ninety_fifth_interval: tuple[float, float] = Field(default=(0, 0), description="95% confidence interval")
|
|
25
25
|
ninety_ninth_interval: tuple[float, float] = Field(default=(0, 0), description="99% confidence interval")
|
|
26
|
+
p90: float = Field(default=0, description="90th percentile of the samples")
|
|
27
|
+
p95: float = Field(default=0, description="95th percentile of the samples")
|
|
28
|
+
p99: float = Field(default=0, description="99th percentile of the samples")
|
aiq/profiler/profile_runner.py
CHANGED
|
@@ -394,7 +394,8 @@ class ProfilerRunner:
|
|
|
394
394
|
|
|
395
395
|
def _compute_confidence_intervals(self, data: list[float], metric_name: str) -> InferenceMetricsModel:
|
|
396
396
|
"""
|
|
397
|
-
Helper to compute 90, 95, 99% confidence intervals
|
|
397
|
+
Helper to compute 90, 95, 99 % confidence intervals **and** the empirical
|
|
398
|
+
90th/95th/99th percentiles (p90/p95/p99) for the mean of a dataset.
|
|
398
399
|
Uses a z-score from the normal approximation for large samples.
|
|
399
400
|
|
|
400
401
|
Returns a dict like::
|
|
@@ -412,11 +413,16 @@ class ProfilerRunner:
|
|
|
412
413
|
n = len(data)
|
|
413
414
|
mean_val = statistics.mean(data)
|
|
414
415
|
if n <= 1:
|
|
415
|
-
return InferenceMetricsModel(
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
416
|
+
return InferenceMetricsModel(
|
|
417
|
+
n=n,
|
|
418
|
+
mean=mean_val,
|
|
419
|
+
ninetieth_interval=(mean_val, mean_val),
|
|
420
|
+
ninety_fifth_interval=(mean_val, mean_val),
|
|
421
|
+
ninety_ninth_interval=(mean_val, mean_val),
|
|
422
|
+
p90=mean_val,
|
|
423
|
+
p95=mean_val,
|
|
424
|
+
p99=mean_val,
|
|
425
|
+
)
|
|
420
426
|
|
|
421
427
|
stdev_val = statistics.pstdev(data) # population stdev or use stdev for sample
|
|
422
428
|
# standard error
|
|
@@ -433,4 +439,32 @@ class ProfilerRunner:
|
|
|
433
439
|
# Optionally, store more info
|
|
434
440
|
intervals["n"] = n
|
|
435
441
|
intervals["mean"] = mean_val
|
|
442
|
+
|
|
443
|
+
# ------------------------------------------------------------------
|
|
444
|
+
# Percentiles
|
|
445
|
+
# ------------------------------------------------------------------
|
|
446
|
+
sorted_data = sorted(data)
|
|
447
|
+
|
|
448
|
+
def _percentile(arr: list[float], pct: float) -> float:
|
|
449
|
+
"""
|
|
450
|
+
Linear interpolation between closest ranks.
|
|
451
|
+
pct is given from 0‑100 (e.g. 90 for p90).
|
|
452
|
+
"""
|
|
453
|
+
if not arr:
|
|
454
|
+
return 0.0
|
|
455
|
+
k = (len(arr) - 1) * (pct / 100.0)
|
|
456
|
+
f = math.floor(k)
|
|
457
|
+
c = math.ceil(k)
|
|
458
|
+
if f == c:
|
|
459
|
+
return arr[int(k)]
|
|
460
|
+
return arr[f] + (arr[c] - arr[f]) * (k - f)
|
|
461
|
+
|
|
462
|
+
p90_val = _percentile(sorted_data, 90)
|
|
463
|
+
p95_val = _percentile(sorted_data, 95)
|
|
464
|
+
p99_val = _percentile(sorted_data, 99)
|
|
465
|
+
|
|
466
|
+
intervals["p90"] = p90_val
|
|
467
|
+
intervals["p95"] = p95_val
|
|
468
|
+
intervals["p99"] = p99_val
|
|
469
|
+
|
|
436
470
|
return InferenceMetricsModel(**intervals)
|
aiq/tool/mcp/mcp_client.py
CHANGED
|
@@ -68,6 +68,16 @@ def model_from_mcp_schema(name: str, mcp_input_schema: dict) -> type[BaseModel]:
|
|
|
68
68
|
else:
|
|
69
69
|
item_type = _type_map.get(item_properties.get("type", "string"), Any)
|
|
70
70
|
field_type = list[item_type]
|
|
71
|
+
elif isinstance(json_type, list):
|
|
72
|
+
field_type = None
|
|
73
|
+
for t in json_type:
|
|
74
|
+
mapped = _type_map.get(t, Any)
|
|
75
|
+
field_type = mapped if field_type is None else field_type | mapped
|
|
76
|
+
|
|
77
|
+
return field_type, Field(
|
|
78
|
+
default=field_properties.get("default", None if "null" in json_type else ...),
|
|
79
|
+
description=field_properties.get("description", "")
|
|
80
|
+
)
|
|
71
81
|
else:
|
|
72
82
|
field_type = _type_map.get(json_type, Any)
|
|
73
83
|
|
aiq/tool/mcp/mcp_tool.py
CHANGED
|
@@ -75,7 +75,8 @@ async def mcp_tool(config: MCPToolConfig, builder: Builder): # pylint: disable=
|
|
|
75
75
|
return await tool.acall(args)
|
|
76
76
|
|
|
77
77
|
_ = tool.input_schema.model_validate(kwargs)
|
|
78
|
-
|
|
78
|
+
filtered_kwargs = {k: v for k, v in kwargs.items() if v is not None}
|
|
79
|
+
return await tool.acall(filtered_kwargs)
|
|
79
80
|
except Exception as e:
|
|
80
81
|
if config.return_exception:
|
|
81
82
|
if tool_input:
|
|
@@ -79,7 +79,7 @@ aiq/data_models/common.py,sha256=G63rUXvDAtK6p1SrRyH0VlHGqrDgCZVVjbnzgGSl2Ic,421
|
|
|
79
79
|
aiq/data_models/component.py,sha256=x6jm1Fhn1k1hGu-5AjM0ywuyvs6ztaZfapD8bLUXSqc,1469
|
|
80
80
|
aiq/data_models/component_ref.py,sha256=GyyIf4k80aUIn6LV9r84m5imbiVhpdaY7uKMMpYpbzU,3872
|
|
81
81
|
aiq/data_models/config.py,sha256=ERLjZY0iqexZ-gSXsCSN1UqgNeiwkEjWdYJEdKqeYTY,14116
|
|
82
|
-
aiq/data_models/dataset_handler.py,sha256=
|
|
82
|
+
aiq/data_models/dataset_handler.py,sha256=liMB3xRohkr4VTMmNWPvWi9qhbhlJQfQK36g5Rknweo,4027
|
|
83
83
|
aiq/data_models/discovery_metadata.py,sha256=OcITQc5VeML4bTHurrsMNiK_oB3z7wudMxcyN7LI8pY,12785
|
|
84
84
|
aiq/data_models/embedder.py,sha256=0v917IiohVA_7zdF7hoO_zQcmNe4hQEFhh4fxRiYBbk,940
|
|
85
85
|
aiq/data_models/evaluate.py,sha256=WBeABZsIa6W04MPj24SRu4s-ty2PkJ7_4SLojXmj5Pk,4704
|
|
@@ -121,8 +121,8 @@ aiq/eval/evaluator/__init__.py,sha256=GUJrgGtpvyMUCjUBvR3faAdv-tZzbU9W-izgx9aMEQ
|
|
|
121
121
|
aiq/eval/evaluator/base_evaluator.py,sha256=5kqOcTYNecnh9us_XvV58pj5tZI82NGkVN4tg9-R_ZE,3040
|
|
122
122
|
aiq/eval/evaluator/evaluator_model.py,sha256=5cxe3mqznlNGzv29v_VseYU7OzoT1eTf7hgSPQxytsM,1440
|
|
123
123
|
aiq/eval/rag_evaluator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
124
|
-
aiq/eval/rag_evaluator/evaluate.py,sha256=
|
|
125
|
-
aiq/eval/rag_evaluator/register.py,sha256=
|
|
124
|
+
aiq/eval/rag_evaluator/evaluate.py,sha256=S767ouF5FUFze9jhUyqAPG2aOKzVS_VnAkP4ppE1aNg,7837
|
|
125
|
+
aiq/eval/rag_evaluator/register.py,sha256=vmUxgMJsI42scapLFLvFI6oqXgu9Rl_XhiNedy5-Cqw,5889
|
|
126
126
|
aiq/eval/swe_bench_evaluator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
127
127
|
aiq/eval/swe_bench_evaluator/evaluate.py,sha256=kNukRruq1EM1RsGLvpVuC22xcP0gpn9acF3edGak9vY,9858
|
|
128
128
|
aiq/eval/swe_bench_evaluator/register.py,sha256=sTb74F7w4iuI0ROsEJ4bV13Nt1GEWQn7UvO2O0HXwXk,1537
|
|
@@ -133,7 +133,7 @@ aiq/eval/tunable_rag_evaluator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5
|
|
|
133
133
|
aiq/eval/tunable_rag_evaluator/evaluate.py,sha256=f4jfn9VVLmkOg631TQr2wy7hPwGMJMsQa4kmXsu0-Uc,13069
|
|
134
134
|
aiq/eval/tunable_rag_evaluator/register.py,sha256=q4p2rFyMzWmaINJc961ZV4jzIlAN4GfWsoImHo0ovsY,2558
|
|
135
135
|
aiq/eval/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
136
|
-
aiq/eval/utils/output_uploader.py,sha256=
|
|
136
|
+
aiq/eval/utils/output_uploader.py,sha256=lkV63Jr97YuG1vr04uOZDvs9e1pGP4FbJykRxS2d7a4,5579
|
|
137
137
|
aiq/eval/utils/tqdm_position_registry.py,sha256=9CtpCk1wtYCSyieHPaSp8nlZu6EcNUOaUz2RTqfekrA,1286
|
|
138
138
|
aiq/eval/utils/weave_eval.py,sha256=l9NTkgLTb30wBnfiHI_yefPFVNyIBrNdbPNq2o58HO4,7088
|
|
139
139
|
aiq/front_ends/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
|
|
@@ -183,9 +183,9 @@ aiq/plugins/.namespace,sha256=Gace0pOC3ETEJf-TBVuNw0TQV6J_KtOPpEiSzMH-odo,215
|
|
|
183
183
|
aiq/profiler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
184
184
|
aiq/profiler/data_frame_row.py,sha256=vudqk1ZzZtlZln2Ir43mPl3nwNc0pQlhwbtdY9oSKtI,1755
|
|
185
185
|
aiq/profiler/data_models.py,sha256=I8k1zjg8KaLjjpc1SxMgaEC2h_jW2bv1cENl1BsTcG8,899
|
|
186
|
-
aiq/profiler/inference_metrics_model.py,sha256=
|
|
186
|
+
aiq/profiler/inference_metrics_model.py,sha256=Thz3OHBDzGrpPYaOm8m8_pNeEA_q0yDlUUDHFkQ3U90,1481
|
|
187
187
|
aiq/profiler/intermediate_property_adapter.py,sha256=XZ_A8f2S5M-EJSkErY6I750Y8HAZPdXsr6Cpb1wXlNM,3537
|
|
188
|
-
aiq/profiler/profile_runner.py,sha256=
|
|
188
|
+
aiq/profiler/profile_runner.py,sha256=Xyh0wl2aeRJtRBzvvkMYkFvqUptB7XUfYJ7jdbBCPuE,22102
|
|
189
189
|
aiq/profiler/utils.py,sha256=hNh_JfxXDrACIp4usXtlriTfVuYUkk3Pv-x74K34MQg,8180
|
|
190
190
|
aiq/profiler/callbacks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
191
191
|
aiq/profiler/callbacks/agno_callback_handler.py,sha256=aDAUY6GDIUtly6KowXXKUqLc7NbE6khg1aXT1AritaA,14930
|
|
@@ -281,8 +281,8 @@ aiq/tool/github_tools/get_github_issue.py,sha256=vwLNkNOszLlymkQju0cR8BNvfdH4Enm
|
|
|
281
281
|
aiq/tool/github_tools/get_github_pr.py,sha256=b7eCOqrVoejGjRwmUVdU45uF07ihbY8lRacMYOSgMrY,9716
|
|
282
282
|
aiq/tool/github_tools/update_github_issue.py,sha256=TUElxUuzjZr_QldL_48RcqSx0A9b23NB_lA82QwFjkM,4103
|
|
283
283
|
aiq/tool/mcp/__init__.py,sha256=GUJrgGtpvyMUCjUBvR3faAdv-tZzbU9W-izgx9aMEQg,680
|
|
284
|
-
aiq/tool/mcp/mcp_client.py,sha256=
|
|
285
|
-
aiq/tool/mcp/mcp_tool.py,sha256=
|
|
284
|
+
aiq/tool/mcp/mcp_client.py,sha256=bTZGh_Y3mRJA9BGbbmfVNRddTIcK251jKlPL7kAjFK0,8553
|
|
285
|
+
aiq/tool/mcp/mcp_tool.py,sha256=0L2Zj1CBwrvv5P9A8-lj_Ao_oBaC6aYRJXw9q5Et4uo,4099
|
|
286
286
|
aiq/tool/memory_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
287
287
|
aiq/tool/memory_tools/add_memory_tool.py,sha256=9EjB3DpYhxwasz7o3O8Rq__Ys5986fciv44ahC6mVCo,3349
|
|
288
288
|
aiq/tool/memory_tools/delete_memory_tool.py,sha256=wdB_I8y-1D1OpNtBi6ZOg36vvNkbaxp-yvdqFMc2Suk,2532
|
|
@@ -312,10 +312,10 @@ aiq/utils/reactive/base/observer_base.py,sha256=UAlyAY_ky4q2t0P81RVFo2Bs_R7z5Nde
|
|
|
312
312
|
aiq/utils/reactive/base/subject_base.py,sha256=Ed-AC6P7cT3qkW1EXjzbd5M9WpVoeN_9KCe3OM3FLU4,2521
|
|
313
313
|
aiq/utils/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
314
314
|
aiq/utils/settings/global_settings.py,sha256=U9TCLdoZsKq5qOVGjREipGVv9e-FlStzqy5zv82_VYk,7454
|
|
315
|
-
aiqtoolkit-1.2.
|
|
316
|
-
aiqtoolkit-1.2.
|
|
317
|
-
aiqtoolkit-1.2.
|
|
318
|
-
aiqtoolkit-1.2.
|
|
319
|
-
aiqtoolkit-1.2.
|
|
320
|
-
aiqtoolkit-1.2.
|
|
321
|
-
aiqtoolkit-1.2.
|
|
315
|
+
aiqtoolkit-1.2.0a20250701.dist-info/licenses/LICENSE-3rd-party.txt,sha256=8o7aySJa9CBvFshPcsRdJbczzdNyDGJ8b0J67WRUQ2k,183936
|
|
316
|
+
aiqtoolkit-1.2.0a20250701.dist-info/licenses/LICENSE.md,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
|
|
317
|
+
aiqtoolkit-1.2.0a20250701.dist-info/METADATA,sha256=lznc2c21geHXbssWhywcefLukeo9tLY9Vth1VoxSe1g,20274
|
|
318
|
+
aiqtoolkit-1.2.0a20250701.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
319
|
+
aiqtoolkit-1.2.0a20250701.dist-info/entry_points.txt,sha256=gRlPfR5g21t328WNEQ4CcEz80S1sJNS8A7rMDYnzl4A,452
|
|
320
|
+
aiqtoolkit-1.2.0a20250701.dist-info/top_level.txt,sha256=fo7AzYcNhZ_tRWrhGumtxwnxMew4xrT1iwouDy_f0Kc,4
|
|
321
|
+
aiqtoolkit-1.2.0a20250701.dist-info/RECORD,,
|
|
File without changes
|
{aiqtoolkit-1.2.0a20250627.dist-info → aiqtoolkit-1.2.0a20250701.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
{aiqtoolkit-1.2.0a20250627.dist-info → aiqtoolkit-1.2.0a20250701.dist-info}/licenses/LICENSE.md
RENAMED
|
File without changes
|
|
File without changes
|