nvidia-nat 1.1.0a20251020__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (480) hide show
  1. aiq/__init__.py +66 -0
  2. nat/agent/__init__.py +0 -0
  3. nat/agent/base.py +265 -0
  4. nat/agent/dual_node.py +72 -0
  5. nat/agent/prompt_optimizer/__init__.py +0 -0
  6. nat/agent/prompt_optimizer/prompt.py +68 -0
  7. nat/agent/prompt_optimizer/register.py +149 -0
  8. nat/agent/react_agent/__init__.py +0 -0
  9. nat/agent/react_agent/agent.py +394 -0
  10. nat/agent/react_agent/output_parser.py +104 -0
  11. nat/agent/react_agent/prompt.py +44 -0
  12. nat/agent/react_agent/register.py +168 -0
  13. nat/agent/reasoning_agent/__init__.py +0 -0
  14. nat/agent/reasoning_agent/reasoning_agent.py +227 -0
  15. nat/agent/register.py +23 -0
  16. nat/agent/rewoo_agent/__init__.py +0 -0
  17. nat/agent/rewoo_agent/agent.py +593 -0
  18. nat/agent/rewoo_agent/prompt.py +107 -0
  19. nat/agent/rewoo_agent/register.py +175 -0
  20. nat/agent/tool_calling_agent/__init__.py +0 -0
  21. nat/agent/tool_calling_agent/agent.py +246 -0
  22. nat/agent/tool_calling_agent/register.py +129 -0
  23. nat/authentication/__init__.py +14 -0
  24. nat/authentication/api_key/__init__.py +14 -0
  25. nat/authentication/api_key/api_key_auth_provider.py +96 -0
  26. nat/authentication/api_key/api_key_auth_provider_config.py +124 -0
  27. nat/authentication/api_key/register.py +26 -0
  28. nat/authentication/credential_validator/__init__.py +14 -0
  29. nat/authentication/credential_validator/bearer_token_validator.py +557 -0
  30. nat/authentication/exceptions/__init__.py +14 -0
  31. nat/authentication/exceptions/api_key_exceptions.py +38 -0
  32. nat/authentication/http_basic_auth/__init__.py +0 -0
  33. nat/authentication/http_basic_auth/http_basic_auth_provider.py +81 -0
  34. nat/authentication/http_basic_auth/register.py +30 -0
  35. nat/authentication/interfaces.py +96 -0
  36. nat/authentication/oauth2/__init__.py +14 -0
  37. nat/authentication/oauth2/oauth2_auth_code_flow_provider.py +140 -0
  38. nat/authentication/oauth2/oauth2_auth_code_flow_provider_config.py +39 -0
  39. nat/authentication/oauth2/oauth2_resource_server_config.py +124 -0
  40. nat/authentication/oauth2/register.py +25 -0
  41. nat/authentication/register.py +20 -0
  42. nat/builder/__init__.py +0 -0
  43. nat/builder/builder.py +317 -0
  44. nat/builder/component_utils.py +320 -0
  45. nat/builder/context.py +321 -0
  46. nat/builder/embedder.py +24 -0
  47. nat/builder/eval_builder.py +166 -0
  48. nat/builder/evaluator.py +29 -0
  49. nat/builder/framework_enum.py +25 -0
  50. nat/builder/front_end.py +73 -0
  51. nat/builder/function.py +714 -0
  52. nat/builder/function_base.py +380 -0
  53. nat/builder/function_info.py +625 -0
  54. nat/builder/intermediate_step_manager.py +206 -0
  55. nat/builder/llm.py +25 -0
  56. nat/builder/retriever.py +25 -0
  57. nat/builder/user_interaction_manager.py +78 -0
  58. nat/builder/workflow.py +160 -0
  59. nat/builder/workflow_builder.py +1365 -0
  60. nat/cli/__init__.py +14 -0
  61. nat/cli/cli_utils/__init__.py +0 -0
  62. nat/cli/cli_utils/config_override.py +231 -0
  63. nat/cli/cli_utils/validation.py +37 -0
  64. nat/cli/commands/__init__.py +0 -0
  65. nat/cli/commands/configure/__init__.py +0 -0
  66. nat/cli/commands/configure/channel/__init__.py +0 -0
  67. nat/cli/commands/configure/channel/add.py +28 -0
  68. nat/cli/commands/configure/channel/channel.py +34 -0
  69. nat/cli/commands/configure/channel/remove.py +30 -0
  70. nat/cli/commands/configure/channel/update.py +30 -0
  71. nat/cli/commands/configure/configure.py +33 -0
  72. nat/cli/commands/evaluate.py +139 -0
  73. nat/cli/commands/info/__init__.py +14 -0
  74. nat/cli/commands/info/info.py +47 -0
  75. nat/cli/commands/info/list_channels.py +32 -0
  76. nat/cli/commands/info/list_components.py +128 -0
  77. nat/cli/commands/mcp/__init__.py +14 -0
  78. nat/cli/commands/mcp/mcp.py +986 -0
  79. nat/cli/commands/object_store/__init__.py +14 -0
  80. nat/cli/commands/object_store/object_store.py +227 -0
  81. nat/cli/commands/optimize.py +90 -0
  82. nat/cli/commands/registry/__init__.py +14 -0
  83. nat/cli/commands/registry/publish.py +88 -0
  84. nat/cli/commands/registry/pull.py +118 -0
  85. nat/cli/commands/registry/registry.py +36 -0
  86. nat/cli/commands/registry/remove.py +108 -0
  87. nat/cli/commands/registry/search.py +153 -0
  88. nat/cli/commands/sizing/__init__.py +14 -0
  89. nat/cli/commands/sizing/calc.py +297 -0
  90. nat/cli/commands/sizing/sizing.py +27 -0
  91. nat/cli/commands/start.py +257 -0
  92. nat/cli/commands/uninstall.py +81 -0
  93. nat/cli/commands/validate.py +47 -0
  94. nat/cli/commands/workflow/__init__.py +14 -0
  95. nat/cli/commands/workflow/templates/__init__.py.j2 +0 -0
  96. nat/cli/commands/workflow/templates/config.yml.j2 +17 -0
  97. nat/cli/commands/workflow/templates/pyproject.toml.j2 +25 -0
  98. nat/cli/commands/workflow/templates/register.py.j2 +4 -0
  99. nat/cli/commands/workflow/templates/workflow.py.j2 +50 -0
  100. nat/cli/commands/workflow/workflow.py +37 -0
  101. nat/cli/commands/workflow/workflow_commands.py +403 -0
  102. nat/cli/entrypoint.py +141 -0
  103. nat/cli/main.py +60 -0
  104. nat/cli/register_workflow.py +522 -0
  105. nat/cli/type_registry.py +1069 -0
  106. nat/control_flow/__init__.py +0 -0
  107. nat/control_flow/register.py +20 -0
  108. nat/control_flow/router_agent/__init__.py +0 -0
  109. nat/control_flow/router_agent/agent.py +329 -0
  110. nat/control_flow/router_agent/prompt.py +48 -0
  111. nat/control_flow/router_agent/register.py +91 -0
  112. nat/control_flow/sequential_executor.py +166 -0
  113. nat/data_models/__init__.py +14 -0
  114. nat/data_models/agent.py +34 -0
  115. nat/data_models/api_server.py +843 -0
  116. nat/data_models/authentication.py +245 -0
  117. nat/data_models/common.py +171 -0
  118. nat/data_models/component.py +60 -0
  119. nat/data_models/component_ref.py +179 -0
  120. nat/data_models/config.py +434 -0
  121. nat/data_models/dataset_handler.py +169 -0
  122. nat/data_models/discovery_metadata.py +305 -0
  123. nat/data_models/embedder.py +27 -0
  124. nat/data_models/evaluate.py +130 -0
  125. nat/data_models/evaluator.py +26 -0
  126. nat/data_models/front_end.py +26 -0
  127. nat/data_models/function.py +64 -0
  128. nat/data_models/function_dependencies.py +80 -0
  129. nat/data_models/gated_field_mixin.py +242 -0
  130. nat/data_models/interactive.py +246 -0
  131. nat/data_models/intermediate_step.py +302 -0
  132. nat/data_models/invocation_node.py +38 -0
  133. nat/data_models/llm.py +27 -0
  134. nat/data_models/logging.py +26 -0
  135. nat/data_models/memory.py +27 -0
  136. nat/data_models/object_store.py +44 -0
  137. nat/data_models/optimizable.py +119 -0
  138. nat/data_models/optimizer.py +149 -0
  139. nat/data_models/profiler.py +54 -0
  140. nat/data_models/registry_handler.py +26 -0
  141. nat/data_models/retriever.py +30 -0
  142. nat/data_models/retry_mixin.py +35 -0
  143. nat/data_models/span.py +228 -0
  144. nat/data_models/step_adaptor.py +64 -0
  145. nat/data_models/streaming.py +33 -0
  146. nat/data_models/swe_bench_model.py +54 -0
  147. nat/data_models/telemetry_exporter.py +26 -0
  148. nat/data_models/temperature_mixin.py +44 -0
  149. nat/data_models/thinking_mixin.py +86 -0
  150. nat/data_models/top_p_mixin.py +44 -0
  151. nat/data_models/ttc_strategy.py +30 -0
  152. nat/embedder/__init__.py +0 -0
  153. nat/embedder/azure_openai_embedder.py +46 -0
  154. nat/embedder/nim_embedder.py +59 -0
  155. nat/embedder/openai_embedder.py +42 -0
  156. nat/embedder/register.py +22 -0
  157. nat/eval/__init__.py +14 -0
  158. nat/eval/config.py +62 -0
  159. nat/eval/dataset_handler/__init__.py +0 -0
  160. nat/eval/dataset_handler/dataset_downloader.py +106 -0
  161. nat/eval/dataset_handler/dataset_filter.py +52 -0
  162. nat/eval/dataset_handler/dataset_handler.py +431 -0
  163. nat/eval/evaluate.py +565 -0
  164. nat/eval/evaluator/__init__.py +14 -0
  165. nat/eval/evaluator/base_evaluator.py +77 -0
  166. nat/eval/evaluator/evaluator_model.py +58 -0
  167. nat/eval/intermediate_step_adapter.py +99 -0
  168. nat/eval/rag_evaluator/__init__.py +0 -0
  169. nat/eval/rag_evaluator/evaluate.py +178 -0
  170. nat/eval/rag_evaluator/register.py +143 -0
  171. nat/eval/register.py +26 -0
  172. nat/eval/remote_workflow.py +133 -0
  173. nat/eval/runners/__init__.py +14 -0
  174. nat/eval/runners/config.py +39 -0
  175. nat/eval/runners/multi_eval_runner.py +54 -0
  176. nat/eval/runtime_evaluator/__init__.py +14 -0
  177. nat/eval/runtime_evaluator/evaluate.py +123 -0
  178. nat/eval/runtime_evaluator/register.py +100 -0
  179. nat/eval/runtime_event_subscriber.py +52 -0
  180. nat/eval/swe_bench_evaluator/__init__.py +0 -0
  181. nat/eval/swe_bench_evaluator/evaluate.py +215 -0
  182. nat/eval/swe_bench_evaluator/register.py +36 -0
  183. nat/eval/trajectory_evaluator/__init__.py +0 -0
  184. nat/eval/trajectory_evaluator/evaluate.py +75 -0
  185. nat/eval/trajectory_evaluator/register.py +40 -0
  186. nat/eval/tunable_rag_evaluator/__init__.py +0 -0
  187. nat/eval/tunable_rag_evaluator/evaluate.py +242 -0
  188. nat/eval/tunable_rag_evaluator/register.py +52 -0
  189. nat/eval/usage_stats.py +41 -0
  190. nat/eval/utils/__init__.py +0 -0
  191. nat/eval/utils/eval_trace_ctx.py +89 -0
  192. nat/eval/utils/output_uploader.py +140 -0
  193. nat/eval/utils/tqdm_position_registry.py +40 -0
  194. nat/eval/utils/weave_eval.py +193 -0
  195. nat/experimental/__init__.py +0 -0
  196. nat/experimental/decorators/__init__.py +0 -0
  197. nat/experimental/decorators/experimental_warning_decorator.py +154 -0
  198. nat/experimental/test_time_compute/__init__.py +0 -0
  199. nat/experimental/test_time_compute/editing/__init__.py +0 -0
  200. nat/experimental/test_time_compute/editing/iterative_plan_refinement_editor.py +147 -0
  201. nat/experimental/test_time_compute/editing/llm_as_a_judge_editor.py +204 -0
  202. nat/experimental/test_time_compute/editing/motivation_aware_summarization.py +107 -0
  203. nat/experimental/test_time_compute/functions/__init__.py +0 -0
  204. nat/experimental/test_time_compute/functions/execute_score_select_function.py +105 -0
  205. nat/experimental/test_time_compute/functions/plan_select_execute_function.py +228 -0
  206. nat/experimental/test_time_compute/functions/ttc_tool_orchestration_function.py +205 -0
  207. nat/experimental/test_time_compute/functions/ttc_tool_wrapper_function.py +146 -0
  208. nat/experimental/test_time_compute/models/__init__.py +0 -0
  209. nat/experimental/test_time_compute/models/editor_config.py +132 -0
  210. nat/experimental/test_time_compute/models/scoring_config.py +112 -0
  211. nat/experimental/test_time_compute/models/search_config.py +120 -0
  212. nat/experimental/test_time_compute/models/selection_config.py +154 -0
  213. nat/experimental/test_time_compute/models/stage_enums.py +43 -0
  214. nat/experimental/test_time_compute/models/strategy_base.py +67 -0
  215. nat/experimental/test_time_compute/models/tool_use_config.py +41 -0
  216. nat/experimental/test_time_compute/models/ttc_item.py +48 -0
  217. nat/experimental/test_time_compute/register.py +35 -0
  218. nat/experimental/test_time_compute/scoring/__init__.py +0 -0
  219. nat/experimental/test_time_compute/scoring/llm_based_agent_scorer.py +168 -0
  220. nat/experimental/test_time_compute/scoring/llm_based_plan_scorer.py +168 -0
  221. nat/experimental/test_time_compute/scoring/motivation_aware_scorer.py +111 -0
  222. nat/experimental/test_time_compute/search/__init__.py +0 -0
  223. nat/experimental/test_time_compute/search/multi_llm_planner.py +128 -0
  224. nat/experimental/test_time_compute/search/multi_query_retrieval_search.py +122 -0
  225. nat/experimental/test_time_compute/search/single_shot_multi_plan_planner.py +128 -0
  226. nat/experimental/test_time_compute/selection/__init__.py +0 -0
  227. nat/experimental/test_time_compute/selection/best_of_n_selector.py +63 -0
  228. nat/experimental/test_time_compute/selection/llm_based_agent_output_selector.py +131 -0
  229. nat/experimental/test_time_compute/selection/llm_based_output_merging_selector.py +157 -0
  230. nat/experimental/test_time_compute/selection/llm_based_plan_selector.py +128 -0
  231. nat/experimental/test_time_compute/selection/threshold_selector.py +58 -0
  232. nat/front_ends/__init__.py +14 -0
  233. nat/front_ends/console/__init__.py +14 -0
  234. nat/front_ends/console/authentication_flow_handler.py +285 -0
  235. nat/front_ends/console/console_front_end_config.py +32 -0
  236. nat/front_ends/console/console_front_end_plugin.py +108 -0
  237. nat/front_ends/console/register.py +25 -0
  238. nat/front_ends/cron/__init__.py +14 -0
  239. nat/front_ends/fastapi/__init__.py +14 -0
  240. nat/front_ends/fastapi/auth_flow_handlers/__init__.py +0 -0
  241. nat/front_ends/fastapi/auth_flow_handlers/http_flow_handler.py +27 -0
  242. nat/front_ends/fastapi/auth_flow_handlers/websocket_flow_handler.py +142 -0
  243. nat/front_ends/fastapi/dask_client_mixin.py +65 -0
  244. nat/front_ends/fastapi/fastapi_front_end_config.py +272 -0
  245. nat/front_ends/fastapi/fastapi_front_end_controller.py +68 -0
  246. nat/front_ends/fastapi/fastapi_front_end_plugin.py +247 -0
  247. nat/front_ends/fastapi/fastapi_front_end_plugin_worker.py +1257 -0
  248. nat/front_ends/fastapi/html_snippets/__init__.py +14 -0
  249. nat/front_ends/fastapi/html_snippets/auth_code_grant_success.py +35 -0
  250. nat/front_ends/fastapi/intermediate_steps_subscriber.py +80 -0
  251. nat/front_ends/fastapi/job_store.py +602 -0
  252. nat/front_ends/fastapi/main.py +64 -0
  253. nat/front_ends/fastapi/message_handler.py +344 -0
  254. nat/front_ends/fastapi/message_validator.py +351 -0
  255. nat/front_ends/fastapi/register.py +25 -0
  256. nat/front_ends/fastapi/response_helpers.py +195 -0
  257. nat/front_ends/fastapi/step_adaptor.py +319 -0
  258. nat/front_ends/fastapi/utils.py +57 -0
  259. nat/front_ends/mcp/__init__.py +14 -0
  260. nat/front_ends/mcp/introspection_token_verifier.py +73 -0
  261. nat/front_ends/mcp/mcp_front_end_config.py +90 -0
  262. nat/front_ends/mcp/mcp_front_end_plugin.py +113 -0
  263. nat/front_ends/mcp/mcp_front_end_plugin_worker.py +268 -0
  264. nat/front_ends/mcp/memory_profiler.py +320 -0
  265. nat/front_ends/mcp/register.py +27 -0
  266. nat/front_ends/mcp/tool_converter.py +290 -0
  267. nat/front_ends/register.py +21 -0
  268. nat/front_ends/simple_base/__init__.py +14 -0
  269. nat/front_ends/simple_base/simple_front_end_plugin_base.py +56 -0
  270. nat/llm/__init__.py +0 -0
  271. nat/llm/aws_bedrock_llm.py +69 -0
  272. nat/llm/azure_openai_llm.py +57 -0
  273. nat/llm/litellm_llm.py +69 -0
  274. nat/llm/nim_llm.py +58 -0
  275. nat/llm/openai_llm.py +54 -0
  276. nat/llm/register.py +27 -0
  277. nat/llm/utils/__init__.py +14 -0
  278. nat/llm/utils/env_config_value.py +93 -0
  279. nat/llm/utils/error.py +17 -0
  280. nat/llm/utils/thinking.py +215 -0
  281. nat/memory/__init__.py +20 -0
  282. nat/memory/interfaces.py +183 -0
  283. nat/memory/models.py +112 -0
  284. nat/meta/pypi.md +58 -0
  285. nat/object_store/__init__.py +20 -0
  286. nat/object_store/in_memory_object_store.py +76 -0
  287. nat/object_store/interfaces.py +84 -0
  288. nat/object_store/models.py +38 -0
  289. nat/object_store/register.py +19 -0
  290. nat/observability/__init__.py +14 -0
  291. nat/observability/exporter/__init__.py +14 -0
  292. nat/observability/exporter/base_exporter.py +449 -0
  293. nat/observability/exporter/exporter.py +78 -0
  294. nat/observability/exporter/file_exporter.py +33 -0
  295. nat/observability/exporter/processing_exporter.py +550 -0
  296. nat/observability/exporter/raw_exporter.py +52 -0
  297. nat/observability/exporter/span_exporter.py +308 -0
  298. nat/observability/exporter_manager.py +335 -0
  299. nat/observability/mixin/__init__.py +14 -0
  300. nat/observability/mixin/batch_config_mixin.py +26 -0
  301. nat/observability/mixin/collector_config_mixin.py +23 -0
  302. nat/observability/mixin/file_mixin.py +288 -0
  303. nat/observability/mixin/file_mode.py +23 -0
  304. nat/observability/mixin/redaction_config_mixin.py +42 -0
  305. nat/observability/mixin/resource_conflict_mixin.py +134 -0
  306. nat/observability/mixin/serialize_mixin.py +61 -0
  307. nat/observability/mixin/tagging_config_mixin.py +62 -0
  308. nat/observability/mixin/type_introspection_mixin.py +496 -0
  309. nat/observability/processor/__init__.py +14 -0
  310. nat/observability/processor/batching_processor.py +308 -0
  311. nat/observability/processor/callback_processor.py +42 -0
  312. nat/observability/processor/falsy_batch_filter_processor.py +55 -0
  313. nat/observability/processor/intermediate_step_serializer.py +28 -0
  314. nat/observability/processor/processor.py +74 -0
  315. nat/observability/processor/processor_factory.py +70 -0
  316. nat/observability/processor/redaction/__init__.py +24 -0
  317. nat/observability/processor/redaction/contextual_redaction_processor.py +125 -0
  318. nat/observability/processor/redaction/contextual_span_redaction_processor.py +66 -0
  319. nat/observability/processor/redaction/redaction_processor.py +177 -0
  320. nat/observability/processor/redaction/span_header_redaction_processor.py +92 -0
  321. nat/observability/processor/span_tagging_processor.py +68 -0
  322. nat/observability/register.py +114 -0
  323. nat/observability/utils/__init__.py +14 -0
  324. nat/observability/utils/dict_utils.py +236 -0
  325. nat/observability/utils/time_utils.py +31 -0
  326. nat/plugins/.namespace +1 -0
  327. nat/profiler/__init__.py +0 -0
  328. nat/profiler/calc/__init__.py +14 -0
  329. nat/profiler/calc/calc_runner.py +626 -0
  330. nat/profiler/calc/calculations.py +288 -0
  331. nat/profiler/calc/data_models.py +188 -0
  332. nat/profiler/calc/plot.py +345 -0
  333. nat/profiler/callbacks/__init__.py +0 -0
  334. nat/profiler/callbacks/agno_callback_handler.py +295 -0
  335. nat/profiler/callbacks/base_callback_class.py +20 -0
  336. nat/profiler/callbacks/langchain_callback_handler.py +297 -0
  337. nat/profiler/callbacks/llama_index_callback_handler.py +205 -0
  338. nat/profiler/callbacks/semantic_kernel_callback_handler.py +238 -0
  339. nat/profiler/callbacks/token_usage_base_model.py +27 -0
  340. nat/profiler/data_frame_row.py +51 -0
  341. nat/profiler/data_models.py +24 -0
  342. nat/profiler/decorators/__init__.py +0 -0
  343. nat/profiler/decorators/framework_wrapper.py +180 -0
  344. nat/profiler/decorators/function_tracking.py +411 -0
  345. nat/profiler/forecasting/__init__.py +0 -0
  346. nat/profiler/forecasting/config.py +18 -0
  347. nat/profiler/forecasting/model_trainer.py +75 -0
  348. nat/profiler/forecasting/models/__init__.py +22 -0
  349. nat/profiler/forecasting/models/forecasting_base_model.py +42 -0
  350. nat/profiler/forecasting/models/linear_model.py +197 -0
  351. nat/profiler/forecasting/models/random_forest_regressor.py +269 -0
  352. nat/profiler/inference_metrics_model.py +28 -0
  353. nat/profiler/inference_optimization/__init__.py +0 -0
  354. nat/profiler/inference_optimization/bottleneck_analysis/__init__.py +0 -0
  355. nat/profiler/inference_optimization/bottleneck_analysis/nested_stack_analysis.py +460 -0
  356. nat/profiler/inference_optimization/bottleneck_analysis/simple_stack_analysis.py +258 -0
  357. nat/profiler/inference_optimization/data_models.py +386 -0
  358. nat/profiler/inference_optimization/experimental/__init__.py +0 -0
  359. nat/profiler/inference_optimization/experimental/concurrency_spike_analysis.py +468 -0
  360. nat/profiler/inference_optimization/experimental/prefix_span_analysis.py +404 -0
  361. nat/profiler/inference_optimization/llm_metrics.py +212 -0
  362. nat/profiler/inference_optimization/prompt_caching.py +163 -0
  363. nat/profiler/inference_optimization/token_uniqueness.py +107 -0
  364. nat/profiler/inference_optimization/workflow_runtimes.py +72 -0
  365. nat/profiler/intermediate_property_adapter.py +102 -0
  366. nat/profiler/parameter_optimization/__init__.py +0 -0
  367. nat/profiler/parameter_optimization/optimizable_utils.py +93 -0
  368. nat/profiler/parameter_optimization/optimizer_runtime.py +67 -0
  369. nat/profiler/parameter_optimization/parameter_optimizer.py +153 -0
  370. nat/profiler/parameter_optimization/parameter_selection.py +107 -0
  371. nat/profiler/parameter_optimization/pareto_visualizer.py +380 -0
  372. nat/profiler/parameter_optimization/prompt_optimizer.py +384 -0
  373. nat/profiler/parameter_optimization/update_helpers.py +66 -0
  374. nat/profiler/profile_runner.py +478 -0
  375. nat/profiler/utils.py +186 -0
  376. nat/registry_handlers/__init__.py +0 -0
  377. nat/registry_handlers/local/__init__.py +0 -0
  378. nat/registry_handlers/local/local_handler.py +176 -0
  379. nat/registry_handlers/local/register_local.py +37 -0
  380. nat/registry_handlers/metadata_factory.py +60 -0
  381. nat/registry_handlers/package_utils.py +570 -0
  382. nat/registry_handlers/pypi/__init__.py +0 -0
  383. nat/registry_handlers/pypi/pypi_handler.py +248 -0
  384. nat/registry_handlers/pypi/register_pypi.py +40 -0
  385. nat/registry_handlers/register.py +20 -0
  386. nat/registry_handlers/registry_handler_base.py +157 -0
  387. nat/registry_handlers/rest/__init__.py +0 -0
  388. nat/registry_handlers/rest/register_rest.py +56 -0
  389. nat/registry_handlers/rest/rest_handler.py +236 -0
  390. nat/registry_handlers/schemas/__init__.py +0 -0
  391. nat/registry_handlers/schemas/headers.py +42 -0
  392. nat/registry_handlers/schemas/package.py +68 -0
  393. nat/registry_handlers/schemas/publish.py +68 -0
  394. nat/registry_handlers/schemas/pull.py +82 -0
  395. nat/registry_handlers/schemas/remove.py +36 -0
  396. nat/registry_handlers/schemas/search.py +91 -0
  397. nat/registry_handlers/schemas/status.py +47 -0
  398. nat/retriever/__init__.py +0 -0
  399. nat/retriever/interface.py +41 -0
  400. nat/retriever/milvus/__init__.py +14 -0
  401. nat/retriever/milvus/register.py +81 -0
  402. nat/retriever/milvus/retriever.py +228 -0
  403. nat/retriever/models.py +77 -0
  404. nat/retriever/nemo_retriever/__init__.py +14 -0
  405. nat/retriever/nemo_retriever/register.py +60 -0
  406. nat/retriever/nemo_retriever/retriever.py +190 -0
  407. nat/retriever/register.py +21 -0
  408. nat/runtime/__init__.py +14 -0
  409. nat/runtime/loader.py +220 -0
  410. nat/runtime/runner.py +292 -0
  411. nat/runtime/session.py +223 -0
  412. nat/runtime/user_metadata.py +130 -0
  413. nat/settings/__init__.py +0 -0
  414. nat/settings/global_settings.py +329 -0
  415. nat/test/.namespace +1 -0
  416. nat/tool/__init__.py +0 -0
  417. nat/tool/chat_completion.py +77 -0
  418. nat/tool/code_execution/README.md +151 -0
  419. nat/tool/code_execution/__init__.py +0 -0
  420. nat/tool/code_execution/code_sandbox.py +267 -0
  421. nat/tool/code_execution/local_sandbox/.gitignore +1 -0
  422. nat/tool/code_execution/local_sandbox/Dockerfile.sandbox +60 -0
  423. nat/tool/code_execution/local_sandbox/__init__.py +13 -0
  424. nat/tool/code_execution/local_sandbox/local_sandbox_server.py +198 -0
  425. nat/tool/code_execution/local_sandbox/sandbox.requirements.txt +6 -0
  426. nat/tool/code_execution/local_sandbox/start_local_sandbox.sh +50 -0
  427. nat/tool/code_execution/register.py +74 -0
  428. nat/tool/code_execution/test_code_execution_sandbox.py +414 -0
  429. nat/tool/code_execution/utils.py +100 -0
  430. nat/tool/datetime_tools.py +82 -0
  431. nat/tool/document_search.py +141 -0
  432. nat/tool/github_tools.py +450 -0
  433. nat/tool/memory_tools/__init__.py +0 -0
  434. nat/tool/memory_tools/add_memory_tool.py +79 -0
  435. nat/tool/memory_tools/delete_memory_tool.py +66 -0
  436. nat/tool/memory_tools/get_memory_tool.py +72 -0
  437. nat/tool/nvidia_rag.py +95 -0
  438. nat/tool/register.py +31 -0
  439. nat/tool/retriever.py +95 -0
  440. nat/tool/server_tools.py +66 -0
  441. nat/utils/__init__.py +0 -0
  442. nat/utils/callable_utils.py +70 -0
  443. nat/utils/data_models/__init__.py +0 -0
  444. nat/utils/data_models/schema_validator.py +58 -0
  445. nat/utils/debugging_utils.py +43 -0
  446. nat/utils/decorators.py +210 -0
  447. nat/utils/dump_distro_mapping.py +32 -0
  448. nat/utils/exception_handlers/__init__.py +0 -0
  449. nat/utils/exception_handlers/automatic_retries.py +342 -0
  450. nat/utils/exception_handlers/schemas.py +114 -0
  451. nat/utils/io/__init__.py +0 -0
  452. nat/utils/io/model_processing.py +28 -0
  453. nat/utils/io/yaml_tools.py +119 -0
  454. nat/utils/log_levels.py +25 -0
  455. nat/utils/log_utils.py +37 -0
  456. nat/utils/metadata_utils.py +74 -0
  457. nat/utils/optional_imports.py +142 -0
  458. nat/utils/producer_consumer_queue.py +178 -0
  459. nat/utils/reactive/__init__.py +0 -0
  460. nat/utils/reactive/base/__init__.py +0 -0
  461. nat/utils/reactive/base/observable_base.py +65 -0
  462. nat/utils/reactive/base/observer_base.py +55 -0
  463. nat/utils/reactive/base/subject_base.py +79 -0
  464. nat/utils/reactive/observable.py +59 -0
  465. nat/utils/reactive/observer.py +76 -0
  466. nat/utils/reactive/subject.py +131 -0
  467. nat/utils/reactive/subscription.py +49 -0
  468. nat/utils/settings/__init__.py +0 -0
  469. nat/utils/settings/global_settings.py +195 -0
  470. nat/utils/string_utils.py +38 -0
  471. nat/utils/type_converter.py +299 -0
  472. nat/utils/type_utils.py +488 -0
  473. nat/utils/url_utils.py +27 -0
  474. nvidia_nat-1.1.0a20251020.dist-info/METADATA +195 -0
  475. nvidia_nat-1.1.0a20251020.dist-info/RECORD +480 -0
  476. nvidia_nat-1.1.0a20251020.dist-info/WHEEL +5 -0
  477. nvidia_nat-1.1.0a20251020.dist-info/entry_points.txt +22 -0
  478. nvidia_nat-1.1.0a20251020.dist-info/licenses/LICENSE-3rd-party.txt +5478 -0
  479. nvidia_nat-1.1.0a20251020.dist-info/licenses/LICENSE.md +201 -0
  480. nvidia_nat-1.1.0a20251020.dist-info/top_level.txt +2 -0
nat/builder/builder.py ADDED
@@ -0,0 +1,317 @@
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 asyncio
17
+ import typing
18
+ from abc import ABC
19
+ from abc import abstractmethod
20
+ from collections.abc import Sequence
21
+ from pathlib import Path
22
+
23
+ from nat.authentication.interfaces import AuthProviderBase
24
+ from nat.builder.context import Context
25
+ from nat.builder.framework_enum import LLMFrameworkEnum
26
+ from nat.builder.function import Function
27
+ from nat.builder.function import FunctionGroup
28
+ from nat.data_models.authentication import AuthProviderBaseConfig
29
+ from nat.data_models.component_ref import AuthenticationRef
30
+ from nat.data_models.component_ref import EmbedderRef
31
+ from nat.data_models.component_ref import FunctionGroupRef
32
+ from nat.data_models.component_ref import FunctionRef
33
+ from nat.data_models.component_ref import LLMRef
34
+ from nat.data_models.component_ref import MemoryRef
35
+ from nat.data_models.component_ref import ObjectStoreRef
36
+ from nat.data_models.component_ref import RetrieverRef
37
+ from nat.data_models.component_ref import TTCStrategyRef
38
+ from nat.data_models.embedder import EmbedderBaseConfig
39
+ from nat.data_models.evaluator import EvaluatorBaseConfig
40
+ from nat.data_models.function import FunctionBaseConfig
41
+ from nat.data_models.function import FunctionGroupBaseConfig
42
+ from nat.data_models.function_dependencies import FunctionDependencies
43
+ from nat.data_models.llm import LLMBaseConfig
44
+ from nat.data_models.memory import MemoryBaseConfig
45
+ from nat.data_models.object_store import ObjectStoreBaseConfig
46
+ from nat.data_models.retriever import RetrieverBaseConfig
47
+ from nat.data_models.ttc_strategy import TTCStrategyBaseConfig
48
+ from nat.experimental.decorators.experimental_warning_decorator import experimental
49
+ from nat.experimental.test_time_compute.models.stage_enums import PipelineTypeEnum
50
+ from nat.experimental.test_time_compute.models.stage_enums import StageTypeEnum
51
+ from nat.memory.interfaces import MemoryEditor
52
+ from nat.object_store.interfaces import ObjectStore
53
+ from nat.retriever.interface import Retriever
54
+
55
+ if typing.TYPE_CHECKING:
56
+ from nat.experimental.test_time_compute.models.strategy_base import StrategyBase
57
+
58
+
59
+ class UserManagerHolder:
60
+
61
+ def __init__(self, context: Context) -> None:
62
+ self._context = context
63
+
64
+ def get_id(self):
65
+ return self._context.user_manager.get_id()
66
+
67
+
68
+ class Builder(ABC):
69
+
70
+ @abstractmethod
71
+ async def add_function(self, name: str | FunctionRef, config: FunctionBaseConfig) -> Function:
72
+ pass
73
+
74
+ @abstractmethod
75
+ async def add_function_group(self, name: str | FunctionGroupRef, config: FunctionGroupBaseConfig) -> FunctionGroup:
76
+ pass
77
+
78
+ @abstractmethod
79
+ async def get_function(self, name: str | FunctionRef) -> Function:
80
+ pass
81
+
82
+ @abstractmethod
83
+ async def get_function_group(self, name: str | FunctionGroupRef) -> FunctionGroup:
84
+ pass
85
+
86
+ async def get_functions(self, function_names: Sequence[str | FunctionRef]) -> list[Function]:
87
+ tasks = [self.get_function(name) for name in function_names]
88
+ return list(await asyncio.gather(*tasks, return_exceptions=False))
89
+
90
+ async def get_function_groups(self, function_group_names: Sequence[str | FunctionGroupRef]) -> list[FunctionGroup]:
91
+ tasks = [self.get_function_group(name) for name in function_group_names]
92
+ return list(await asyncio.gather(*tasks, return_exceptions=False))
93
+
94
+ @abstractmethod
95
+ def get_function_config(self, name: str | FunctionRef) -> FunctionBaseConfig:
96
+ pass
97
+
98
+ @abstractmethod
99
+ def get_function_group_config(self, name: str | FunctionGroupRef) -> FunctionGroupBaseConfig:
100
+ pass
101
+
102
+ @abstractmethod
103
+ async def set_workflow(self, config: FunctionBaseConfig) -> Function:
104
+ pass
105
+
106
+ @abstractmethod
107
+ def get_workflow(self) -> Function:
108
+ pass
109
+
110
+ @abstractmethod
111
+ def get_workflow_config(self) -> FunctionBaseConfig:
112
+ pass
113
+
114
+ @abstractmethod
115
+ async def get_tools(self,
116
+ tool_names: Sequence[str | FunctionRef | FunctionGroupRef],
117
+ wrapper_type: LLMFrameworkEnum | str) -> list[typing.Any]:
118
+ pass
119
+
120
+ @abstractmethod
121
+ async def get_tool(self, fn_name: str | FunctionRef, wrapper_type: LLMFrameworkEnum | str) -> typing.Any:
122
+ pass
123
+
124
+ @abstractmethod
125
+ async def add_llm(self, name: str | LLMRef, config: LLMBaseConfig) -> typing.Any:
126
+ pass
127
+
128
+ @abstractmethod
129
+ async def get_llm(self, llm_name: str | LLMRef, wrapper_type: LLMFrameworkEnum | str) -> typing.Any:
130
+ pass
131
+
132
+ async def get_llms(self, llm_names: Sequence[str | LLMRef],
133
+ wrapper_type: LLMFrameworkEnum | str) -> list[typing.Any]:
134
+
135
+ coros = [self.get_llm(llm_name=n, wrapper_type=wrapper_type) for n in llm_names]
136
+
137
+ llms = await asyncio.gather(*coros, return_exceptions=False)
138
+
139
+ return list(llms)
140
+
141
+ @abstractmethod
142
+ def get_llm_config(self, llm_name: str | LLMRef) -> LLMBaseConfig:
143
+ pass
144
+
145
+ @abstractmethod
146
+ @experimental(feature_name="Authentication")
147
+ async def add_auth_provider(self, name: str | AuthenticationRef,
148
+ config: AuthProviderBaseConfig) -> AuthProviderBase:
149
+ pass
150
+
151
+ @abstractmethod
152
+ async def get_auth_provider(self, auth_provider_name: str | AuthenticationRef) -> AuthProviderBase:
153
+ pass
154
+
155
+ async def get_auth_providers(self, auth_provider_names: list[str | AuthenticationRef]):
156
+
157
+ coros = [self.get_auth_provider(auth_provider_name=n) for n in auth_provider_names]
158
+
159
+ auth_providers = await asyncio.gather(*coros, return_exceptions=False)
160
+
161
+ return list(auth_providers)
162
+
163
+ @abstractmethod
164
+ async def add_object_store(self, name: str | ObjectStoreRef, config: ObjectStoreBaseConfig) -> ObjectStore:
165
+ pass
166
+
167
+ async def get_object_store_clients(self, object_store_names: Sequence[str | ObjectStoreRef]) -> list[ObjectStore]:
168
+ """
169
+ Return a list of all object store clients.
170
+ """
171
+ return list(await asyncio.gather(*[self.get_object_store_client(name) for name in object_store_names]))
172
+
173
+ @abstractmethod
174
+ async def get_object_store_client(self, object_store_name: str | ObjectStoreRef) -> ObjectStore:
175
+ pass
176
+
177
+ @abstractmethod
178
+ def get_object_store_config(self, object_store_name: str | ObjectStoreRef) -> ObjectStoreBaseConfig:
179
+ pass
180
+
181
+ @abstractmethod
182
+ async def add_embedder(self, name: str | EmbedderRef, config: EmbedderBaseConfig) -> None:
183
+ pass
184
+
185
+ async def get_embedders(self, embedder_names: Sequence[str | EmbedderRef],
186
+ wrapper_type: LLMFrameworkEnum | str) -> list[typing.Any]:
187
+
188
+ coros = [self.get_embedder(embedder_name=n, wrapper_type=wrapper_type) for n in embedder_names]
189
+
190
+ embedders = await asyncio.gather(*coros, return_exceptions=False)
191
+
192
+ return list(embedders)
193
+
194
+ @abstractmethod
195
+ async def get_embedder(self, embedder_name: str | EmbedderRef, wrapper_type: LLMFrameworkEnum | str) -> typing.Any:
196
+ pass
197
+
198
+ @abstractmethod
199
+ def get_embedder_config(self, embedder_name: str | EmbedderRef) -> EmbedderBaseConfig:
200
+ pass
201
+
202
+ @abstractmethod
203
+ async def add_memory_client(self, name: str | MemoryRef, config: MemoryBaseConfig) -> MemoryEditor:
204
+ pass
205
+
206
+ async def get_memory_clients(self, memory_names: Sequence[str | MemoryRef]) -> list[MemoryEditor]:
207
+ """
208
+ Return a list of memory clients for the specified names.
209
+ """
210
+ tasks = [self.get_memory_client(n) for n in memory_names]
211
+ return list(await asyncio.gather(*tasks, return_exceptions=False))
212
+
213
+ @abstractmethod
214
+ async def get_memory_client(self, memory_name: str | MemoryRef) -> MemoryEditor:
215
+ """
216
+ Return the instantiated memory client for the given name.
217
+ """
218
+ pass
219
+
220
+ @abstractmethod
221
+ def get_memory_client_config(self, memory_name: str | MemoryRef) -> MemoryBaseConfig:
222
+ pass
223
+
224
+ @abstractmethod
225
+ async def add_retriever(self, name: str | RetrieverRef, config: RetrieverBaseConfig) -> None:
226
+ pass
227
+
228
+ async def get_retrievers(self,
229
+ retriever_names: Sequence[str | RetrieverRef],
230
+ wrapper_type: LLMFrameworkEnum | str | None = None) -> list[Retriever]:
231
+
232
+ tasks = [self.get_retriever(n, wrapper_type=wrapper_type) for n in retriever_names]
233
+
234
+ retrievers = await asyncio.gather(*tasks, return_exceptions=False)
235
+
236
+ return list(retrievers)
237
+
238
+ @typing.overload
239
+ async def get_retriever(self, retriever_name: str | RetrieverRef,
240
+ wrapper_type: LLMFrameworkEnum | str) -> typing.Any:
241
+ ...
242
+
243
+ @typing.overload
244
+ async def get_retriever(self, retriever_name: str | RetrieverRef, wrapper_type: None) -> Retriever:
245
+ ...
246
+
247
+ @typing.overload
248
+ async def get_retriever(self, retriever_name: str | RetrieverRef) -> Retriever:
249
+ ...
250
+
251
+ @abstractmethod
252
+ async def get_retriever(self,
253
+ retriever_name: str | RetrieverRef,
254
+ wrapper_type: LLMFrameworkEnum | str | None = None) -> typing.Any:
255
+ pass
256
+
257
+ @abstractmethod
258
+ async def get_retriever_config(self, retriever_name: str | RetrieverRef) -> RetrieverBaseConfig:
259
+ pass
260
+
261
+ @abstractmethod
262
+ @experimental(feature_name="TTC")
263
+ async def add_ttc_strategy(self, name: str | TTCStrategyRef, config: TTCStrategyBaseConfig):
264
+ pass
265
+
266
+ @abstractmethod
267
+ async def get_ttc_strategy(self,
268
+ strategy_name: str | TTCStrategyRef,
269
+ pipeline_type: PipelineTypeEnum,
270
+ stage_type: StageTypeEnum) -> "StrategyBase":
271
+ pass
272
+
273
+ @abstractmethod
274
+ async def get_ttc_strategy_config(self,
275
+ strategy_name: str | TTCStrategyRef,
276
+ pipeline_type: PipelineTypeEnum,
277
+ stage_type: StageTypeEnum) -> TTCStrategyBaseConfig:
278
+ pass
279
+
280
+ @abstractmethod
281
+ def get_user_manager(self) -> UserManagerHolder:
282
+ pass
283
+
284
+ @abstractmethod
285
+ def get_function_dependencies(self, fn_name: str) -> FunctionDependencies:
286
+ pass
287
+
288
+ @abstractmethod
289
+ def get_function_group_dependencies(self, fn_name: str) -> FunctionDependencies:
290
+ pass
291
+
292
+
293
+ class EvalBuilder(ABC):
294
+
295
+ @abstractmethod
296
+ async def add_evaluator(self, name: str, config: EvaluatorBaseConfig):
297
+ pass
298
+
299
+ @abstractmethod
300
+ def get_evaluator(self, evaluator_name: str) -> typing.Any:
301
+ pass
302
+
303
+ @abstractmethod
304
+ def get_evaluator_config(self, evaluator_name: str) -> EvaluatorBaseConfig:
305
+ pass
306
+
307
+ @abstractmethod
308
+ def get_max_concurrency(self) -> int:
309
+ pass
310
+
311
+ @abstractmethod
312
+ def get_output_dir(self) -> Path:
313
+ pass
314
+
315
+ @abstractmethod
316
+ async def get_all_tools(self, wrapper_type: LLMFrameworkEnum | str) -> list[typing.Any]:
317
+ pass
@@ -0,0 +1,320 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import logging
17
+ import typing
18
+ from collections.abc import Generator
19
+ from collections.abc import Iterable
20
+
21
+ import networkx as nx
22
+ from pydantic import BaseModel
23
+
24
+ from nat.data_models.authentication import AuthProviderBaseConfig
25
+ from nat.data_models.common import TypedBaseModel
26
+ from nat.data_models.component import ComponentGroup
27
+ from nat.data_models.component_ref import ComponentRef
28
+ from nat.data_models.component_ref import ComponentRefNode
29
+ from nat.data_models.component_ref import generate_instance_id
30
+ from nat.data_models.config import Config
31
+ from nat.data_models.embedder import EmbedderBaseConfig
32
+ from nat.data_models.function import FunctionBaseConfig
33
+ from nat.data_models.function import FunctionGroupBaseConfig
34
+ from nat.data_models.llm import LLMBaseConfig
35
+ from nat.data_models.memory import MemoryBaseConfig
36
+ from nat.data_models.object_store import ObjectStoreBaseConfig
37
+ from nat.data_models.retriever import RetrieverBaseConfig
38
+ from nat.data_models.ttc_strategy import TTCStrategyBaseConfig
39
+ from nat.utils.type_utils import DecomposedType
40
+
41
+ logger = logging.getLogger(__name__)
42
+
43
+ # Order in which we want to process the component groups
44
+ _component_group_order = [
45
+ ComponentGroup.AUTHENTICATION,
46
+ ComponentGroup.EMBEDDERS,
47
+ ComponentGroup.LLMS,
48
+ ComponentGroup.MEMORY,
49
+ ComponentGroup.OBJECT_STORES,
50
+ ComponentGroup.RETRIEVERS,
51
+ ComponentGroup.TTC_STRATEGIES,
52
+ ComponentGroup.FUNCTION_GROUPS,
53
+ ComponentGroup.FUNCTIONS,
54
+ ]
55
+
56
+
57
+ class ComponentInstanceData(BaseModel):
58
+ """A data model to hold component runtime instance metadata to support generating build sequences.
59
+
60
+ Args:
61
+ component_group (ComponentGroup): The component group in a NAT configuration object.
62
+ name (ComponentRef): The name of the component runtime instance.
63
+ config (TypedBaseModel): The runtime instance's configuration object.
64
+ instance_id (str): Unique identifier for each runtime instance.
65
+ is_root (bool): A flag to indicate if the runtime instance is the root of the workflow.
66
+ """
67
+
68
+ component_group: ComponentGroup
69
+ name: ComponentRef
70
+ config: TypedBaseModel
71
+ instance_id: str
72
+ is_root: bool = False
73
+
74
+
75
+ def iterate_leaf_to_root(graph: nx.DiGraph) -> Generator[ComponentRefNode]:
76
+ """A recursive generator that yields leaf nodes from the bottom to the root of a directed graph.
77
+
78
+ Args:
79
+ graph (nx.DiGraph): A networkx directed graph object.
80
+
81
+ Yields:
82
+ ComponentRefNode: An object contain a ComponentRef and its component group.
83
+ """
84
+
85
+ leaf_nodes = [node for node, degree in graph.out_degree() if degree == 0]
86
+
87
+ if len(leaf_nodes) > 0:
88
+ for leaf_node in leaf_nodes:
89
+ yield leaf_node
90
+ graph.remove_node(leaf_node)
91
+
92
+ yield from iterate_leaf_to_root(graph)
93
+
94
+
95
+ def group_from_component(component: TypedBaseModel) -> ComponentGroup | None:
96
+ """Determines the component group from a runtime instance configuration object.
97
+
98
+ Args:
99
+ component (TypedBaseModel): A runtime instance configuration object.
100
+
101
+ Returns:
102
+ ComponentGroup | None: The component group of the runtime instance configuration object. If the
103
+ component is not a valid runtime instance, None is returned.
104
+ """
105
+
106
+ if (isinstance(component, AuthProviderBaseConfig)):
107
+ return ComponentGroup.AUTHENTICATION
108
+ if (isinstance(component, EmbedderBaseConfig)):
109
+ return ComponentGroup.EMBEDDERS
110
+ if (isinstance(component, FunctionBaseConfig)):
111
+ return ComponentGroup.FUNCTIONS
112
+ if (isinstance(component, FunctionGroupBaseConfig)):
113
+ return ComponentGroup.FUNCTION_GROUPS
114
+ if (isinstance(component, LLMBaseConfig)):
115
+ return ComponentGroup.LLMS
116
+ if (isinstance(component, MemoryBaseConfig)):
117
+ return ComponentGroup.MEMORY
118
+ if (isinstance(component, ObjectStoreBaseConfig)):
119
+ return ComponentGroup.OBJECT_STORES
120
+ if (isinstance(component, RetrieverBaseConfig)):
121
+ return ComponentGroup.RETRIEVERS
122
+ if (isinstance(component, TTCStrategyBaseConfig)):
123
+ return ComponentGroup.TTC_STRATEGIES
124
+
125
+ return None
126
+
127
+
128
+ def recursive_componentref_discovery(cls: TypedBaseModel, value: typing.Any,
129
+ type_hint: type[typing.Any]) -> Generator[tuple[str, ComponentRefNode]]:
130
+ """Discovers instances of ComponentRefs in a configuration object and updates the dependency graph.
131
+
132
+ Args:
133
+ cls (TypedBaseModel): A configuration object for a runtime instance.
134
+ value (typing.Any): The current traversed value from the configuration object.
135
+ type_hint (type[typing.Any]): The type of the current traversed value from the configuration object.
136
+ """
137
+
138
+ decomposed_type = DecomposedType(type_hint)
139
+
140
+ if (value is None):
141
+ return
142
+
143
+ if ((decomposed_type.origin is None) and (not issubclass(type(value), BaseModel))):
144
+ if issubclass(type(value), ComponentRef):
145
+ instance_id = generate_instance_id(cls)
146
+ value_node = ComponentRefNode(ref_name=value, component_group=value.component_group)
147
+ yield instance_id, value_node
148
+
149
+ elif ((decomposed_type.origin in (tuple, list, set)) and (isinstance(value, Iterable))):
150
+ for v in value:
151
+ yield from recursive_componentref_discovery(cls, v, decomposed_type.args[0])
152
+ elif ((decomposed_type.origin in (dict, type(typing.TypedDict))) and (isinstance(value, dict))):
153
+ for v in value.values():
154
+ yield from recursive_componentref_discovery(cls, v, decomposed_type.args[1])
155
+ elif (issubclass(type(value), BaseModel)):
156
+ for field, field_info in type(value).model_fields.items():
157
+ field_data = getattr(value, field)
158
+ yield from recursive_componentref_discovery(cls, field_data, field_info.annotation)
159
+ if (decomposed_type.is_union):
160
+ for arg in decomposed_type.args:
161
+ if arg is typing.Any or DecomposedType(arg).is_instance(value):
162
+ yield from recursive_componentref_discovery(cls, value, arg)
163
+ else:
164
+ for arg in decomposed_type.args:
165
+ yield from recursive_componentref_discovery(cls, value, arg)
166
+
167
+
168
+ def update_dependency_graph(config: "Config", instance_config: TypedBaseModel,
169
+ dependency_graph: nx.DiGraph) -> nx.DiGraph:
170
+ """Updates the hierarchical component instance dependency graph from a configuration runtime instance.
171
+
172
+ Args:
173
+ config (Config): A NAT configuration object with runtime instance details.
174
+ instance_config (TypedBaseModel): A component's runtime instance configuration object.
175
+ dependency_graph (nx.DiGraph): A graph tracking runtime instance component dependencies.
176
+
177
+ Returns:
178
+ nx.DiGraph: An dependency graph that has been updated with the provided runtime instance.
179
+ """
180
+
181
+ for field_name, field_info in type(instance_config).model_fields.items():
182
+
183
+ for instance_id, value_node in recursive_componentref_discovery(
184
+ instance_config,
185
+ getattr(instance_config, field_name),
186
+ field_info.annotation): # type: ignore
187
+
188
+ # add immediate edge
189
+ dependency_graph.add_edge(instance_id, value_node)
190
+ # add dependency edge to ensure connections to leaf nodes exist
191
+ dependency_component_dict = getattr(config, value_node.component_group)
192
+ dependency_component_instance_config = dependency_component_dict.get(value_node.ref_name)
193
+ dependency_component_instance_id = generate_instance_id(dependency_component_instance_config)
194
+ dependency_graph.add_edge(value_node, dependency_component_instance_id)
195
+
196
+ return dependency_graph
197
+
198
+
199
+ def config_to_dependency_objects(config: "Config") -> tuple[dict[str, ComponentInstanceData], nx.DiGraph]:
200
+ """Generates a map of component runtime instance IDs to use when generating a build sequence.
201
+
202
+ Args:
203
+ config (Config): The NAT workflow configuration object.
204
+
205
+ Returns:
206
+ tuple[dict[str, ComponentInstanceData], nx.DiGraph]: A tuple containing a map of component runtime instance
207
+ IDs to a component object containing its metadata and a dependency graph of nested components.
208
+ """
209
+
210
+ # Build map of every runtime instances
211
+ dependency_map: dict[str, ComponentInstanceData] = {}
212
+ dependency_graph: nx.DiGraph = nx.DiGraph()
213
+
214
+ # Create the dependency map preserving as much order as we can
215
+ for group in _component_group_order:
216
+
217
+ component_dict = getattr(config, group.value)
218
+
219
+ assert isinstance(component_dict, dict), "Config components must be a dictionary"
220
+
221
+ for component_instance_name, component_instance_config in component_dict.items():
222
+
223
+ instance_id = generate_instance_id(component_instance_config)
224
+ dependency_map[instance_id] = ComponentInstanceData(component_group=group,
225
+ instance_id=instance_id,
226
+ name=component_instance_name,
227
+ config=component_instance_config)
228
+
229
+ dependency_graph = update_dependency_graph(config=config,
230
+ instance_config=component_instance_config,
231
+ dependency_graph=dependency_graph)
232
+
233
+ # Set the workflow flag on the workflow instance (must be last)
234
+ workflow_instance_id = generate_instance_id(config.workflow)
235
+
236
+ dependency_map[workflow_instance_id] = ComponentInstanceData(
237
+ component_group=ComponentGroup.FUNCTIONS,
238
+ instance_id=workflow_instance_id,
239
+ name="<workflow>", # type: ignore
240
+ config=config.workflow,
241
+ is_root=True)
242
+
243
+ dependency_graph = update_dependency_graph(config=config,
244
+ instance_config=config.workflow,
245
+ dependency_graph=dependency_graph)
246
+
247
+ return dependency_map, dependency_graph
248
+
249
+
250
+ def build_dependency_sequence(config: "Config") -> list[ComponentInstanceData]:
251
+ """Generates the depencency sequence from a NAT configuration object
252
+
253
+ Args:
254
+ config (Config): A NAT configuration object.
255
+
256
+ Returns:
257
+ list[ComponentInstanceData]: A list representing the instatiation sequence to ensure all valid
258
+ runtime instance references.
259
+ """
260
+
261
+ total_node_count = (len(config.embedders) + len(config.functions) + len(config.function_groups) + len(config.llms) +
262
+ len(config.memory) + len(config.object_stores) + len(config.retrievers) +
263
+ len(config.ttc_strategies) + len(config.authentication) + 1) # +1 for the workflow
264
+
265
+ dependency_map: dict
266
+ dependency_graph: nx.DiGraph
267
+ dependency_map, dependency_graph = config_to_dependency_objects(config=config)
268
+
269
+ dependency_sequence: list[ComponentInstanceData] = []
270
+ instance_ids = set()
271
+ for node in iterate_leaf_to_root(dependency_graph.copy()): # type: ignore
272
+
273
+ if (node not in dependency_sequence):
274
+
275
+ # Convert node to id
276
+ if (isinstance(node, ComponentRefNode) and issubclass(type(node.ref_name), ComponentRef)):
277
+
278
+ component_group_configs = getattr(config, node.component_group.value)
279
+ node_config = component_group_configs.get(node.ref_name, None)
280
+
281
+ # Only add nodes that are valid in the current instance configuration
282
+ if (node_config is None):
283
+ continue
284
+
285
+ component_instance = ComponentInstanceData(
286
+ name=node.ref_name,
287
+ component_group=node.component_group.value, # type: ignore
288
+ config=node_config,
289
+ instance_id=generate_instance_id(node_config))
290
+
291
+ else:
292
+
293
+ component_instance = dependency_map.get(node, None)
294
+
295
+ # Only add nodes that are valid in the current instance configuration
296
+ if (component_instance is None):
297
+ continue
298
+
299
+ if (component_instance.instance_id not in instance_ids):
300
+
301
+ dependency_sequence.append(component_instance)
302
+ instance_ids.add(component_instance.instance_id)
303
+
304
+ remaining_dependency_sequence: list[ComponentInstanceData] = []
305
+
306
+ # Find the remaining nodes that are not in the sequence preserving order
307
+ for instance_id, instance in dependency_map.items():
308
+ if (instance_id not in instance_ids):
309
+ remaining_dependency_sequence.append(instance)
310
+
311
+ # Add the remaining at the front of the sequence
312
+ dependency_sequence = remaining_dependency_sequence + dependency_sequence
313
+
314
+ # Find the root node and make sure it is the last node in the sequence
315
+ dependency_sequence = [x for x in dependency_sequence if not x.is_root
316
+ ] + [x for x in dependency_sequence if x.is_root]
317
+
318
+ assert len(dependency_sequence) == total_node_count, "Dependency sequence generation failed. Report as bug."
319
+
320
+ return dependency_sequence