aiqtoolkit 1.2.0a20250609__py3-none-any.whl → 1.2.0a20250611__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.

@@ -17,6 +17,7 @@ import time
17
17
  import typing
18
18
  import uuid
19
19
  from enum import Enum
20
+ from typing import Literal
20
21
 
21
22
  from pydantic import BaseModel
22
23
  from pydantic import ConfigDict
@@ -82,6 +83,26 @@ class UsageInfo(BaseModel):
82
83
  seconds_between_calls: int = 0
83
84
 
84
85
 
86
+ class ToolParameters(BaseModel):
87
+ properties: dict[str, typing.Any] = Field(..., description="The properties of the function parameters.")
88
+ required: list[str] = Field(default_factory=list, description="The required properties of the function parameters.")
89
+ type_: Literal["object"] = Field(default="object", description="The type of the function parameters.", alias="type")
90
+ additionalProperties: bool = Field(default=False,
91
+ description="Enable function parameters allow additional properties.")
92
+ strict: bool = Field(default=True, description="Ensure function calls reliably adhere to the function schema.")
93
+
94
+
95
+ class ToolDetails(BaseModel):
96
+ name: str = Field(..., description="The name of the function.")
97
+ description: str = Field(..., description="The description of the function.")
98
+ parameters: ToolParameters = Field(..., description="The parameters of the function.")
99
+
100
+
101
+ class ToolSchema(BaseModel):
102
+ type: Literal["function"] = Field(..., description="The type of the tool.")
103
+ function: ToolDetails = Field(..., description="The function details.")
104
+
105
+
85
106
  class TraceMetadata(BaseModel):
86
107
  chat_responses: typing.Any | None = None
87
108
  chat_inputs: typing.Any | None = None
@@ -91,6 +112,8 @@ class TraceMetadata(BaseModel):
91
112
  span_inputs: typing.Any | None = None
92
113
  span_outputs: typing.Any | None = None
93
114
  provided_metadata: typing.Any | None = None
115
+ tools_schema: list[ToolSchema] = Field(default_factory=list,
116
+ description="The schema of tools used in a tool calling request.")
94
117
 
95
118
  # Allow extra fields in the model_config to support derived models
96
119
  model_config = ConfigDict(extra="allow")
aiq/llm/openai_llm.py CHANGED
@@ -26,7 +26,7 @@ from aiq.data_models.llm import LLMBaseConfig
26
26
  class OpenAIModelConfig(LLMBaseConfig, name="openai"):
27
27
  """An OpenAI LLM provider to be used with an LLM client."""
28
28
 
29
- model_config = ConfigDict(protected_namespaces=())
29
+ model_config = ConfigDict(protected_namespaces=(), extra="allow")
30
30
 
31
31
  api_key: str | None = Field(default=None, description="OpenAI API key to interact with hosted model.")
32
32
  base_url: str | None = Field(default=None, description="Base url to the hosted model.")
aiq/meta/pypi.md CHANGED
@@ -15,7 +15,7 @@ See the License for the specific language governing permissions and
15
15
  limitations under the License.
16
16
  -->
17
17
 
18
- ![NVIDIA Agent Intelligence Toolkit](https://media.githubusercontent.com/media/NVIDIA/AIQToolkit/refs/heads/main/docs/source/_static/aiqtoolkit_banner.png "AIQ toolkit banner image")
18
+ ![NVIDIA Agent Intelligence Toolkit](https://media.githubusercontent.com/media/NVIDIA/NeMo-Agent-Toolkit/refs/heads/main/docs/source/_static/aiqtoolkit_banner.png "AIQ toolkit banner image")
19
19
 
20
20
  # NVIDIA Agent Intelligence Toolkit
21
21
 
@@ -38,11 +38,11 @@ With AIQ toolkit, you can move quickly, experiment freely, and ensure reliabilit
38
38
  * [Documentation](https://docs.nvidia.com/aiqtoolkit/1.2.0/index.html): Explore the full documentation for AIQ toolkit.
39
39
 
40
40
  ## First time user?
41
- If this is your first time using AIQ toolkit, it is recommended to install the latest version from the [source repository](https://github.com/NVIDIA/AIQToolkit?tab=readme-ov-file#quick-start) on GitHub. This package is intended for users who are familiar with AIQ toolkit applications and need to add AIQ toolkit as a dependency to their project.
41
+ If this is your first time using AIQ toolkit, it is recommended to install the latest version from the [source repository](https://github.com/NVIDIA/NeMo-Agent-Toolkit?tab=readme-ov-file#quick-start) on GitHub. This package is intended for users who are familiar with AIQ toolkit applications and need to add AIQ toolkit as a dependency to their project.
42
42
 
43
43
  ## Feedback
44
44
 
45
- We would love to hear from you! Please file an issue on [GitHub](https://github.com/NVIDIA/AIQToolkit/issues) if you have any feedback or feature requests.
45
+ We would love to hear from you! Please file an issue on [GitHub](https://github.com/NVIDIA/NeMo-Agent-Toolkit/issues) if you have any feedback or feature requests.
46
46
 
47
47
  ## Acknowledgements
48
48
 
@@ -13,6 +13,7 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
+ import json
16
17
  import logging
17
18
  import re
18
19
  import warnings
@@ -75,6 +76,24 @@ except TelemetryOptionalImportError:
75
76
  set_span_in_context = dummy_set_span_in_context
76
77
 
77
78
 
79
+ def merge_dicts(dict1: dict, dict2: dict) -> dict:
80
+ """
81
+ Merge two dictionaries, prioritizing non-null values from the first dictionary.
82
+
83
+ Args:
84
+ dict1 (dict): First dictionary (higher priority)
85
+ dict2 (dict): Second dictionary (lower priority)
86
+
87
+ Returns:
88
+ dict: Merged dictionary with non-null values from dict1 taking precedence
89
+ """
90
+ result = dict2.copy() # Start with a copy of the second dictionary
91
+ for key, value in dict1.items():
92
+ if value is not None: # Only update if value is not None
93
+ result[key] = value
94
+ return result
95
+
96
+
78
97
  def _ns_timestamp(seconds_float: float) -> int:
79
98
  """
80
99
  Convert AIQ Toolkit's float `event_timestamp` (in seconds) into an integer number
@@ -285,6 +304,10 @@ class AsyncOtelSpanListener:
285
304
  sub_span.set_attribute(SpanAttributes.INPUT_VALUE, serialized_input)
286
305
  sub_span.set_attribute(SpanAttributes.INPUT_MIME_TYPE, "application/json" if is_json else "text/plain")
287
306
 
307
+ # Optional: add metadata to the span from TraceMetadata
308
+ if step.payload.metadata:
309
+ sub_span.set_attribute("aiq.metadata", step.payload.metadata.model_dump_json())
310
+
288
311
  self._span_stack[step.UUID] = sub_span
289
312
 
290
313
  self._outstanding_spans[step.UUID] = sub_span
@@ -323,6 +346,13 @@ class AsyncOtelSpanListener:
323
346
  sub_span.set_attribute(SpanAttributes.OUTPUT_VALUE, serialized_output)
324
347
  sub_span.set_attribute(SpanAttributes.OUTPUT_MIME_TYPE, "application/json" if is_json else "text/plain")
325
348
 
349
+ # # Optional: add metadata to the span from TraceMetadata
350
+ if step.payload.metadata:
351
+ start_event_metadata = json.loads(sub_span.attributes.get("aiq.metadata", {}))
352
+ end_event_metadata = json.loads(step.payload.metadata.model_dump_json())
353
+ merged_event_metadata = merge_dicts(start_event_metadata, end_event_metadata)
354
+ sub_span.set_attribute("aiq.metadata", json.dumps(merged_event_metadata))
355
+
326
356
  end_ns = _ns_timestamp(step.payload.event_timestamp)
327
357
 
328
358
  # End the subspan
@@ -24,7 +24,6 @@ from aiq.cli.register_workflow import register_telemetry_exporter
24
24
  from aiq.data_models.logging import LoggingBaseConfig
25
25
  from aiq.data_models.telemetry_exporter import TelemetryExporterBaseConfig
26
26
  from aiq.utils.optional_imports import telemetry_optional_import
27
- from aiq.utils.optional_imports import try_import_opentelemetry
28
27
  from aiq.utils.optional_imports import try_import_phoenix
29
28
 
30
29
  logger = logging.getLogger(__name__)
@@ -117,9 +116,9 @@ class OtelCollectorTelemetryExporter(TelemetryExporterBaseConfig, name="otelcoll
117
116
  @register_telemetry_exporter(config_type=OtelCollectorTelemetryExporter)
118
117
  async def otel_telemetry_exporter(config: OtelCollectorTelemetryExporter, builder: Builder):
119
118
  """Create an OpenTelemetry telemetry exporter."""
120
- # If the dependencies are not installed, a TelemetryOptionalImportError will be raised
121
- opentelemetry = try_import_opentelemetry()
122
- yield opentelemetry.sdk.trace.export.OTLPSpanExporter(config.endpoint)
119
+
120
+ trace_exporter = telemetry_optional_import("opentelemetry.exporter.otlp.proto.http.trace_exporter")
121
+ yield trace_exporter.OTLPSpanExporter(endpoint=config.endpoint)
123
122
 
124
123
 
125
124
  class ConsoleLoggingMethod(LoggingBaseConfig, name="console"):
@@ -34,6 +34,7 @@ from aiq.builder.framework_enum import LLMFrameworkEnum
34
34
  from aiq.data_models.intermediate_step import IntermediateStepPayload
35
35
  from aiq.data_models.intermediate_step import IntermediateStepType
36
36
  from aiq.data_models.intermediate_step import StreamEventData
37
+ from aiq.data_models.intermediate_step import ToolSchema
37
38
  from aiq.data_models.intermediate_step import TraceMetadata
38
39
  from aiq.data_models.intermediate_step import UsageInfo
39
40
  from aiq.profiler.callbacks.base_callback_class import BaseProfilerCallback
@@ -42,6 +43,16 @@ from aiq.profiler.callbacks.token_usage_base_model import TokenUsageBaseModel
42
43
  logger = logging.getLogger(__name__)
43
44
 
44
45
 
46
+ def _extract_tools_schema(invocation_params: dict) -> list:
47
+
48
+ tools_schema = []
49
+ if invocation_params is not None:
50
+ for tool in invocation_params.get("tools", []):
51
+ tools_schema.append(ToolSchema(**tool))
52
+
53
+ return tools_schema
54
+
55
+
45
56
  class LangchainProfilerHandler(AsyncCallbackHandler, BaseProfilerCallback): # pylint: disable=R0901
46
57
  """Callback Handler that tracks NIM info."""
47
58
 
@@ -138,16 +149,17 @@ class LangchainProfilerHandler(AsyncCallbackHandler, BaseProfilerCallback): # p
138
149
  run_id = str(run_id)
139
150
  self._run_id_to_model_name[run_id] = model_name
140
151
 
141
- stats = IntermediateStepPayload(event_type=IntermediateStepType.LLM_START,
142
- framework=LLMFrameworkEnum.LANGCHAIN,
143
- name=model_name,
144
- UUID=run_id,
145
- data=StreamEventData(input=copy.deepcopy(messages[0])),
146
- metadata=TraceMetadata(chat_inputs=copy.deepcopy(messages[0])),
147
- usage_info=UsageInfo(token_usage=TokenUsageBaseModel(),
148
- num_llm_calls=1,
149
- seconds_between_calls=int(time.time() -
150
- self.last_call_ts)))
152
+ stats = IntermediateStepPayload(
153
+ event_type=IntermediateStepType.LLM_START,
154
+ framework=LLMFrameworkEnum.LANGCHAIN,
155
+ name=model_name,
156
+ UUID=run_id,
157
+ data=StreamEventData(input=copy.deepcopy(messages[0])),
158
+ metadata=TraceMetadata(chat_inputs=copy.deepcopy(messages[0]),
159
+ tools_schema=_extract_tools_schema(kwargs.get("invocation_params", {}))),
160
+ usage_info=UsageInfo(token_usage=TokenUsageBaseModel(),
161
+ num_llm_calls=1,
162
+ seconds_between_calls=int(time.time() - self.last_call_ts)))
151
163
 
152
164
  self.step_manager.push_intermediate_step(stats)
153
165
  self._run_id_to_llm_input[run_id] = messages[0][-1].content
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiqtoolkit
3
- Version: 1.2.0a20250609
3
+ Version: 1.2.0a20250611
4
4
  Summary: NVIDIA Agent Intelligence toolkit
5
5
  Author: NVIDIA Corporation
6
6
  Maintainer: NVIDIA Corporation
@@ -292,7 +292,7 @@ See the License for the specific language governing permissions and
292
292
  limitations under the License.
293
293
  -->
294
294
 
295
- ![NVIDIA Agent Intelligence Toolkit](https://media.githubusercontent.com/media/NVIDIA/AIQToolkit/refs/heads/main/docs/source/_static/aiqtoolkit_banner.png "AIQ toolkit banner image")
295
+ ![NVIDIA Agent Intelligence Toolkit](https://media.githubusercontent.com/media/NVIDIA/NeMo-Agent-Toolkit/refs/heads/main/docs/source/_static/aiqtoolkit_banner.png "AIQ toolkit banner image")
296
296
 
297
297
  # NVIDIA Agent Intelligence Toolkit
298
298
 
@@ -315,11 +315,11 @@ With AIQ toolkit, you can move quickly, experiment freely, and ensure reliabilit
315
315
  * [Documentation](https://docs.nvidia.com/aiqtoolkit/1.2.0/index.html): Explore the full documentation for AIQ toolkit.
316
316
 
317
317
  ## First time user?
318
- If this is your first time using AIQ toolkit, it is recommended to install the latest version from the [source repository](https://github.com/NVIDIA/AIQToolkit?tab=readme-ov-file#quick-start) on GitHub. This package is intended for users who are familiar with AIQ toolkit applications and need to add AIQ toolkit as a dependency to their project.
318
+ If this is your first time using AIQ toolkit, it is recommended to install the latest version from the [source repository](https://github.com/NVIDIA/NeMo-Agent-Toolkit?tab=readme-ov-file#quick-start) on GitHub. This package is intended for users who are familiar with AIQ toolkit applications and need to add AIQ toolkit as a dependency to their project.
319
319
 
320
320
  ## Feedback
321
321
 
322
- We would love to hear from you! Please file an issue on [GitHub](https://github.com/NVIDIA/AIQToolkit/issues) if you have any feedback or feature requests.
322
+ We would love to hear from you! Please file an issue on [GitHub](https://github.com/NVIDIA/NeMo-Agent-Toolkit/issues) if you have any feedback or feature requests.
323
323
 
324
324
  ## Acknowledgements
325
325
 
@@ -88,7 +88,7 @@ aiq/data_models/front_end.py,sha256=z8k6lSWjt1vMOYFbjWQxodpwAqPeuGS0hRBjsriDW2s,
88
88
  aiq/data_models/function.py,sha256=M_duXVXL5MvYe0WVLvqEgEzXs0UAYNSMfy9ZTpxuKPA,1013
89
89
  aiq/data_models/function_dependencies.py,sha256=bIdfrwDT_rR5eEER2WhYtl43QaOAnTL1p8IkyGJtB_Y,2403
90
90
  aiq/data_models/interactive.py,sha256=cYBIp3N3AaP0pxMRJFMwVoMrAWpWVT2turidhr__36A,8418
91
- aiq/data_models/intermediate_step.py,sha256=F0QW-uZODehEV0NKy55zl9fmbZrF2qggi8R4iW_XKHk,10057
91
+ aiq/data_models/intermediate_step.py,sha256=XVn8MdAJAk5Yy3JfWfgUQHKqjsr5E-XrC_sluFAU8OA,11385
92
92
  aiq/data_models/invocation_node.py,sha256=nDRylgzBfJduGA-lme9xN4P6BdOYj0L6ytLHnTuetMI,1618
93
93
  aiq/data_models/llm.py,sha256=McbDdUUtWfp9WCdMMJA2xh7mvlmyNdGDCH8P_7l2iKU,920
94
94
  aiq/data_models/logging.py,sha256=1QtVjIQ99PgMYUuzw4h1FAoPRteZY7uf3oFTqV3ONgA,940
@@ -163,7 +163,7 @@ aiq/front_ends/simple_base/simple_front_end_plugin_base.py,sha256=HzcJFHZUZFnZJd
163
163
  aiq/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
164
164
  aiq/llm/aws_bedrock_llm.py,sha256=ZbYnT0vf36xCsnGAxDAQ3ugnV1SdcPXVKVxhhXsjdg0,2773
165
165
  aiq/llm/nim_llm.py,sha256=l5dJk4MCzEbIKJnbGen9Zq7tpCEew4OXKeYqDodFXF0,2116
166
- aiq/llm/openai_llm.py,sha256=ytdcyJTgeuOElfEJzJszSqO2Ck5msDIUJO55oVmugMg,2152
166
+ aiq/llm/openai_llm.py,sha256=3ShtQ0kB1hdBCPvjBWjo1jydue4l3oDIflrMc83SD9U,2167
167
167
  aiq/llm/register.py,sha256=GMsFzhupP_rwSVkIoJUT8j0CRhWyC4X58ihnO_l9OkM,899
168
168
  aiq/llm/utils/__init__.py,sha256=GUJrgGtpvyMUCjUBvR3faAdv-tZzbU9W-izgx9aMEQg,680
169
169
  aiq/llm/utils/env_config_value.py,sha256=SBpppIRszDXNcEEG2L6kVojY7LH_EpHfK7bu92TGrE4,3568
@@ -172,10 +172,10 @@ aiq/memory/__init__.py,sha256=sNqiLatqyTNSBUKKgmInOvCmebkuDHRTErZaeOaE8C8,844
172
172
  aiq/memory/interfaces.py,sha256=lyj1TGr3Fhibul8Y64Emj-BUEqDotmmFoVCEMqTujUA,5531
173
173
  aiq/memory/models.py,sha256=c5dA7nKHQ4AS1_ptQZcfC_oXO495-ehocnf_qXTE6c8,4319
174
174
  aiq/meta/module_to_distro.json,sha256=1XV7edobFrdDKvsSoynfodXg_hczUWpDrQzGkW9qqEs,28
175
- aiq/meta/pypi.md,sha256=Ukj1J--Q6GF7Zh1tKonygttN3aiq_Lf2-445nz0sE-o,4362
175
+ aiq/meta/pypi.md,sha256=N1fvWaio3KhnAw9yigeM-oWaLuT5i_C7U_2UVzyPbks,4386
176
176
  aiq/observability/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
177
- aiq/observability/async_otel_listener.py,sha256=gR8fEdpZ9L8vGZiXLI7FwbwtSiGgQHMDDj5d-vKjZGc,18407
178
- aiq/observability/register.py,sha256=WLPGY1b_RmVv48od-hIytvJrCqNoJupriHCzyxvTbUw,6723
177
+ aiq/observability/async_otel_listener.py,sha256=2Ye9bkHfAssuxFS_ECyRyl-bTa73yYvsPyO4BaK5Beg,19662
178
+ aiq/observability/register.py,sha256=YCmRNfGQMnL-_2ukcA6zRSkUbOMIbexTvJgTB9Iee6M,6619
179
179
  aiq/plugins/.namespace,sha256=Gace0pOC3ETEJf-TBVuNw0TQV6J_KtOPpEiSzMH-odo,215
180
180
  aiq/profiler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
181
181
  aiq/profiler/data_frame_row.py,sha256=vudqk1ZzZtlZln2Ir43mPl3nwNc0pQlhwbtdY9oSKtI,1755
@@ -186,7 +186,7 @@ aiq/profiler/utils.py,sha256=hNh_JfxXDrACIp4usXtlriTfVuYUkk3Pv-x74K34MQg,8180
186
186
  aiq/profiler/callbacks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
187
187
  aiq/profiler/callbacks/agno_callback_handler.py,sha256=aDAUY6GDIUtly6KowXXKUqLc7NbE6khg1aXT1AritaA,14930
188
188
  aiq/profiler/callbacks/base_callback_class.py,sha256=BFZMkb-dPoHAnM_4jVXX08hD8Vi2n8thyftVlUxfE24,745
189
- aiq/profiler/callbacks/langchain_callback_handler.py,sha256=sgxnbEMGgqHx7_IY6uAAFURHdRvDOzG8G_brr_3KJAU,12388
189
+ aiq/profiler/callbacks/langchain_callback_handler.py,sha256=tG9OX2C3Rsqpew2Jaj2LLkZkwEztbeQ-oLVIBUDPL48,12511
190
190
  aiq/profiler/callbacks/llama_index_callback_handler.py,sha256=AXUtfsUwif-rUFoVaRnMeSe29TcpT9Z8nxWcJWD2PiQ,9334
191
191
  aiq/profiler/callbacks/semantic_kernel_callback_handler.py,sha256=uYlq0Lku6U1AMg5GoPpJoZm6lvgIjLQN5_uIbswL4bA,11157
192
192
  aiq/profiler/callbacks/token_usage_base_model.py,sha256=X0b_AbBgVQAAbgbDMim-3S3XdQ7PaPs9qMUACvMAe5o,1104
@@ -308,10 +308,10 @@ aiq/utils/reactive/base/observer_base.py,sha256=UAlyAY_ky4q2t0P81RVFo2Bs_R7z5Nde
308
308
  aiq/utils/reactive/base/subject_base.py,sha256=Ed-AC6P7cT3qkW1EXjzbd5M9WpVoeN_9KCe3OM3FLU4,2521
309
309
  aiq/utils/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
310
310
  aiq/utils/settings/global_settings.py,sha256=U9TCLdoZsKq5qOVGjREipGVv9e-FlStzqy5zv82_VYk,7454
311
- aiqtoolkit-1.2.0a20250609.dist-info/licenses/LICENSE-3rd-party.txt,sha256=8o7aySJa9CBvFshPcsRdJbczzdNyDGJ8b0J67WRUQ2k,183936
312
- aiqtoolkit-1.2.0a20250609.dist-info/licenses/LICENSE.md,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
313
- aiqtoolkit-1.2.0a20250609.dist-info/METADATA,sha256=QOm_3b4TK8JrHBnrAtNBolujyy6DYJtTyAiicNN46Ng,20250
314
- aiqtoolkit-1.2.0a20250609.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
315
- aiqtoolkit-1.2.0a20250609.dist-info/entry_points.txt,sha256=gRlPfR5g21t328WNEQ4CcEz80S1sJNS8A7rMDYnzl4A,452
316
- aiqtoolkit-1.2.0a20250609.dist-info/top_level.txt,sha256=fo7AzYcNhZ_tRWrhGumtxwnxMew4xrT1iwouDy_f0Kc,4
317
- aiqtoolkit-1.2.0a20250609.dist-info/RECORD,,
311
+ aiqtoolkit-1.2.0a20250611.dist-info/licenses/LICENSE-3rd-party.txt,sha256=8o7aySJa9CBvFshPcsRdJbczzdNyDGJ8b0J67WRUQ2k,183936
312
+ aiqtoolkit-1.2.0a20250611.dist-info/licenses/LICENSE.md,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
313
+ aiqtoolkit-1.2.0a20250611.dist-info/METADATA,sha256=BA-GWB8DEDahAysE0QbgDQoh1Q7Pl0-hgxTara-pWeU,20274
314
+ aiqtoolkit-1.2.0a20250611.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
315
+ aiqtoolkit-1.2.0a20250611.dist-info/entry_points.txt,sha256=gRlPfR5g21t328WNEQ4CcEz80S1sJNS8A7rMDYnzl4A,452
316
+ aiqtoolkit-1.2.0a20250611.dist-info/top_level.txt,sha256=fo7AzYcNhZ_tRWrhGumtxwnxMew4xrT1iwouDy_f0Kc,4
317
+ aiqtoolkit-1.2.0a20250611.dist-info/RECORD,,