aiqtoolkit 1.2.0rc4__py3-none-any.whl → 1.2rc9__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 (441) hide show
  1. aiqtoolkit-1.2rc9.dist-info/METADATA +29 -0
  2. aiqtoolkit-1.2rc9.dist-info/RECORD +4 -0
  3. aiqtoolkit-1.2rc9.dist-info/top_level.txt +1 -0
  4. aiq/agent/__init__.py +0 -0
  5. aiq/agent/base.py +0 -239
  6. aiq/agent/dual_node.py +0 -67
  7. aiq/agent/react_agent/__init__.py +0 -0
  8. aiq/agent/react_agent/agent.py +0 -355
  9. aiq/agent/react_agent/output_parser.py +0 -104
  10. aiq/agent/react_agent/prompt.py +0 -41
  11. aiq/agent/react_agent/register.py +0 -149
  12. aiq/agent/reasoning_agent/__init__.py +0 -0
  13. aiq/agent/reasoning_agent/reasoning_agent.py +0 -225
  14. aiq/agent/register.py +0 -23
  15. aiq/agent/rewoo_agent/__init__.py +0 -0
  16. aiq/agent/rewoo_agent/agent.py +0 -411
  17. aiq/agent/rewoo_agent/prompt.py +0 -108
  18. aiq/agent/rewoo_agent/register.py +0 -158
  19. aiq/agent/tool_calling_agent/__init__.py +0 -0
  20. aiq/agent/tool_calling_agent/agent.py +0 -119
  21. aiq/agent/tool_calling_agent/register.py +0 -106
  22. aiq/authentication/__init__.py +0 -14
  23. aiq/authentication/api_key/__init__.py +0 -14
  24. aiq/authentication/api_key/api_key_auth_provider.py +0 -96
  25. aiq/authentication/api_key/api_key_auth_provider_config.py +0 -124
  26. aiq/authentication/api_key/register.py +0 -26
  27. aiq/authentication/exceptions/__init__.py +0 -14
  28. aiq/authentication/exceptions/api_key_exceptions.py +0 -38
  29. aiq/authentication/exceptions/auth_code_grant_exceptions.py +0 -86
  30. aiq/authentication/exceptions/call_back_exceptions.py +0 -38
  31. aiq/authentication/exceptions/request_exceptions.py +0 -54
  32. aiq/authentication/http_basic_auth/__init__.py +0 -0
  33. aiq/authentication/http_basic_auth/http_basic_auth_provider.py +0 -81
  34. aiq/authentication/http_basic_auth/register.py +0 -30
  35. aiq/authentication/interfaces.py +0 -93
  36. aiq/authentication/oauth2/__init__.py +0 -14
  37. aiq/authentication/oauth2/oauth2_auth_code_flow_provider.py +0 -107
  38. aiq/authentication/oauth2/oauth2_auth_code_flow_provider_config.py +0 -39
  39. aiq/authentication/oauth2/register.py +0 -25
  40. aiq/authentication/register.py +0 -21
  41. aiq/builder/__init__.py +0 -0
  42. aiq/builder/builder.py +0 -285
  43. aiq/builder/component_utils.py +0 -316
  44. aiq/builder/context.py +0 -264
  45. aiq/builder/embedder.py +0 -24
  46. aiq/builder/eval_builder.py +0 -161
  47. aiq/builder/evaluator.py +0 -29
  48. aiq/builder/framework_enum.py +0 -24
  49. aiq/builder/front_end.py +0 -73
  50. aiq/builder/function.py +0 -344
  51. aiq/builder/function_base.py +0 -380
  52. aiq/builder/function_info.py +0 -627
  53. aiq/builder/intermediate_step_manager.py +0 -174
  54. aiq/builder/llm.py +0 -25
  55. aiq/builder/retriever.py +0 -25
  56. aiq/builder/user_interaction_manager.py +0 -74
  57. aiq/builder/workflow.py +0 -148
  58. aiq/builder/workflow_builder.py +0 -1117
  59. aiq/cli/__init__.py +0 -14
  60. aiq/cli/cli_utils/__init__.py +0 -0
  61. aiq/cli/cli_utils/config_override.py +0 -231
  62. aiq/cli/cli_utils/validation.py +0 -37
  63. aiq/cli/commands/__init__.py +0 -0
  64. aiq/cli/commands/configure/__init__.py +0 -0
  65. aiq/cli/commands/configure/channel/__init__.py +0 -0
  66. aiq/cli/commands/configure/channel/add.py +0 -28
  67. aiq/cli/commands/configure/channel/channel.py +0 -36
  68. aiq/cli/commands/configure/channel/remove.py +0 -30
  69. aiq/cli/commands/configure/channel/update.py +0 -30
  70. aiq/cli/commands/configure/configure.py +0 -33
  71. aiq/cli/commands/evaluate.py +0 -139
  72. aiq/cli/commands/info/__init__.py +0 -14
  73. aiq/cli/commands/info/info.py +0 -39
  74. aiq/cli/commands/info/list_channels.py +0 -32
  75. aiq/cli/commands/info/list_components.py +0 -129
  76. aiq/cli/commands/info/list_mcp.py +0 -213
  77. aiq/cli/commands/registry/__init__.py +0 -14
  78. aiq/cli/commands/registry/publish.py +0 -88
  79. aiq/cli/commands/registry/pull.py +0 -118
  80. aiq/cli/commands/registry/registry.py +0 -38
  81. aiq/cli/commands/registry/remove.py +0 -108
  82. aiq/cli/commands/registry/search.py +0 -155
  83. aiq/cli/commands/sizing/__init__.py +0 -14
  84. aiq/cli/commands/sizing/calc.py +0 -297
  85. aiq/cli/commands/sizing/sizing.py +0 -27
  86. aiq/cli/commands/start.py +0 -246
  87. aiq/cli/commands/uninstall.py +0 -81
  88. aiq/cli/commands/validate.py +0 -47
  89. aiq/cli/commands/workflow/__init__.py +0 -14
  90. aiq/cli/commands/workflow/templates/__init__.py.j2 +0 -0
  91. aiq/cli/commands/workflow/templates/config.yml.j2 +0 -16
  92. aiq/cli/commands/workflow/templates/pyproject.toml.j2 +0 -22
  93. aiq/cli/commands/workflow/templates/register.py.j2 +0 -5
  94. aiq/cli/commands/workflow/templates/workflow.py.j2 +0 -36
  95. aiq/cli/commands/workflow/workflow.py +0 -37
  96. aiq/cli/commands/workflow/workflow_commands.py +0 -313
  97. aiq/cli/entrypoint.py +0 -135
  98. aiq/cli/main.py +0 -44
  99. aiq/cli/register_workflow.py +0 -488
  100. aiq/cli/type_registry.py +0 -1000
  101. aiq/data_models/__init__.py +0 -14
  102. aiq/data_models/api_server.py +0 -694
  103. aiq/data_models/authentication.py +0 -231
  104. aiq/data_models/common.py +0 -171
  105. aiq/data_models/component.py +0 -54
  106. aiq/data_models/component_ref.py +0 -168
  107. aiq/data_models/config.py +0 -406
  108. aiq/data_models/dataset_handler.py +0 -123
  109. aiq/data_models/discovery_metadata.py +0 -335
  110. aiq/data_models/embedder.py +0 -27
  111. aiq/data_models/evaluate.py +0 -127
  112. aiq/data_models/evaluator.py +0 -26
  113. aiq/data_models/front_end.py +0 -26
  114. aiq/data_models/function.py +0 -30
  115. aiq/data_models/function_dependencies.py +0 -72
  116. aiq/data_models/interactive.py +0 -246
  117. aiq/data_models/intermediate_step.py +0 -302
  118. aiq/data_models/invocation_node.py +0 -38
  119. aiq/data_models/its_strategy.py +0 -30
  120. aiq/data_models/llm.py +0 -27
  121. aiq/data_models/logging.py +0 -26
  122. aiq/data_models/memory.py +0 -27
  123. aiq/data_models/object_store.py +0 -44
  124. aiq/data_models/profiler.py +0 -54
  125. aiq/data_models/registry_handler.py +0 -26
  126. aiq/data_models/retriever.py +0 -30
  127. aiq/data_models/retry_mixin.py +0 -35
  128. aiq/data_models/span.py +0 -187
  129. aiq/data_models/step_adaptor.py +0 -64
  130. aiq/data_models/streaming.py +0 -33
  131. aiq/data_models/swe_bench_model.py +0 -54
  132. aiq/data_models/telemetry_exporter.py +0 -26
  133. aiq/embedder/__init__.py +0 -0
  134. aiq/embedder/langchain_client.py +0 -41
  135. aiq/embedder/nim_embedder.py +0 -59
  136. aiq/embedder/openai_embedder.py +0 -43
  137. aiq/embedder/register.py +0 -24
  138. aiq/eval/__init__.py +0 -14
  139. aiq/eval/config.py +0 -60
  140. aiq/eval/dataset_handler/__init__.py +0 -0
  141. aiq/eval/dataset_handler/dataset_downloader.py +0 -106
  142. aiq/eval/dataset_handler/dataset_filter.py +0 -52
  143. aiq/eval/dataset_handler/dataset_handler.py +0 -254
  144. aiq/eval/evaluate.py +0 -506
  145. aiq/eval/evaluator/__init__.py +0 -14
  146. aiq/eval/evaluator/base_evaluator.py +0 -73
  147. aiq/eval/evaluator/evaluator_model.py +0 -45
  148. aiq/eval/intermediate_step_adapter.py +0 -99
  149. aiq/eval/rag_evaluator/__init__.py +0 -0
  150. aiq/eval/rag_evaluator/evaluate.py +0 -178
  151. aiq/eval/rag_evaluator/register.py +0 -143
  152. aiq/eval/register.py +0 -23
  153. aiq/eval/remote_workflow.py +0 -133
  154. aiq/eval/runners/__init__.py +0 -14
  155. aiq/eval/runners/config.py +0 -39
  156. aiq/eval/runners/multi_eval_runner.py +0 -54
  157. aiq/eval/runtime_event_subscriber.py +0 -52
  158. aiq/eval/swe_bench_evaluator/__init__.py +0 -0
  159. aiq/eval/swe_bench_evaluator/evaluate.py +0 -215
  160. aiq/eval/swe_bench_evaluator/register.py +0 -36
  161. aiq/eval/trajectory_evaluator/__init__.py +0 -0
  162. aiq/eval/trajectory_evaluator/evaluate.py +0 -75
  163. aiq/eval/trajectory_evaluator/register.py +0 -40
  164. aiq/eval/tunable_rag_evaluator/__init__.py +0 -0
  165. aiq/eval/tunable_rag_evaluator/evaluate.py +0 -245
  166. aiq/eval/tunable_rag_evaluator/register.py +0 -52
  167. aiq/eval/usage_stats.py +0 -41
  168. aiq/eval/utils/__init__.py +0 -0
  169. aiq/eval/utils/output_uploader.py +0 -140
  170. aiq/eval/utils/tqdm_position_registry.py +0 -40
  171. aiq/eval/utils/weave_eval.py +0 -184
  172. aiq/experimental/__init__.py +0 -0
  173. aiq/experimental/decorators/__init__.py +0 -0
  174. aiq/experimental/decorators/experimental_warning_decorator.py +0 -130
  175. aiq/experimental/inference_time_scaling/__init__.py +0 -0
  176. aiq/experimental/inference_time_scaling/editing/__init__.py +0 -0
  177. aiq/experimental/inference_time_scaling/editing/iterative_plan_refinement_editor.py +0 -147
  178. aiq/experimental/inference_time_scaling/editing/llm_as_a_judge_editor.py +0 -204
  179. aiq/experimental/inference_time_scaling/editing/motivation_aware_summarization.py +0 -107
  180. aiq/experimental/inference_time_scaling/functions/__init__.py +0 -0
  181. aiq/experimental/inference_time_scaling/functions/execute_score_select_function.py +0 -105
  182. aiq/experimental/inference_time_scaling/functions/its_tool_orchestration_function.py +0 -205
  183. aiq/experimental/inference_time_scaling/functions/its_tool_wrapper_function.py +0 -146
  184. aiq/experimental/inference_time_scaling/functions/plan_select_execute_function.py +0 -224
  185. aiq/experimental/inference_time_scaling/models/__init__.py +0 -0
  186. aiq/experimental/inference_time_scaling/models/editor_config.py +0 -132
  187. aiq/experimental/inference_time_scaling/models/its_item.py +0 -48
  188. aiq/experimental/inference_time_scaling/models/scoring_config.py +0 -112
  189. aiq/experimental/inference_time_scaling/models/search_config.py +0 -120
  190. aiq/experimental/inference_time_scaling/models/selection_config.py +0 -154
  191. aiq/experimental/inference_time_scaling/models/stage_enums.py +0 -43
  192. aiq/experimental/inference_time_scaling/models/strategy_base.py +0 -66
  193. aiq/experimental/inference_time_scaling/models/tool_use_config.py +0 -41
  194. aiq/experimental/inference_time_scaling/register.py +0 -36
  195. aiq/experimental/inference_time_scaling/scoring/__init__.py +0 -0
  196. aiq/experimental/inference_time_scaling/scoring/llm_based_agent_scorer.py +0 -168
  197. aiq/experimental/inference_time_scaling/scoring/llm_based_plan_scorer.py +0 -168
  198. aiq/experimental/inference_time_scaling/scoring/motivation_aware_scorer.py +0 -111
  199. aiq/experimental/inference_time_scaling/search/__init__.py +0 -0
  200. aiq/experimental/inference_time_scaling/search/multi_llm_planner.py +0 -128
  201. aiq/experimental/inference_time_scaling/search/multi_query_retrieval_search.py +0 -122
  202. aiq/experimental/inference_time_scaling/search/single_shot_multi_plan_planner.py +0 -128
  203. aiq/experimental/inference_time_scaling/selection/__init__.py +0 -0
  204. aiq/experimental/inference_time_scaling/selection/best_of_n_selector.py +0 -63
  205. aiq/experimental/inference_time_scaling/selection/llm_based_agent_output_selector.py +0 -131
  206. aiq/experimental/inference_time_scaling/selection/llm_based_output_merging_selector.py +0 -159
  207. aiq/experimental/inference_time_scaling/selection/llm_based_plan_selector.py +0 -128
  208. aiq/experimental/inference_time_scaling/selection/threshold_selector.py +0 -58
  209. aiq/front_ends/__init__.py +0 -14
  210. aiq/front_ends/console/__init__.py +0 -14
  211. aiq/front_ends/console/authentication_flow_handler.py +0 -233
  212. aiq/front_ends/console/console_front_end_config.py +0 -32
  213. aiq/front_ends/console/console_front_end_plugin.py +0 -96
  214. aiq/front_ends/console/register.py +0 -25
  215. aiq/front_ends/cron/__init__.py +0 -14
  216. aiq/front_ends/fastapi/__init__.py +0 -14
  217. aiq/front_ends/fastapi/auth_flow_handlers/__init__.py +0 -0
  218. aiq/front_ends/fastapi/auth_flow_handlers/http_flow_handler.py +0 -27
  219. aiq/front_ends/fastapi/auth_flow_handlers/websocket_flow_handler.py +0 -107
  220. aiq/front_ends/fastapi/fastapi_front_end_config.py +0 -234
  221. aiq/front_ends/fastapi/fastapi_front_end_controller.py +0 -68
  222. aiq/front_ends/fastapi/fastapi_front_end_plugin.py +0 -116
  223. aiq/front_ends/fastapi/fastapi_front_end_plugin_worker.py +0 -1092
  224. aiq/front_ends/fastapi/html_snippets/__init__.py +0 -14
  225. aiq/front_ends/fastapi/html_snippets/auth_code_grant_success.py +0 -35
  226. aiq/front_ends/fastapi/intermediate_steps_subscriber.py +0 -80
  227. aiq/front_ends/fastapi/job_store.py +0 -183
  228. aiq/front_ends/fastapi/main.py +0 -72
  229. aiq/front_ends/fastapi/message_handler.py +0 -298
  230. aiq/front_ends/fastapi/message_validator.py +0 -345
  231. aiq/front_ends/fastapi/register.py +0 -25
  232. aiq/front_ends/fastapi/response_helpers.py +0 -195
  233. aiq/front_ends/fastapi/step_adaptor.py +0 -321
  234. aiq/front_ends/mcp/__init__.py +0 -14
  235. aiq/front_ends/mcp/mcp_front_end_config.py +0 -32
  236. aiq/front_ends/mcp/mcp_front_end_plugin.py +0 -93
  237. aiq/front_ends/mcp/register.py +0 -27
  238. aiq/front_ends/mcp/tool_converter.py +0 -242
  239. aiq/front_ends/register.py +0 -22
  240. aiq/front_ends/simple_base/__init__.py +0 -14
  241. aiq/front_ends/simple_base/simple_front_end_plugin_base.py +0 -54
  242. aiq/llm/__init__.py +0 -0
  243. aiq/llm/aws_bedrock_llm.py +0 -57
  244. aiq/llm/nim_llm.py +0 -46
  245. aiq/llm/openai_llm.py +0 -46
  246. aiq/llm/register.py +0 -23
  247. aiq/llm/utils/__init__.py +0 -14
  248. aiq/llm/utils/env_config_value.py +0 -94
  249. aiq/llm/utils/error.py +0 -17
  250. aiq/memory/__init__.py +0 -20
  251. aiq/memory/interfaces.py +0 -183
  252. aiq/memory/models.py +0 -112
  253. aiq/meta/module_to_distro.json +0 -3
  254. aiq/meta/pypi.md +0 -58
  255. aiq/object_store/__init__.py +0 -20
  256. aiq/object_store/in_memory_object_store.py +0 -76
  257. aiq/object_store/interfaces.py +0 -84
  258. aiq/object_store/models.py +0 -36
  259. aiq/object_store/register.py +0 -20
  260. aiq/observability/__init__.py +0 -14
  261. aiq/observability/exporter/__init__.py +0 -14
  262. aiq/observability/exporter/base_exporter.py +0 -449
  263. aiq/observability/exporter/exporter.py +0 -78
  264. aiq/observability/exporter/file_exporter.py +0 -33
  265. aiq/observability/exporter/processing_exporter.py +0 -322
  266. aiq/observability/exporter/raw_exporter.py +0 -52
  267. aiq/observability/exporter/span_exporter.py +0 -265
  268. aiq/observability/exporter_manager.py +0 -335
  269. aiq/observability/mixin/__init__.py +0 -14
  270. aiq/observability/mixin/batch_config_mixin.py +0 -26
  271. aiq/observability/mixin/collector_config_mixin.py +0 -23
  272. aiq/observability/mixin/file_mixin.py +0 -288
  273. aiq/observability/mixin/file_mode.py +0 -23
  274. aiq/observability/mixin/resource_conflict_mixin.py +0 -134
  275. aiq/observability/mixin/serialize_mixin.py +0 -61
  276. aiq/observability/mixin/type_introspection_mixin.py +0 -183
  277. aiq/observability/processor/__init__.py +0 -14
  278. aiq/observability/processor/batching_processor.py +0 -309
  279. aiq/observability/processor/callback_processor.py +0 -42
  280. aiq/observability/processor/intermediate_step_serializer.py +0 -28
  281. aiq/observability/processor/processor.py +0 -71
  282. aiq/observability/register.py +0 -96
  283. aiq/observability/utils/__init__.py +0 -14
  284. aiq/observability/utils/dict_utils.py +0 -236
  285. aiq/observability/utils/time_utils.py +0 -31
  286. aiq/plugins/.namespace +0 -1
  287. aiq/profiler/__init__.py +0 -0
  288. aiq/profiler/calc/__init__.py +0 -14
  289. aiq/profiler/calc/calc_runner.py +0 -627
  290. aiq/profiler/calc/calculations.py +0 -288
  291. aiq/profiler/calc/data_models.py +0 -188
  292. aiq/profiler/calc/plot.py +0 -345
  293. aiq/profiler/callbacks/__init__.py +0 -0
  294. aiq/profiler/callbacks/agno_callback_handler.py +0 -295
  295. aiq/profiler/callbacks/base_callback_class.py +0 -20
  296. aiq/profiler/callbacks/langchain_callback_handler.py +0 -290
  297. aiq/profiler/callbacks/llama_index_callback_handler.py +0 -205
  298. aiq/profiler/callbacks/semantic_kernel_callback_handler.py +0 -238
  299. aiq/profiler/callbacks/token_usage_base_model.py +0 -27
  300. aiq/profiler/data_frame_row.py +0 -51
  301. aiq/profiler/data_models.py +0 -24
  302. aiq/profiler/decorators/__init__.py +0 -0
  303. aiq/profiler/decorators/framework_wrapper.py +0 -131
  304. aiq/profiler/decorators/function_tracking.py +0 -254
  305. aiq/profiler/forecasting/__init__.py +0 -0
  306. aiq/profiler/forecasting/config.py +0 -18
  307. aiq/profiler/forecasting/model_trainer.py +0 -75
  308. aiq/profiler/forecasting/models/__init__.py +0 -22
  309. aiq/profiler/forecasting/models/forecasting_base_model.py +0 -40
  310. aiq/profiler/forecasting/models/linear_model.py +0 -196
  311. aiq/profiler/forecasting/models/random_forest_regressor.py +0 -268
  312. aiq/profiler/inference_metrics_model.py +0 -28
  313. aiq/profiler/inference_optimization/__init__.py +0 -0
  314. aiq/profiler/inference_optimization/bottleneck_analysis/__init__.py +0 -0
  315. aiq/profiler/inference_optimization/bottleneck_analysis/nested_stack_analysis.py +0 -460
  316. aiq/profiler/inference_optimization/bottleneck_analysis/simple_stack_analysis.py +0 -258
  317. aiq/profiler/inference_optimization/data_models.py +0 -386
  318. aiq/profiler/inference_optimization/experimental/__init__.py +0 -0
  319. aiq/profiler/inference_optimization/experimental/concurrency_spike_analysis.py +0 -468
  320. aiq/profiler/inference_optimization/experimental/prefix_span_analysis.py +0 -405
  321. aiq/profiler/inference_optimization/llm_metrics.py +0 -212
  322. aiq/profiler/inference_optimization/prompt_caching.py +0 -163
  323. aiq/profiler/inference_optimization/token_uniqueness.py +0 -107
  324. aiq/profiler/inference_optimization/workflow_runtimes.py +0 -72
  325. aiq/profiler/intermediate_property_adapter.py +0 -102
  326. aiq/profiler/profile_runner.py +0 -473
  327. aiq/profiler/utils.py +0 -184
  328. aiq/registry_handlers/__init__.py +0 -0
  329. aiq/registry_handlers/local/__init__.py +0 -0
  330. aiq/registry_handlers/local/local_handler.py +0 -176
  331. aiq/registry_handlers/local/register_local.py +0 -37
  332. aiq/registry_handlers/metadata_factory.py +0 -60
  333. aiq/registry_handlers/package_utils.py +0 -567
  334. aiq/registry_handlers/pypi/__init__.py +0 -0
  335. aiq/registry_handlers/pypi/pypi_handler.py +0 -251
  336. aiq/registry_handlers/pypi/register_pypi.py +0 -40
  337. aiq/registry_handlers/register.py +0 -21
  338. aiq/registry_handlers/registry_handler_base.py +0 -157
  339. aiq/registry_handlers/rest/__init__.py +0 -0
  340. aiq/registry_handlers/rest/register_rest.py +0 -56
  341. aiq/registry_handlers/rest/rest_handler.py +0 -237
  342. aiq/registry_handlers/schemas/__init__.py +0 -0
  343. aiq/registry_handlers/schemas/headers.py +0 -42
  344. aiq/registry_handlers/schemas/package.py +0 -68
  345. aiq/registry_handlers/schemas/publish.py +0 -63
  346. aiq/registry_handlers/schemas/pull.py +0 -82
  347. aiq/registry_handlers/schemas/remove.py +0 -36
  348. aiq/registry_handlers/schemas/search.py +0 -91
  349. aiq/registry_handlers/schemas/status.py +0 -47
  350. aiq/retriever/__init__.py +0 -0
  351. aiq/retriever/interface.py +0 -37
  352. aiq/retriever/milvus/__init__.py +0 -14
  353. aiq/retriever/milvus/register.py +0 -81
  354. aiq/retriever/milvus/retriever.py +0 -228
  355. aiq/retriever/models.py +0 -74
  356. aiq/retriever/nemo_retriever/__init__.py +0 -14
  357. aiq/retriever/nemo_retriever/register.py +0 -60
  358. aiq/retriever/nemo_retriever/retriever.py +0 -190
  359. aiq/retriever/register.py +0 -22
  360. aiq/runtime/__init__.py +0 -14
  361. aiq/runtime/loader.py +0 -215
  362. aiq/runtime/runner.py +0 -190
  363. aiq/runtime/session.py +0 -158
  364. aiq/runtime/user_metadata.py +0 -130
  365. aiq/settings/__init__.py +0 -0
  366. aiq/settings/global_settings.py +0 -318
  367. aiq/test/.namespace +0 -1
  368. aiq/tool/__init__.py +0 -0
  369. aiq/tool/chat_completion.py +0 -74
  370. aiq/tool/code_execution/README.md +0 -151
  371. aiq/tool/code_execution/__init__.py +0 -0
  372. aiq/tool/code_execution/code_sandbox.py +0 -267
  373. aiq/tool/code_execution/local_sandbox/.gitignore +0 -1
  374. aiq/tool/code_execution/local_sandbox/Dockerfile.sandbox +0 -60
  375. aiq/tool/code_execution/local_sandbox/__init__.py +0 -13
  376. aiq/tool/code_execution/local_sandbox/local_sandbox_server.py +0 -198
  377. aiq/tool/code_execution/local_sandbox/sandbox.requirements.txt +0 -6
  378. aiq/tool/code_execution/local_sandbox/start_local_sandbox.sh +0 -50
  379. aiq/tool/code_execution/register.py +0 -74
  380. aiq/tool/code_execution/test_code_execution_sandbox.py +0 -414
  381. aiq/tool/code_execution/utils.py +0 -100
  382. aiq/tool/datetime_tools.py +0 -42
  383. aiq/tool/document_search.py +0 -141
  384. aiq/tool/github_tools/__init__.py +0 -0
  385. aiq/tool/github_tools/create_github_commit.py +0 -133
  386. aiq/tool/github_tools/create_github_issue.py +0 -87
  387. aiq/tool/github_tools/create_github_pr.py +0 -106
  388. aiq/tool/github_tools/get_github_file.py +0 -106
  389. aiq/tool/github_tools/get_github_issue.py +0 -166
  390. aiq/tool/github_tools/get_github_pr.py +0 -256
  391. aiq/tool/github_tools/update_github_issue.py +0 -100
  392. aiq/tool/mcp/__init__.py +0 -14
  393. aiq/tool/mcp/exceptions.py +0 -142
  394. aiq/tool/mcp/mcp_client.py +0 -255
  395. aiq/tool/mcp/mcp_tool.py +0 -96
  396. aiq/tool/memory_tools/__init__.py +0 -0
  397. aiq/tool/memory_tools/add_memory_tool.py +0 -79
  398. aiq/tool/memory_tools/delete_memory_tool.py +0 -67
  399. aiq/tool/memory_tools/get_memory_tool.py +0 -72
  400. aiq/tool/nvidia_rag.py +0 -95
  401. aiq/tool/register.py +0 -38
  402. aiq/tool/retriever.py +0 -89
  403. aiq/tool/server_tools.py +0 -66
  404. aiq/utils/__init__.py +0 -0
  405. aiq/utils/data_models/__init__.py +0 -0
  406. aiq/utils/data_models/schema_validator.py +0 -58
  407. aiq/utils/debugging_utils.py +0 -43
  408. aiq/utils/dump_distro_mapping.py +0 -32
  409. aiq/utils/exception_handlers/__init__.py +0 -0
  410. aiq/utils/exception_handlers/automatic_retries.py +0 -289
  411. aiq/utils/exception_handlers/mcp.py +0 -211
  412. aiq/utils/exception_handlers/schemas.py +0 -114
  413. aiq/utils/io/__init__.py +0 -0
  414. aiq/utils/io/model_processing.py +0 -28
  415. aiq/utils/io/yaml_tools.py +0 -119
  416. aiq/utils/log_utils.py +0 -37
  417. aiq/utils/metadata_utils.py +0 -74
  418. aiq/utils/optional_imports.py +0 -142
  419. aiq/utils/producer_consumer_queue.py +0 -178
  420. aiq/utils/reactive/__init__.py +0 -0
  421. aiq/utils/reactive/base/__init__.py +0 -0
  422. aiq/utils/reactive/base/observable_base.py +0 -65
  423. aiq/utils/reactive/base/observer_base.py +0 -55
  424. aiq/utils/reactive/base/subject_base.py +0 -79
  425. aiq/utils/reactive/observable.py +0 -59
  426. aiq/utils/reactive/observer.py +0 -76
  427. aiq/utils/reactive/subject.py +0 -131
  428. aiq/utils/reactive/subscription.py +0 -49
  429. aiq/utils/settings/__init__.py +0 -0
  430. aiq/utils/settings/global_settings.py +0 -197
  431. aiq/utils/string_utils.py +0 -38
  432. aiq/utils/type_converter.py +0 -290
  433. aiq/utils/type_utils.py +0 -484
  434. aiq/utils/url_utils.py +0 -27
  435. aiqtoolkit-1.2.0rc4.dist-info/METADATA +0 -363
  436. aiqtoolkit-1.2.0rc4.dist-info/RECORD +0 -438
  437. aiqtoolkit-1.2.0rc4.dist-info/entry_points.txt +0 -20
  438. aiqtoolkit-1.2.0rc4.dist-info/licenses/LICENSE-3rd-party.txt +0 -3686
  439. aiqtoolkit-1.2.0rc4.dist-info/licenses/LICENSE.md +0 -201
  440. aiqtoolkit-1.2.0rc4.dist-info/top_level.txt +0 -1
  441. {aiqtoolkit-1.2.0rc4.dist-info → aiqtoolkit-1.2rc9.dist-info}/WHEEL +0 -0
@@ -1,190 +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 json
17
- import logging
18
- import os
19
- import typing
20
- from functools import partial
21
- from urllib.parse import urljoin
22
-
23
- import httpx
24
- from langchain_core.retrievers import BaseRetriever
25
- from pydantic import BaseModel
26
- from pydantic import Field
27
- from pydantic import HttpUrl
28
-
29
- from aiq.retriever.interface import AIQRetriever
30
- from aiq.retriever.models import AIQDocument
31
- from aiq.retriever.models import RetrieverError
32
- from aiq.retriever.models import RetrieverOutput
33
-
34
- logger = logging.getLogger(__name__)
35
-
36
-
37
- class Collection(BaseModel):
38
- id: str
39
- name: str
40
- meta: typing.Any
41
- pipeline: str
42
- created_at: str
43
-
44
-
45
- class RetrieverPayload(BaseModel):
46
- query: str
47
- top_k: int = Field(le=50, gt=0)
48
-
49
-
50
- class CollectionUnavailableError(RetrieverError):
51
- pass
52
-
53
-
54
- class NemoRetriever(AIQRetriever):
55
- """
56
- Client for retrieving document chunks from a Nemo Retriever service.
57
- """
58
-
59
- def __init__(self, uri: str | HttpUrl, timeout: int = 60, nvidia_api_key: str = None, **kwargs):
60
-
61
- self.base_url = str(uri)
62
- self.timeout = timeout
63
- self._search_func = self._search
64
- self.api_key = nvidia_api_key if nvidia_api_key else os.getenv('NVIDIA_API_KEY')
65
- self._bound_params = []
66
- if not self.api_key:
67
- logger.warning("No API key was specified as part of configuration or as an environment variable.")
68
-
69
- def bind(self, **kwargs) -> None:
70
- """
71
- Bind default values to the search method. Cannot bind the 'query' parameter.
72
-
73
- Args:
74
- kwargs (dict): Key value pairs corresponding to the default values of search parameters.
75
- """
76
- if "query" in kwargs:
77
- kwargs = {k: v for k, v in kwargs.items() if k != "query"}
78
- self._search_func = partial(self._search_func, **kwargs)
79
- self._bound_params = list(kwargs.keys())
80
- logger.debug("Binding paramaters for search function: %s", kwargs)
81
-
82
- def get_unbound_params(self) -> list[str]:
83
- """
84
- Returns a list of unbound parameters which will need to be passed to the search function.
85
- """
86
- return [param for param in ["query", "collection_name", "top_k"] if param not in self._bound_params]
87
-
88
- async def get_collections(self, client) -> list[Collection]:
89
- """
90
- Get a list of all available collections as pydantic `Collection` objects
91
- """
92
- collection_response = await client.get(urljoin(self.base_url, "/v1/collections"))
93
- collection_response.raise_for_status()
94
- if not collection_response or len(collection_response.json().get('collections', [])) == 0:
95
- raise CollectionUnavailableError(f"No collections available at {self.base_url}")
96
-
97
- collections = [
98
- Collection.model_validate(collection) for collection in collection_response.json()["collections"]
99
- ]
100
-
101
- return collections
102
-
103
- async def get_collection_by_name(self, collection_name, client) -> Collection:
104
- """
105
- Retrieve a collection using it's name. Will return the first collection found if the name is ambiguous.
106
- """
107
- collections = await self.get_collections(client)
108
- if (collection := next((c for c in collections if c.name == collection_name), None)) is None:
109
- raise CollectionUnavailableError(f"Collection {collection_name} not found")
110
- return collection
111
-
112
- async def search(self, query: str, **kwargs):
113
- return await self._search_func(query=query, **kwargs)
114
-
115
- async def _search(
116
- self,
117
- query: str,
118
- collection_name: str,
119
- top_k: str,
120
- output_fields: list[str] = None,
121
- ):
122
- """
123
- Retrieve document chunks from the configured Nemo Retriever Service.
124
- """
125
- output = []
126
- try:
127
- async with httpx.AsyncClient(headers={"Authorization": f"Bearer {self.api_key}"},
128
- timeout=self.timeout) as client:
129
- collection = await self.get_collection_by_name(collection_name, client)
130
- url = urljoin(self.base_url, f"/v1/collections/{collection.id}/search")
131
-
132
- payload = RetrieverPayload(query=query, top_k=top_k)
133
- response = await client.post(url, content=json.dumps(payload.model_dump(mode="python")))
134
-
135
- logger.debug("response.status_code=%s", response.status_code)
136
-
137
- response.raise_for_status()
138
- output = response.json().get("chunks")
139
-
140
- # Handle output fields
141
- output = [_flatten(chunk, output_fields) for chunk in output]
142
-
143
- return _wrap_nemo_results(output=output, content_field="content")
144
-
145
- except Exception as e:
146
- logger.exception("Encountered an error when retrieving results from Nemo Retriever: %s", e)
147
- raise CollectionUnavailableError(
148
- f"Error when retrieving documents from {collection_name} for query '{query}'") from e
149
-
150
-
151
- def _wrap_nemo_results(output: list[dict], content_field: str):
152
- return RetrieverOutput(results=[_wrap_nemo_single_results(o, content_field=content_field) for o in output])
153
-
154
-
155
- def _wrap_nemo_single_results(output: dict, content_field: str):
156
- return AIQDocument(page_content=output[content_field],
157
- metadata={
158
- k: v
159
- for k, v in output.items() if k != content_field
160
- })
161
-
162
-
163
- def _flatten(obj: dict, output_fields: list[str]) -> list[str]:
164
- base_fields = [
165
- "format",
166
- "id",
167
- ]
168
- if not output_fields:
169
- output_fields = [
170
- "format",
171
- "id",
172
- ]
173
- output_fields.extend(list(obj["metadata"].keys()))
174
- data = {"content": obj.get("content")}
175
- for field in base_fields:
176
- if field in output_fields:
177
- data.update({field: obj[field]})
178
-
179
- data.update({k: v for k, v in obj['metadata'].items() if k in output_fields})
180
- return data
181
-
182
-
183
- class NemoLangchainRetriever(BaseRetriever, BaseModel):
184
- client: NemoRetriever
185
-
186
- def _get_relevant_documents(self, query, *, run_manager, **kwargs):
187
- raise NotImplementedError
188
-
189
- async def _aget_relevant_documents(self, query, *, run_manager, **kwargs):
190
- return await self.client.search(query, **kwargs)
aiq/retriever/register.py DELETED
@@ -1,22 +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
- # pylint: disable=unused-import
17
- # flake8: noqa
18
- # isort:skip_file
19
-
20
- # Import any providers which need to be automatically registered here
21
- import aiq.retriever.milvus.register
22
- import aiq.retriever.nemo_retriever.register
aiq/runtime/__init__.py DELETED
@@ -1,14 +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.
aiq/runtime/loader.py DELETED
@@ -1,215 +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
- from __future__ import annotations
17
-
18
- import importlib.metadata
19
- import logging
20
- import time
21
- from contextlib import asynccontextmanager
22
- from enum import IntFlag
23
- from enum import auto
24
- from functools import lru_cache
25
- from functools import reduce
26
-
27
- from aiq.builder.workflow_builder import WorkflowBuilder
28
- from aiq.cli.type_registry import GlobalTypeRegistry
29
- from aiq.data_models.config import AIQConfig
30
- from aiq.runtime.session import AIQSessionManager
31
- from aiq.utils.data_models.schema_validator import validate_schema
32
- from aiq.utils.debugging_utils import is_debugger_attached
33
- from aiq.utils.io.yaml_tools import yaml_load
34
- from aiq.utils.type_utils import StrPath
35
-
36
- logger = logging.getLogger(__name__)
37
-
38
-
39
- class PluginTypes(IntFlag):
40
- COMPONENT = auto()
41
- """
42
- A plugin that is a component of the workflow. This includes tools, LLMs, retrievers, etc.
43
- """
44
- FRONT_END = auto()
45
- """
46
- A plugin that is a front end for the workflow. This includes FastAPI, Gradio, etc.
47
- """
48
- EVALUATOR = auto()
49
- """
50
- A plugin that is an evaluator for the workflow. This includes evaluators like RAGAS, SWE-bench, etc.
51
- """
52
- AUTHENTICATION = auto()
53
- """
54
- A plugin that is an API authentication provider for the workflow. This includes Oauth2, API Key, etc.
55
- """
56
- REGISTRY_HANDLER = auto()
57
-
58
- # Convenience flag for groups of plugin types
59
- CONFIG_OBJECT = COMPONENT | FRONT_END | EVALUATOR | AUTHENTICATION
60
- """
61
- Any plugin that can be specified in the AIQ Toolkit configuration file.
62
- """
63
- ALL = COMPONENT | FRONT_END | EVALUATOR | REGISTRY_HANDLER | AUTHENTICATION
64
- """
65
- All plugin types
66
- """
67
-
68
-
69
- def load_config(config_file: StrPath) -> AIQConfig:
70
- """
71
- This is the primary entry point for loading an AIQ Toolkit configuration file. It ensures that all plugins are
72
- loaded and then validates the configuration file against the AIQConfig schema.
73
-
74
- Parameters
75
- ----------
76
- config_file : StrPath
77
- The path to the configuration file
78
-
79
- Returns
80
- -------
81
- AIQConfig
82
- The validated AIQConfig object
83
- """
84
-
85
- # Ensure all of the plugins are loaded
86
- discover_and_register_plugins(PluginTypes.CONFIG_OBJECT)
87
-
88
- config_yaml = yaml_load(config_file)
89
-
90
- # Validate configuration adheres to AIQ Toolkit schemas
91
- validated_aiq_config = validate_schema(config_yaml, AIQConfig)
92
-
93
- return validated_aiq_config
94
-
95
-
96
- @asynccontextmanager
97
- async def load_workflow(config_file: StrPath, max_concurrency: int = -1):
98
- """
99
- Load the AIQ Toolkit configuration file and create an AIQRunner object. This is the primary entry point for running
100
- AIQ Toolkit workflows.
101
-
102
- Parameters
103
- ----------
104
- config_file : StrPath
105
- The path to the configuration file
106
- max_concurrency : int, optional
107
- The maximum number of parallel workflow invocations to support. Specifying 0 or -1 will allow an unlimited
108
- count, by default -1
109
- """
110
-
111
- # Load the config object
112
- config = load_config(config_file)
113
-
114
- # Must yield the workflow function otherwise it cleans up
115
- async with WorkflowBuilder.from_config(config=config) as workflow:
116
-
117
- yield AIQSessionManager(workflow.build(), max_concurrency=max_concurrency)
118
-
119
-
120
- @lru_cache
121
- def discover_entrypoints(plugin_type: PluginTypes):
122
- """
123
- Discover all the requested plugin types which were registered via an entry point group and return them.
124
- """
125
-
126
- entry_points = importlib.metadata.entry_points()
127
-
128
- plugin_groups = []
129
-
130
- # Add the specified plugin type to the list of groups to load
131
- if (plugin_type & PluginTypes.COMPONENT):
132
- plugin_groups.extend(["aiq.plugins", "aiq.components"])
133
- if (plugin_type & PluginTypes.FRONT_END):
134
- plugin_groups.append("aiq.front_ends")
135
- if (plugin_type & PluginTypes.REGISTRY_HANDLER):
136
- plugin_groups.append("aiq.registry_handlers")
137
- if (plugin_type & PluginTypes.EVALUATOR):
138
- plugin_groups.append("aiq.evaluators")
139
- if (plugin_type & PluginTypes.AUTHENTICATION):
140
- plugin_groups.append("aiq.authentication_providers")
141
-
142
- # Get the entry points for the specified groups
143
- aiq_plugins = reduce(lambda x, y: list(x) + list(y), [entry_points.select(group=y) for y in plugin_groups])
144
-
145
- return aiq_plugins
146
-
147
-
148
- @lru_cache
149
- def get_all_aiq_entrypoints_distro_mapping() -> dict[str, str]:
150
- """
151
- Get the mapping of all AIQ entry points to their distribution names.
152
- """
153
-
154
- mapping = {}
155
- aiq_entrypoints = discover_entrypoints(PluginTypes.ALL)
156
- for ep in aiq_entrypoints:
157
- ep_module_parts = ep.module.split(".")
158
- current_parts = []
159
- for part in ep_module_parts:
160
- current_parts.append(part)
161
- module_prefix = ".".join(current_parts)
162
- mapping[module_prefix] = ep.dist.name
163
-
164
- return mapping
165
-
166
-
167
- def discover_and_register_plugins(plugin_type: PluginTypes):
168
- """
169
- Discover all the requested plugin types which were registered via an entry point group and register them into the
170
- GlobalTypeRegistry.
171
- """
172
-
173
- # Get the entry points for the specified groups
174
- aiq_plugins = discover_entrypoints(plugin_type)
175
-
176
- count = 0
177
-
178
- # Pause registration hooks for performance. This is useful when loading a large number of plugins.
179
- with GlobalTypeRegistry.get().pause_registration_changed_hooks():
180
-
181
- for entry_point in aiq_plugins:
182
- try:
183
- logger.debug("Loading module '%s' from entry point '%s'...", entry_point.module, entry_point.name)
184
-
185
- start_time = time.time()
186
-
187
- entry_point.load()
188
-
189
- elapsed_time = (time.time() - start_time) * 1000
190
-
191
- logger.debug("Loading module '%s' from entry point '%s'...Complete (%f ms)",
192
- entry_point.module,
193
- entry_point.name,
194
- elapsed_time)
195
-
196
- # Log a warning if the plugin took a long time to load. This can be useful for debugging slow imports.
197
- # The threshold is 300 ms if no plugins have been loaded yet, and 100 ms otherwise. Triple the threshold
198
- # if a debugger is attached.
199
- if (elapsed_time > (300.0 if count == 0 else 150.0) * (3 if is_debugger_attached() else 1)):
200
- logger.debug(
201
- "Loading module '%s' from entry point '%s' took a long time (%f ms). "
202
- "Ensure all imports are inside your registered functions.",
203
- entry_point.module,
204
- entry_point.name,
205
- elapsed_time)
206
-
207
- except ImportError:
208
- logger.warning("Failed to import plugin '%s'", entry_point.name, exc_info=True)
209
- # Optionally, you can mark the plugin as unavailable or take other actions
210
-
211
- except Exception:
212
- logger.exception("An error occurred while loading plugin '%s': {e}", entry_point.name, exc_info=True)
213
-
214
- finally:
215
- count += 1
aiq/runtime/runner.py DELETED
@@ -1,190 +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 typing
18
- from enum import Enum
19
-
20
- from aiq.builder.context import AIQContext
21
- from aiq.builder.context import AIQContextState
22
- from aiq.builder.function import Function
23
- from aiq.data_models.invocation_node import InvocationNode
24
- from aiq.observability.exporter_manager import ExporterManager
25
- from aiq.utils.reactive.subject import Subject
26
-
27
- logger = logging.getLogger(__name__)
28
-
29
-
30
- class UserManagerBase:
31
- pass
32
-
33
-
34
- class AIQRunnerState(Enum):
35
- UNINITIALIZED = 0
36
- INITIALIZED = 1
37
- RUNNING = 2
38
- COMPLETED = 3
39
- FAILED = 4
40
-
41
-
42
- _T = typing.TypeVar("_T")
43
-
44
-
45
- class AIQRunner:
46
-
47
- def __init__(self,
48
- input_message: typing.Any,
49
- entry_fn: Function,
50
- context_state: AIQContextState,
51
- exporter_manager: ExporterManager):
52
- """
53
- The AIQRunner class is used to run a workflow. It handles converting input and output data types and running the
54
- workflow with the specified concurrency.
55
-
56
- Parameters
57
- ----------
58
- input_message : typing.Any
59
- The input message to the workflow
60
- entry_fn : Function
61
- The entry function to the workflow
62
- context_state : AIQContextState
63
- The context state to use
64
- exporter_manager : ExporterManager
65
- The exporter manager to use
66
- """
67
-
68
- if (entry_fn is None):
69
- raise ValueError("entry_fn cannot be None")
70
-
71
- self._entry_fn = entry_fn
72
- self._context_state = context_state
73
- self._context = AIQContext(self._context_state)
74
-
75
- self._state = AIQRunnerState.UNINITIALIZED
76
-
77
- self._input_message_token = None
78
-
79
- # Before we start, we need to convert the input message to the workflow input type
80
- self._input_message = input_message
81
-
82
- self._exporter_manager = exporter_manager
83
-
84
- @property
85
- def context(self) -> AIQContext:
86
- return self._context
87
-
88
- def convert(self, value: typing.Any, to_type: type[_T]) -> _T:
89
- return self._entry_fn.convert(value, to_type)
90
-
91
- async def __aenter__(self):
92
-
93
- # Set the input message on the context
94
- self._input_message_token = self._context_state.input_message.set(self._input_message)
95
-
96
- # Create reactive event stream
97
- self._context_state.event_stream.set(Subject())
98
- self._context_state.active_function.set(InvocationNode(
99
- function_name="root",
100
- function_id="root",
101
- ))
102
-
103
- if (self._state == AIQRunnerState.UNINITIALIZED):
104
- self._state = AIQRunnerState.INITIALIZED
105
- else:
106
- raise ValueError("Cannot enter the context more than once")
107
-
108
- return self
109
-
110
- async def __aexit__(self, exc_type, exc_value, traceback):
111
-
112
- if (self._input_message_token is None):
113
- raise ValueError("Cannot exit the context without entering it")
114
-
115
- self._context_state.input_message.reset(self._input_message_token)
116
-
117
- if (self._state not in (AIQRunnerState.COMPLETED, AIQRunnerState.FAILED)):
118
- raise ValueError("Cannot exit the context without completing the workflow")
119
-
120
- @typing.overload
121
- async def result(self) -> typing.Any:
122
- ...
123
-
124
- @typing.overload
125
- async def result(self, to_type: type[_T]) -> _T:
126
- ...
127
-
128
- async def result(self, to_type: type | None = None):
129
-
130
- if (self._state != AIQRunnerState.INITIALIZED):
131
- raise ValueError("Cannot run the workflow without entering the context")
132
-
133
- try:
134
- self._state = AIQRunnerState.RUNNING
135
-
136
- if (not self._entry_fn.has_single_output):
137
- raise ValueError("Workflow does not support single output")
138
-
139
- async with self._exporter_manager.start(context_state=self._context_state):
140
- # Run the workflow
141
- result = await self._entry_fn.ainvoke(self._input_message, to_type=to_type)
142
-
143
- # Close the intermediate stream
144
- event_stream = self._context_state.event_stream.get()
145
- if event_stream:
146
- event_stream.on_complete()
147
-
148
- self._state = AIQRunnerState.COMPLETED
149
-
150
- return result
151
- except Exception as e:
152
- logger.exception("Error running workflow: %s", e)
153
- event_stream = self._context_state.event_stream.get()
154
- if event_stream:
155
- event_stream.on_complete()
156
- self._state = AIQRunnerState.FAILED
157
-
158
- raise
159
-
160
- async def result_stream(self, to_type: type | None = None):
161
-
162
- if (self._state != AIQRunnerState.INITIALIZED):
163
- raise ValueError("Cannot run the workflow without entering the context")
164
-
165
- try:
166
- self._state = AIQRunnerState.RUNNING
167
-
168
- if (not self._entry_fn.has_streaming_output):
169
- raise ValueError("Workflow does not support streaming output")
170
-
171
- # Run the workflow
172
- async with self._exporter_manager.start(context_state=self._context_state):
173
- async for m in self._entry_fn.astream(self._input_message, to_type=to_type):
174
- yield m
175
-
176
- self._state = AIQRunnerState.COMPLETED
177
-
178
- # Close the intermediate stream
179
- event_stream = self._context_state.event_stream.get()
180
- if event_stream:
181
- event_stream.on_complete()
182
-
183
- except Exception as e:
184
- logger.exception("Error running workflow: %s", e)
185
- event_stream = self._context_state.event_stream.get()
186
- if event_stream:
187
- event_stream.on_complete()
188
- self._state = AIQRunnerState.FAILED
189
-
190
- raise