aiqtoolkit 1.1.0rc6__py3-none-any.whl → 1.2.0__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.

Files changed (319) hide show
  1. aiqtoolkit-1.2.0.dist-info/METADATA +29 -0
  2. aiqtoolkit-1.2.0.dist-info/RECORD +4 -0
  3. {aiqtoolkit-1.1.0rc6.dist-info → aiqtoolkit-1.2.0.dist-info}/WHEEL +1 -1
  4. aiqtoolkit-1.2.0.dist-info/top_level.txt +1 -0
  5. aiq/agent/__init__.py +0 -0
  6. aiq/agent/base.py +0 -76
  7. aiq/agent/dual_node.py +0 -67
  8. aiq/agent/react_agent/__init__.py +0 -0
  9. aiq/agent/react_agent/agent.py +0 -322
  10. aiq/agent/react_agent/output_parser.py +0 -104
  11. aiq/agent/react_agent/prompt.py +0 -46
  12. aiq/agent/react_agent/register.py +0 -148
  13. aiq/agent/reasoning_agent/__init__.py +0 -0
  14. aiq/agent/reasoning_agent/reasoning_agent.py +0 -224
  15. aiq/agent/register.py +0 -23
  16. aiq/agent/rewoo_agent/__init__.py +0 -0
  17. aiq/agent/rewoo_agent/agent.py +0 -410
  18. aiq/agent/rewoo_agent/prompt.py +0 -108
  19. aiq/agent/rewoo_agent/register.py +0 -158
  20. aiq/agent/tool_calling_agent/__init__.py +0 -0
  21. aiq/agent/tool_calling_agent/agent.py +0 -123
  22. aiq/agent/tool_calling_agent/register.py +0 -105
  23. aiq/builder/__init__.py +0 -0
  24. aiq/builder/builder.py +0 -223
  25. aiq/builder/component_utils.py +0 -303
  26. aiq/builder/context.py +0 -227
  27. aiq/builder/embedder.py +0 -24
  28. aiq/builder/eval_builder.py +0 -120
  29. aiq/builder/evaluator.py +0 -29
  30. aiq/builder/framework_enum.py +0 -24
  31. aiq/builder/front_end.py +0 -73
  32. aiq/builder/function.py +0 -297
  33. aiq/builder/function_base.py +0 -376
  34. aiq/builder/function_info.py +0 -627
  35. aiq/builder/intermediate_step_manager.py +0 -176
  36. aiq/builder/llm.py +0 -25
  37. aiq/builder/retriever.py +0 -25
  38. aiq/builder/user_interaction_manager.py +0 -71
  39. aiq/builder/workflow.py +0 -143
  40. aiq/builder/workflow_builder.py +0 -757
  41. aiq/cli/__init__.py +0 -14
  42. aiq/cli/cli_utils/__init__.py +0 -0
  43. aiq/cli/cli_utils/config_override.py +0 -231
  44. aiq/cli/cli_utils/validation.py +0 -37
  45. aiq/cli/commands/__init__.py +0 -0
  46. aiq/cli/commands/configure/__init__.py +0 -0
  47. aiq/cli/commands/configure/channel/__init__.py +0 -0
  48. aiq/cli/commands/configure/channel/add.py +0 -28
  49. aiq/cli/commands/configure/channel/channel.py +0 -36
  50. aiq/cli/commands/configure/channel/remove.py +0 -30
  51. aiq/cli/commands/configure/channel/update.py +0 -30
  52. aiq/cli/commands/configure/configure.py +0 -33
  53. aiq/cli/commands/evaluate.py +0 -139
  54. aiq/cli/commands/info/__init__.py +0 -14
  55. aiq/cli/commands/info/info.py +0 -39
  56. aiq/cli/commands/info/list_channels.py +0 -32
  57. aiq/cli/commands/info/list_components.py +0 -129
  58. aiq/cli/commands/info/list_mcp.py +0 -126
  59. aiq/cli/commands/registry/__init__.py +0 -14
  60. aiq/cli/commands/registry/publish.py +0 -88
  61. aiq/cli/commands/registry/pull.py +0 -118
  62. aiq/cli/commands/registry/registry.py +0 -38
  63. aiq/cli/commands/registry/remove.py +0 -108
  64. aiq/cli/commands/registry/search.py +0 -155
  65. aiq/cli/commands/start.py +0 -250
  66. aiq/cli/commands/uninstall.py +0 -83
  67. aiq/cli/commands/validate.py +0 -47
  68. aiq/cli/commands/workflow/__init__.py +0 -14
  69. aiq/cli/commands/workflow/templates/__init__.py.j2 +0 -0
  70. aiq/cli/commands/workflow/templates/config.yml.j2 +0 -16
  71. aiq/cli/commands/workflow/templates/pyproject.toml.j2 +0 -22
  72. aiq/cli/commands/workflow/templates/register.py.j2 +0 -5
  73. aiq/cli/commands/workflow/templates/workflow.py.j2 +0 -36
  74. aiq/cli/commands/workflow/workflow.py +0 -37
  75. aiq/cli/commands/workflow/workflow_commands.py +0 -313
  76. aiq/cli/entrypoint.py +0 -133
  77. aiq/cli/main.py +0 -44
  78. aiq/cli/register_workflow.py +0 -408
  79. aiq/cli/type_registry.py +0 -879
  80. aiq/data_models/__init__.py +0 -14
  81. aiq/data_models/api_server.py +0 -588
  82. aiq/data_models/common.py +0 -143
  83. aiq/data_models/component.py +0 -46
  84. aiq/data_models/component_ref.py +0 -135
  85. aiq/data_models/config.py +0 -349
  86. aiq/data_models/dataset_handler.py +0 -122
  87. aiq/data_models/discovery_metadata.py +0 -286
  88. aiq/data_models/embedder.py +0 -26
  89. aiq/data_models/evaluate.py +0 -104
  90. aiq/data_models/evaluator.py +0 -26
  91. aiq/data_models/front_end.py +0 -26
  92. aiq/data_models/function.py +0 -30
  93. aiq/data_models/function_dependencies.py +0 -64
  94. aiq/data_models/interactive.py +0 -237
  95. aiq/data_models/intermediate_step.py +0 -269
  96. aiq/data_models/invocation_node.py +0 -38
  97. aiq/data_models/llm.py +0 -26
  98. aiq/data_models/logging.py +0 -26
  99. aiq/data_models/memory.py +0 -26
  100. aiq/data_models/profiler.py +0 -53
  101. aiq/data_models/registry_handler.py +0 -26
  102. aiq/data_models/retriever.py +0 -30
  103. aiq/data_models/step_adaptor.py +0 -64
  104. aiq/data_models/streaming.py +0 -33
  105. aiq/data_models/swe_bench_model.py +0 -54
  106. aiq/data_models/telemetry_exporter.py +0 -26
  107. aiq/embedder/__init__.py +0 -0
  108. aiq/embedder/langchain_client.py +0 -41
  109. aiq/embedder/nim_embedder.py +0 -58
  110. aiq/embedder/openai_embedder.py +0 -42
  111. aiq/embedder/register.py +0 -24
  112. aiq/eval/__init__.py +0 -14
  113. aiq/eval/config.py +0 -42
  114. aiq/eval/dataset_handler/__init__.py +0 -0
  115. aiq/eval/dataset_handler/dataset_downloader.py +0 -106
  116. aiq/eval/dataset_handler/dataset_filter.py +0 -52
  117. aiq/eval/dataset_handler/dataset_handler.py +0 -169
  118. aiq/eval/evaluate.py +0 -325
  119. aiq/eval/evaluator/__init__.py +0 -14
  120. aiq/eval/evaluator/evaluator_model.py +0 -44
  121. aiq/eval/intermediate_step_adapter.py +0 -93
  122. aiq/eval/rag_evaluator/__init__.py +0 -0
  123. aiq/eval/rag_evaluator/evaluate.py +0 -138
  124. aiq/eval/rag_evaluator/register.py +0 -138
  125. aiq/eval/register.py +0 -23
  126. aiq/eval/remote_workflow.py +0 -128
  127. aiq/eval/runtime_event_subscriber.py +0 -52
  128. aiq/eval/swe_bench_evaluator/__init__.py +0 -0
  129. aiq/eval/swe_bench_evaluator/evaluate.py +0 -215
  130. aiq/eval/swe_bench_evaluator/register.py +0 -36
  131. aiq/eval/trajectory_evaluator/__init__.py +0 -0
  132. aiq/eval/trajectory_evaluator/evaluate.py +0 -118
  133. aiq/eval/trajectory_evaluator/register.py +0 -40
  134. aiq/eval/tunable_rag_evaluator/__init__.py +0 -0
  135. aiq/eval/tunable_rag_evaluator/evaluate.py +0 -263
  136. aiq/eval/tunable_rag_evaluator/register.py +0 -50
  137. aiq/eval/utils/__init__.py +0 -0
  138. aiq/eval/utils/output_uploader.py +0 -131
  139. aiq/eval/utils/tqdm_position_registry.py +0 -40
  140. aiq/front_ends/__init__.py +0 -14
  141. aiq/front_ends/console/__init__.py +0 -14
  142. aiq/front_ends/console/console_front_end_config.py +0 -32
  143. aiq/front_ends/console/console_front_end_plugin.py +0 -107
  144. aiq/front_ends/console/register.py +0 -25
  145. aiq/front_ends/cron/__init__.py +0 -14
  146. aiq/front_ends/fastapi/__init__.py +0 -14
  147. aiq/front_ends/fastapi/fastapi_front_end_config.py +0 -150
  148. aiq/front_ends/fastapi/fastapi_front_end_plugin.py +0 -103
  149. aiq/front_ends/fastapi/fastapi_front_end_plugin_worker.py +0 -607
  150. aiq/front_ends/fastapi/intermediate_steps_subscriber.py +0 -80
  151. aiq/front_ends/fastapi/job_store.py +0 -161
  152. aiq/front_ends/fastapi/main.py +0 -70
  153. aiq/front_ends/fastapi/message_handler.py +0 -279
  154. aiq/front_ends/fastapi/message_validator.py +0 -345
  155. aiq/front_ends/fastapi/register.py +0 -25
  156. aiq/front_ends/fastapi/response_helpers.py +0 -195
  157. aiq/front_ends/fastapi/step_adaptor.py +0 -320
  158. aiq/front_ends/fastapi/websocket.py +0 -148
  159. aiq/front_ends/mcp/__init__.py +0 -14
  160. aiq/front_ends/mcp/mcp_front_end_config.py +0 -32
  161. aiq/front_ends/mcp/mcp_front_end_plugin.py +0 -93
  162. aiq/front_ends/mcp/register.py +0 -27
  163. aiq/front_ends/mcp/tool_converter.py +0 -242
  164. aiq/front_ends/register.py +0 -22
  165. aiq/front_ends/simple_base/__init__.py +0 -14
  166. aiq/front_ends/simple_base/simple_front_end_plugin_base.py +0 -52
  167. aiq/llm/__init__.py +0 -0
  168. aiq/llm/nim_llm.py +0 -45
  169. aiq/llm/openai_llm.py +0 -45
  170. aiq/llm/register.py +0 -22
  171. aiq/llm/utils/__init__.py +0 -14
  172. aiq/llm/utils/env_config_value.py +0 -94
  173. aiq/llm/utils/error.py +0 -17
  174. aiq/memory/__init__.py +0 -20
  175. aiq/memory/interfaces.py +0 -183
  176. aiq/memory/models.py +0 -112
  177. aiq/meta/module_to_distro.json +0 -3
  178. aiq/meta/pypi.md +0 -58
  179. aiq/observability/__init__.py +0 -0
  180. aiq/observability/async_otel_listener.py +0 -429
  181. aiq/observability/register.py +0 -99
  182. aiq/plugins/.namespace +0 -1
  183. aiq/profiler/__init__.py +0 -0
  184. aiq/profiler/callbacks/__init__.py +0 -0
  185. aiq/profiler/callbacks/agno_callback_handler.py +0 -295
  186. aiq/profiler/callbacks/base_callback_class.py +0 -20
  187. aiq/profiler/callbacks/langchain_callback_handler.py +0 -278
  188. aiq/profiler/callbacks/llama_index_callback_handler.py +0 -205
  189. aiq/profiler/callbacks/semantic_kernel_callback_handler.py +0 -238
  190. aiq/profiler/callbacks/token_usage_base_model.py +0 -27
  191. aiq/profiler/data_frame_row.py +0 -51
  192. aiq/profiler/decorators/__init__.py +0 -0
  193. aiq/profiler/decorators/framework_wrapper.py +0 -131
  194. aiq/profiler/decorators/function_tracking.py +0 -254
  195. aiq/profiler/forecasting/__init__.py +0 -0
  196. aiq/profiler/forecasting/config.py +0 -18
  197. aiq/profiler/forecasting/model_trainer.py +0 -75
  198. aiq/profiler/forecasting/models/__init__.py +0 -22
  199. aiq/profiler/forecasting/models/forecasting_base_model.py +0 -40
  200. aiq/profiler/forecasting/models/linear_model.py +0 -196
  201. aiq/profiler/forecasting/models/random_forest_regressor.py +0 -268
  202. aiq/profiler/inference_metrics_model.py +0 -25
  203. aiq/profiler/inference_optimization/__init__.py +0 -0
  204. aiq/profiler/inference_optimization/bottleneck_analysis/__init__.py +0 -0
  205. aiq/profiler/inference_optimization/bottleneck_analysis/nested_stack_analysis.py +0 -452
  206. aiq/profiler/inference_optimization/bottleneck_analysis/simple_stack_analysis.py +0 -258
  207. aiq/profiler/inference_optimization/data_models.py +0 -386
  208. aiq/profiler/inference_optimization/experimental/__init__.py +0 -0
  209. aiq/profiler/inference_optimization/experimental/concurrency_spike_analysis.py +0 -468
  210. aiq/profiler/inference_optimization/experimental/prefix_span_analysis.py +0 -405
  211. aiq/profiler/inference_optimization/llm_metrics.py +0 -212
  212. aiq/profiler/inference_optimization/prompt_caching.py +0 -163
  213. aiq/profiler/inference_optimization/token_uniqueness.py +0 -107
  214. aiq/profiler/inference_optimization/workflow_runtimes.py +0 -72
  215. aiq/profiler/intermediate_property_adapter.py +0 -102
  216. aiq/profiler/profile_runner.py +0 -433
  217. aiq/profiler/utils.py +0 -184
  218. aiq/registry_handlers/__init__.py +0 -0
  219. aiq/registry_handlers/local/__init__.py +0 -0
  220. aiq/registry_handlers/local/local_handler.py +0 -176
  221. aiq/registry_handlers/local/register_local.py +0 -37
  222. aiq/registry_handlers/metadata_factory.py +0 -60
  223. aiq/registry_handlers/package_utils.py +0 -198
  224. aiq/registry_handlers/pypi/__init__.py +0 -0
  225. aiq/registry_handlers/pypi/pypi_handler.py +0 -251
  226. aiq/registry_handlers/pypi/register_pypi.py +0 -40
  227. aiq/registry_handlers/register.py +0 -21
  228. aiq/registry_handlers/registry_handler_base.py +0 -157
  229. aiq/registry_handlers/rest/__init__.py +0 -0
  230. aiq/registry_handlers/rest/register_rest.py +0 -56
  231. aiq/registry_handlers/rest/rest_handler.py +0 -237
  232. aiq/registry_handlers/schemas/__init__.py +0 -0
  233. aiq/registry_handlers/schemas/headers.py +0 -42
  234. aiq/registry_handlers/schemas/package.py +0 -68
  235. aiq/registry_handlers/schemas/publish.py +0 -63
  236. aiq/registry_handlers/schemas/pull.py +0 -82
  237. aiq/registry_handlers/schemas/remove.py +0 -36
  238. aiq/registry_handlers/schemas/search.py +0 -91
  239. aiq/registry_handlers/schemas/status.py +0 -47
  240. aiq/retriever/__init__.py +0 -0
  241. aiq/retriever/interface.py +0 -37
  242. aiq/retriever/milvus/__init__.py +0 -14
  243. aiq/retriever/milvus/register.py +0 -81
  244. aiq/retriever/milvus/retriever.py +0 -228
  245. aiq/retriever/models.py +0 -74
  246. aiq/retriever/nemo_retriever/__init__.py +0 -14
  247. aiq/retriever/nemo_retriever/register.py +0 -60
  248. aiq/retriever/nemo_retriever/retriever.py +0 -190
  249. aiq/retriever/register.py +0 -22
  250. aiq/runtime/__init__.py +0 -14
  251. aiq/runtime/loader.py +0 -188
  252. aiq/runtime/runner.py +0 -176
  253. aiq/runtime/session.py +0 -140
  254. aiq/runtime/user_metadata.py +0 -131
  255. aiq/settings/__init__.py +0 -0
  256. aiq/settings/global_settings.py +0 -318
  257. aiq/test/.namespace +0 -1
  258. aiq/tool/__init__.py +0 -0
  259. aiq/tool/code_execution/__init__.py +0 -0
  260. aiq/tool/code_execution/code_sandbox.py +0 -188
  261. aiq/tool/code_execution/local_sandbox/Dockerfile.sandbox +0 -60
  262. aiq/tool/code_execution/local_sandbox/__init__.py +0 -13
  263. aiq/tool/code_execution/local_sandbox/local_sandbox_server.py +0 -83
  264. aiq/tool/code_execution/local_sandbox/sandbox.requirements.txt +0 -4
  265. aiq/tool/code_execution/local_sandbox/start_local_sandbox.sh +0 -25
  266. aiq/tool/code_execution/register.py +0 -70
  267. aiq/tool/code_execution/utils.py +0 -100
  268. aiq/tool/datetime_tools.py +0 -42
  269. aiq/tool/document_search.py +0 -141
  270. aiq/tool/github_tools/__init__.py +0 -0
  271. aiq/tool/github_tools/create_github_commit.py +0 -133
  272. aiq/tool/github_tools/create_github_issue.py +0 -87
  273. aiq/tool/github_tools/create_github_pr.py +0 -106
  274. aiq/tool/github_tools/get_github_file.py +0 -106
  275. aiq/tool/github_tools/get_github_issue.py +0 -166
  276. aiq/tool/github_tools/get_github_pr.py +0 -256
  277. aiq/tool/github_tools/update_github_issue.py +0 -100
  278. aiq/tool/mcp/__init__.py +0 -14
  279. aiq/tool/mcp/mcp_client.py +0 -220
  280. aiq/tool/mcp/mcp_tool.py +0 -95
  281. aiq/tool/memory_tools/__init__.py +0 -0
  282. aiq/tool/memory_tools/add_memory_tool.py +0 -79
  283. aiq/tool/memory_tools/delete_memory_tool.py +0 -67
  284. aiq/tool/memory_tools/get_memory_tool.py +0 -72
  285. aiq/tool/nvidia_rag.py +0 -95
  286. aiq/tool/register.py +0 -37
  287. aiq/tool/retriever.py +0 -89
  288. aiq/tool/server_tools.py +0 -63
  289. aiq/utils/__init__.py +0 -0
  290. aiq/utils/data_models/__init__.py +0 -0
  291. aiq/utils/data_models/schema_validator.py +0 -58
  292. aiq/utils/debugging_utils.py +0 -43
  293. aiq/utils/exception_handlers/__init__.py +0 -0
  294. aiq/utils/exception_handlers/schemas.py +0 -114
  295. aiq/utils/io/__init__.py +0 -0
  296. aiq/utils/io/yaml_tools.py +0 -119
  297. aiq/utils/metadata_utils.py +0 -74
  298. aiq/utils/optional_imports.py +0 -142
  299. aiq/utils/producer_consumer_queue.py +0 -178
  300. aiq/utils/reactive/__init__.py +0 -0
  301. aiq/utils/reactive/base/__init__.py +0 -0
  302. aiq/utils/reactive/base/observable_base.py +0 -65
  303. aiq/utils/reactive/base/observer_base.py +0 -55
  304. aiq/utils/reactive/base/subject_base.py +0 -79
  305. aiq/utils/reactive/observable.py +0 -59
  306. aiq/utils/reactive/observer.py +0 -76
  307. aiq/utils/reactive/subject.py +0 -131
  308. aiq/utils/reactive/subscription.py +0 -49
  309. aiq/utils/settings/__init__.py +0 -0
  310. aiq/utils/settings/global_settings.py +0 -197
  311. aiq/utils/type_converter.py +0 -232
  312. aiq/utils/type_utils.py +0 -397
  313. aiq/utils/url_utils.py +0 -27
  314. aiqtoolkit-1.1.0rc6.dist-info/METADATA +0 -331
  315. aiqtoolkit-1.1.0rc6.dist-info/RECORD +0 -316
  316. aiqtoolkit-1.1.0rc6.dist-info/entry_points.txt +0 -17
  317. aiqtoolkit-1.1.0rc6.dist-info/licenses/LICENSE-3rd-party.txt +0 -3686
  318. aiqtoolkit-1.1.0rc6.dist-info/licenses/LICENSE.md +0 -201
  319. aiqtoolkit-1.1.0rc6.dist-info/top_level.txt +0 -1
aiq/data_models/common.py DELETED
@@ -1,143 +0,0 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-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 inspect
17
- import sys
18
- import typing
19
- from hashlib import sha512
20
-
21
- from pydantic import AliasChoices
22
- from pydantic import BaseModel
23
- from pydantic import Field
24
-
25
- _LT = typing.TypeVar("_LT")
26
-
27
-
28
- class HashableBaseModel(BaseModel):
29
- """
30
- Subclass of a Pydantic BaseModel that is hashable. Use in objects that need to be hashed for caching purposes.
31
- """
32
-
33
- def __hash__(self):
34
- return int.from_bytes(bytes=sha512(f"{self.__class__.__qualname__}::{self.model_dump_json()}".encode(
35
- 'utf-8', errors='ignore')).digest(),
36
- byteorder=sys.byteorder)
37
-
38
- def __lt__(self, other):
39
- return self.__hash__() < other.__hash__()
40
-
41
- def __eq__(self, other):
42
- return self.__hash__() == other.__hash__()
43
-
44
- def __ne__(self, other):
45
- return self.__hash__() != other.__hash__()
46
-
47
- def __gt__(self, other):
48
- return self.__hash__() > other.__hash__()
49
-
50
- @classmethod
51
- def generate_json_schema(cls) -> dict[str, typing.Any]:
52
- return cls.model_json_schema()
53
-
54
- @classmethod
55
- def write_json_schema(cls, schema_path: str) -> None:
56
-
57
- import json
58
-
59
- schema = cls.generate_json_schema()
60
-
61
- with open(schema_path, "w", encoding="utf-8") as f:
62
- json.dump(schema, f, indent=2)
63
-
64
-
65
- def subclass_depth(cls: type) -> int:
66
- """
67
- Compute a class' subclass depth.
68
- """
69
- depth = 0
70
- while (cls is not object):
71
- cls = cls.__base__
72
- depth += 1
73
- return depth
74
-
75
-
76
- def _get_origin_or_base(cls: type) -> type:
77
- """
78
- Get the origin of a type or the base class if it is not a generic.
79
- """
80
- origin = typing.get_origin(cls)
81
- if origin is None:
82
- return cls
83
- return origin
84
-
85
-
86
- class BaseModelRegistryTag:
87
-
88
- pass
89
-
90
-
91
- class TypedBaseModel(BaseModel):
92
- """
93
- Subclass of Pydantic BaseModel that allows for specifying the object type. Use in Pydantic discriminated unions.
94
- """
95
-
96
- type: str = Field(init=False,
97
- serialization_alias="_type",
98
- validation_alias=AliasChoices('type', '_type'),
99
- description="The type of the object",
100
- title="Type",
101
- repr=False)
102
-
103
- full_type: typing.ClassVar[str]
104
-
105
- def __init_subclass__(cls, name: str | None = None):
106
- super().__init_subclass__()
107
-
108
- if (name is not None):
109
- module = inspect.getmodule(cls)
110
-
111
- assert module is not None, f"Module not found for class {cls} when registering {name}"
112
- package_name: str | None = module.__package__
113
-
114
- # If the package name is not set, then we use the module name. Must have some namespace which will be unique
115
- if (not package_name):
116
- package_name = module.__name__
117
-
118
- full_name = f"{package_name}/{name}"
119
-
120
- type_field = cls.model_fields.get("type")
121
- if type_field is not None:
122
- type_field.default = name
123
- cls.full_type = full_name
124
-
125
- @classmethod
126
- def static_type(cls):
127
- return cls.model_fields.get("type").default
128
-
129
- @classmethod
130
- def static_full_type(cls):
131
- return cls.full_type
132
-
133
- @staticmethod
134
- def discriminator(v: typing.Any) -> str | None:
135
- # If its serialized, then we use the alias
136
- if isinstance(v, dict):
137
- return v.get("_type", v.get("type"))
138
-
139
- # Otherwise we use the property
140
- return getattr(v, "type")
141
-
142
-
143
- TypedBaseModelT = typing.TypeVar("TypedBaseModelT", bound=TypedBaseModel)
@@ -1,46 +0,0 @@
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 logging
17
- from enum import StrEnum
18
-
19
- logger = logging.getLogger(__name__)
20
-
21
-
22
- class AIQComponentEnum(StrEnum):
23
- FRONT_END = "front_end"
24
- FUNCTION = "function"
25
- TOOL_WRAPPER = "tool_wrapper"
26
- LLM_PROVIDER = "llm_provider"
27
- LLM_CLIENT = "llm_client"
28
- EMBEDDER_PROVIDER = "embedder_provider"
29
- EMBEDDER_CLIENT = "embedder_client"
30
- EVALUATOR = "evaluator"
31
- MEMORY = "memory"
32
- RETRIEVER_PROVIDER = "retriever_provider"
33
- RETRIEVER_CLIENT = "retriever_client"
34
- REGISTRY_HANDLER = "registry_handler"
35
- LOGGING = "logging"
36
- TRACING = "tracing"
37
- PACKAGE = "package"
38
- UNDEFINED = "undefined"
39
-
40
-
41
- class ComponentGroup(StrEnum):
42
- EMBEDDERS = "embedders"
43
- FUNCTIONS = "functions"
44
- LLMS = "llms"
45
- MEMORY = "memory"
46
- RETRIEVERS = "retrievers"
@@ -1,135 +0,0 @@
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 typing
17
- from abc import ABC
18
- from abc import abstractmethod
19
-
20
- from pydantic_core import CoreSchema
21
- from pydantic_core import core_schema
22
-
23
- from aiq.data_models.common import HashableBaseModel
24
- from aiq.data_models.component import ComponentGroup
25
- from aiq.utils.type_utils import override
26
-
27
-
28
- def generate_instance_id(input_object: typing.Any) -> str:
29
- """Generates a unique identifier for a python object derived from its python unique id.
30
-
31
- Args:
32
- input_object (typing.Any): The input object to receive a unique identifier.
33
-
34
- Returns:
35
- str: Unique identifier.
36
- """
37
-
38
- return str(id(input_object))
39
-
40
-
41
- class ComponentRefNode(HashableBaseModel):
42
- """A node type for component runtime instances reference names in a networkx digraph.
43
-
44
- Args:
45
- ref_name (ComponentRef): The name of the component runtime instance.
46
- component_group (ComponentGroup): The component group in an AIQ Toolkit configuration object.
47
- """
48
-
49
- ref_name: "ComponentRef"
50
- component_group: ComponentGroup
51
-
52
-
53
- class ComponentRef(str, ABC):
54
- """
55
- Abstract class used for the interface to derive ComponentRef objects.
56
- """
57
-
58
- def __new__(cls, value: "ComponentRef | str"):
59
- # Sublcassing str skips abstractmethod enforcement.
60
- if len(cls.__abstractmethods__ - set(cls.__dict__)):
61
- abstract_methods = ", ".join([f"'{method}'" for method in cls.__abstractmethods__])
62
- raise TypeError(f"Can't instantiate abstract class {cls.__name__} "
63
- f"without an implementation for abstract method(s) {abstract_methods}")
64
-
65
- return super().__new__(cls, value)
66
-
67
- @property
68
- @abstractmethod
69
- def component_group(self) -> ComponentGroup:
70
- """Provides the component group this ComponentRef object represents.
71
-
72
- Returns:
73
- ComponentGroup: A component group of the AIQ Toolkit configuration object
74
- """
75
-
76
- pass
77
-
78
- @classmethod
79
- def __get_pydantic_core_schema__(cls, source_type, handler, **kwargs) -> CoreSchema:
80
- return core_schema.no_info_plain_validator_function(cls)
81
-
82
-
83
- class EmbedderRef(ComponentRef):
84
- """
85
- A reference to an embedder in an AIQ Toolkit configuration object.
86
- """
87
-
88
- @property
89
- @override
90
- def component_group(self):
91
- return ComponentGroup.EMBEDDERS
92
-
93
-
94
- class FunctionRef(ComponentRef):
95
- """
96
- A reference to a function in an AIQ Toolkit configuration object.
97
- """
98
-
99
- @property
100
- @override
101
- def component_group(self):
102
- return ComponentGroup.FUNCTIONS
103
-
104
-
105
- class LLMRef(ComponentRef):
106
- """
107
- A reference to an LLM in an AIQ Toolkit configuration object.
108
- """
109
-
110
- @property
111
- @override
112
- def component_group(self):
113
- return ComponentGroup.LLMS
114
-
115
-
116
- class MemoryRef(ComponentRef):
117
- """
118
- A reference to a memory in an AIQ Toolkit configuration object.
119
- """
120
-
121
- @property
122
- @override
123
- def component_group(self):
124
- return ComponentGroup.MEMORY
125
-
126
-
127
- class RetrieverRef(ComponentRef):
128
- """
129
- A reference to a retriever in an AIQ Toolkit configuration object.
130
- """
131
-
132
- @property
133
- @override
134
- def component_group(self):
135
- return ComponentGroup.RETRIEVERS
aiq/data_models/config.py DELETED
@@ -1,349 +0,0 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-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 logging
17
- import sys
18
- import typing
19
-
20
- from pydantic import BaseModel
21
- from pydantic import ConfigDict
22
- from pydantic import Discriminator
23
- from pydantic import ValidationError
24
- from pydantic import ValidationInfo
25
- from pydantic import ValidatorFunctionWrapHandler
26
- from pydantic import field_validator
27
-
28
- from aiq.data_models.evaluate import EvalConfig
29
- from aiq.data_models.front_end import FrontEndBaseConfig
30
- from aiq.data_models.function import EmptyFunctionConfig
31
- from aiq.data_models.function import FunctionBaseConfig
32
- from aiq.data_models.logging import LoggingBaseConfig
33
- from aiq.data_models.telemetry_exporter import TelemetryExporterBaseConfig
34
- from aiq.front_ends.fastapi.fastapi_front_end_config import FastApiFrontEndConfig
35
-
36
- from .common import HashableBaseModel
37
- from .common import TypedBaseModel
38
- from .embedder import EmbedderBaseConfig
39
- from .llm import LLMBaseConfig
40
- from .memory import MemoryBaseConfig
41
- from .retriever import RetrieverBaseConfig
42
-
43
- logger = logging.getLogger(__name__)
44
-
45
-
46
- def _process_validation_error(err: ValidationError, handler: ValidatorFunctionWrapHandler, info: ValidationInfo):
47
- from aiq.cli.type_registry import GlobalTypeRegistry # pylint: disable=cyclic-import
48
-
49
- new_errors = []
50
- logged_once = False
51
- needs_reraise = False
52
- for e in err.errors():
53
-
54
- error_type = e['type']
55
- if error_type == 'union_tag_invalid' and "ctx" in e and not logged_once:
56
- requested_type = e["ctx"]["tag"]
57
-
58
- if (info.field_name in ('workflow', 'functions')):
59
- registered_keys = GlobalTypeRegistry.get().get_registered_functions()
60
- elif (info.field_name == "llms"):
61
- registered_keys = GlobalTypeRegistry.get().get_registered_llm_providers()
62
- elif (info.field_name == "embedders"):
63
- registered_keys = GlobalTypeRegistry.get().get_registered_embedder_providers()
64
- elif (info.field_name == "memory"):
65
- registered_keys = GlobalTypeRegistry.get().get_registered_memorys()
66
- elif (info.field_name == "retrievers"):
67
- registered_keys = GlobalTypeRegistry.get().get_registered_retriever_providers()
68
- elif (info.field_name == "tracing"):
69
- registered_keys = GlobalTypeRegistry.get().get_registered_telemetry_exporters()
70
- elif (info.field_name == "logging"):
71
- registered_keys = GlobalTypeRegistry.get().get_registered_logging_method()
72
- elif (info.field_name == "evaluators"):
73
- registered_keys = GlobalTypeRegistry.get().get_registered_evaluators()
74
- elif (info.field_name == "front_ends"):
75
- registered_keys = GlobalTypeRegistry.get().get_registered_front_ends()
76
-
77
- else:
78
- assert False, f"Unknown field name {info.field_name} in validator"
79
-
80
- # Check and see if the there are multiple full types which match this short type
81
- matching_keys = [k for k in registered_keys if k.local_name == requested_type]
82
-
83
- assert len(matching_keys) != 1, "Exact match should have been found. Contact developers"
84
-
85
- matching_key_names = [x.full_type for x in matching_keys]
86
- registered_key_names = [x.full_type for x in registered_keys]
87
-
88
- if (len(matching_keys) == 0):
89
- # This is a case where the requested type is not found. Show a helpful message about what is
90
- # available
91
- logger.error(("Requested %s type `%s` not found. "
92
- "Have you ensured the necessary package has been installed with `uv pip install`?"
93
- "\nAvailable %s names:\n - %s\n"),
94
- info.field_name,
95
- requested_type,
96
- info.field_name,
97
- '\n - '.join(registered_key_names))
98
- else:
99
- # This is a case where the requested type is ambiguous.
100
- logger.error(("Requested %s type `%s` is ambiguous. "
101
- "Matched multiple %s by their local name: %s. "
102
- "Please use the fully qualified %s name."
103
- "\nAvailable %s names:\n - %s\n"),
104
- info.field_name,
105
- requested_type,
106
- info.field_name,
107
- matching_key_names,
108
- info.field_name,
109
- info.field_name,
110
- '\n - '.join(registered_key_names))
111
-
112
- # Only show one error
113
- logged_once = True
114
-
115
- elif error_type == 'missing':
116
- location = e["loc"]
117
- if len(location) > 1: # remove the _type field from the location
118
- e['loc'] = (location[0], ) + location[2:]
119
- needs_reraise = True
120
-
121
- new_errors.append(e)
122
-
123
- if needs_reraise:
124
- raise ValidationError.from_exception_data(title=err.title, line_errors=new_errors)
125
-
126
-
127
- class TelemetryConfig(BaseModel):
128
-
129
- logging: dict[str, LoggingBaseConfig] = {}
130
- tracing: dict[str, TelemetryExporterBaseConfig] = {}
131
-
132
- @field_validator("logging", "tracing", mode="wrap")
133
- @classmethod
134
- def validate_components(cls, value: typing.Any, handler: ValidatorFunctionWrapHandler, info: ValidationInfo):
135
-
136
- try:
137
- return handler(value)
138
- except ValidationError as err:
139
- _process_validation_error(err, handler, info)
140
- raise
141
-
142
- @classmethod
143
- def rebuild_annotations(cls):
144
-
145
- from aiq.cli.type_registry import GlobalTypeRegistry
146
-
147
- type_registry = GlobalTypeRegistry.get()
148
-
149
- TracingAnnotation = dict[str,
150
- typing.Annotated[type_registry.compute_annotation(TelemetryExporterBaseConfig),
151
- Discriminator(TypedBaseModel.discriminator)]]
152
-
153
- LoggingAnnotation = dict[str,
154
- typing.Annotated[type_registry.compute_annotation(LoggingBaseConfig),
155
- Discriminator(TypedBaseModel.discriminator)]]
156
-
157
- should_rebuild = False
158
-
159
- tracing_field = cls.model_fields.get("tracing")
160
- if tracing_field is not None and tracing_field.annotation != TracingAnnotation:
161
- tracing_field.annotation = TracingAnnotation
162
- should_rebuild = True
163
-
164
- logging_field = cls.model_fields.get("logging")
165
- if logging_field is not None and logging_field.annotation != LoggingAnnotation:
166
- logging_field.annotation = LoggingAnnotation
167
- should_rebuild = True
168
-
169
- if (should_rebuild):
170
- return cls.model_rebuild(force=True)
171
-
172
- return False
173
-
174
-
175
- class GeneralConfig(BaseModel):
176
-
177
- model_config = ConfigDict(protected_namespaces=())
178
-
179
- use_uvloop: bool = True
180
- """
181
- Whether to use uvloop for the event loop. This can provide a significant speedup in some cases. Disable to provide
182
- better error messages when debugging.
183
- """
184
-
185
- telemetry: TelemetryConfig = TelemetryConfig()
186
-
187
- # FrontEnd Configuration
188
- front_end: FrontEndBaseConfig = FastApiFrontEndConfig()
189
-
190
- @field_validator("front_end", mode="wrap")
191
- @classmethod
192
- def validate_components(cls, value: typing.Any, handler: ValidatorFunctionWrapHandler, info: ValidationInfo):
193
-
194
- try:
195
- return handler(value)
196
- except ValidationError as err:
197
- _process_validation_error(err, handler, info)
198
- raise
199
-
200
- @classmethod
201
- def rebuild_annotations(cls):
202
-
203
- from aiq.cli.type_registry import GlobalTypeRegistry
204
-
205
- type_registry = GlobalTypeRegistry.get()
206
-
207
- FrontEndAnnotation = typing.Annotated[type_registry.compute_annotation(FrontEndBaseConfig),
208
- Discriminator(TypedBaseModel.discriminator)]
209
-
210
- should_rebuild = False
211
-
212
- front_end_field = cls.model_fields.get("front_end")
213
- if front_end_field is not None and front_end_field.annotation != FrontEndAnnotation:
214
- front_end_field.annotation = FrontEndAnnotation
215
- should_rebuild = True
216
-
217
- if (TelemetryConfig.rebuild_annotations()):
218
- should_rebuild = True
219
-
220
- if (should_rebuild):
221
- return cls.model_rebuild(force=True)
222
-
223
- return False
224
-
225
-
226
- class AIQConfig(HashableBaseModel):
227
-
228
- model_config = ConfigDict(extra="forbid")
229
-
230
- # Global Options
231
- general: GeneralConfig = GeneralConfig()
232
-
233
- # Functions Configuration
234
- functions: dict[str, FunctionBaseConfig] = {}
235
-
236
- # LLMs Configuration
237
- llms: dict[str, LLMBaseConfig] = {}
238
-
239
- # Embedders Configuration
240
- embedders: dict[str, EmbedderBaseConfig] = {}
241
-
242
- # Memory Configuration
243
- memory: dict[str, MemoryBaseConfig] = {}
244
-
245
- # Retriever Configuration
246
- retrievers: dict[str, RetrieverBaseConfig] = {}
247
-
248
- # Workflow Configuration
249
- workflow: FunctionBaseConfig = EmptyFunctionConfig()
250
-
251
- # Evaluation Options
252
- eval: EvalConfig = EvalConfig()
253
-
254
- def print_summary(self, stream: typing.TextIO = sys.stdout):
255
- """Print a summary of the configuration"""
256
-
257
- stream.write("\nConfiguration Summary:\n")
258
- stream.write("-" * 20 + "\n")
259
- if self.workflow:
260
- stream.write(f"Workflow Type: {self.workflow.type}\n")
261
-
262
- stream.write(f"Number of Functions: {len(self.functions)}\n")
263
- stream.write(f"Number of LLMs: {len(self.llms)}\n")
264
- stream.write(f"Number of Embedders: {len(self.embedders)}\n")
265
- stream.write(f"Number of Memory: {len(self.memory)}\n")
266
- stream.write(f"Number of Retrievers: {len(self.retrievers)}\n")
267
-
268
- @field_validator("functions", "llms", "embedders", "memory", "retrievers", "workflow", mode="wrap")
269
- @classmethod
270
- def validate_components(cls, value: typing.Any, handler: ValidatorFunctionWrapHandler, info: ValidationInfo):
271
-
272
- try:
273
- return handler(value)
274
- except ValidationError as err:
275
- _process_validation_error(err, handler, info)
276
- raise
277
-
278
- @classmethod
279
- def rebuild_annotations(cls):
280
-
281
- from aiq.cli.type_registry import GlobalTypeRegistry
282
-
283
- type_registry = GlobalTypeRegistry.get()
284
-
285
- LLMsAnnotation = dict[str,
286
- typing.Annotated[type_registry.compute_annotation(LLMBaseConfig),
287
- Discriminator(TypedBaseModel.discriminator)]]
288
-
289
- EmbeddersAnnotation = dict[str,
290
- typing.Annotated[type_registry.compute_annotation(EmbedderBaseConfig),
291
- Discriminator(TypedBaseModel.discriminator)]]
292
-
293
- FunctionsAnnotation = dict[str,
294
- typing.Annotated[type_registry.compute_annotation(FunctionBaseConfig, ),
295
- Discriminator(TypedBaseModel.discriminator)]]
296
-
297
- MemoryAnnotation = dict[str,
298
- typing.Annotated[type_registry.compute_annotation(MemoryBaseConfig),
299
- Discriminator(TypedBaseModel.discriminator)]]
300
-
301
- RetrieverAnnotation = dict[str,
302
- typing.Annotated[type_registry.compute_annotation(RetrieverBaseConfig),
303
- Discriminator(TypedBaseModel.discriminator)]]
304
-
305
- WorkflowAnnotation = typing.Annotated[type_registry.compute_annotation(FunctionBaseConfig),
306
- Discriminator(TypedBaseModel.discriminator)]
307
-
308
- should_rebuild = False
309
-
310
- llms_field = cls.model_fields.get("llms")
311
- if llms_field is not None and llms_field.annotation != LLMsAnnotation:
312
- llms_field.annotation = LLMsAnnotation
313
- should_rebuild = True
314
-
315
- embedders_field = cls.model_fields.get("embedders")
316
- if embedders_field is not None and embedders_field.annotation != EmbeddersAnnotation:
317
- embedders_field.annotation = EmbeddersAnnotation
318
- should_rebuild = True
319
-
320
- functions_field = cls.model_fields.get("functions")
321
- if functions_field is not None and functions_field.annotation != FunctionsAnnotation:
322
- functions_field.annotation = FunctionsAnnotation
323
- should_rebuild = True
324
-
325
- memory_field = cls.model_fields.get("memory")
326
- if memory_field is not None and memory_field.annotation != MemoryAnnotation:
327
- memory_field.annotation = MemoryAnnotation
328
- should_rebuild = True
329
-
330
- retrievers_field = cls.model_fields.get("retrievers")
331
- if retrievers_field is not None and retrievers_field.annotation != RetrieverAnnotation:
332
- retrievers_field.annotation = RetrieverAnnotation
333
- should_rebuild = True
334
-
335
- workflow_field = cls.model_fields.get("workflow")
336
- if workflow_field is not None and workflow_field.annotation != WorkflowAnnotation:
337
- workflow_field.annotation = WorkflowAnnotation
338
- should_rebuild = True
339
-
340
- if (GeneralConfig.rebuild_annotations()):
341
- should_rebuild = True
342
-
343
- if (EvalConfig.rebuild_annotations()):
344
- should_rebuild = True
345
-
346
- if (should_rebuild):
347
- return cls.model_rebuild(force=True)
348
-
349
- return False