nvidia-nat 1.4.0a20251112__py3-none-any.whl → 1.4.0a20260113__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 (492) hide show
  1. aiq/__init__.py +1 -1
  2. nat/{front_ends/mcp → agent/auto_memory_wrapper}/__init__.py +1 -1
  3. nat/agent/auto_memory_wrapper/agent.py +278 -0
  4. nat/agent/auto_memory_wrapper/register.py +227 -0
  5. nat/agent/auto_memory_wrapper/state.py +30 -0
  6. nat/agent/base.py +1 -1
  7. nat/agent/dual_node.py +1 -1
  8. nat/agent/prompt_optimizer/prompt.py +1 -1
  9. nat/agent/prompt_optimizer/register.py +1 -1
  10. nat/agent/react_agent/agent.py +16 -9
  11. nat/agent/react_agent/output_parser.py +2 -2
  12. nat/agent/react_agent/prompt.py +3 -2
  13. nat/agent/react_agent/register.py +2 -2
  14. nat/agent/react_agent/register_per_user_agent.py +104 -0
  15. nat/agent/reasoning_agent/reasoning_agent.py +1 -1
  16. nat/agent/register.py +3 -1
  17. nat/agent/responses_api_agent/__init__.py +1 -1
  18. nat/agent/responses_api_agent/register.py +1 -1
  19. nat/agent/rewoo_agent/agent.py +9 -4
  20. nat/agent/rewoo_agent/prompt.py +1 -1
  21. nat/agent/rewoo_agent/register.py +1 -1
  22. nat/agent/tool_calling_agent/agent.py +5 -4
  23. nat/agent/tool_calling_agent/register.py +1 -1
  24. nat/authentication/__init__.py +1 -1
  25. nat/authentication/api_key/__init__.py +1 -1
  26. nat/authentication/api_key/api_key_auth_provider.py +1 -1
  27. nat/authentication/api_key/api_key_auth_provider_config.py +22 -7
  28. nat/authentication/api_key/register.py +1 -1
  29. nat/authentication/credential_validator/__init__.py +1 -1
  30. nat/authentication/credential_validator/bearer_token_validator.py +1 -1
  31. nat/authentication/exceptions/__init__.py +1 -1
  32. nat/authentication/exceptions/api_key_exceptions.py +1 -1
  33. nat/authentication/http_basic_auth/http_basic_auth_provider.py +1 -1
  34. nat/authentication/http_basic_auth/register.py +1 -1
  35. nat/authentication/interfaces.py +1 -1
  36. nat/authentication/oauth2/__init__.py +1 -1
  37. nat/authentication/oauth2/oauth2_auth_code_flow_provider.py +1 -1
  38. nat/authentication/oauth2/oauth2_auth_code_flow_provider_config.py +1 -1
  39. nat/authentication/oauth2/oauth2_resource_server_config.py +1 -1
  40. nat/authentication/oauth2/register.py +1 -1
  41. nat/authentication/register.py +1 -1
  42. nat/builder/builder.py +563 -1
  43. nat/builder/child_builder.py +385 -0
  44. nat/builder/component_utils.py +34 -4
  45. nat/builder/context.py +34 -1
  46. nat/builder/embedder.py +1 -1
  47. nat/builder/eval_builder.py +19 -7
  48. nat/builder/evaluator.py +1 -1
  49. nat/builder/framework_enum.py +3 -1
  50. nat/builder/front_end.py +1 -1
  51. nat/builder/function.py +113 -5
  52. nat/builder/function_base.py +1 -1
  53. nat/builder/function_info.py +1 -1
  54. nat/builder/intermediate_step_manager.py +1 -1
  55. nat/builder/llm.py +1 -1
  56. nat/builder/per_user_workflow_builder.py +843 -0
  57. nat/builder/retriever.py +1 -1
  58. nat/builder/sync_builder.py +571 -0
  59. nat/builder/user_interaction_manager.py +1 -1
  60. nat/builder/workflow.py +5 -3
  61. nat/builder/workflow_builder.py +619 -378
  62. nat/cli/__init__.py +1 -1
  63. nat/cli/cli_utils/config_override.py +1 -1
  64. nat/cli/cli_utils/validation.py +32 -1
  65. nat/cli/commands/configure/channel/add.py +1 -1
  66. nat/cli/commands/configure/channel/channel.py +1 -1
  67. nat/cli/commands/configure/channel/remove.py +1 -1
  68. nat/cli/commands/configure/channel/update.py +1 -1
  69. nat/cli/commands/configure/configure.py +1 -1
  70. nat/cli/commands/evaluate.py +87 -13
  71. nat/cli/commands/finetune.py +132 -0
  72. nat/cli/commands/info/__init__.py +1 -1
  73. nat/cli/commands/info/info.py +1 -1
  74. nat/cli/commands/info/list_channels.py +1 -1
  75. nat/cli/commands/info/list_components.py +1 -1
  76. nat/cli/commands/object_store/__init__.py +1 -1
  77. nat/cli/commands/object_store/object_store.py +1 -1
  78. nat/cli/commands/optimize.py +1 -1
  79. nat/cli/commands/{mcp → red_teaming}/__init__.py +1 -1
  80. nat/cli/commands/red_teaming/red_teaming.py +138 -0
  81. nat/cli/commands/red_teaming/red_teaming_utils.py +73 -0
  82. nat/cli/commands/registry/__init__.py +1 -1
  83. nat/cli/commands/registry/publish.py +1 -1
  84. nat/cli/commands/registry/pull.py +1 -1
  85. nat/cli/commands/registry/registry.py +1 -1
  86. nat/cli/commands/registry/remove.py +1 -1
  87. nat/cli/commands/registry/search.py +1 -1
  88. nat/cli/commands/sizing/__init__.py +1 -1
  89. nat/cli/commands/sizing/calc.py +1 -1
  90. nat/cli/commands/sizing/sizing.py +1 -1
  91. nat/cli/commands/start.py +1 -1
  92. nat/cli/commands/uninstall.py +1 -1
  93. nat/cli/commands/validate.py +1 -1
  94. nat/cli/commands/workflow/__init__.py +1 -1
  95. nat/cli/commands/workflow/workflow.py +1 -1
  96. nat/cli/commands/workflow/workflow_commands.py +3 -2
  97. nat/cli/entrypoint.py +15 -37
  98. nat/cli/main.py +2 -2
  99. nat/cli/plugin_loader.py +69 -0
  100. nat/cli/register_workflow.py +233 -5
  101. nat/cli/type_registry.py +237 -3
  102. nat/control_flow/register.py +1 -1
  103. nat/control_flow/router_agent/agent.py +1 -1
  104. nat/control_flow/router_agent/prompt.py +1 -1
  105. nat/control_flow/router_agent/register.py +1 -1
  106. nat/control_flow/sequential_executor.py +28 -7
  107. nat/data_models/__init__.py +1 -1
  108. nat/data_models/agent.py +1 -1
  109. nat/data_models/api_server.py +38 -3
  110. nat/data_models/authentication.py +1 -1
  111. nat/data_models/common.py +1 -1
  112. nat/data_models/component.py +9 -1
  113. nat/data_models/component_ref.py +45 -1
  114. nat/data_models/config.py +78 -1
  115. nat/data_models/dataset_handler.py +15 -2
  116. nat/data_models/discovery_metadata.py +1 -1
  117. nat/data_models/embedder.py +1 -1
  118. nat/data_models/evaluate.py +6 -1
  119. nat/data_models/evaluator.py +1 -1
  120. nat/data_models/finetuning.py +260 -0
  121. nat/data_models/front_end.py +1 -1
  122. nat/data_models/function.py +15 -2
  123. nat/data_models/function_dependencies.py +1 -1
  124. nat/data_models/gated_field_mixin.py +1 -1
  125. nat/data_models/interactive.py +1 -1
  126. nat/data_models/intermediate_step.py +29 -2
  127. nat/data_models/invocation_node.py +1 -1
  128. nat/data_models/llm.py +1 -1
  129. nat/data_models/logging.py +1 -1
  130. nat/data_models/memory.py +1 -1
  131. nat/data_models/middleware.py +37 -0
  132. nat/data_models/object_store.py +1 -1
  133. nat/data_models/openai_mcp.py +1 -1
  134. nat/data_models/optimizable.py +1 -1
  135. nat/data_models/optimizer.py +1 -1
  136. nat/data_models/profiler.py +1 -1
  137. nat/data_models/registry_handler.py +1 -1
  138. nat/data_models/retriever.py +1 -1
  139. nat/data_models/retry_mixin.py +1 -1
  140. nat/data_models/runtime_enum.py +26 -0
  141. nat/data_models/span.py +1 -1
  142. nat/data_models/step_adaptor.py +1 -1
  143. nat/data_models/streaming.py +1 -1
  144. nat/data_models/swe_bench_model.py +1 -1
  145. nat/data_models/telemetry_exporter.py +1 -1
  146. nat/data_models/thinking_mixin.py +1 -1
  147. nat/data_models/ttc_strategy.py +1 -1
  148. nat/embedder/azure_openai_embedder.py +1 -1
  149. nat/embedder/nim_embedder.py +1 -1
  150. nat/embedder/openai_embedder.py +1 -1
  151. nat/embedder/register.py +1 -1
  152. nat/eval/__init__.py +1 -1
  153. nat/eval/config.py +8 -1
  154. nat/eval/dataset_handler/dataset_downloader.py +1 -1
  155. nat/eval/dataset_handler/dataset_filter.py +1 -1
  156. nat/eval/dataset_handler/dataset_handler.py +4 -2
  157. nat/eval/evaluate.py +226 -81
  158. nat/eval/evaluator/__init__.py +1 -1
  159. nat/eval/evaluator/base_evaluator.py +2 -2
  160. nat/eval/evaluator/evaluator_model.py +3 -2
  161. nat/eval/intermediate_step_adapter.py +1 -1
  162. nat/eval/llm_validator.py +336 -0
  163. nat/eval/rag_evaluator/evaluate.py +17 -10
  164. nat/eval/rag_evaluator/register.py +1 -1
  165. nat/eval/red_teaming_evaluator/__init__.py +14 -0
  166. nat/eval/red_teaming_evaluator/data_models.py +66 -0
  167. nat/eval/red_teaming_evaluator/evaluate.py +327 -0
  168. nat/eval/red_teaming_evaluator/filter_conditions.py +75 -0
  169. nat/eval/red_teaming_evaluator/register.py +55 -0
  170. nat/eval/register.py +2 -1
  171. nat/eval/remote_workflow.py +1 -1
  172. nat/eval/runners/__init__.py +1 -1
  173. nat/eval/runners/config.py +1 -1
  174. nat/eval/runners/multi_eval_runner.py +1 -1
  175. nat/eval/runners/red_teaming_runner/__init__.py +24 -0
  176. nat/eval/runners/red_teaming_runner/config.py +282 -0
  177. nat/eval/runners/red_teaming_runner/report_utils.py +707 -0
  178. nat/eval/runners/red_teaming_runner/runner.py +867 -0
  179. nat/eval/runtime_evaluator/__init__.py +1 -1
  180. nat/eval/runtime_evaluator/evaluate.py +1 -1
  181. nat/eval/runtime_evaluator/register.py +1 -1
  182. nat/eval/runtime_event_subscriber.py +1 -1
  183. nat/eval/swe_bench_evaluator/evaluate.py +1 -1
  184. nat/eval/swe_bench_evaluator/register.py +1 -1
  185. nat/eval/trajectory_evaluator/evaluate.py +2 -2
  186. nat/eval/trajectory_evaluator/register.py +1 -1
  187. nat/eval/tunable_rag_evaluator/evaluate.py +5 -5
  188. nat/eval/tunable_rag_evaluator/register.py +1 -1
  189. nat/eval/usage_stats.py +1 -1
  190. nat/eval/utils/eval_trace_ctx.py +1 -1
  191. nat/eval/utils/output_uploader.py +1 -1
  192. nat/eval/utils/tqdm_position_registry.py +1 -1
  193. nat/eval/utils/weave_eval.py +1 -1
  194. nat/experimental/decorators/experimental_warning_decorator.py +1 -1
  195. nat/experimental/test_time_compute/editing/iterative_plan_refinement_editor.py +1 -1
  196. nat/experimental/test_time_compute/editing/llm_as_a_judge_editor.py +1 -1
  197. nat/experimental/test_time_compute/editing/motivation_aware_summarization.py +1 -1
  198. nat/experimental/test_time_compute/functions/execute_score_select_function.py +1 -1
  199. nat/experimental/test_time_compute/functions/multi_llm_judge_function.py +88 -0
  200. nat/experimental/test_time_compute/functions/plan_select_execute_function.py +1 -1
  201. nat/experimental/test_time_compute/functions/ttc_tool_orchestration_function.py +1 -1
  202. nat/experimental/test_time_compute/functions/ttc_tool_wrapper_function.py +1 -1
  203. nat/experimental/test_time_compute/models/editor_config.py +1 -1
  204. nat/experimental/test_time_compute/models/scoring_config.py +1 -1
  205. nat/experimental/test_time_compute/models/search_config.py +20 -2
  206. nat/experimental/test_time_compute/models/selection_config.py +33 -2
  207. nat/experimental/test_time_compute/models/stage_enums.py +1 -1
  208. nat/experimental/test_time_compute/models/strategy_base.py +1 -1
  209. nat/experimental/test_time_compute/models/tool_use_config.py +1 -1
  210. nat/experimental/test_time_compute/models/ttc_item.py +1 -1
  211. nat/experimental/test_time_compute/register.py +4 -1
  212. nat/experimental/test_time_compute/scoring/llm_based_agent_scorer.py +1 -1
  213. nat/experimental/test_time_compute/scoring/llm_based_plan_scorer.py +1 -1
  214. nat/experimental/test_time_compute/scoring/motivation_aware_scorer.py +1 -1
  215. nat/experimental/test_time_compute/search/multi_llm_generation.py +115 -0
  216. nat/experimental/test_time_compute/search/multi_llm_planner.py +1 -1
  217. nat/experimental/test_time_compute/search/multi_query_retrieval_search.py +1 -1
  218. nat/experimental/test_time_compute/search/single_shot_multi_plan_planner.py +1 -1
  219. nat/experimental/test_time_compute/selection/best_of_n_selector.py +1 -1
  220. nat/experimental/test_time_compute/selection/llm_based_agent_output_selector.py +1 -1
  221. nat/experimental/test_time_compute/selection/llm_based_output_merging_selector.py +1 -1
  222. nat/experimental/test_time_compute/selection/llm_based_plan_selector.py +1 -1
  223. nat/experimental/test_time_compute/selection/llm_judge_selection.py +127 -0
  224. nat/experimental/test_time_compute/selection/threshold_selector.py +1 -1
  225. nat/finetuning/__init__.py +24 -0
  226. nat/finetuning/finetuning_runtime.py +143 -0
  227. nat/finetuning/interfaces/__init__.py +24 -0
  228. nat/finetuning/interfaces/finetuning_runner.py +261 -0
  229. nat/finetuning/interfaces/trainer_adapter.py +103 -0
  230. nat/finetuning/interfaces/trajectory_builder.py +115 -0
  231. nat/finetuning/utils/__init__.py +15 -0
  232. nat/finetuning/utils/parsers/__init__.py +15 -0
  233. nat/finetuning/utils/parsers/adk_parser.py +141 -0
  234. nat/finetuning/utils/parsers/base_parser.py +238 -0
  235. nat/finetuning/utils/parsers/common.py +91 -0
  236. nat/finetuning/utils/parsers/langchain_parser.py +267 -0
  237. nat/finetuning/utils/parsers/llama_index_parser.py +218 -0
  238. nat/front_ends/__init__.py +1 -1
  239. nat/front_ends/console/__init__.py +1 -1
  240. nat/front_ends/console/authentication_flow_handler.py +1 -1
  241. nat/front_ends/console/console_front_end_config.py +4 -1
  242. nat/front_ends/console/console_front_end_plugin.py +5 -4
  243. nat/front_ends/console/register.py +1 -1
  244. nat/front_ends/cron/__init__.py +1 -1
  245. nat/front_ends/fastapi/__init__.py +1 -1
  246. nat/front_ends/fastapi/async_job.py +128 -0
  247. nat/front_ends/fastapi/auth_flow_handlers/http_flow_handler.py +1 -1
  248. nat/front_ends/fastapi/auth_flow_handlers/websocket_flow_handler.py +13 -9
  249. nat/front_ends/fastapi/dask_client_mixin.py +1 -1
  250. nat/front_ends/fastapi/fastapi_front_end_config.py +23 -1
  251. nat/front_ends/fastapi/fastapi_front_end_controller.py +1 -1
  252. nat/front_ends/fastapi/fastapi_front_end_plugin.py +25 -30
  253. nat/front_ends/fastapi/fastapi_front_end_plugin_worker.py +318 -59
  254. nat/front_ends/fastapi/html_snippets/__init__.py +1 -1
  255. nat/front_ends/fastapi/html_snippets/auth_code_grant_success.py +1 -1
  256. nat/front_ends/fastapi/intermediate_steps_subscriber.py +12 -1
  257. nat/front_ends/fastapi/job_store.py +23 -11
  258. nat/front_ends/fastapi/main.py +1 -1
  259. nat/front_ends/fastapi/message_handler.py +27 -4
  260. nat/front_ends/fastapi/message_validator.py +54 -2
  261. nat/front_ends/fastapi/register.py +1 -1
  262. nat/front_ends/fastapi/response_helpers.py +16 -15
  263. nat/front_ends/fastapi/step_adaptor.py +1 -1
  264. nat/front_ends/fastapi/utils.py +1 -1
  265. nat/front_ends/register.py +1 -2
  266. nat/front_ends/simple_base/__init__.py +1 -1
  267. nat/front_ends/simple_base/simple_front_end_plugin_base.py +6 -4
  268. nat/llm/aws_bedrock_llm.py +1 -1
  269. nat/llm/azure_openai_llm.py +10 -1
  270. nat/llm/dynamo_llm.py +363 -0
  271. nat/llm/huggingface_llm.py +177 -0
  272. nat/llm/litellm_llm.py +1 -1
  273. nat/llm/nim_llm.py +1 -1
  274. nat/llm/openai_llm.py +1 -1
  275. nat/llm/register.py +3 -1
  276. nat/llm/utils/__init__.py +1 -1
  277. nat/llm/utils/env_config_value.py +1 -1
  278. nat/llm/utils/error.py +1 -1
  279. nat/llm/utils/thinking.py +1 -1
  280. nat/memory/__init__.py +1 -1
  281. nat/memory/interfaces.py +1 -1
  282. nat/memory/models.py +1 -1
  283. nat/meta/pypi.md +1 -1
  284. nat/middleware/__init__.py +35 -0
  285. nat/middleware/cache/__init__.py +14 -0
  286. nat/middleware/cache/cache_middleware.py +253 -0
  287. nat/middleware/cache/cache_middleware_config.py +44 -0
  288. nat/middleware/cache/register.py +33 -0
  289. nat/middleware/defense/__init__.py +14 -0
  290. nat/middleware/defense/defense_middleware.py +362 -0
  291. nat/middleware/defense/defense_middleware_content_guard.py +455 -0
  292. nat/middleware/defense/defense_middleware_data_models.py +91 -0
  293. nat/middleware/defense/defense_middleware_output_verifier.py +440 -0
  294. nat/middleware/defense/defense_middleware_pii.py +356 -0
  295. nat/middleware/defense/register.py +82 -0
  296. nat/middleware/dynamic/__init__.py +14 -0
  297. nat/middleware/dynamic/dynamic_function_middleware.py +962 -0
  298. nat/middleware/dynamic/dynamic_middleware_config.py +132 -0
  299. nat/middleware/dynamic/register.py +34 -0
  300. nat/middleware/function_middleware.py +370 -0
  301. nat/middleware/logging/__init__.py +14 -0
  302. nat/middleware/logging/logging_middleware.py +67 -0
  303. nat/middleware/logging/logging_middleware_config.py +28 -0
  304. nat/middleware/logging/register.py +33 -0
  305. nat/middleware/middleware.py +298 -0
  306. nat/middleware/red_teaming/__init__.py +14 -0
  307. nat/middleware/red_teaming/red_teaming_middleware.py +344 -0
  308. nat/middleware/red_teaming/red_teaming_middleware_config.py +112 -0
  309. nat/middleware/red_teaming/register.py +47 -0
  310. nat/middleware/register.py +22 -0
  311. nat/middleware/utils/__init__.py +14 -0
  312. nat/middleware/utils/workflow_inventory.py +155 -0
  313. nat/object_store/__init__.py +1 -1
  314. nat/object_store/in_memory_object_store.py +1 -1
  315. nat/object_store/interfaces.py +1 -1
  316. nat/object_store/models.py +1 -1
  317. nat/object_store/register.py +1 -1
  318. nat/observability/__init__.py +1 -1
  319. nat/observability/exporter/__init__.py +1 -1
  320. nat/observability/exporter/base_exporter.py +1 -1
  321. nat/observability/exporter/exporter.py +1 -1
  322. nat/observability/exporter/file_exporter.py +1 -1
  323. nat/observability/exporter/processing_exporter.py +1 -1
  324. nat/observability/exporter/raw_exporter.py +1 -1
  325. nat/observability/exporter/span_exporter.py +7 -1
  326. nat/observability/exporter_manager.py +1 -1
  327. nat/observability/mixin/__init__.py +1 -1
  328. nat/observability/mixin/batch_config_mixin.py +1 -1
  329. nat/observability/mixin/collector_config_mixin.py +1 -1
  330. nat/observability/mixin/file_mixin.py +1 -1
  331. nat/observability/mixin/file_mode.py +1 -1
  332. nat/observability/mixin/redaction_config_mixin.py +1 -1
  333. nat/observability/mixin/resource_conflict_mixin.py +1 -1
  334. nat/observability/mixin/serialize_mixin.py +1 -1
  335. nat/observability/mixin/tagging_config_mixin.py +1 -1
  336. nat/observability/mixin/type_introspection_mixin.py +1 -1
  337. nat/observability/processor/__init__.py +1 -1
  338. nat/observability/processor/batching_processor.py +1 -1
  339. nat/observability/processor/callback_processor.py +1 -1
  340. nat/observability/processor/falsy_batch_filter_processor.py +1 -1
  341. nat/observability/processor/intermediate_step_serializer.py +1 -1
  342. nat/observability/processor/processor.py +1 -1
  343. nat/observability/processor/processor_factory.py +1 -1
  344. nat/observability/processor/redaction/__init__.py +1 -1
  345. nat/observability/processor/redaction/contextual_redaction_processor.py +1 -1
  346. nat/observability/processor/redaction/contextual_span_redaction_processor.py +1 -1
  347. nat/observability/processor/redaction/redaction_processor.py +1 -1
  348. nat/observability/processor/redaction/span_header_redaction_processor.py +1 -1
  349. nat/observability/processor/span_tagging_processor.py +1 -1
  350. nat/observability/register.py +1 -1
  351. nat/observability/utils/__init__.py +1 -1
  352. nat/observability/utils/dict_utils.py +1 -1
  353. nat/observability/utils/time_utils.py +1 -1
  354. nat/profiler/calc/__init__.py +1 -1
  355. nat/profiler/calc/calc_runner.py +3 -3
  356. nat/profiler/calc/calculations.py +1 -1
  357. nat/profiler/calc/data_models.py +1 -1
  358. nat/profiler/calc/plot.py +30 -3
  359. nat/profiler/callbacks/agno_callback_handler.py +1 -1
  360. nat/profiler/callbacks/base_callback_class.py +1 -1
  361. nat/profiler/callbacks/langchain_callback_handler.py +33 -3
  362. nat/profiler/callbacks/llama_index_callback_handler.py +13 -10
  363. nat/profiler/callbacks/semantic_kernel_callback_handler.py +1 -1
  364. nat/profiler/callbacks/token_usage_base_model.py +1 -1
  365. nat/profiler/data_frame_row.py +1 -1
  366. nat/profiler/data_models.py +1 -1
  367. nat/profiler/decorators/framework_wrapper.py +32 -1
  368. nat/profiler/decorators/function_tracking.py +1 -1
  369. nat/profiler/forecasting/config.py +1 -1
  370. nat/profiler/forecasting/model_trainer.py +1 -1
  371. nat/profiler/forecasting/models/__init__.py +1 -1
  372. nat/profiler/forecasting/models/forecasting_base_model.py +1 -1
  373. nat/profiler/forecasting/models/linear_model.py +1 -1
  374. nat/profiler/forecasting/models/random_forest_regressor.py +1 -1
  375. nat/profiler/inference_metrics_model.py +1 -1
  376. nat/profiler/inference_optimization/bottleneck_analysis/nested_stack_analysis.py +1 -1
  377. nat/profiler/inference_optimization/bottleneck_analysis/simple_stack_analysis.py +1 -1
  378. nat/profiler/inference_optimization/data_models.py +1 -1
  379. nat/profiler/inference_optimization/experimental/concurrency_spike_analysis.py +1 -1
  380. nat/profiler/inference_optimization/experimental/prefix_span_analysis.py +1 -1
  381. nat/profiler/inference_optimization/llm_metrics.py +1 -1
  382. nat/profiler/inference_optimization/prompt_caching.py +1 -1
  383. nat/profiler/inference_optimization/token_uniqueness.py +1 -1
  384. nat/profiler/inference_optimization/workflow_runtimes.py +1 -1
  385. nat/profiler/intermediate_property_adapter.py +1 -1
  386. nat/profiler/parameter_optimization/optimizable_utils.py +1 -1
  387. nat/profiler/parameter_optimization/optimizer_runtime.py +1 -1
  388. nat/profiler/parameter_optimization/parameter_optimizer.py +1 -1
  389. nat/profiler/parameter_optimization/parameter_selection.py +1 -1
  390. nat/profiler/parameter_optimization/pareto_visualizer.py +1 -1
  391. nat/profiler/parameter_optimization/prompt_optimizer.py +1 -1
  392. nat/profiler/parameter_optimization/update_helpers.py +1 -1
  393. nat/profiler/profile_runner.py +1 -1
  394. nat/profiler/utils.py +1 -1
  395. nat/registry_handlers/local/local_handler.py +1 -1
  396. nat/registry_handlers/local/register_local.py +1 -1
  397. nat/registry_handlers/metadata_factory.py +1 -1
  398. nat/registry_handlers/package_utils.py +1 -1
  399. nat/registry_handlers/pypi/pypi_handler.py +1 -1
  400. nat/registry_handlers/pypi/register_pypi.py +1 -1
  401. nat/registry_handlers/register.py +1 -1
  402. nat/registry_handlers/registry_handler_base.py +1 -1
  403. nat/registry_handlers/rest/register_rest.py +1 -1
  404. nat/registry_handlers/rest/rest_handler.py +1 -1
  405. nat/registry_handlers/schemas/headers.py +1 -1
  406. nat/registry_handlers/schemas/package.py +1 -1
  407. nat/registry_handlers/schemas/publish.py +1 -1
  408. nat/registry_handlers/schemas/pull.py +1 -1
  409. nat/registry_handlers/schemas/remove.py +1 -1
  410. nat/registry_handlers/schemas/search.py +1 -1
  411. nat/registry_handlers/schemas/status.py +1 -1
  412. nat/retriever/interface.py +1 -1
  413. nat/retriever/milvus/__init__.py +1 -1
  414. nat/retriever/milvus/register.py +12 -4
  415. nat/retriever/milvus/retriever.py +103 -41
  416. nat/retriever/models.py +1 -1
  417. nat/retriever/nemo_retriever/__init__.py +1 -1
  418. nat/retriever/nemo_retriever/register.py +1 -1
  419. nat/retriever/nemo_retriever/retriever.py +5 -5
  420. nat/retriever/register.py +1 -1
  421. nat/runtime/__init__.py +1 -1
  422. nat/runtime/loader.py +10 -3
  423. nat/runtime/metrics.py +180 -0
  424. nat/runtime/runner.py +13 -6
  425. nat/runtime/session.py +458 -32
  426. nat/runtime/user_metadata.py +1 -1
  427. nat/settings/global_settings.py +1 -1
  428. nat/tool/chat_completion.py +1 -1
  429. nat/tool/code_execution/README.md +1 -1
  430. nat/tool/code_execution/code_sandbox.py +2 -2
  431. nat/tool/code_execution/local_sandbox/Dockerfile.sandbox +1 -1
  432. nat/tool/code_execution/local_sandbox/__init__.py +1 -1
  433. nat/tool/code_execution/local_sandbox/local_sandbox_server.py +1 -1
  434. nat/tool/code_execution/local_sandbox/start_local_sandbox.sh +1 -1
  435. nat/tool/code_execution/register.py +1 -1
  436. nat/tool/code_execution/utils.py +1 -1
  437. nat/tool/datetime_tools.py +1 -1
  438. nat/tool/document_search.py +1 -1
  439. nat/tool/github_tools.py +1 -1
  440. nat/tool/memory_tools/add_memory_tool.py +1 -1
  441. nat/tool/memory_tools/delete_memory_tool.py +1 -1
  442. nat/tool/memory_tools/get_memory_tool.py +1 -1
  443. nat/tool/nvidia_rag.py +2 -2
  444. nat/tool/register.py +1 -1
  445. nat/tool/retriever.py +1 -1
  446. nat/tool/server_tools.py +1 -1
  447. nat/utils/__init__.py +8 -5
  448. nat/utils/callable_utils.py +1 -1
  449. nat/utils/data_models/schema_validator.py +1 -1
  450. nat/utils/debugging_utils.py +1 -1
  451. nat/utils/decorators.py +1 -1
  452. nat/utils/dump_distro_mapping.py +1 -1
  453. nat/utils/exception_handlers/automatic_retries.py +3 -3
  454. nat/utils/exception_handlers/schemas.py +1 -1
  455. nat/utils/io/model_processing.py +1 -1
  456. nat/utils/io/supress_logs.py +33 -0
  457. nat/utils/io/yaml_tools.py +1 -1
  458. nat/utils/log_levels.py +1 -1
  459. nat/utils/log_utils.py +13 -1
  460. nat/utils/metadata_utils.py +1 -1
  461. nat/utils/optional_imports.py +1 -1
  462. nat/utils/producer_consumer_queue.py +1 -1
  463. nat/utils/reactive/base/observable_base.py +1 -1
  464. nat/utils/reactive/base/observer_base.py +1 -1
  465. nat/utils/reactive/base/subject_base.py +1 -1
  466. nat/utils/reactive/observable.py +1 -1
  467. nat/utils/reactive/observer.py +1 -1
  468. nat/utils/reactive/subject.py +1 -1
  469. nat/utils/reactive/subscription.py +1 -1
  470. nat/utils/responses_api.py +1 -1
  471. nat/utils/settings/global_settings.py +1 -1
  472. nat/utils/string_utils.py +1 -1
  473. nat/utils/type_converter.py +18 -5
  474. nat/utils/type_utils.py +1 -1
  475. nat/utils/url_utils.py +1 -1
  476. {nvidia_nat-1.4.0a20251112.dist-info → nvidia_nat-1.4.0a20260113.dist-info}/METADATA +46 -15
  477. nvidia_nat-1.4.0a20260113.dist-info/RECORD +547 -0
  478. nvidia_nat-1.4.0a20260113.dist-info/entry_points.txt +38 -0
  479. nat/cli/commands/mcp/mcp.py +0 -986
  480. nat/front_ends/mcp/introspection_token_verifier.py +0 -73
  481. nat/front_ends/mcp/mcp_front_end_config.py +0 -109
  482. nat/front_ends/mcp/mcp_front_end_plugin.py +0 -151
  483. nat/front_ends/mcp/mcp_front_end_plugin_worker.py +0 -362
  484. nat/front_ends/mcp/memory_profiler.py +0 -320
  485. nat/front_ends/mcp/register.py +0 -27
  486. nat/front_ends/mcp/tool_converter.py +0 -321
  487. nvidia_nat-1.4.0a20251112.dist-info/RECORD +0 -481
  488. nvidia_nat-1.4.0a20251112.dist-info/entry_points.txt +0 -22
  489. {nvidia_nat-1.4.0a20251112.dist-info → nvidia_nat-1.4.0a20260113.dist-info}/WHEEL +0 -0
  490. {nvidia_nat-1.4.0a20251112.dist-info → nvidia_nat-1.4.0a20260113.dist-info}/licenses/LICENSE-3rd-party.txt +0 -0
  491. {nvidia_nat-1.4.0a20251112.dist-info → nvidia_nat-1.4.0a20260113.dist-info}/licenses/LICENSE.md +0 -0
  492. {nvidia_nat-1.4.0a20251112.dist-info → nvidia_nat-1.4.0a20260113.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,385 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import typing
17
+ from collections.abc import Generator
18
+ from collections.abc import Sequence
19
+ from contextlib import contextmanager
20
+
21
+ from nat.authentication.interfaces import AuthProviderBase
22
+ from nat.builder.builder import Builder
23
+ from nat.builder.builder import UserManagerHolder
24
+ from nat.builder.builder import _current_builder_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.builder.sync_builder import SyncBuilder
29
+ from nat.data_models.authentication import AuthProviderBaseConfig
30
+ from nat.data_models.common import TypedBaseModel
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 MiddlewareRef
34
+ from nat.data_models.component_ref import TrainerAdapterRef
35
+ from nat.data_models.component_ref import TrainerRef
36
+ from nat.data_models.component_ref import TrajectoryBuilderRef
37
+ from nat.data_models.component_ref import TTCStrategyRef
38
+ from nat.data_models.embedder import EmbedderBaseConfig
39
+ from nat.data_models.finetuning import TrainerAdapterConfig
40
+ from nat.data_models.finetuning import TrainerConfig
41
+ from nat.data_models.finetuning import TrajectoryBuilderConfig
42
+ from nat.data_models.function import FunctionBaseConfig
43
+ from nat.data_models.function import FunctionGroupBaseConfig
44
+ from nat.data_models.function_dependencies import FunctionDependencies
45
+ from nat.data_models.llm import LLMBaseConfig
46
+ from nat.data_models.memory import MemoryBaseConfig
47
+ from nat.data_models.middleware import MiddlewareBaseConfig
48
+ from nat.data_models.object_store import ObjectStoreBaseConfig
49
+ from nat.data_models.retriever import RetrieverBaseConfig
50
+ from nat.data_models.ttc_strategy import TTCStrategyBaseConfig
51
+ from nat.experimental.decorators.experimental_warning_decorator import experimental
52
+ from nat.experimental.test_time_compute.models.stage_enums import PipelineTypeEnum
53
+ from nat.experimental.test_time_compute.models.stage_enums import StageTypeEnum
54
+ from nat.experimental.test_time_compute.models.strategy_base import StrategyBase
55
+ from nat.finetuning.interfaces.finetuning_runner import Trainer
56
+ from nat.finetuning.interfaces.trainer_adapter import TrainerAdapter
57
+ from nat.finetuning.interfaces.trajectory_builder import TrajectoryBuilder
58
+ from nat.memory.interfaces import MemoryEditor
59
+ from nat.middleware.middleware import Middleware
60
+ from nat.object_store.interfaces import ObjectStore
61
+ from nat.retriever.interface import Retriever
62
+ from nat.utils.type_utils import override
63
+
64
+
65
+ class ChildBuilder(Builder):
66
+
67
+ def __init__(self, workflow_builder: Builder) -> None:
68
+
69
+ self._workflow_builder = workflow_builder
70
+
71
+ self._dependencies = FunctionDependencies()
72
+
73
+ @override
74
+ @property
75
+ def sync_builder(self) -> SyncBuilder:
76
+ return SyncBuilder(self)
77
+
78
+ @property
79
+ def dependencies(self) -> FunctionDependencies:
80
+ return self._dependencies
81
+
82
+ @override
83
+ async def add_function(self, name: str, config: FunctionBaseConfig) -> Function:
84
+ return await self._workflow_builder.add_function(name, config)
85
+
86
+ @override
87
+ async def add_function_group(self, name: str, config: FunctionGroupBaseConfig) -> FunctionGroup:
88
+ return await self._workflow_builder.add_function_group(name, config)
89
+
90
+ @override
91
+ async def get_function(self, name: str) -> Function:
92
+ # If a function tries to get another function, we assume it uses it
93
+ fn = await self._workflow_builder.get_function(name)
94
+
95
+ self._dependencies.add_function(name)
96
+
97
+ return fn
98
+
99
+ @override
100
+ async def get_function_group(self, name: str) -> FunctionGroup:
101
+ # If a function tries to get a function group, we assume it uses it
102
+ function_group = await self._workflow_builder.get_function_group(name)
103
+
104
+ self._dependencies.add_function_group(name)
105
+
106
+ return function_group
107
+
108
+ @override
109
+ def get_function_config(self, name: str) -> FunctionBaseConfig:
110
+ return self._workflow_builder.get_function_config(name)
111
+
112
+ @override
113
+ def get_function_group_config(self, name: str) -> FunctionGroupBaseConfig:
114
+ return self._workflow_builder.get_function_group_config(name)
115
+
116
+ @override
117
+ async def set_workflow(self, config: FunctionBaseConfig) -> Function:
118
+ return await self._workflow_builder.set_workflow(config)
119
+
120
+ @override
121
+ def get_workflow(self) -> Function:
122
+ return self._workflow_builder.get_workflow()
123
+
124
+ @override
125
+ def get_workflow_config(self) -> FunctionBaseConfig:
126
+ return self._workflow_builder.get_workflow_config()
127
+
128
+ @override
129
+ async def get_tools(self,
130
+ tool_names: Sequence[str | FunctionRef | FunctionGroupRef],
131
+ wrapper_type: LLMFrameworkEnum | str) -> list[typing.Any]:
132
+ # Import here to avoid cyclic import
133
+ from nat.builder.per_user_workflow_builder import PerUserWorkflowBuilder
134
+ from nat.builder.workflow_builder import WorkflowBuilder
135
+
136
+ tools = await self._workflow_builder.get_tools(tool_names, wrapper_type)
137
+ for tool_name in tool_names:
138
+ if isinstance(self._workflow_builder, WorkflowBuilder):
139
+ function_groups = self._workflow_builder._function_groups
140
+ elif isinstance(self._workflow_builder, PerUserWorkflowBuilder):
141
+ # Per-user components can have dependencies on both shared and per-user function groups
142
+ function_groups = {
143
+ **self._workflow_builder._shared_builder._function_groups,
144
+ **self._workflow_builder._per_user_function_groups
145
+ }
146
+ else:
147
+ raise TypeError(f"Invalid workflow builder type: {type(self._workflow_builder)}")
148
+ if tool_name in function_groups:
149
+ self._dependencies.add_function_group(tool_name)
150
+ else:
151
+ self._dependencies.add_function(tool_name)
152
+ return tools
153
+
154
+ @override
155
+ async def get_tool(self, fn_name: str | FunctionRef, wrapper_type: LLMFrameworkEnum | str):
156
+ # If a function tries to get another function as a tool, we assume it uses it
157
+ fn = await self._workflow_builder.get_tool(fn_name, wrapper_type)
158
+
159
+ self._dependencies.add_function(fn_name)
160
+
161
+ return fn
162
+
163
+ @override
164
+ async def add_llm(self, name: str, config: LLMBaseConfig) -> None:
165
+ return await self._workflow_builder.add_llm(name, config)
166
+
167
+ @experimental(feature_name="Authentication")
168
+ @override
169
+ async def add_auth_provider(self, name: str, config: AuthProviderBaseConfig) -> AuthProviderBase:
170
+ return await self._workflow_builder.add_auth_provider(name, config)
171
+
172
+ @override
173
+ async def get_auth_provider(self, auth_provider_name: str):
174
+ return await self._workflow_builder.get_auth_provider(auth_provider_name)
175
+
176
+ @override
177
+ async def get_llm(self, llm_name: str, wrapper_type: LLMFrameworkEnum | str) -> typing.Any:
178
+ llm = await self._workflow_builder.get_llm(llm_name, wrapper_type)
179
+
180
+ self._dependencies.add_llm(llm_name)
181
+
182
+ return llm
183
+
184
+ @override
185
+ def get_llm_config(self, llm_name: str) -> LLMBaseConfig:
186
+ return self._workflow_builder.get_llm_config(llm_name)
187
+
188
+ @override
189
+ async def add_embedder(self, name: str, config: EmbedderBaseConfig) -> None:
190
+ await self._workflow_builder.add_embedder(name, config)
191
+
192
+ @override
193
+ async def get_embedder(self, embedder_name: str, wrapper_type: LLMFrameworkEnum | str) -> typing.Any:
194
+ embedder = await self._workflow_builder.get_embedder(embedder_name, wrapper_type)
195
+
196
+ self._dependencies.add_embedder(embedder_name)
197
+
198
+ return embedder
199
+
200
+ @override
201
+ def get_embedder_config(self, embedder_name: str) -> EmbedderBaseConfig:
202
+ return self._workflow_builder.get_embedder_config(embedder_name)
203
+
204
+ @override
205
+ async def add_memory_client(self, name: str, config: MemoryBaseConfig) -> MemoryEditor:
206
+ return await self._workflow_builder.add_memory_client(name, config)
207
+
208
+ @override
209
+ async def get_memory_client(self, memory_name: str) -> MemoryEditor:
210
+ """
211
+ Return the instantiated memory client for the given name.
212
+ """
213
+ memory_client = await self._workflow_builder.get_memory_client(memory_name)
214
+
215
+ self._dependencies.add_memory_client(memory_name)
216
+
217
+ return memory_client
218
+
219
+ @override
220
+ def get_memory_client_config(self, memory_name: str) -> MemoryBaseConfig:
221
+ return self._workflow_builder.get_memory_client_config(memory_name=memory_name)
222
+
223
+ @override
224
+ async def add_object_store(self, name: str, config: ObjectStoreBaseConfig):
225
+ return await self._workflow_builder.add_object_store(name, config)
226
+
227
+ @override
228
+ async def get_object_store_client(self, object_store_name: str) -> ObjectStore:
229
+ """
230
+ Return the instantiated object store client for the given name.
231
+ """
232
+ object_store_client = await self._workflow_builder.get_object_store_client(object_store_name)
233
+
234
+ self._dependencies.add_object_store(object_store_name)
235
+
236
+ return object_store_client
237
+
238
+ @override
239
+ def get_object_store_config(self, object_store_name: str) -> ObjectStoreBaseConfig:
240
+ return self._workflow_builder.get_object_store_config(object_store_name)
241
+
242
+ @override
243
+ @experimental(feature_name="Finetuning")
244
+ async def add_trainer(self, name: str | TrainerRef, config: TrainerConfig) -> Trainer:
245
+ return await self._workflow_builder.add_trainer(name, config)
246
+
247
+ @override
248
+ @experimental(feature_name="Finetuning")
249
+ async def add_trainer_adapter(self, name: str | TrainerAdapterRef, config: TrainerAdapterConfig) -> TrainerAdapter:
250
+ return await self._workflow_builder.add_trainer_adapter(name, config)
251
+
252
+ @override
253
+ @experimental(feature_name="Finetuning")
254
+ async def add_trajectory_builder(self, name: str | TrajectoryBuilderRef,
255
+ config: TrajectoryBuilderConfig) -> TrajectoryBuilder:
256
+ return await self._workflow_builder.add_trajectory_builder(name, config)
257
+
258
+ @override
259
+ async def get_trainer(self,
260
+ trainer_name: str | TrainerRef,
261
+ trajectory_builder: TrajectoryBuilder,
262
+ trainer_adapter: TrainerAdapter) -> Trainer:
263
+ return await self._workflow_builder.get_trainer(trainer_name, trajectory_builder, trainer_adapter)
264
+
265
+ @override
266
+ async def get_trainer_config(self, trainer_name: str | TrainerRef) -> TrainerConfig:
267
+ return await self._workflow_builder.get_trainer_config(trainer_name)
268
+
269
+ @override
270
+ async def get_trainer_adapter_config(self, trainer_adapter_name: str | TrainerAdapterRef) -> TrainerAdapterConfig:
271
+ return await self._workflow_builder.get_trainer_adapter_config(trainer_adapter_name)
272
+
273
+ @override
274
+ async def get_trajectory_builder_config(
275
+ self, trajectory_builder_name: str | TrajectoryBuilderRef) -> (TrajectoryBuilderConfig):
276
+ return await self._workflow_builder.get_trajectory_builder_config(trajectory_builder_name)
277
+
278
+ @override
279
+ async def get_trainer_adapter(self, trainer_adapter_name: str | TrainerAdapterRef) -> TrainerAdapter:
280
+ return await self._workflow_builder.get_trainer_adapter(trainer_adapter_name)
281
+
282
+ @override
283
+ async def get_trajectory_builder(self, trajectory_builder_name: str | TrajectoryBuilderRef) -> TrajectoryBuilder:
284
+ return await self._workflow_builder.get_trajectory_builder(trajectory_builder_name)
285
+
286
+ @override
287
+ @experimental(feature_name="TTC")
288
+ async def add_ttc_strategy(self, name: str, config: TTCStrategyBaseConfig) -> None:
289
+ await self._workflow_builder.add_ttc_strategy(name, config)
290
+
291
+ @override
292
+ async def get_ttc_strategy(self,
293
+ strategy_name: str | TTCStrategyRef,
294
+ pipeline_type: PipelineTypeEnum,
295
+ stage_type: StageTypeEnum) -> StrategyBase:
296
+ return await self._workflow_builder.get_ttc_strategy(strategy_name=strategy_name,
297
+ pipeline_type=pipeline_type,
298
+ stage_type=stage_type)
299
+
300
+ @override
301
+ async def get_ttc_strategy_config(self,
302
+ strategy_name: str | TTCStrategyRef,
303
+ pipeline_type: PipelineTypeEnum,
304
+ stage_type: StageTypeEnum) -> TTCStrategyBaseConfig:
305
+ return await self._workflow_builder.get_ttc_strategy_config(strategy_name=strategy_name,
306
+ pipeline_type=pipeline_type,
307
+ stage_type=stage_type)
308
+
309
+ @override
310
+ async def add_retriever(self, name: str, config: RetrieverBaseConfig) -> None:
311
+ await self._workflow_builder.add_retriever(name, config)
312
+
313
+ @override
314
+ async def get_retriever(self, retriever_name: str, wrapper_type: LLMFrameworkEnum | str | None = None) -> Retriever:
315
+ if not wrapper_type:
316
+ return await self._workflow_builder.get_retriever(retriever_name=retriever_name)
317
+ return await self._workflow_builder.get_retriever(retriever_name=retriever_name, wrapper_type=wrapper_type)
318
+
319
+ @override
320
+ async def get_retriever_config(self, retriever_name: str) -> RetrieverBaseConfig:
321
+ return await self._workflow_builder.get_retriever_config(retriever_name=retriever_name)
322
+
323
+ @override
324
+ def get_user_manager(self) -> UserManagerHolder:
325
+ return self._workflow_builder.get_user_manager()
326
+
327
+ @override
328
+ def get_function_dependencies(self, fn_name: str) -> FunctionDependencies:
329
+ return self._workflow_builder.get_function_dependencies(fn_name)
330
+
331
+ @override
332
+ def get_function_group_dependencies(self, fn_name: str) -> FunctionDependencies:
333
+ return self._workflow_builder.get_function_group_dependencies(fn_name)
334
+
335
+ @override
336
+ async def add_middleware(self, name: str | MiddlewareRef, config: MiddlewareBaseConfig) -> Middleware:
337
+ """Add middleware to the builder."""
338
+ return await self._workflow_builder.add_middleware(name, config)
339
+
340
+ @override
341
+ async def get_middleware(self, middleware_name: str | MiddlewareRef) -> Middleware:
342
+ """Get built middleware by name."""
343
+ return await self._workflow_builder.get_middleware(middleware_name)
344
+
345
+ @override
346
+ def get_middleware_config(self, middleware_name: str | MiddlewareRef) -> MiddlewareBaseConfig:
347
+ """Get the configuration for middleware."""
348
+ return self._workflow_builder.get_middleware_config(middleware_name)
349
+
350
+ @staticmethod
351
+ @contextmanager
352
+ def use(config: TypedBaseModel, builder: Builder) -> Generator["ChildBuilder", None, None]:
353
+ """
354
+ Context manager for temporarily setting the Builder object.
355
+
356
+ Parameters
357
+ ----------
358
+ config : TypedBaseModel
359
+ The configuration to use within the context. Note: Not used for now, but required by the interface
360
+ and will be used in the future.
361
+ builder : Builder
362
+ The Builder instance to use within the context.
363
+
364
+ Yields
365
+ ------
366
+ ChildBuilder
367
+ The Builder instance that was set.
368
+
369
+ Examples
370
+ --------
371
+ >>> with ChildBuilder.use(config, my_builder) as builder:
372
+ ... # builder is active in this context
373
+ ... assert Builder.current() == builder
374
+ >>> # Original builder is restored here
375
+
376
+ """
377
+
378
+ inner_builder = ChildBuilder(workflow_builder=builder)
379
+
380
+ previous = _current_builder_context.get()
381
+ _current_builder_context.set(inner_builder)
382
+ try:
383
+ yield inner_builder
384
+ finally:
385
+ _current_builder_context.set(previous)
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,18 +29,25 @@ from nat.data_models.component_ref import ComponentRefNode
29
29
  from nat.data_models.component_ref import generate_instance_id
30
30
  from nat.data_models.config import Config
31
31
  from nat.data_models.embedder import EmbedderBaseConfig
32
+ from nat.data_models.finetuning import TrainerAdapterConfig
33
+ from nat.data_models.finetuning import TrainerConfig
34
+ from nat.data_models.finetuning import TrajectoryBuilderConfig
32
35
  from nat.data_models.function import FunctionBaseConfig
33
36
  from nat.data_models.function import FunctionGroupBaseConfig
34
37
  from nat.data_models.llm import LLMBaseConfig
35
38
  from nat.data_models.memory import MemoryBaseConfig
39
+ from nat.data_models.middleware import MiddlewareBaseConfig
36
40
  from nat.data_models.object_store import ObjectStoreBaseConfig
37
41
  from nat.data_models.retriever import RetrieverBaseConfig
38
42
  from nat.data_models.ttc_strategy import TTCStrategyBaseConfig
39
43
  from nat.utils.type_utils import DecomposedType
40
44
 
45
+ WORKFLOW_COMPONENT_NAME = "<workflow>"
46
+
41
47
  logger = logging.getLogger(__name__)
42
48
 
43
49
  # Order in which we want to process the component groups
50
+ # IMPORTANT: MIDDLEWARE must be built before FUNCTIONS
44
51
  _component_group_order = [
45
52
  ComponentGroup.AUTHENTICATION,
46
53
  ComponentGroup.EMBEDDERS,
@@ -49,8 +56,12 @@ _component_group_order = [
49
56
  ComponentGroup.OBJECT_STORES,
50
57
  ComponentGroup.RETRIEVERS,
51
58
  ComponentGroup.TTC_STRATEGIES,
59
+ ComponentGroup.MIDDLEWARE,
52
60
  ComponentGroup.FUNCTION_GROUPS,
53
61
  ComponentGroup.FUNCTIONS,
62
+ ComponentGroup.TRAINER_ADAPTERS,
63
+ ComponentGroup.TRAJECTORY_BUILDERS,
64
+ ComponentGroup.TRAINERS
54
65
  ]
55
66
 
56
67
 
@@ -107,10 +118,18 @@ def group_from_component(component: TypedBaseModel) -> ComponentGroup | None:
107
118
  return ComponentGroup.AUTHENTICATION
108
119
  if (isinstance(component, EmbedderBaseConfig)):
109
120
  return ComponentGroup.EMBEDDERS
121
+ if (isinstance(component, TrainerConfig)):
122
+ return ComponentGroup.TRAINERS
123
+ if (isinstance(component, TrainerAdapterConfig)):
124
+ return ComponentGroup.TRAINER_ADAPTERS
125
+ if (isinstance(component, TrajectoryBuilderConfig)):
126
+ return ComponentGroup.TRAJECTORY_BUILDERS
110
127
  if (isinstance(component, FunctionBaseConfig)):
111
128
  return ComponentGroup.FUNCTIONS
112
129
  if (isinstance(component, FunctionGroupBaseConfig)):
113
130
  return ComponentGroup.FUNCTION_GROUPS
131
+ if (isinstance(component, MiddlewareBaseConfig)):
132
+ return ComponentGroup.MIDDLEWARE
114
133
  if (isinstance(component, LLMBaseConfig)):
115
134
  return ComponentGroup.LLMS
116
135
  if (isinstance(component, MemoryBaseConfig)):
@@ -158,7 +177,16 @@ def recursive_componentref_discovery(cls: TypedBaseModel, value: typing.Any,
158
177
  yield from recursive_componentref_discovery(cls, field_data, field_info.annotation)
159
178
  if (decomposed_type.is_union):
160
179
  for arg in decomposed_type.args:
161
- if arg is typing.Any or DecomposedType(arg).is_instance(value):
180
+ # Check if value matches this union arg type
181
+ # TypedDict and some other types don't support isinstance checks,
182
+ # so we catch the TypeError and skip them
183
+ try:
184
+ is_match = arg is typing.Any or DecomposedType(arg).is_instance(value)
185
+ except TypeError:
186
+ # Skip types that don't support isinstance (e.g., TypedDict)
187
+ continue
188
+
189
+ if is_match:
162
190
  yield from recursive_componentref_discovery(cls, value, arg)
163
191
  else:
164
192
  for arg in decomposed_type.args:
@@ -236,7 +264,7 @@ def config_to_dependency_objects(config: "Config") -> tuple[dict[str, ComponentI
236
264
  dependency_map[workflow_instance_id] = ComponentInstanceData(
237
265
  component_group=ComponentGroup.FUNCTIONS,
238
266
  instance_id=workflow_instance_id,
239
- name="<workflow>", # type: ignore
267
+ name=WORKFLOW_COMPONENT_NAME, # type: ignore
240
268
  config=config.workflow,
241
269
  is_root=True)
242
270
 
@@ -260,7 +288,9 @@ def build_dependency_sequence(config: "Config") -> list[ComponentInstanceData]:
260
288
 
261
289
  total_node_count = (len(config.embedders) + len(config.functions) + len(config.function_groups) + len(config.llms) +
262
290
  len(config.memory) + len(config.object_stores) + len(config.retrievers) +
263
- len(config.ttc_strategies) + len(config.authentication) + 1) # +1 for the workflow
291
+ len(config.ttc_strategies) + len(config.authentication) + len(config.middleware) +
292
+ len(config.trainers) + len(config.trajectory_builders) + len(config.trainer_adapters) + 1
293
+ ) # +1 for the workflow
264
294
 
265
295
  dependency_map: dict
266
296
  dependency_graph: nx.DiGraph
nat/builder/context.py CHANGED
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -34,6 +34,7 @@ from nat.data_models.intermediate_step import IntermediateStepType
34
34
  from nat.data_models.intermediate_step import StreamEventData
35
35
  from nat.data_models.intermediate_step import TraceMetadata
36
36
  from nat.data_models.invocation_node import InvocationNode
37
+ from nat.data_models.runtime_enum import RuntimeTypeEnum
37
38
  from nat.runtime.user_metadata import RequestAttributes
38
39
  from nat.utils.reactive.subject import Subject
39
40
 
@@ -68,10 +69,14 @@ class ContextState(metaclass=Singleton):
68
69
  def __init__(self):
69
70
  self.conversation_id: ContextVar[str | None] = ContextVar("conversation_id", default=None)
70
71
  self.user_message_id: ContextVar[str | None] = ContextVar("user_message_id", default=None)
72
+ self.user_id: ContextVar[str | None] = ContextVar("user_id", default=None)
71
73
  self.workflow_run_id: ContextVar[str | None] = ContextVar("workflow_run_id", default=None)
72
74
  self.workflow_trace_id: ContextVar[int | None] = ContextVar("workflow_trace_id", default=None)
75
+ self.observability_trace_id: ContextVar[str | None] = ContextVar("observability_trace_id", default=None)
73
76
  self.input_message: ContextVar[typing.Any] = ContextVar("input_message", default=None)
74
77
  self.user_manager: ContextVar[typing.Any] = ContextVar("user_manager", default=None)
78
+ self.runtime_type: ContextVar[RuntimeTypeEnum] = ContextVar("runtime_type",
79
+ default=RuntimeTypeEnum.RUN_OR_SERVE)
75
80
  self._metadata: ContextVar[RequestAttributes | None] = ContextVar("request_attributes", default=None)
76
81
  self._event_stream: ContextVar[Subject[IntermediateStep] | None] = ContextVar("event_stream", default=None)
77
82
  self._active_function: ContextVar[InvocationNode | None] = ContextVar("active_function", default=None)
@@ -199,6 +204,13 @@ class Context:
199
204
  """
200
205
  return self._context_state.user_message_id.get()
201
206
 
207
+ @property
208
+ def user_id(self) -> str | None:
209
+ """
210
+ This property retrieves the user ID which is the unique identifier for the current user.
211
+ """
212
+ return self._context_state.user_id.get()
213
+
202
214
  @property
203
215
  def workflow_run_id(self) -> str | None:
204
216
  """
@@ -213,6 +225,13 @@ class Context:
213
225
  """
214
226
  return self._context_state.workflow_trace_id.get()
215
227
 
228
+ @property
229
+ def observability_trace_id(self) -> str | None:
230
+ """
231
+ Returns the root observability trace identifier for the current run.
232
+ """
233
+ return self._context_state.observability_trace_id.get()
234
+
216
235
  @contextmanager
217
236
  def push_active_function(self,
218
237
  function_name: str,
@@ -302,6 +321,20 @@ class Context:
302
321
  raise RuntimeError("User authentication callback is not set in the context.")
303
322
  return callback
304
323
 
324
+ @property
325
+ def is_evaluating(self) -> bool:
326
+ """
327
+ Indicates whether the current context is in evaluation mode.
328
+
329
+ This property checks the context state to determine if the current
330
+ operation is being performed in evaluation mode. It returns a boolean
331
+ value indicating the evaluation status.
332
+
333
+ Returns:
334
+ bool: True if in evaluation mode, False otherwise.
335
+ """
336
+ return self._context_state.runtime_type.get() == RuntimeTypeEnum.EVALUATE
337
+
305
338
  @staticmethod
306
339
  def get() -> "Context":
307
340
  """
nat/builder/embedder.py CHANGED
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,7 +22,9 @@ from pathlib import Path
22
22
  from nat.builder.builder import EvalBuilder
23
23
  from nat.builder.evaluator import EvaluatorInfo
24
24
  from nat.builder.framework_enum import LLMFrameworkEnum
25
+ from nat.builder.function import FunctionGroup
25
26
  from nat.builder.workflow_builder import WorkflowBuilder
27
+ from nat.builder.workflow_builder import _log_build_failure
26
28
  from nat.cli.type_registry import TypeRegistry
27
29
  from nat.data_models.config import Config
28
30
  from nat.data_models.config import GeneralConfig
@@ -95,6 +97,16 @@ class WorkflowEvalBuilder(WorkflowBuilder, EvalBuilder):
95
97
  tool_wrapper_reg = self._registry.get_tool_wrapper(llm_framework=wrapper_type)
96
98
 
97
99
  async def get_tool(fn_name: str):
100
+ # Maintain backwards compatibility with the old function group name format
101
+ new_fn_name = fn_name.replace(FunctionGroup.LEGACY_SEPARATOR, FunctionGroup.SEPARATOR)
102
+ if (fn_name not in self._functions) and (new_fn_name in self._functions):
103
+ logger.warning(
104
+ f"Function `{fn_name}` is deprecated and will be removed in a future release." + \
105
+ f"Use `{new_fn_name}` instead."
106
+ )
107
+ fn_name = new_fn_name
108
+ # end of backwards compatibility check
109
+
98
110
  fn = await self.get_function(fn_name)
99
111
  try:
100
112
  return tool_wrapper_reg.build_fn(fn_name, fn, self)
@@ -124,12 +136,12 @@ class WorkflowEvalBuilder(WorkflowBuilder, EvalBuilder):
124
136
  completed_components = [(name, "evaluator") for name in completed_evaluators]
125
137
  remaining_components = [(name, "evaluator") for name in remaining_evaluators]
126
138
 
127
- # Use the inherited common logging method from WorkflowBuilder
128
- self._log_build_failure(failing_evaluator_name,
129
- "evaluator",
130
- completed_components,
131
- remaining_components,
132
- original_error)
139
+ # Use the common logging function from workflow_builder
140
+ _log_build_failure(failing_evaluator_name,
141
+ "evaluator",
142
+ completed_components,
143
+ remaining_components,
144
+ original_error)
133
145
 
134
146
  @override
135
147
  async def populate_builder(self, config: Config, skip_workflow: bool = False):
nat/builder/evaluator.py CHANGED
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,3 +23,5 @@ class LLMFrameworkEnum(str, Enum):
23
23
  SEMANTIC_KERNEL = "semantic_kernel"
24
24
  AGNO = "agno"
25
25
  ADK = "adk"
26
+ STRANDS = "strands"
27
+ AUTOGEN = "autogen"
nat/builder/front_end.py CHANGED
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");