nvidia-nat 1.2.0rc5__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.
Files changed (435) hide show
  1. aiq/agent/__init__.py +0 -0
  2. aiq/agent/base.py +239 -0
  3. aiq/agent/dual_node.py +67 -0
  4. aiq/agent/react_agent/__init__.py +0 -0
  5. aiq/agent/react_agent/agent.py +355 -0
  6. aiq/agent/react_agent/output_parser.py +104 -0
  7. aiq/agent/react_agent/prompt.py +41 -0
  8. aiq/agent/react_agent/register.py +149 -0
  9. aiq/agent/reasoning_agent/__init__.py +0 -0
  10. aiq/agent/reasoning_agent/reasoning_agent.py +225 -0
  11. aiq/agent/register.py +23 -0
  12. aiq/agent/rewoo_agent/__init__.py +0 -0
  13. aiq/agent/rewoo_agent/agent.py +411 -0
  14. aiq/agent/rewoo_agent/prompt.py +108 -0
  15. aiq/agent/rewoo_agent/register.py +158 -0
  16. aiq/agent/tool_calling_agent/__init__.py +0 -0
  17. aiq/agent/tool_calling_agent/agent.py +119 -0
  18. aiq/agent/tool_calling_agent/register.py +106 -0
  19. aiq/authentication/__init__.py +14 -0
  20. aiq/authentication/api_key/__init__.py +14 -0
  21. aiq/authentication/api_key/api_key_auth_provider.py +96 -0
  22. aiq/authentication/api_key/api_key_auth_provider_config.py +124 -0
  23. aiq/authentication/api_key/register.py +26 -0
  24. aiq/authentication/exceptions/__init__.py +14 -0
  25. aiq/authentication/exceptions/api_key_exceptions.py +38 -0
  26. aiq/authentication/http_basic_auth/__init__.py +0 -0
  27. aiq/authentication/http_basic_auth/http_basic_auth_provider.py +81 -0
  28. aiq/authentication/http_basic_auth/register.py +30 -0
  29. aiq/authentication/interfaces.py +93 -0
  30. aiq/authentication/oauth2/__init__.py +14 -0
  31. aiq/authentication/oauth2/oauth2_auth_code_flow_provider.py +107 -0
  32. aiq/authentication/oauth2/oauth2_auth_code_flow_provider_config.py +39 -0
  33. aiq/authentication/oauth2/register.py +25 -0
  34. aiq/authentication/register.py +21 -0
  35. aiq/builder/__init__.py +0 -0
  36. aiq/builder/builder.py +285 -0
  37. aiq/builder/component_utils.py +316 -0
  38. aiq/builder/context.py +264 -0
  39. aiq/builder/embedder.py +24 -0
  40. aiq/builder/eval_builder.py +161 -0
  41. aiq/builder/evaluator.py +29 -0
  42. aiq/builder/framework_enum.py +24 -0
  43. aiq/builder/front_end.py +73 -0
  44. aiq/builder/function.py +344 -0
  45. aiq/builder/function_base.py +380 -0
  46. aiq/builder/function_info.py +627 -0
  47. aiq/builder/intermediate_step_manager.py +174 -0
  48. aiq/builder/llm.py +25 -0
  49. aiq/builder/retriever.py +25 -0
  50. aiq/builder/user_interaction_manager.py +74 -0
  51. aiq/builder/workflow.py +148 -0
  52. aiq/builder/workflow_builder.py +1117 -0
  53. aiq/cli/__init__.py +14 -0
  54. aiq/cli/cli_utils/__init__.py +0 -0
  55. aiq/cli/cli_utils/config_override.py +231 -0
  56. aiq/cli/cli_utils/validation.py +37 -0
  57. aiq/cli/commands/__init__.py +0 -0
  58. aiq/cli/commands/configure/__init__.py +0 -0
  59. aiq/cli/commands/configure/channel/__init__.py +0 -0
  60. aiq/cli/commands/configure/channel/add.py +28 -0
  61. aiq/cli/commands/configure/channel/channel.py +36 -0
  62. aiq/cli/commands/configure/channel/remove.py +30 -0
  63. aiq/cli/commands/configure/channel/update.py +30 -0
  64. aiq/cli/commands/configure/configure.py +33 -0
  65. aiq/cli/commands/evaluate.py +139 -0
  66. aiq/cli/commands/info/__init__.py +14 -0
  67. aiq/cli/commands/info/info.py +39 -0
  68. aiq/cli/commands/info/list_channels.py +32 -0
  69. aiq/cli/commands/info/list_components.py +129 -0
  70. aiq/cli/commands/info/list_mcp.py +213 -0
  71. aiq/cli/commands/registry/__init__.py +14 -0
  72. aiq/cli/commands/registry/publish.py +88 -0
  73. aiq/cli/commands/registry/pull.py +118 -0
  74. aiq/cli/commands/registry/registry.py +38 -0
  75. aiq/cli/commands/registry/remove.py +108 -0
  76. aiq/cli/commands/registry/search.py +155 -0
  77. aiq/cli/commands/sizing/__init__.py +14 -0
  78. aiq/cli/commands/sizing/calc.py +297 -0
  79. aiq/cli/commands/sizing/sizing.py +27 -0
  80. aiq/cli/commands/start.py +246 -0
  81. aiq/cli/commands/uninstall.py +81 -0
  82. aiq/cli/commands/validate.py +47 -0
  83. aiq/cli/commands/workflow/__init__.py +14 -0
  84. aiq/cli/commands/workflow/templates/__init__.py.j2 +0 -0
  85. aiq/cli/commands/workflow/templates/config.yml.j2 +16 -0
  86. aiq/cli/commands/workflow/templates/pyproject.toml.j2 +22 -0
  87. aiq/cli/commands/workflow/templates/register.py.j2 +5 -0
  88. aiq/cli/commands/workflow/templates/workflow.py.j2 +36 -0
  89. aiq/cli/commands/workflow/workflow.py +37 -0
  90. aiq/cli/commands/workflow/workflow_commands.py +313 -0
  91. aiq/cli/entrypoint.py +135 -0
  92. aiq/cli/main.py +44 -0
  93. aiq/cli/register_workflow.py +488 -0
  94. aiq/cli/type_registry.py +1000 -0
  95. aiq/data_models/__init__.py +14 -0
  96. aiq/data_models/api_server.py +694 -0
  97. aiq/data_models/authentication.py +231 -0
  98. aiq/data_models/common.py +171 -0
  99. aiq/data_models/component.py +54 -0
  100. aiq/data_models/component_ref.py +168 -0
  101. aiq/data_models/config.py +406 -0
  102. aiq/data_models/dataset_handler.py +123 -0
  103. aiq/data_models/discovery_metadata.py +335 -0
  104. aiq/data_models/embedder.py +27 -0
  105. aiq/data_models/evaluate.py +127 -0
  106. aiq/data_models/evaluator.py +26 -0
  107. aiq/data_models/front_end.py +26 -0
  108. aiq/data_models/function.py +30 -0
  109. aiq/data_models/function_dependencies.py +72 -0
  110. aiq/data_models/interactive.py +246 -0
  111. aiq/data_models/intermediate_step.py +302 -0
  112. aiq/data_models/invocation_node.py +38 -0
  113. aiq/data_models/llm.py +27 -0
  114. aiq/data_models/logging.py +26 -0
  115. aiq/data_models/memory.py +27 -0
  116. aiq/data_models/object_store.py +44 -0
  117. aiq/data_models/profiler.py +54 -0
  118. aiq/data_models/registry_handler.py +26 -0
  119. aiq/data_models/retriever.py +30 -0
  120. aiq/data_models/retry_mixin.py +35 -0
  121. aiq/data_models/span.py +187 -0
  122. aiq/data_models/step_adaptor.py +64 -0
  123. aiq/data_models/streaming.py +33 -0
  124. aiq/data_models/swe_bench_model.py +54 -0
  125. aiq/data_models/telemetry_exporter.py +26 -0
  126. aiq/data_models/ttc_strategy.py +30 -0
  127. aiq/embedder/__init__.py +0 -0
  128. aiq/embedder/langchain_client.py +41 -0
  129. aiq/embedder/nim_embedder.py +59 -0
  130. aiq/embedder/openai_embedder.py +43 -0
  131. aiq/embedder/register.py +24 -0
  132. aiq/eval/__init__.py +14 -0
  133. aiq/eval/config.py +60 -0
  134. aiq/eval/dataset_handler/__init__.py +0 -0
  135. aiq/eval/dataset_handler/dataset_downloader.py +106 -0
  136. aiq/eval/dataset_handler/dataset_filter.py +52 -0
  137. aiq/eval/dataset_handler/dataset_handler.py +254 -0
  138. aiq/eval/evaluate.py +506 -0
  139. aiq/eval/evaluator/__init__.py +14 -0
  140. aiq/eval/evaluator/base_evaluator.py +73 -0
  141. aiq/eval/evaluator/evaluator_model.py +45 -0
  142. aiq/eval/intermediate_step_adapter.py +99 -0
  143. aiq/eval/rag_evaluator/__init__.py +0 -0
  144. aiq/eval/rag_evaluator/evaluate.py +178 -0
  145. aiq/eval/rag_evaluator/register.py +143 -0
  146. aiq/eval/register.py +23 -0
  147. aiq/eval/remote_workflow.py +133 -0
  148. aiq/eval/runners/__init__.py +14 -0
  149. aiq/eval/runners/config.py +39 -0
  150. aiq/eval/runners/multi_eval_runner.py +54 -0
  151. aiq/eval/runtime_event_subscriber.py +52 -0
  152. aiq/eval/swe_bench_evaluator/__init__.py +0 -0
  153. aiq/eval/swe_bench_evaluator/evaluate.py +215 -0
  154. aiq/eval/swe_bench_evaluator/register.py +36 -0
  155. aiq/eval/trajectory_evaluator/__init__.py +0 -0
  156. aiq/eval/trajectory_evaluator/evaluate.py +75 -0
  157. aiq/eval/trajectory_evaluator/register.py +40 -0
  158. aiq/eval/tunable_rag_evaluator/__init__.py +0 -0
  159. aiq/eval/tunable_rag_evaluator/evaluate.py +245 -0
  160. aiq/eval/tunable_rag_evaluator/register.py +52 -0
  161. aiq/eval/usage_stats.py +41 -0
  162. aiq/eval/utils/__init__.py +0 -0
  163. aiq/eval/utils/output_uploader.py +140 -0
  164. aiq/eval/utils/tqdm_position_registry.py +40 -0
  165. aiq/eval/utils/weave_eval.py +184 -0
  166. aiq/experimental/__init__.py +0 -0
  167. aiq/experimental/decorators/__init__.py +0 -0
  168. aiq/experimental/decorators/experimental_warning_decorator.py +130 -0
  169. aiq/experimental/test_time_compute/__init__.py +0 -0
  170. aiq/experimental/test_time_compute/editing/__init__.py +0 -0
  171. aiq/experimental/test_time_compute/editing/iterative_plan_refinement_editor.py +147 -0
  172. aiq/experimental/test_time_compute/editing/llm_as_a_judge_editor.py +204 -0
  173. aiq/experimental/test_time_compute/editing/motivation_aware_summarization.py +107 -0
  174. aiq/experimental/test_time_compute/functions/__init__.py +0 -0
  175. aiq/experimental/test_time_compute/functions/execute_score_select_function.py +105 -0
  176. aiq/experimental/test_time_compute/functions/its_tool_orchestration_function.py +205 -0
  177. aiq/experimental/test_time_compute/functions/its_tool_wrapper_function.py +146 -0
  178. aiq/experimental/test_time_compute/functions/plan_select_execute_function.py +224 -0
  179. aiq/experimental/test_time_compute/models/__init__.py +0 -0
  180. aiq/experimental/test_time_compute/models/editor_config.py +132 -0
  181. aiq/experimental/test_time_compute/models/scoring_config.py +112 -0
  182. aiq/experimental/test_time_compute/models/search_config.py +120 -0
  183. aiq/experimental/test_time_compute/models/selection_config.py +154 -0
  184. aiq/experimental/test_time_compute/models/stage_enums.py +43 -0
  185. aiq/experimental/test_time_compute/models/strategy_base.py +66 -0
  186. aiq/experimental/test_time_compute/models/tool_use_config.py +41 -0
  187. aiq/experimental/test_time_compute/models/ttc_item.py +48 -0
  188. aiq/experimental/test_time_compute/register.py +36 -0
  189. aiq/experimental/test_time_compute/scoring/__init__.py +0 -0
  190. aiq/experimental/test_time_compute/scoring/llm_based_agent_scorer.py +168 -0
  191. aiq/experimental/test_time_compute/scoring/llm_based_plan_scorer.py +168 -0
  192. aiq/experimental/test_time_compute/scoring/motivation_aware_scorer.py +111 -0
  193. aiq/experimental/test_time_compute/search/__init__.py +0 -0
  194. aiq/experimental/test_time_compute/search/multi_llm_planner.py +128 -0
  195. aiq/experimental/test_time_compute/search/multi_query_retrieval_search.py +122 -0
  196. aiq/experimental/test_time_compute/search/single_shot_multi_plan_planner.py +128 -0
  197. aiq/experimental/test_time_compute/selection/__init__.py +0 -0
  198. aiq/experimental/test_time_compute/selection/best_of_n_selector.py +63 -0
  199. aiq/experimental/test_time_compute/selection/llm_based_agent_output_selector.py +131 -0
  200. aiq/experimental/test_time_compute/selection/llm_based_output_merging_selector.py +159 -0
  201. aiq/experimental/test_time_compute/selection/llm_based_plan_selector.py +128 -0
  202. aiq/experimental/test_time_compute/selection/threshold_selector.py +58 -0
  203. aiq/front_ends/__init__.py +14 -0
  204. aiq/front_ends/console/__init__.py +14 -0
  205. aiq/front_ends/console/authentication_flow_handler.py +233 -0
  206. aiq/front_ends/console/console_front_end_config.py +32 -0
  207. aiq/front_ends/console/console_front_end_plugin.py +96 -0
  208. aiq/front_ends/console/register.py +25 -0
  209. aiq/front_ends/cron/__init__.py +14 -0
  210. aiq/front_ends/fastapi/__init__.py +14 -0
  211. aiq/front_ends/fastapi/auth_flow_handlers/__init__.py +0 -0
  212. aiq/front_ends/fastapi/auth_flow_handlers/http_flow_handler.py +27 -0
  213. aiq/front_ends/fastapi/auth_flow_handlers/websocket_flow_handler.py +107 -0
  214. aiq/front_ends/fastapi/fastapi_front_end_config.py +234 -0
  215. aiq/front_ends/fastapi/fastapi_front_end_controller.py +68 -0
  216. aiq/front_ends/fastapi/fastapi_front_end_plugin.py +116 -0
  217. aiq/front_ends/fastapi/fastapi_front_end_plugin_worker.py +1092 -0
  218. aiq/front_ends/fastapi/html_snippets/__init__.py +14 -0
  219. aiq/front_ends/fastapi/html_snippets/auth_code_grant_success.py +35 -0
  220. aiq/front_ends/fastapi/intermediate_steps_subscriber.py +80 -0
  221. aiq/front_ends/fastapi/job_store.py +183 -0
  222. aiq/front_ends/fastapi/main.py +72 -0
  223. aiq/front_ends/fastapi/message_handler.py +298 -0
  224. aiq/front_ends/fastapi/message_validator.py +345 -0
  225. aiq/front_ends/fastapi/register.py +25 -0
  226. aiq/front_ends/fastapi/response_helpers.py +195 -0
  227. aiq/front_ends/fastapi/step_adaptor.py +321 -0
  228. aiq/front_ends/mcp/__init__.py +14 -0
  229. aiq/front_ends/mcp/mcp_front_end_config.py +32 -0
  230. aiq/front_ends/mcp/mcp_front_end_plugin.py +93 -0
  231. aiq/front_ends/mcp/register.py +27 -0
  232. aiq/front_ends/mcp/tool_converter.py +242 -0
  233. aiq/front_ends/register.py +22 -0
  234. aiq/front_ends/simple_base/__init__.py +14 -0
  235. aiq/front_ends/simple_base/simple_front_end_plugin_base.py +54 -0
  236. aiq/llm/__init__.py +0 -0
  237. aiq/llm/aws_bedrock_llm.py +57 -0
  238. aiq/llm/nim_llm.py +46 -0
  239. aiq/llm/openai_llm.py +46 -0
  240. aiq/llm/register.py +23 -0
  241. aiq/llm/utils/__init__.py +14 -0
  242. aiq/llm/utils/env_config_value.py +94 -0
  243. aiq/llm/utils/error.py +17 -0
  244. aiq/memory/__init__.py +20 -0
  245. aiq/memory/interfaces.py +183 -0
  246. aiq/memory/models.py +112 -0
  247. aiq/meta/module_to_distro.json +3 -0
  248. aiq/meta/pypi.md +58 -0
  249. aiq/object_store/__init__.py +20 -0
  250. aiq/object_store/in_memory_object_store.py +76 -0
  251. aiq/object_store/interfaces.py +84 -0
  252. aiq/object_store/models.py +36 -0
  253. aiq/object_store/register.py +20 -0
  254. aiq/observability/__init__.py +14 -0
  255. aiq/observability/exporter/__init__.py +14 -0
  256. aiq/observability/exporter/base_exporter.py +449 -0
  257. aiq/observability/exporter/exporter.py +78 -0
  258. aiq/observability/exporter/file_exporter.py +33 -0
  259. aiq/observability/exporter/processing_exporter.py +322 -0
  260. aiq/observability/exporter/raw_exporter.py +52 -0
  261. aiq/observability/exporter/span_exporter.py +265 -0
  262. aiq/observability/exporter_manager.py +335 -0
  263. aiq/observability/mixin/__init__.py +14 -0
  264. aiq/observability/mixin/batch_config_mixin.py +26 -0
  265. aiq/observability/mixin/collector_config_mixin.py +23 -0
  266. aiq/observability/mixin/file_mixin.py +288 -0
  267. aiq/observability/mixin/file_mode.py +23 -0
  268. aiq/observability/mixin/resource_conflict_mixin.py +134 -0
  269. aiq/observability/mixin/serialize_mixin.py +61 -0
  270. aiq/observability/mixin/type_introspection_mixin.py +183 -0
  271. aiq/observability/processor/__init__.py +14 -0
  272. aiq/observability/processor/batching_processor.py +310 -0
  273. aiq/observability/processor/callback_processor.py +42 -0
  274. aiq/observability/processor/intermediate_step_serializer.py +28 -0
  275. aiq/observability/processor/processor.py +71 -0
  276. aiq/observability/register.py +96 -0
  277. aiq/observability/utils/__init__.py +14 -0
  278. aiq/observability/utils/dict_utils.py +236 -0
  279. aiq/observability/utils/time_utils.py +31 -0
  280. aiq/plugins/.namespace +1 -0
  281. aiq/profiler/__init__.py +0 -0
  282. aiq/profiler/calc/__init__.py +14 -0
  283. aiq/profiler/calc/calc_runner.py +627 -0
  284. aiq/profiler/calc/calculations.py +288 -0
  285. aiq/profiler/calc/data_models.py +188 -0
  286. aiq/profiler/calc/plot.py +345 -0
  287. aiq/profiler/callbacks/__init__.py +0 -0
  288. aiq/profiler/callbacks/agno_callback_handler.py +295 -0
  289. aiq/profiler/callbacks/base_callback_class.py +20 -0
  290. aiq/profiler/callbacks/langchain_callback_handler.py +290 -0
  291. aiq/profiler/callbacks/llama_index_callback_handler.py +205 -0
  292. aiq/profiler/callbacks/semantic_kernel_callback_handler.py +238 -0
  293. aiq/profiler/callbacks/token_usage_base_model.py +27 -0
  294. aiq/profiler/data_frame_row.py +51 -0
  295. aiq/profiler/data_models.py +24 -0
  296. aiq/profiler/decorators/__init__.py +0 -0
  297. aiq/profiler/decorators/framework_wrapper.py +131 -0
  298. aiq/profiler/decorators/function_tracking.py +254 -0
  299. aiq/profiler/forecasting/__init__.py +0 -0
  300. aiq/profiler/forecasting/config.py +18 -0
  301. aiq/profiler/forecasting/model_trainer.py +75 -0
  302. aiq/profiler/forecasting/models/__init__.py +22 -0
  303. aiq/profiler/forecasting/models/forecasting_base_model.py +40 -0
  304. aiq/profiler/forecasting/models/linear_model.py +196 -0
  305. aiq/profiler/forecasting/models/random_forest_regressor.py +268 -0
  306. aiq/profiler/inference_metrics_model.py +28 -0
  307. aiq/profiler/inference_optimization/__init__.py +0 -0
  308. aiq/profiler/inference_optimization/bottleneck_analysis/__init__.py +0 -0
  309. aiq/profiler/inference_optimization/bottleneck_analysis/nested_stack_analysis.py +460 -0
  310. aiq/profiler/inference_optimization/bottleneck_analysis/simple_stack_analysis.py +258 -0
  311. aiq/profiler/inference_optimization/data_models.py +386 -0
  312. aiq/profiler/inference_optimization/experimental/__init__.py +0 -0
  313. aiq/profiler/inference_optimization/experimental/concurrency_spike_analysis.py +468 -0
  314. aiq/profiler/inference_optimization/experimental/prefix_span_analysis.py +405 -0
  315. aiq/profiler/inference_optimization/llm_metrics.py +212 -0
  316. aiq/profiler/inference_optimization/prompt_caching.py +163 -0
  317. aiq/profiler/inference_optimization/token_uniqueness.py +107 -0
  318. aiq/profiler/inference_optimization/workflow_runtimes.py +72 -0
  319. aiq/profiler/intermediate_property_adapter.py +102 -0
  320. aiq/profiler/profile_runner.py +473 -0
  321. aiq/profiler/utils.py +184 -0
  322. aiq/registry_handlers/__init__.py +0 -0
  323. aiq/registry_handlers/local/__init__.py +0 -0
  324. aiq/registry_handlers/local/local_handler.py +176 -0
  325. aiq/registry_handlers/local/register_local.py +37 -0
  326. aiq/registry_handlers/metadata_factory.py +60 -0
  327. aiq/registry_handlers/package_utils.py +567 -0
  328. aiq/registry_handlers/pypi/__init__.py +0 -0
  329. aiq/registry_handlers/pypi/pypi_handler.py +251 -0
  330. aiq/registry_handlers/pypi/register_pypi.py +40 -0
  331. aiq/registry_handlers/register.py +21 -0
  332. aiq/registry_handlers/registry_handler_base.py +157 -0
  333. aiq/registry_handlers/rest/__init__.py +0 -0
  334. aiq/registry_handlers/rest/register_rest.py +56 -0
  335. aiq/registry_handlers/rest/rest_handler.py +237 -0
  336. aiq/registry_handlers/schemas/__init__.py +0 -0
  337. aiq/registry_handlers/schemas/headers.py +42 -0
  338. aiq/registry_handlers/schemas/package.py +68 -0
  339. aiq/registry_handlers/schemas/publish.py +63 -0
  340. aiq/registry_handlers/schemas/pull.py +82 -0
  341. aiq/registry_handlers/schemas/remove.py +36 -0
  342. aiq/registry_handlers/schemas/search.py +91 -0
  343. aiq/registry_handlers/schemas/status.py +47 -0
  344. aiq/retriever/__init__.py +0 -0
  345. aiq/retriever/interface.py +37 -0
  346. aiq/retriever/milvus/__init__.py +14 -0
  347. aiq/retriever/milvus/register.py +81 -0
  348. aiq/retriever/milvus/retriever.py +228 -0
  349. aiq/retriever/models.py +74 -0
  350. aiq/retriever/nemo_retriever/__init__.py +14 -0
  351. aiq/retriever/nemo_retriever/register.py +60 -0
  352. aiq/retriever/nemo_retriever/retriever.py +190 -0
  353. aiq/retriever/register.py +22 -0
  354. aiq/runtime/__init__.py +14 -0
  355. aiq/runtime/loader.py +215 -0
  356. aiq/runtime/runner.py +190 -0
  357. aiq/runtime/session.py +158 -0
  358. aiq/runtime/user_metadata.py +130 -0
  359. aiq/settings/__init__.py +0 -0
  360. aiq/settings/global_settings.py +318 -0
  361. aiq/test/.namespace +1 -0
  362. aiq/tool/__init__.py +0 -0
  363. aiq/tool/chat_completion.py +74 -0
  364. aiq/tool/code_execution/README.md +151 -0
  365. aiq/tool/code_execution/__init__.py +0 -0
  366. aiq/tool/code_execution/code_sandbox.py +267 -0
  367. aiq/tool/code_execution/local_sandbox/.gitignore +1 -0
  368. aiq/tool/code_execution/local_sandbox/Dockerfile.sandbox +60 -0
  369. aiq/tool/code_execution/local_sandbox/__init__.py +13 -0
  370. aiq/tool/code_execution/local_sandbox/local_sandbox_server.py +198 -0
  371. aiq/tool/code_execution/local_sandbox/sandbox.requirements.txt +6 -0
  372. aiq/tool/code_execution/local_sandbox/start_local_sandbox.sh +50 -0
  373. aiq/tool/code_execution/register.py +74 -0
  374. aiq/tool/code_execution/test_code_execution_sandbox.py +414 -0
  375. aiq/tool/code_execution/utils.py +100 -0
  376. aiq/tool/datetime_tools.py +42 -0
  377. aiq/tool/document_search.py +141 -0
  378. aiq/tool/github_tools/__init__.py +0 -0
  379. aiq/tool/github_tools/create_github_commit.py +133 -0
  380. aiq/tool/github_tools/create_github_issue.py +87 -0
  381. aiq/tool/github_tools/create_github_pr.py +106 -0
  382. aiq/tool/github_tools/get_github_file.py +106 -0
  383. aiq/tool/github_tools/get_github_issue.py +166 -0
  384. aiq/tool/github_tools/get_github_pr.py +256 -0
  385. aiq/tool/github_tools/update_github_issue.py +100 -0
  386. aiq/tool/mcp/__init__.py +14 -0
  387. aiq/tool/mcp/exceptions.py +142 -0
  388. aiq/tool/mcp/mcp_client.py +255 -0
  389. aiq/tool/mcp/mcp_tool.py +96 -0
  390. aiq/tool/memory_tools/__init__.py +0 -0
  391. aiq/tool/memory_tools/add_memory_tool.py +79 -0
  392. aiq/tool/memory_tools/delete_memory_tool.py +67 -0
  393. aiq/tool/memory_tools/get_memory_tool.py +72 -0
  394. aiq/tool/nvidia_rag.py +95 -0
  395. aiq/tool/register.py +38 -0
  396. aiq/tool/retriever.py +89 -0
  397. aiq/tool/server_tools.py +66 -0
  398. aiq/utils/__init__.py +0 -0
  399. aiq/utils/data_models/__init__.py +0 -0
  400. aiq/utils/data_models/schema_validator.py +58 -0
  401. aiq/utils/debugging_utils.py +43 -0
  402. aiq/utils/dump_distro_mapping.py +32 -0
  403. aiq/utils/exception_handlers/__init__.py +0 -0
  404. aiq/utils/exception_handlers/automatic_retries.py +289 -0
  405. aiq/utils/exception_handlers/mcp.py +211 -0
  406. aiq/utils/exception_handlers/schemas.py +114 -0
  407. aiq/utils/io/__init__.py +0 -0
  408. aiq/utils/io/model_processing.py +28 -0
  409. aiq/utils/io/yaml_tools.py +119 -0
  410. aiq/utils/log_utils.py +37 -0
  411. aiq/utils/metadata_utils.py +74 -0
  412. aiq/utils/optional_imports.py +142 -0
  413. aiq/utils/producer_consumer_queue.py +178 -0
  414. aiq/utils/reactive/__init__.py +0 -0
  415. aiq/utils/reactive/base/__init__.py +0 -0
  416. aiq/utils/reactive/base/observable_base.py +65 -0
  417. aiq/utils/reactive/base/observer_base.py +55 -0
  418. aiq/utils/reactive/base/subject_base.py +79 -0
  419. aiq/utils/reactive/observable.py +59 -0
  420. aiq/utils/reactive/observer.py +76 -0
  421. aiq/utils/reactive/subject.py +131 -0
  422. aiq/utils/reactive/subscription.py +49 -0
  423. aiq/utils/settings/__init__.py +0 -0
  424. aiq/utils/settings/global_settings.py +197 -0
  425. aiq/utils/string_utils.py +38 -0
  426. aiq/utils/type_converter.py +290 -0
  427. aiq/utils/type_utils.py +484 -0
  428. aiq/utils/url_utils.py +27 -0
  429. nvidia_nat-1.2.0rc5.dist-info/METADATA +363 -0
  430. nvidia_nat-1.2.0rc5.dist-info/RECORD +435 -0
  431. nvidia_nat-1.2.0rc5.dist-info/WHEEL +5 -0
  432. nvidia_nat-1.2.0rc5.dist-info/entry_points.txt +20 -0
  433. nvidia_nat-1.2.0rc5.dist-info/licenses/LICENSE-3rd-party.txt +3686 -0
  434. nvidia_nat-1.2.0rc5.dist-info/licenses/LICENSE.md +201 -0
  435. nvidia_nat-1.2.0rc5.dist-info/top_level.txt +1 -0
@@ -0,0 +1,246 @@
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 re
17
+ import typing
18
+ from enum import Enum
19
+
20
+ from pydantic import BaseModel
21
+ from pydantic import Discriminator
22
+ from pydantic import Field
23
+ from pydantic import field_validator
24
+
25
+
26
+ class HumanPromptModelType(str, Enum):
27
+ """
28
+ Represents the type of an interaction model.
29
+ """
30
+ TEXT = "text"
31
+ NOTIFICATION = "notification"
32
+ BINARY_CHOICE = "binary_choice"
33
+ RADIO = "radio"
34
+ CHECKBOX = "checkbox"
35
+ DROPDOWN = "dropdown"
36
+ OAUTH_CONSENT = "oauth_consent"
37
+
38
+
39
+ class BinaryChoiceOptionsType(str, Enum):
40
+ """
41
+ Represents the types of system interaction binary choice content
42
+ """
43
+ CONTINUE = "continue"
44
+ CANCEL = "cancel"
45
+
46
+
47
+ class MultipleChoiceOptionType(str, Enum):
48
+ """
49
+ Represents the types of system interaction multiple choice content
50
+ """
51
+ EMAIL = "email"
52
+ SMS = "sms"
53
+ PUSH = "push"
54
+
55
+
56
+ class BinaryHumanPromptOption(BaseModel):
57
+ """
58
+ Represents a choice for a binary interaction.
59
+ """
60
+ id: str = Field(default="default", description="The ID of the choice.")
61
+ label: str = Field(default="default", description="Label of the choice")
62
+ value: typing.Any = Field(default="default", description="The value of the choice.")
63
+
64
+
65
+ class MultipleChoiceOption(BaseModel):
66
+ id: str = Field(default="default", description="The ID of the choice.")
67
+ label: str = Field(default="default", description="The label for the multiple choice interaction.")
68
+ value: str = Field(default="default", description="The value for the multiple choice interaction.")
69
+ description: str = Field(default="default", description="The description for the multiple choice interaction.")
70
+
71
+
72
+ class HumanResponseText(BaseModel):
73
+ """
74
+ Represents a text response to an interaction.
75
+ """
76
+ type: typing.Literal[HumanPromptModelType.TEXT] = HumanPromptModelType.TEXT
77
+ text: str = Field(description="The text of the response.")
78
+
79
+
80
+ class HumanResponseNotification(BaseModel):
81
+ """
82
+ Represents a notification response to an interaction.
83
+ """
84
+ type: typing.Literal[HumanPromptModelType.NOTIFICATION] = HumanPromptModelType.NOTIFICATION
85
+ text: str = Field(default="Notification acknowledgement.", description="Default notification response text.")
86
+
87
+
88
+ class HumanResponseBinary(BaseModel):
89
+ """
90
+ Represents a binary response to an interaction.
91
+ """
92
+ type: typing.Literal[HumanPromptModelType.BINARY_CHOICE] = HumanPromptModelType.BINARY_CHOICE
93
+ selected_option: BinaryHumanPromptOption = Field(description="The selected binary response.")
94
+
95
+
96
+ class HumanResponseRadio(BaseModel):
97
+ """
98
+ Represents a multiple choice radio response to an interaction.
99
+ """
100
+ type: typing.Literal[HumanPromptModelType.RADIO] = HumanPromptModelType.RADIO
101
+ selected_option: MultipleChoiceOption = Field(description="The selected multiple choice radio response.")
102
+
103
+
104
+ class HumanResponseCheckbox(BaseModel):
105
+ """
106
+ Represents a multiple choice checkbox response to an interaction.
107
+ """
108
+ type: typing.Literal[HumanPromptModelType.CHECKBOX] = HumanPromptModelType.CHECKBOX
109
+ selected_option: MultipleChoiceOption = Field(description="The selected multiple choice checkbox response.")
110
+
111
+
112
+ class HumanResponseDropdown(BaseModel):
113
+ """
114
+ Represents a multiple choice dropdown response to an interaction.
115
+ """
116
+ type: typing.Literal[HumanPromptModelType.DROPDOWN] = HumanPromptModelType.DROPDOWN
117
+ selected_option: MultipleChoiceOption = Field(description="The selected multiple choice dropdown response.")
118
+
119
+
120
+ HumanResponse = typing.Annotated[HumanResponseText | HumanResponseBinary | HumanResponseNotification
121
+ | HumanResponseRadio | HumanResponseCheckbox
122
+ | HumanResponseDropdown,
123
+ Discriminator("type")]
124
+
125
+
126
+ class HumanPromptBase(BaseModel):
127
+ """
128
+ Base interaction model to derive from
129
+ """
130
+ text: str = Field(description="Text prompt that will be displayed to the user.")
131
+
132
+
133
+ class HumanPromptText(HumanPromptBase):
134
+ """
135
+ Represents a text interaction.
136
+ """
137
+ input_type: typing.Literal[HumanPromptModelType.TEXT] = HumanPromptModelType.TEXT
138
+ placeholder: str | None = Field(description="The placeholder for the text.")
139
+ required: bool = Field(default=True, description="Whether the interaction is required.")
140
+
141
+
142
+ class HumanPromptNotification(HumanPromptBase):
143
+ """
144
+ Represents a notification interaction.
145
+ """
146
+ input_type: typing.Literal[HumanPromptModelType.NOTIFICATION] = HumanPromptModelType.NOTIFICATION
147
+
148
+
149
+ class _HumanPromptOAuthConsent(HumanPromptBase):
150
+ """
151
+ Represents an OAuth consent prompt interaction used to notify the UI to open the authentication page for completing
152
+ the consent flow.
153
+ """
154
+ input_type: typing.Literal[HumanPromptModelType.OAUTH_CONSENT] = HumanPromptModelType.OAUTH_CONSENT
155
+
156
+
157
+ class HumanPromptBinary(HumanPromptBase):
158
+ """
159
+ Represents a binary interaction.
160
+ """
161
+ input_type: typing.Literal[HumanPromptModelType.BINARY_CHOICE] = HumanPromptModelType.BINARY_CHOICE
162
+ options: list[BinaryHumanPromptOption] = Field(description="The options for the binary interaction.")
163
+
164
+ # Field validator to make sure len(options) == 2
165
+ @field_validator("options", mode="before")
166
+ @classmethod
167
+ def validate_options(cls, options):
168
+ if len(options) != 2:
169
+ raise ValueError("Binary interactions must have exactly two options.")
170
+ return options
171
+
172
+
173
+ class HumanPromptMultipleChoiceBase(HumanPromptBase):
174
+ """
175
+ Represents a multiple choice interaction.
176
+ """
177
+ options: list[MultipleChoiceOption] = Field(description="The options for the multiple choice interaction.")
178
+
179
+
180
+ class HumanPromptRadio(HumanPromptMultipleChoiceBase):
181
+ """
182
+ Represents a radio interaction.
183
+ """
184
+ input_type: typing.Literal[HumanPromptModelType.RADIO] = HumanPromptModelType.RADIO
185
+
186
+
187
+ class HumanPromptCheckbox(HumanPromptMultipleChoiceBase):
188
+ """
189
+ Represents a checkbox interaction.
190
+ """
191
+ input_type: typing.Literal[HumanPromptModelType.CHECKBOX] = HumanPromptModelType.CHECKBOX
192
+
193
+
194
+ class HumanPromptDropdown(HumanPromptMultipleChoiceBase):
195
+ """
196
+ Represents a dropdown interaction.
197
+ """
198
+ input_type: typing.Literal[HumanPromptModelType.DROPDOWN] = HumanPromptModelType.DROPDOWN
199
+
200
+
201
+ HumanPrompt = typing.Annotated[HumanPromptText | HumanPromptNotification | HumanPromptBinary | HumanPromptRadio
202
+ | HumanPromptCheckbox | HumanPromptDropdown | _HumanPromptOAuthConsent,
203
+ Discriminator("input_type")]
204
+
205
+
206
+ class InteractionStatus(str, Enum):
207
+ """
208
+ Represents the status of an interaction.
209
+ """
210
+ PENDING = "pending"
211
+ IN_PROGRESS = "in_progress"
212
+ COMPLETED = "completed"
213
+ FAILED = "failed"
214
+
215
+
216
+ class InteractionBase(BaseModel):
217
+ """
218
+ Represents a system-human interaction.
219
+ """
220
+ id: str = Field(description="The ID of the interaction.")
221
+ type: str = Field(default="system_human_interaction", description="The type of the interaction.")
222
+ thread_id: str | None = Field(description="The thread ID of the interaction.", default=None)
223
+ parent_id: str | None = Field(description="The parent ID of the interaction.", default=None)
224
+ status: InteractionStatus = Field(description="The status of the interaction.", default=InteractionStatus.PENDING)
225
+ timestamp: str = Field(description="The timestamp of the interaction.")
226
+
227
+ @field_validator("timestamp", mode="before")
228
+ @classmethod
229
+ def validate_timestamp(cls, timestamp):
230
+ if not re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z", timestamp):
231
+ raise ValueError("Timestamp must be in the format 2025-01-13T10:00:03Z")
232
+ return timestamp
233
+
234
+
235
+ class InteractionPrompt(InteractionBase):
236
+ """
237
+ Represents a system-human interaction with a prompt.
238
+ """
239
+ content: HumanPrompt = Field(description="The content of the interaction.")
240
+
241
+
242
+ class InteractionResponse(InteractionBase):
243
+ """
244
+ Represents a system-human interaction with a response.
245
+ """
246
+ content: HumanResponse = Field(description="The content of the interaction.")
@@ -0,0 +1,302 @@
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 time
17
+ import typing
18
+ import uuid
19
+ from enum import Enum
20
+ from typing import Literal
21
+
22
+ from pydantic import BaseModel
23
+ from pydantic import ConfigDict
24
+ from pydantic import Field
25
+ from pydantic import model_validator
26
+
27
+ from aiq.builder.framework_enum import LLMFrameworkEnum
28
+ from aiq.data_models.invocation_node import InvocationNode
29
+ from aiq.profiler.callbacks.token_usage_base_model import TokenUsageBaseModel
30
+
31
+
32
+ class IntermediateStepCategory(str, Enum):
33
+ LLM = "LLM"
34
+ TOOL = "TOOL"
35
+ WORKFLOW = "WORKFLOW"
36
+ TASK = "TASK"
37
+ FUNCTION = "FUNCTION"
38
+ CUSTOM = "CUSTOM"
39
+ SPAN = "SPAN"
40
+
41
+
42
+ class IntermediateStepType(str, Enum):
43
+ LLM_START = "LLM_START"
44
+ LLM_END = "LLM_END"
45
+ LLM_NEW_TOKEN = "LLM_NEW_TOKEN"
46
+ TOOL_START = "TOOL_START"
47
+ TOOL_END = "TOOL_END"
48
+ WORKFLOW_START = "WORKFLOW_START"
49
+ WORKFLOW_END = "WORKFLOW_END"
50
+ TASK_START = "TASK_START"
51
+ TASK_END = "TASK_END"
52
+ FUNCTION_START = "FUNCTION_START"
53
+ FUNCTION_END = "FUNCTION_END"
54
+ CUSTOM_START = "CUSTOM_START"
55
+ CUSTOM_END = "CUSTOM_END"
56
+ SPAN_START = "SPAN_START"
57
+ SPAN_CHUNK = "SPAN_CHUNK"
58
+ SPAN_END = "SPAN_END"
59
+
60
+
61
+ class IntermediateStepState(str, Enum):
62
+ START = "START"
63
+ CHUNK = "CHUNK"
64
+ END = "END"
65
+
66
+
67
+ class StreamEventData(BaseModel):
68
+ """
69
+ AIQStreamEventData is a data model that represents the data field in an streaming event.
70
+ """
71
+
72
+ # Allow extra fields in the model_config to support derived models
73
+ model_config = ConfigDict(extra="allow")
74
+
75
+ input: typing.Any | None = None
76
+ output: typing.Any | None = None
77
+ chunk: typing.Any | None = None
78
+
79
+
80
+ class UsageInfo(BaseModel):
81
+ token_usage: TokenUsageBaseModel = TokenUsageBaseModel()
82
+ num_llm_calls: int = 0
83
+ seconds_between_calls: int = 0
84
+
85
+
86
+ class ToolParameters(BaseModel):
87
+ properties: dict[str, typing.Any] = Field(..., description="The properties of the function parameters.")
88
+ required: list[str] = Field(default_factory=list, description="The required properties of the function parameters.")
89
+ type_: Literal["object"] = Field(default="object", description="The type of the function parameters.", alias="type")
90
+ additionalProperties: bool = Field(default=False,
91
+ description="Enable function parameters allow additional properties.")
92
+ strict: bool = Field(default=True, description="Ensure function calls reliably adhere to the function schema.")
93
+
94
+
95
+ class ToolDetails(BaseModel):
96
+ name: str = Field(..., description="The name of the function.")
97
+ description: str = Field(..., description="The description of the function.")
98
+ parameters: ToolParameters = Field(..., description="The parameters of the function.")
99
+
100
+
101
+ class ToolSchema(BaseModel):
102
+ type: Literal["function"] = Field(..., description="The type of the tool.")
103
+ function: ToolDetails = Field(..., description="The function details.")
104
+
105
+
106
+ class TraceMetadata(BaseModel):
107
+ chat_responses: typing.Any | None = None
108
+ chat_inputs: typing.Any | None = None
109
+ tool_inputs: typing.Any | None = None
110
+ tool_outputs: typing.Any | None = None
111
+ tool_info: typing.Any | None = None
112
+ span_inputs: typing.Any | None = None
113
+ span_outputs: typing.Any | None = None
114
+ provided_metadata: typing.Any | None = None
115
+ tools_schema: list[ToolSchema] = Field(default_factory=list,
116
+ description="The schema of tools used in a tool calling request.")
117
+
118
+ # Allow extra fields in the model_config to support derived models
119
+ model_config = ConfigDict(extra="allow")
120
+
121
+
122
+ class IntermediateStepPayload(BaseModel):
123
+ """
124
+ AIQIntermediateStep is a data model that represents an intermediate step in the AIQ Toolkit. Intermediate steps are
125
+ captured while a request is running and can be used to show progress or to evaluate the path a workflow took to get
126
+ a response.
127
+ """
128
+
129
+ # Allow extra fields in the model_config to support derived models
130
+ model_config = ConfigDict(extra="allow")
131
+
132
+ event_type: IntermediateStepType
133
+ # Create an event timestamp field with the default being a lambda that returns the current time
134
+ event_timestamp: float = Field(default_factory=lambda: time.time())
135
+ span_event_timestamp: float | None = None # Used for tracking the start time of a task if this is end
136
+ framework: LLMFrameworkEnum | None = None
137
+ name: str | None = None
138
+ tags: list[str] | None = None
139
+ metadata: dict[str, typing.Any] | TraceMetadata | None = None
140
+ data: StreamEventData | None = None
141
+ usage_info: UsageInfo | None = None
142
+ UUID: str = Field(default_factory=lambda: str(uuid.uuid4()))
143
+
144
+ @property
145
+ def event_category(self) -> IntermediateStepCategory: # pylint: disable=too-many-return-statements
146
+ match self.event_type:
147
+ case IntermediateStepType.LLM_START:
148
+ return IntermediateStepCategory.LLM
149
+ case IntermediateStepType.LLM_END:
150
+ return IntermediateStepCategory.LLM
151
+ case IntermediateStepType.LLM_NEW_TOKEN:
152
+ return IntermediateStepCategory.LLM
153
+ case IntermediateStepType.TOOL_START:
154
+ return IntermediateStepCategory.TOOL
155
+ case IntermediateStepType.TOOL_END:
156
+ return IntermediateStepCategory.TOOL
157
+ case IntermediateStepType.WORKFLOW_START:
158
+ return IntermediateStepCategory.WORKFLOW
159
+ case IntermediateStepType.WORKFLOW_END:
160
+ return IntermediateStepCategory.WORKFLOW
161
+ case IntermediateStepType.TASK_START:
162
+ return IntermediateStepCategory.TASK
163
+ case IntermediateStepType.TASK_END:
164
+ return IntermediateStepCategory.TASK
165
+ case IntermediateStepType.FUNCTION_START:
166
+ return IntermediateStepCategory.FUNCTION
167
+ case IntermediateStepType.FUNCTION_END:
168
+ return IntermediateStepCategory.FUNCTION
169
+ case IntermediateStepType.CUSTOM_START:
170
+ return IntermediateStepCategory.CUSTOM
171
+ case IntermediateStepType.CUSTOM_END:
172
+ return IntermediateStepCategory.CUSTOM
173
+ case IntermediateStepType.SPAN_START:
174
+ return IntermediateStepCategory.SPAN
175
+ case IntermediateStepType.SPAN_CHUNK:
176
+ return IntermediateStepCategory.SPAN
177
+ case IntermediateStepType.SPAN_END:
178
+ return IntermediateStepCategory.SPAN
179
+ case _:
180
+ raise ValueError(f"Unknown event type: {self.event_type}")
181
+
182
+ @property
183
+ def event_state(self) -> IntermediateStepState: # pylint: disable=too-many-return-statements
184
+ match self.event_type:
185
+ case IntermediateStepType.LLM_START:
186
+ return IntermediateStepState.START
187
+ case IntermediateStepType.LLM_END:
188
+ return IntermediateStepState.END
189
+ case IntermediateStepType.LLM_NEW_TOKEN:
190
+ return IntermediateStepState.CHUNK
191
+ case IntermediateStepType.TOOL_START:
192
+ return IntermediateStepState.START
193
+ case IntermediateStepType.TOOL_END:
194
+ return IntermediateStepState.END
195
+ case IntermediateStepType.WORKFLOW_START:
196
+ return IntermediateStepState.START
197
+ case IntermediateStepType.WORKFLOW_END:
198
+ return IntermediateStepState.END
199
+ case IntermediateStepType.TASK_START:
200
+ return IntermediateStepState.START
201
+ case IntermediateStepType.TASK_END:
202
+ return IntermediateStepState.END
203
+ case IntermediateStepType.FUNCTION_START:
204
+ return IntermediateStepState.START
205
+ case IntermediateStepType.FUNCTION_END:
206
+ return IntermediateStepState.END
207
+ case IntermediateStepType.CUSTOM_START:
208
+ return IntermediateStepState.START
209
+ case IntermediateStepType.CUSTOM_END:
210
+ return IntermediateStepState.END
211
+ case IntermediateStepType.SPAN_START:
212
+ return IntermediateStepState.START
213
+ case IntermediateStepType.SPAN_CHUNK:
214
+ return IntermediateStepState.CHUNK
215
+ case IntermediateStepType.SPAN_END:
216
+ return IntermediateStepState.END
217
+ case _:
218
+ raise ValueError(f"Unknown event type: {self.event_type}")
219
+
220
+ @model_validator(mode="after")
221
+ def check_span_event_timestamp(self) -> "IntermediateStepPayload":
222
+ if self.event_state != IntermediateStepState.END and self.span_event_timestamp is not None:
223
+ raise ValueError("span_event_timestamp can only be provided for events with an END state")
224
+ return self
225
+
226
+
227
+ class IntermediateStep(BaseModel):
228
+ """
229
+ AIQIntermediateStep is a data model that represents an intermediate step in the AIQ Toolkit. Intermediate steps are
230
+ captured while a request is running and can be used to show progress or to evaluate the path a workflow took to get
231
+ a response.
232
+ """
233
+
234
+ # Allow extra fields in the model_config to support derived models
235
+ model_config = ConfigDict(extra="forbid")
236
+
237
+ parent_id: str
238
+ """
239
+ The parent step ID for the current step. The parent ID is the ID of the last START step which has a different UUID
240
+ than the current step. This value is different from the function_ancestry.parent_id value which tracks the last
241
+ parent FUNCTION step. For the first START step, the parent_id is 'root'.
242
+ """
243
+
244
+ function_ancestry: InvocationNode
245
+ """
246
+ The function ancestry for the current step showing the current AIQ function that was being executed when the step
247
+ was created.
248
+ """
249
+
250
+ payload: IntermediateStepPayload
251
+ """
252
+ The payload for the current step.
253
+ """
254
+
255
+ # ===== Payload Properties =====
256
+ @property
257
+ def event_type(self) -> IntermediateStepType:
258
+ return self.payload.event_type
259
+
260
+ @property
261
+ def event_timestamp(self) -> float:
262
+ return self.payload.event_timestamp
263
+
264
+ @property
265
+ def span_event_timestamp(self) -> float | None:
266
+ return self.payload.span_event_timestamp
267
+
268
+ @property
269
+ def framework(self) -> LLMFrameworkEnum | None:
270
+ return self.payload.framework
271
+
272
+ @property
273
+ def name(self) -> str | None:
274
+ return self.payload.name
275
+
276
+ @property
277
+ def tags(self) -> list[str] | None:
278
+ return self.payload.tags
279
+
280
+ @property
281
+ def metadata(self) -> dict[str, typing.Any] | TraceMetadata | None:
282
+ return self.payload.metadata
283
+
284
+ @property
285
+ def data(self) -> StreamEventData | None:
286
+ return self.payload.data
287
+
288
+ @property
289
+ def usage_info(self) -> UsageInfo | None:
290
+ return self.payload.usage_info
291
+
292
+ @property
293
+ def UUID(self) -> str: # pylint: disable=invalid-name
294
+ return self.payload.UUID
295
+
296
+ @property
297
+ def event_category(self) -> IntermediateStepCategory:
298
+ return self.payload.event_category
299
+
300
+ @property
301
+ def event_state(self) -> IntermediateStepState:
302
+ return self.payload.event_state
@@ -0,0 +1,38 @@
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 BaseModel
17
+
18
+
19
+ class InvocationNode(BaseModel):
20
+ """
21
+ Represents a node in an invocation call graph.
22
+
23
+ The InvocationNode class encapsulates the details of a specific function
24
+ invocation within a call graph. It stores the unique identifier of the
25
+ invocation, the function name, and optional details about the parent
26
+ node (if any). This class is useful for tracing the execution flow
27
+ in a system or application.
28
+
29
+ Attributes:
30
+ function_id (str): Unique identifier for the function invocation.
31
+ function_name (str): Name of the function invoked.
32
+ parent_id (str | None): Unique identifier of the parent invocation, if applicable. Defaults to None.
33
+ parent_name (str | None): Name of the parent function invoked, if applicable. Defaults to None.
34
+ """
35
+ function_id: str
36
+ function_name: str
37
+ parent_id: str | None = None
38
+ parent_name: str | None = None
aiq/data_models/llm.py ADDED
@@ -0,0 +1,27 @@
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 typing
17
+
18
+ from .common import BaseModelRegistryTag
19
+ from .common import TypedBaseModel
20
+
21
+
22
+ class LLMBaseConfig(TypedBaseModel, BaseModelRegistryTag):
23
+ """Base configuration for LLM providers."""
24
+ pass
25
+
26
+
27
+ LLMBaseConfigT = typing.TypeVar("LLMBaseConfigT", bound=LLMBaseConfig)
@@ -0,0 +1,26 @@
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 typing
17
+
18
+ from .common import BaseModelRegistryTag
19
+ from .common import TypedBaseModel
20
+
21
+
22
+ class LoggingBaseConfig(TypedBaseModel, BaseModelRegistryTag):
23
+ pass
24
+
25
+
26
+ LoggingMethodConfigT = typing.TypeVar("LoggingMethodConfigT", bound=LoggingBaseConfig)
@@ -0,0 +1,27 @@
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 typing
17
+
18
+ from .common import BaseModelRegistryTag
19
+ from .common import TypedBaseModel
20
+
21
+
22
+ class MemoryBaseConfig(TypedBaseModel, BaseModelRegistryTag):
23
+ """ The base level config object for a memory object. Memories provide an interface for storing and retrieving. """
24
+ pass
25
+
26
+
27
+ MemoryBaseConfigT = typing.TypeVar("MemoryBaseConfigT", bound=MemoryBaseConfig)