aiqtoolkit 1.1.0a20250516__py3-none-any.whl → 1.1.0a20251020__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.1.0a20251020.dist-info/METADATA +37 -0
  2. aiqtoolkit-1.1.0a20251020.dist-info/RECORD +4 -0
  3. {aiqtoolkit-1.1.0a20250516.dist-info → aiqtoolkit-1.1.0a20251020.dist-info}/WHEEL +1 -1
  4. aiqtoolkit-1.1.0a20251020.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.0a20250516.dist-info/METADATA +0 -331
  315. aiqtoolkit-1.1.0a20250516.dist-info/RECORD +0 -316
  316. aiqtoolkit-1.1.0a20250516.dist-info/entry_points.txt +0 -17
  317. aiqtoolkit-1.1.0a20250516.dist-info/licenses/LICENSE-3rd-party.txt +0 -3686
  318. aiqtoolkit-1.1.0a20250516.dist-info/licenses/LICENSE.md +0 -201
  319. aiqtoolkit-1.1.0a20250516.dist-info/top_level.txt +0 -1
@@ -1,37 +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
- from abc import ABC
17
- from abc import abstractmethod
18
-
19
- from aiq.retriever.models import RetrieverOutput
20
-
21
-
22
- class AIQRetriever(ABC):
23
- """
24
- Abstract interface for interacting with data stores.
25
-
26
- A Retriever is resposible for retrieving data from a configured data store.
27
-
28
- Implemntations may integrate with vector stores or other indexing backends that allow for text-based search.
29
- """
30
-
31
- @abstractmethod
32
- async def search(self, query: str, **kwargs) -> RetrieverOutput:
33
- """
34
- Retireve max(top_k) items from the data store based on vector similarity search (implementation dependent).
35
-
36
- """
37
- raise NotImplementedError
@@ -1,14 +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.
@@ -1,81 +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
- from pydantic import Field
17
- from pydantic import HttpUrl
18
-
19
- from aiq.builder.builder import Builder
20
- from aiq.builder.builder import LLMFrameworkEnum
21
- from aiq.builder.retriever import RetrieverProviderInfo
22
- from aiq.cli.register_workflow import register_retriever_client
23
- from aiq.cli.register_workflow import register_retriever_provider
24
- from aiq.data_models.retriever import RetrieverBaseConfig
25
-
26
-
27
- class MilvusRetrieverConfig(RetrieverBaseConfig, name="milvus_retriever"):
28
- """
29
- Configuration for a Retriever which pulls data from a Milvus service.
30
- """
31
- uri: HttpUrl = Field(description="The uri of Milvus service")
32
- connection_args: dict = Field(
33
- description="Dictionary of arguments used to connect to and authenticate with the Milvus service",
34
- default={},
35
- )
36
- embedding_model: str = Field(description="The name of the embedding model to use for vectorizing the query")
37
- collection_name: str | None = Field(description="The name of the milvus collection to search", default=None)
38
- content_field: str = Field(description="Name of the primary field to store/retrieve",
39
- default="text",
40
- alias="primary_field")
41
- top_k: int | None = Field(gt=0, description="The number of results to return", default=None)
42
- output_fields: list[str] | None = Field(
43
- default=None,
44
- description="A list of fields to return from the datastore. If 'None', all fields but the vector are returned.")
45
- search_params: dict = Field(default={"metric_type": "L2"},
46
- description="Search parameters to use when performing vector search")
47
- vector_field: str = Field(default="vector", description="Name of the field to compare with the vectorized query")
48
- description: str | None = Field(default=None,
49
- description="If present it will be used as the tool description",
50
- alias="collection_description")
51
-
52
-
53
- @register_retriever_provider(config_type=MilvusRetrieverConfig)
54
- async def milvus_retriever(retriever_config: MilvusRetrieverConfig, builder: Builder):
55
- yield RetrieverProviderInfo(config=retriever_config,
56
- description="An adapter for a Miluvs data store to use with a Retriever Client")
57
-
58
-
59
- @register_retriever_client(config_type=MilvusRetrieverConfig, wrapper_type=None)
60
- async def milvus_retriever_client(config: MilvusRetrieverConfig, builder: Builder):
61
- from pymilvus import MilvusClient
62
-
63
- from aiq.retriever.milvus.retriever import MilvusRetriever
64
-
65
- embedder = await builder.get_embedder(embedder_name=config.embedding_model, wrapper_type=LLMFrameworkEnum.LANGCHAIN)
66
-
67
- milvus_client = MilvusClient(uri=str(config.uri), **config.connection_args)
68
- retriever = MilvusRetriever(
69
- client=milvus_client,
70
- embedder=embedder,
71
- content_field=config.content_field,
72
- )
73
-
74
- # Using parameters in the config to set default values which can be overridden during the function call.
75
- optional_fields = ["collection_name", "top_k", "output_fields", "search_params", "vector_field"]
76
- model_dict = config.model_dump()
77
- optional_args = {field: model_dict[field] for field in optional_fields if model_dict[field] is not None}
78
-
79
- retriever.bind(**optional_args)
80
-
81
- yield retriever
@@ -1,228 +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 functools import partial
18
-
19
- from langchain_core.embeddings import Embeddings
20
- from pymilvus import MilvusClient
21
- from pymilvus.client.abstract import Hit
22
-
23
- from aiq.retriever.interface import AIQRetriever
24
- from aiq.retriever.models import AIQDocument
25
- from aiq.retriever.models import RetrieverError
26
- from aiq.retriever.models import RetrieverOutput
27
-
28
- logger = logging.getLogger(__name__)
29
-
30
-
31
- class CollectionNotFoundError(RetrieverError):
32
- pass
33
-
34
-
35
- class MilvusRetriever(AIQRetriever):
36
- """
37
- Client for retrieving document chunks from a Milvus vectorstore
38
- """
39
-
40
- def __init__(
41
- self,
42
- client: MilvusClient,
43
- embedder: Embeddings,
44
- content_field: str = "text",
45
- use_iterator: bool = False,
46
- ) -> None:
47
- """
48
- Initialize the Milvus Retriever using a preconfigured MilvusClient
49
-
50
- Args:
51
- client (MilvusClient): Preinstantiate pymilvus.MilvusClient object.
52
- """
53
- self._client = client
54
- self._embedder = embedder
55
-
56
- if use_iterator and "search_iterator" not in dir(self._client):
57
- raise ValueError("This version of the pymilvus.MilvusClient does not support the search iterator.")
58
-
59
- self._search_func = self._search if not use_iterator else self._search_with_iterator
60
- self._default_params = None
61
- self._bound_params = []
62
- self.content_field = content_field
63
- logger.info("Mivlus Retriever using %s for search.", self._search_func.__name__)
64
-
65
- def bind(self, **kwargs) -> None:
66
- """
67
- Bind default values to the search method. Cannot bind the 'query' parameter.
68
-
69
- Args:
70
- kwargs (dict): Key value pairs corresponding to the default values of search parameters.
71
- """
72
- if "query" in kwargs:
73
- kwargs = {k: v for k, v in kwargs.items() if k != "query"}
74
- self._search_func = partial(self._search_func, **kwargs)
75
- self._bound_params = list(kwargs.keys())
76
- logger.debug("Binding paramaters for search function: %s", kwargs)
77
-
78
- def get_unbound_params(self) -> list[str]:
79
- """
80
- Returns a list of unbound parameters which will need to be passed to the search function.
81
- """
82
- return [param for param in ["query", "collection_name", "top_k", "filters"] if param not in self._bound_params]
83
-
84
- def _validate_collection(self, collection_name: str) -> bool:
85
- return collection_name in self._client.list_collections()
86
-
87
- async def search(self, query: str, **kwargs):
88
- return await self._search_func(query=query, **kwargs)
89
-
90
- async def _search_with_iterator(self,
91
- query: str,
92
- *,
93
- collection_name: str,
94
- top_k: int,
95
- filters: str | None = None,
96
- output_fields: list[str] | None = None,
97
- search_params: dict | None = None,
98
- timeout: float | None = None,
99
- vector_field_name: str | None = "vector",
100
- distance_cutoff: float | None = None,
101
- **kwargs):
102
- """
103
- Retrieve document chunks from a Milvus vectorstore using a search iterator, allowing for the retrieval of more
104
- results.
105
- """
106
- logger.debug("MilvusRetriever searching query: %s, for collection: %s. Returning max %s results",
107
- query,
108
- collection_name,
109
- top_k)
110
-
111
- if not self._validate_collection(collection_name):
112
- raise CollectionNotFoundError(f"Collection: {collection_name} does not exist")
113
-
114
- # If no output fields are specified, return all of them
115
- if not output_fields:
116
- collection_schema = self._client.describe_collection(collection_name)
117
- output_fields = [
118
- field["name"] for field in collection_schema.get("fields") if field["name"] != vector_field_name
119
- ]
120
-
121
- search_vector = self._embedder.embed_query(query)
122
-
123
- search_iterator = self._client.search_iterator(
124
- collection_name=collection_name,
125
- data=[search_vector],
126
- batch_size=kwargs.get("batch_size", 1000),
127
- filter=filters,
128
- limit=top_k,
129
- output_fields=output_fields,
130
- search_params=search_params if search_params else {"metric_type": "L2"},
131
- timeout=timeout,
132
- anns_field=vector_field_name,
133
- round_decimal=kwargs.get("round_decimal", -1),
134
- partition_names=kwargs.get("partition_names", None),
135
- )
136
-
137
- results = []
138
- try:
139
- while True:
140
- _res = search_iterator.next()
141
- res = _res.get_res()
142
- if len(_res) == 0:
143
- search_iterator.close()
144
- break
145
-
146
- if distance_cutoff and res[0][-1].distance > distance_cutoff:
147
- for i in range(len(res[0])):
148
- if res[0][i].distance > distance_cutoff:
149
- break
150
- results.append(res[0][i])
151
- break
152
- results.extend(res[0])
153
-
154
- return _wrap_milvus_results(results, content_field=self.content_field)
155
-
156
- except Exception as e:
157
- logger.exception("Exception when retrieving results from milvus for query %s: %s", query, e)
158
- raise RetrieverError(f"Error when retrieving documents from {collection_name} for query '{query}'") from e
159
-
160
- async def _search(self,
161
- query: str,
162
- *,
163
- collection_name: str,
164
- top_k: int,
165
- filters: str | None = None,
166
- output_fields: list[str] | None = None,
167
- search_params: dict | None = None,
168
- timeout: float | None = None,
169
- vector_field_name: str | None = "vector",
170
- **kwargs):
171
- """
172
- Retrieve document chunks from a Milvus vectorstore
173
- """
174
- logger.debug("MilvusRetriever searching query: %s, for collection: %s. Returning max %s results",
175
- query,
176
- collection_name,
177
- top_k)
178
-
179
- if not self._validate_collection(collection_name):
180
- raise CollectionNotFoundError(f"Collection: {collection_name} does not exist")
181
-
182
- available_fields = [v.get("name") for v in self._client.describe_collection(collection_name).get("fields", {})]
183
-
184
- if self.content_field not in available_fields:
185
- raise ValueError(f"The specified content field: {self.content_field} is not part of the schema.")
186
-
187
- if vector_field_name not in available_fields:
188
- raise ValueError(f"The specified vector field name: {vector_field_name} is not part of the schema.")
189
-
190
- # If no output fields are specified, return all of them
191
- if not output_fields:
192
- output_fields = [field for field in available_fields if field != vector_field_name]
193
-
194
- if self.content_field not in output_fields:
195
- output_fields.append(self.content_field)
196
-
197
- search_vector = self._embedder.embed_query(query)
198
- res = self._client.search(
199
- collection_name=collection_name,
200
- data=[search_vector],
201
- filter=filters,
202
- output_fields=output_fields,
203
- search_params=search_params if search_params else {"metric_type": "L2"},
204
- timeout=timeout,
205
- anns_field=vector_field_name,
206
- limit=top_k,
207
- )
208
-
209
- return _wrap_milvus_results(res[0], content_field=self.content_field)
210
-
211
-
212
- def _wrap_milvus_results(res: list[Hit], content_field: str):
213
- return RetrieverOutput(results=[_wrap_milvus_single_results(r, content_field=content_field) for r in res])
214
-
215
-
216
- def _wrap_milvus_single_results(res: Hit | dict, content_field: str) -> AIQDocument:
217
- if not isinstance(res, (Hit, dict)):
218
- raise ValueError(f"Milvus search returned object of type {type(res)}. Expected 'Hit' or 'dict'.")
219
-
220
- if isinstance(res, Hit):
221
- metadata = {k: v for k, v in res.fields.items() if k != content_field}
222
- metadata.update({"distance": res.distance})
223
- return AIQDocument(page_content=res.fields[content_field], metadata=metadata, document_id=res.id)
224
-
225
- fields = res["entity"]
226
- metadata = {k: v for k, v in fields.items() if k != content_field}
227
- metadata.update({"distance": res.get("distance")})
228
- return AIQDocument(page_content=fields.get(content_field), metadata=metadata, document_id=res["id"])
aiq/retriever/models.py DELETED
@@ -1,74 +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
- from __future__ import annotations
17
-
18
- import json
19
- from typing import Any
20
-
21
- from pydantic import BaseModel
22
- from pydantic import Field
23
-
24
- from aiq.utils.type_converter import GlobalTypeConverter
25
-
26
-
27
- class AIQDocument(BaseModel):
28
- """
29
- Object representing a retrieved document/chunk from a standard AIQ Toolkit Retriever.
30
- """
31
- page_content: str = Field(description="Primary content of the document to insert or retrieve")
32
- metadata: dict[str, Any] = Field(description="Metadata dictionary attached to the AIQDocument")
33
- document_id: str | None = Field(description="Unique ID for the document, if supported by the configured datastore",
34
- default=None)
35
-
36
- @classmethod
37
- def from_dict(cls, data: dict[str, Any]) -> AIQDocument:
38
- """
39
- Deserialize an AIQDocument from a dictionary representation.
40
-
41
- Args:
42
- data (dict): A dictionary containing keys
43
- 'page_content', 'metadata', and optionally 'document_id'.
44
-
45
- Returns:
46
- MemoryItem: A reconstructed MemoryItem instance.
47
- """
48
- return cls(**data)
49
-
50
-
51
- class RetrieverOutput(BaseModel):
52
- results: list[AIQDocument] = Field(description="A list of retrieved AIQDocuments")
53
-
54
- def __len__(self):
55
- return len(self.results)
56
-
57
- def __str__(self):
58
- return json.dumps(self.model_dump())
59
-
60
-
61
- class RetrieverError(Exception):
62
- pass
63
-
64
-
65
- def retriever_output_to_dict(obj: RetrieverOutput) -> dict:
66
- return obj.model_dump()
67
-
68
-
69
- def retriever_output_to_str(obj: RetrieverOutput) -> str:
70
- return str(obj)
71
-
72
-
73
- GlobalTypeConverter.register_converter(retriever_output_to_dict)
74
- GlobalTypeConverter.register_converter(retriever_output_to_str)
@@ -1,14 +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.
@@ -1,60 +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
- from pydantic import Field
17
- from pydantic import HttpUrl
18
-
19
- from aiq.builder.builder import Builder
20
- from aiq.builder.retriever import RetrieverProviderInfo
21
- from aiq.cli.register_workflow import register_retriever_client
22
- from aiq.cli.register_workflow import register_retriever_provider
23
- from aiq.data_models.retriever import RetrieverBaseConfig
24
-
25
-
26
- class NemoRetrieverConfig(RetrieverBaseConfig, name="nemo_retriever"):
27
- """
28
- Configuration for a Retriever which pulls data from a Nemo Retriever service.
29
- """
30
- uri: HttpUrl = Field(description="The uri of the Nemo Retriever service.")
31
- collection_name: str | None = Field(description="The name of the collection to search", default=None)
32
- top_k: int | None = Field(description="The number of results to return", gt=0, le=50, default=None)
33
- output_fields: list[str] | None = Field(
34
- default=None,
35
- description="A list of fields to return from the datastore. If 'None', all fields but the vector are returned.")
36
- timeout: int = Field(default=60, description="Maximum time to wait for results to be returned from the service.")
37
- nvidia_api_key: str | None = Field(
38
- description="API key used to authenticate with the service. If 'None', will use ENV Variable 'NVIDIA_API_KEY'",
39
- default=None,
40
- )
41
-
42
-
43
- @register_retriever_provider(config_type=NemoRetrieverConfig)
44
- async def nemo_retriever(retriever_config: NemoRetrieverConfig, builder: Builder):
45
- yield RetrieverProviderInfo(config=retriever_config,
46
- description="An adapter for a Nemo data store for use with a Retriever Client")
47
-
48
-
49
- @register_retriever_client(config_type=NemoRetrieverConfig, wrapper_type=None)
50
- async def nemo_retriever_client(config: NemoRetrieverConfig, builder: Builder):
51
- from aiq.retriever.nemo_retriever.retriever import NemoRetriever
52
-
53
- retriever = NemoRetriever(**config.model_dump(exclude={"type", "top_k", "collection_name"}))
54
- optional_fields = ["collection_name", "top_k", "output_fields"]
55
- model_dict = config.model_dump()
56
- optional_args = {field: model_dict[field] for field in optional_fields if model_dict[field] is not None}
57
-
58
- retriever.bind(**optional_args)
59
-
60
- yield retriever