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
@@ -0,0 +1,257 @@
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 functools
18
+ import logging
19
+ import typing
20
+ from collections.abc import Callable
21
+ from pathlib import Path
22
+
23
+ import click
24
+ from pydantic_core import SchemaValidator
25
+
26
+ from nat.cli.cli_utils.config_override import load_and_override_config
27
+ from nat.cli.type_registry import GlobalTypeRegistry
28
+ from nat.cli.type_registry import RegisteredFrontEndInfo
29
+ from nat.data_models.config import Config
30
+ from nat.utils.data_models.schema_validator import validate_schema
31
+ from nat.utils.type_utils import DecomposedType
32
+
33
+ logger = logging.getLogger(__name__)
34
+
35
+
36
+ class StartCommandGroup(click.Group):
37
+
38
+ def __init__(
39
+ self,
40
+ name: str | None = None,
41
+ invoke_without_command: bool = False,
42
+ no_args_is_help: bool | None = None,
43
+ subcommand_metavar: str | None = None,
44
+ chain: bool = False,
45
+ result_callback: Callable[..., typing.Any] | None = None,
46
+ **attrs: typing.Any,
47
+ ):
48
+ super().__init__(name=name,
49
+ invoke_without_command=invoke_without_command,
50
+ no_args_is_help=no_args_is_help,
51
+ subcommand_metavar=subcommand_metavar,
52
+ chain=chain,
53
+ result_callback=result_callback,
54
+ **attrs)
55
+
56
+ self._commands: dict[str, click.Command] | None = None
57
+ self._registered_front_ends: dict[str, RegisteredFrontEndInfo] = {}
58
+
59
+ def _build_params(self, front_end: RegisteredFrontEndInfo) -> list[click.Parameter]:
60
+
61
+ params: list[click.Parameter] = []
62
+
63
+ # First two are always the config file and override
64
+ params.append(
65
+ click.Option(param_decls=["--config_file"],
66
+ type=click.Path(exists=True, file_okay=True, dir_okay=False, path_type=Path),
67
+ required=True,
68
+ help=("A JSON/YAML file that sets the parameters for the workflow.")))
69
+ params.append(
70
+ click.Option(
71
+ param_decls=["--override"],
72
+ type=(str, str),
73
+ multiple=True,
74
+ help="Override config values using dot notation (e.g., --override llms.nim_llm.temperature 0.7)"))
75
+
76
+ fields = front_end.config_type.model_fields
77
+ for name, field in fields.items():
78
+
79
+ if (name in ("override", "config_file")):
80
+ raise ValueError(
81
+ "Cannot have a field named 'override' or 'config_file' in the front end config. These are reserved."
82
+ )
83
+
84
+ # Skip init-only fields since we dont want to set them in the constructor. Must check for False explicitly
85
+ if (field.init == False): # noqa: E712, pylint: disable=singleton-comparison
86
+ continue
87
+
88
+ if (field.annotation is None):
89
+ raise ValueError(f"Field {name} has no type annotation. Types are required for Front End Plugins.")
90
+
91
+ # Decompose the type into its origin and arguments
92
+ decomposed_type = DecomposedType(field.annotation)
93
+
94
+ param_decls = [f"--{name}"]
95
+ multiple = False
96
+
97
+ # Remove any optional types
98
+ while (decomposed_type.is_optional):
99
+ decomposed_type = decomposed_type.get_optional_type()
100
+
101
+ if (decomposed_type.is_union):
102
+ raise ValueError(f"Invalid field '{name}'.Unions are only supported for optional parameters.")
103
+
104
+ # Handle the types
105
+ # Literal[...] -> map to click.Choice([...])
106
+ if (decomposed_type.origin is typing.Literal):
107
+ # typing.get_args returns the literal values; ensure they are strings for Click
108
+ literal_values = [str(v) for v in decomposed_type.args]
109
+ param_type = click.Choice(literal_values)
110
+
111
+ elif (issubclass(decomposed_type.root, Path)):
112
+ param_type = click.Path(exists=True, file_okay=True, dir_okay=False, path_type=Path)
113
+
114
+ elif (issubclass(decomposed_type.root, list | tuple | set)):
115
+ if (len(decomposed_type.args) == 1):
116
+ inner = DecomposedType(decomposed_type.args[0])
117
+ # Support containers of Literal values -> multiple Choice
118
+ if (inner.origin is typing.Literal):
119
+ literal_values = [str(v) for v in inner.args]
120
+ param_type = click.Choice(literal_values)
121
+ else:
122
+ param_type = inner.root
123
+ else:
124
+ param_type = None
125
+
126
+ multiple = True
127
+ else:
128
+ param_type = decomposed_type.root
129
+
130
+ if (field.alias is not None):
131
+ param_decls = [f"--{field.alias}", f"{name}"]
132
+
133
+ params.append(
134
+ click.Option(param_decls=param_decls,
135
+ type=param_type,
136
+ required=False,
137
+ multiple=multiple,
138
+ help=field.description))
139
+
140
+ return params
141
+
142
+ def _load_commands(self) -> dict[str, click.Command]:
143
+
144
+ if (self._commands is not None):
145
+ return self._commands
146
+
147
+ from nat.runtime.loader import PluginTypes
148
+ from nat.runtime.loader import discover_and_register_plugins
149
+
150
+ # Only load front ends here for performance. Ensures a responsive CLI
151
+ discover_and_register_plugins(PluginTypes.FRONT_END)
152
+
153
+ all_front_ends = GlobalTypeRegistry.get().get_registered_front_ends()
154
+
155
+ self._commands = {}
156
+
157
+ for front_end in all_front_ends:
158
+
159
+ registered_front_end = GlobalTypeRegistry.get().get_front_end(config_type=front_end.config_type)
160
+
161
+ # Build the command parameters
162
+ params: list[click.Parameter] = self._build_params(registered_front_end)
163
+ help_msg = f"Run a NAT workflow using the {registered_front_end.local_name} front end."
164
+
165
+ cmd = click.Command(name=registered_front_end.local_name,
166
+ params=params,
167
+ help=help_msg,
168
+ callback=functools.partial(click.pass_context(self.invoke_subcommand),
169
+ cmd_name=front_end.local_name))
170
+
171
+ self._registered_front_ends[front_end.local_name] = registered_front_end
172
+ self._commands[front_end.local_name] = cmd
173
+
174
+ return self._commands
175
+
176
+ def invoke_subcommand(self,
177
+ ctx: click.Context,
178
+ cmd_name: str,
179
+ config_file: Path,
180
+ override: tuple[tuple[str, str], ...],
181
+ **kwargs) -> int | None:
182
+
183
+ from nat.runtime.loader import PluginTypes
184
+ from nat.runtime.loader import discover_and_register_plugins
185
+
186
+ if (config_file is None):
187
+ raise click.ClickException("No config file provided.")
188
+
189
+ # Here we need to ensure all objects are loaded before we try to create the config object
190
+ discover_and_register_plugins(PluginTypes.CONFIG_OBJECT)
191
+
192
+ logger.info("Starting NAT from config file: '%s'", config_file)
193
+
194
+ config_dict = load_and_override_config(config_file, override)
195
+
196
+ # Get the front end for the command
197
+ front_end: RegisteredFrontEndInfo = self._registered_front_ends[cmd_name]
198
+
199
+ config = validate_schema(config_dict, Config)
200
+
201
+ # Override default front end config with values from the config file for serverless execution modes.
202
+ # Check that we have the right kind of front end
203
+ if (not isinstance(config.general.front_end, front_end.config_type)):
204
+
205
+ # Set the front end config
206
+ config.general.front_end = front_end.config_type()
207
+
208
+ front_end_config = config.general.front_end
209
+
210
+ # Iterate over the parameters and set them in the config
211
+ for param, value in kwargs.items():
212
+
213
+ # Skip default values so we dont overwrite the config
214
+ if (ctx.get_parameter_source(param) == click.core.ParameterSource.DEFAULT):
215
+ continue
216
+
217
+ setattr(front_end_config, param, value)
218
+
219
+ # Validate the config once more to ensure that all parameters are set correctly
220
+ schema_validator = SchemaValidator(schema=front_end_config.__pydantic_core_schema__)
221
+ schema_validator.validate_python(front_end_config.__dict__)
222
+
223
+ try:
224
+
225
+ async def run_plugin():
226
+
227
+ # From the config, get the registered front end plugin
228
+ front_end_info = GlobalTypeRegistry.get().get_front_end(config_type=type(front_end_config))
229
+
230
+ # Create the front end plugin
231
+ async with front_end_info.build_fn(front_end_config, config) as front_end_plugin:
232
+
233
+ # Run the front end plugin
234
+ await front_end_plugin.run()
235
+
236
+ return asyncio.run(run_plugin())
237
+
238
+ except Exception as e:
239
+ logger.error("Failed to initialize workflow")
240
+ raise click.ClickException(str(e)) from e
241
+
242
+ def get_command(self, ctx: click.Context, cmd_name: str) -> click.Command | None:
243
+
244
+ return self._load_commands().get(cmd_name)
245
+
246
+ def list_commands(self, ctx: click.Context) -> list[str]:
247
+ return sorted(self._load_commands().keys())
248
+
249
+
250
+ @click.command(name=__name__,
251
+ invoke_without_command=False,
252
+ help="Run a NAT workflow using a front end configuration.",
253
+ cls=StartCommandGroup)
254
+ @click.pass_context
255
+ def start_command(ctx: click.Context, **kwargs) -> None:
256
+ """Run a NAT workflow using a front end configuration."""
257
+ pass
@@ -0,0 +1,81 @@
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 asyncio
17
+ import logging
18
+ from contextlib import AsyncExitStack
19
+
20
+ import click
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+
25
+ async def uninstall_packages(packages: list[dict[str, str]]) -> None:
26
+
27
+ from nat.cli.type_registry import GlobalTypeRegistry
28
+ from nat.registry_handlers.schemas.package import PackageNameVersionList
29
+ from nat.runtime.loader import PluginTypes
30
+ from nat.runtime.loader import discover_and_register_plugins
31
+ from nat.settings.global_settings import GlobalSettings
32
+
33
+ discover_and_register_plugins(PluginTypes.CONFIG_OBJECT)
34
+
35
+ registry = GlobalTypeRegistry.get()
36
+
37
+ config_dict = {"channels": {"uninstall_local": {"_type": "local"}}}
38
+ registry_config = GlobalSettings.get().model_validate(config_dict)
39
+ local_registry_config = registry_config.channels.get("uninstall_local", None)
40
+
41
+ if (local_registry_config is None):
42
+ logger.error("Channel runtime instance not found.")
43
+
44
+ try:
45
+ package_name_list = PackageNameVersionList(**{"packages": packages})
46
+ except Exception as e:
47
+ logger.exception("Error validating package format: %s", e)
48
+ return
49
+
50
+ async with AsyncExitStack() as stack:
51
+ registry_handler_info = registry.get_registry_handler(type(local_registry_config))
52
+ registry_handler = await stack.enter_async_context(registry_handler_info.build_fn(local_registry_config))
53
+ await stack.enter_async_context(registry_handler.remove(packages=package_name_list))
54
+
55
+
56
+ @click.group(name=__name__, invoke_without_command=True, help=("Uninstall plugin packages from the local environment."))
57
+ @click.argument("packages", type=str)
58
+ def uninstall_command(packages: str) -> None:
59
+ """
60
+ Uninstall plugin packages from the local environment.
61
+ """
62
+
63
+ packages = packages.split()
64
+ packages_versions = []
65
+ for package in packages:
66
+ package_dict = {}
67
+ package_version = package.split("==")
68
+ if (len(package_version) == 1):
69
+ package_dict["name"] = package_version[0]
70
+ msg = f"No package version provided for '{package_version[0]}'."
71
+ logger.warning(msg)
72
+ elif (len(package_version) == 2):
73
+ package_dict["name"] = package_version[0]
74
+ package_dict["version"] = package_version[1]
75
+ else:
76
+ msg = f"Invalid input: '{package}'"
77
+ logger.error(msg)
78
+ if (package_dict):
79
+ packages_versions.append(package_dict)
80
+
81
+ asyncio.run(uninstall_packages(packages=packages_versions))
@@ -0,0 +1,47 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from pathlib import Path
17
+
18
+ import click
19
+
20
+
21
+ @click.command()
22
+ @click.option("--config_file",
23
+ type=click.Path(exists=True, file_okay=True, dir_okay=False, path_type=Path),
24
+ required=True,
25
+ help="Configuration file to validate")
26
+ def validate_command(config_file: Path):
27
+ """Validate a configuration file"""
28
+ # load function level dependencies
29
+ from io import StringIO
30
+
31
+ from nat.runtime.loader import load_config
32
+
33
+ try:
34
+ click.echo(f"Validating configuration file: {config_file}")
35
+ config = load_config(config_file)
36
+ click.echo(click.style("✓ Configuration file is valid!", fg="green"))
37
+
38
+ stream = StringIO()
39
+
40
+ config.print_summary(stream=stream)
41
+
42
+ click.echo_via_pager(stream.getvalue())
43
+ except Exception as e:
44
+ click.echo(click.style("✗ Validation failed!\n\nError:", fg="red"))
45
+
46
+ click.echo(click.style(e, fg="red"))
47
+ raise click.ClickException(str(e)) from e
@@ -0,0 +1,14 @@
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.
File without changes
@@ -0,0 +1,17 @@
1
+ functions:
2
+ current_datetime:
3
+ _type: current_datetime
4
+ {{python_safe_workflow_name}}:
5
+ _type: {{python_safe_workflow_name}}
6
+ prefix: "Hello:"
7
+
8
+ llms:
9
+ nim_llm:
10
+ _type: nim
11
+ model_name: meta/llama-3.1-70b-instruct
12
+ temperature: 0.0
13
+
14
+ workflow:
15
+ _type: react_agent
16
+ llm_name: nim_llm
17
+ tool_names: [current_datetime, {{python_safe_workflow_name}}]
@@ -0,0 +1,25 @@
1
+ [build-system]
2
+ build-backend = "setuptools.build_meta"
3
+ {% if editable %}requires = ["setuptools >= 64", "setuptools-scm>=8"]
4
+
5
+ [tool.setuptools_scm]
6
+ # NAT uses the --first-parent flag to avoid tags from previous releases which have been merged into the develop branch
7
+ # from causing an unexpected version change. This can be safely removed if developing outside of the NAT repository.
8
+ git_describe_command = "git describe --long --first-parent"
9
+ root = "{{ rel_path_to_repo_root}}"{% else %}requires = ["setuptools >= 64"]{% endif %}
10
+
11
+ [project]
12
+ name = "{{ package_name }}"
13
+ {% if editable %}dynamic = ["version"]{% else %}version = "0.1.0"{% endif %}
14
+ dependencies = [
15
+ "{{ nat_dependency }}",
16
+ ]
17
+ requires-python = ">=3.11,<3.14"
18
+ description = "Custom NeMo Agent Toolkit Workflow"
19
+ classifiers = ["Programming Language :: Python"]
20
+
21
+ {% if editable %}[tool.uv.sources]
22
+ nvidia-nat = { path = "{{ rel_path_to_repo_root}}", editable = true }{% endif %}
23
+
24
+ [project.entry-points.'nat.components']
25
+ {{ package_name }} = "{{ package_name }}.register"
@@ -0,0 +1,4 @@
1
+ # flake8: noqa
2
+
3
+ # Import the generated workflow function to trigger registration
4
+ from .{{package_name}} import {{ python_safe_workflow_name }}_function
@@ -0,0 +1,50 @@
1
+ import logging
2
+
3
+ from pydantic import Field
4
+
5
+ from nat.builder.builder import Builder
6
+ from nat.builder.framework_enum import LLMFrameworkEnum
7
+ from nat.builder.function_info import FunctionInfo
8
+ from nat.cli.register_workflow import register_function
9
+ from nat.data_models.function import FunctionBaseConfig
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ class {{ workflow_class_name }}(FunctionBaseConfig, name="{{ workflow_name }}"):
15
+ """
16
+ {{ workflow_description }}
17
+ """
18
+ prefix: str = Field(default="Echo:", description="Prefix to add before the echoed text.")
19
+
20
+
21
+ @register_function(config_type={{ workflow_class_name }}, framework_wrappers=[LLMFrameworkEnum.LANGCHAIN])
22
+ async def {{ python_safe_workflow_name }}_function(config: {{ workflow_class_name }}, builder: Builder):
23
+ """
24
+ Registers a function (addressable via `{{ workflow_name }}` in the configuration).
25
+ This registration ensures a static mapping of the function type, `{{ workflow_name }}`, to the `{{ workflow_class_name }}` configuration object.
26
+
27
+ Args:
28
+ config ({{ workflow_class_name }}): The configuration for the function.
29
+ builder (Builder): The builder object.
30
+
31
+ Returns:
32
+ FunctionInfo: The function info object for the function.
33
+ """
34
+
35
+ # Define the function that will be registered.
36
+ async def _echo(text: str) -> str:
37
+ """
38
+ Takes a text input and echoes back with a pre-defined prefix.
39
+
40
+ Args:
41
+ text (str): The text to echo back.
42
+
43
+ Returns:
44
+ str: The text with the prefix.
45
+ """
46
+ return f"{config.prefix} {text}"
47
+
48
+ # The callable is wrapped in a FunctionInfo object.
49
+ # The description parameter is used to describe the function.
50
+ yield FunctionInfo.from_fn(_echo, description=_echo.__doc__)
@@ -0,0 +1,37 @@
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
+
18
+ import click
19
+
20
+ from nat.cli.commands.workflow.workflow_commands import create_command
21
+ from nat.cli.commands.workflow.workflow_commands import delete_command
22
+ from nat.cli.commands.workflow.workflow_commands import reinstall_command
23
+
24
+ logger = logging.getLogger(__name__)
25
+
26
+
27
+ @click.group(name=__name__, invoke_without_command=False, help="Interact with templated workflows.")
28
+ def workflow_command(**kwargs):
29
+ """
30
+ Interact with templated workflows.
31
+ """
32
+ pass
33
+
34
+
35
+ workflow_command.add_command(create_command, name="create")
36
+ workflow_command.add_command(delete_command, "delete")
37
+ workflow_command.add_command(reinstall_command, "reinstall")