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
nat/cli/type_registry.py CHANGED
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1
+ # SPDX-FileCopyrightText: Copyright (c) 2024-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,6 +22,7 @@ from contextlib import contextmanager
22
22
  from copy import deepcopy
23
23
  from functools import cached_property
24
24
  from logging import Handler
25
+ from typing import Self
25
26
 
26
27
  from pydantic import BaseModel
27
28
  from pydantic import ConfigDict
@@ -29,6 +30,7 @@ from pydantic import Field
29
30
  from pydantic import Tag
30
31
  from pydantic import computed_field
31
32
  from pydantic import field_validator
33
+ from pydantic import model_validator
32
34
 
33
35
  from nat.authentication.interfaces import AuthProviderBase
34
36
  from nat.builder.builder import Builder
@@ -52,6 +54,12 @@ from nat.data_models.embedder import EmbedderBaseConfig
52
54
  from nat.data_models.embedder import EmbedderBaseConfigT
53
55
  from nat.data_models.evaluator import EvaluatorBaseConfig
54
56
  from nat.data_models.evaluator import EvaluatorBaseConfigT
57
+ from nat.data_models.finetuning import TrainerAdapterConfig
58
+ from nat.data_models.finetuning import TrainerAdapterConfigT
59
+ from nat.data_models.finetuning import TrainerConfig
60
+ from nat.data_models.finetuning import TrainerConfigT
61
+ from nat.data_models.finetuning import TrajectoryBuilderConfig
62
+ from nat.data_models.finetuning import TrajectoryBuilderConfigT
55
63
  from nat.data_models.front_end import FrontEndBaseConfig
56
64
  from nat.data_models.front_end import FrontEndConfigT
57
65
  from nat.data_models.function import FunctionBaseConfig
@@ -64,6 +72,8 @@ from nat.data_models.logging import LoggingBaseConfig
64
72
  from nat.data_models.logging import LoggingMethodConfigT
65
73
  from nat.data_models.memory import MemoryBaseConfig
66
74
  from nat.data_models.memory import MemoryBaseConfigT
75
+ from nat.data_models.middleware import MiddlewareBaseConfig
76
+ from nat.data_models.middleware import MiddlewareBaseConfigT
67
77
  from nat.data_models.object_store import ObjectStoreBaseConfig
68
78
  from nat.data_models.object_store import ObjectStoreBaseConfigT
69
79
  from nat.data_models.registry_handler import RegistryHandlerBaseConfig
@@ -75,7 +85,11 @@ from nat.data_models.telemetry_exporter import TelemetryExporterConfigT
75
85
  from nat.data_models.ttc_strategy import TTCStrategyBaseConfig
76
86
  from nat.data_models.ttc_strategy import TTCStrategyBaseConfigT
77
87
  from nat.experimental.test_time_compute.models.strategy_base import StrategyBase
88
+ from nat.finetuning.interfaces.finetuning_runner import Trainer
89
+ from nat.finetuning.interfaces.trainer_adapter import TrainerAdapter
90
+ from nat.finetuning.interfaces.trajectory_builder import TrajectoryBuilder
78
91
  from nat.memory.interfaces import MemoryEditor
92
+ from nat.middleware.middleware import Middleware
79
93
  from nat.object_store.interfaces import ObjectStore
80
94
  from nat.observability.exporter.base_exporter import BaseExporter
81
95
  from nat.registry_handlers.registry_handler_base import AbstractRegistryHandler
@@ -86,9 +100,13 @@ AuthProviderBuildCallableT = Callable[[AuthProviderBaseConfigT, Builder], AsyncI
86
100
  EmbedderClientBuildCallableT = Callable[[EmbedderBaseConfigT, Builder], AsyncIterator[typing.Any]]
87
101
  EmbedderProviderBuildCallableT = Callable[[EmbedderBaseConfigT, Builder], AsyncIterator[EmbedderProviderInfo]]
88
102
  EvaluatorBuildCallableT = Callable[[EvaluatorBaseConfigT, EvalBuilder], AsyncIterator[EvaluatorInfo]]
103
+ TrainerBuildCallableT = Callable[[TrainerConfigT, Builder], AsyncIterator[Trainer]]
104
+ TrainerAdapterBuildCallableT = Callable[[TrainerAdapterConfigT, Builder], AsyncIterator[TrainerAdapter]]
105
+ TrajectoryBuilderBuildCallableT = Callable[[TrajectoryBuilderConfigT, Builder], AsyncIterator[TrajectoryBuilder]]
89
106
  FrontEndBuildCallableT = Callable[[FrontEndConfigT, Config], AsyncIterator[FrontEndBase]]
90
107
  FunctionBuildCallableT = Callable[[FunctionConfigT, Builder], AsyncIterator[FunctionInfo | Callable | FunctionBase]]
91
108
  FunctionGroupBuildCallableT = Callable[[FunctionGroupConfigT, Builder], AsyncIterator[FunctionGroup]]
109
+ MiddlewareBuildCallableT = Callable[[MiddlewareBaseConfigT, Builder], AsyncIterator[Middleware]]
92
110
  TTCStrategyBuildCallableT = Callable[[TTCStrategyBaseConfigT, Builder], AsyncIterator[StrategyBase]]
93
111
  LLMClientBuildCallableT = Callable[[LLMBaseConfigT, Builder], AsyncIterator[typing.Any]]
94
112
  LLMProviderBuildCallableT = Callable[[LLMBaseConfigT, Builder], AsyncIterator[LLMProviderInfo]]
@@ -107,11 +125,17 @@ EmbedderClientRegisteredCallableT = Callable[[EmbedderBaseConfigT, Builder], Abs
107
125
  EmbedderProviderRegisteredCallableT = Callable[[EmbedderBaseConfigT, Builder],
108
126
  AbstractAsyncContextManager[EmbedderProviderInfo]]
109
127
  EvaluatorRegisteredCallableT = Callable[[EvaluatorBaseConfigT, EvalBuilder], AbstractAsyncContextManager[EvaluatorInfo]]
128
+ TrainerRegisteredCallableT = Callable[[TrainerConfigT, Builder], AbstractAsyncContextManager[Trainer]]
129
+ TrainerAdapterRegisteredCallableT = Callable[[TrainerAdapterConfigT, Builder],
130
+ AbstractAsyncContextManager[TrainerAdapter]]
131
+ TrajectoryBuilderRegisteredCallableT = Callable[[TrajectoryBuilderConfigT, Builder],
132
+ AbstractAsyncContextManager[TrajectoryBuilder]]
110
133
  FrontEndRegisteredCallableT = Callable[[FrontEndConfigT, Config], AbstractAsyncContextManager[FrontEndBase]]
111
134
  FunctionRegisteredCallableT = Callable[[FunctionConfigT, Builder],
112
135
  AbstractAsyncContextManager[FunctionInfo | Callable | FunctionBase]]
113
136
  FunctionGroupRegisteredCallableT = Callable[[FunctionGroupConfigT, Builder], AbstractAsyncContextManager[FunctionGroup]]
114
- TTCStrategyRegisterCallableT = Callable[[TTCStrategyBaseConfigT, Builder], AbstractAsyncContextManager[StrategyBase]]
137
+ MiddlewareRegisteredCallableT = Callable[[MiddlewareBaseConfigT, Builder], AbstractAsyncContextManager[Middleware]]
138
+ TTCStrategyRegisteredCallableT = Callable[[TTCStrategyBaseConfigT, Builder], AbstractAsyncContextManager[StrategyBase]]
115
139
  LLMClientRegisteredCallableT = Callable[[LLMBaseConfigT, Builder], AbstractAsyncContextManager[typing.Any]]
116
140
  LLMProviderRegisteredCallableT = Callable[[LLMBaseConfigT, Builder], AbstractAsyncContextManager[LLMProviderInfo]]
117
141
  LoggingMethodRegisteredCallableT = Callable[[LoggingMethodConfigT, Builder], AbstractAsyncContextManager[typing.Any]]
@@ -133,6 +157,12 @@ class RegisteredInfo(BaseModel, typing.Generic[TypedBaseModelT]):
133
157
  config_type: type[TypedBaseModelT]
134
158
  discovery_metadata: DiscoveryMetadata = DiscoveryMetadata()
135
159
 
160
+ is_per_user: bool = Field(default=False,
161
+ description="Whether the component is per-user. Default to False. If True, "
162
+ "each user will have their own separate instance of the component. The per-user "
163
+ "component instance will be lazily built on user's first invocation. If False, the "
164
+ "component instance will be shared across all users.")
165
+
136
166
  @computed_field
137
167
  @cached_property
138
168
  def module_name(self) -> str:
@@ -164,6 +194,32 @@ class RegisteredLoggingMethod(RegisteredInfo[LoggingBaseConfig]):
164
194
  build_fn: LoggingMethodRegisteredCallableT = Field(repr=False)
165
195
 
166
196
 
197
+ class RegisteredTrainerInfo(RegisteredInfo[TrainerConfig]):
198
+ """
199
+ Represents a registered Trainer. Trainers are responsible for fine-tuning LLMs.
200
+ """
201
+
202
+ build_fn: TrainerRegisteredCallableT = Field(repr=False)
203
+
204
+
205
+ class RegisteredTrainerAdapterInfo(RegisteredInfo[TrainerAdapterConfig]):
206
+ """
207
+ Represents a registered Trainer Adapter. Trainer Adapters are responsible for adapting the training process to
208
+ different frameworks.
209
+ """
210
+
211
+ build_fn: TrainerAdapterRegisteredCallableT = Field(repr=False)
212
+
213
+
214
+ class RegisteredTrajectoryBuilderInfo(RegisteredInfo[TrajectoryBuilderConfig]):
215
+ """
216
+ Represents a registered Trajectory Builder. Trajectory Builders are responsible for building trajectories for
217
+ fine-tuning.
218
+ """
219
+
220
+ build_fn: TrajectoryBuilderRegisteredCallableT = Field(repr=False)
221
+
222
+
167
223
  class RegisteredFrontEndInfo(RegisteredInfo[FrontEndBaseConfig]):
168
224
  """
169
225
  Represents a registered front end. Front ends are the entry points to the workflow and are responsible for
@@ -179,9 +235,43 @@ class RegisteredFunctionInfo(RegisteredInfo[FunctionBaseConfig]):
179
235
  and a description.
180
236
  """
181
237
 
238
+ model_config = ConfigDict(frozen=True, arbitrary_types_allowed=True)
239
+
182
240
  build_fn: FunctionRegisteredCallableT = Field(repr=False)
183
241
  framework_wrappers: list[str] = Field(default_factory=list)
184
242
 
243
+ # Declared schemas for per-user functions which are lazy-loaded. Must be provided if is_per_user is True.
244
+ per_user_function_input_schema: type[BaseModel] | type[None] | None = Field(
245
+ default=None,
246
+ description="Declared input schema for per-user functions. Must be provided if is_per_user "
247
+ "is True. This is for enabling OpenAPI documentation generation without a concrete function instance.")
248
+ per_user_function_single_output_schema: type[BaseModel] | type[None] | None = Field(
249
+ default=None,
250
+ description="Declared single output schema for per-user functions. Must be provided if is_per_user "
251
+ "is True. This is for enabling OpenAPI documentation generation without a concrete function instance.")
252
+ per_user_function_streaming_output_schema: type[BaseModel] | type[None] | None = Field(
253
+ default=None,
254
+ description="Declared streaming output schema for per-user functions. Must be provided if is_per_user "
255
+ "is True. This is for enabling OpenAPI documentation generation without a concrete function instance.")
256
+
257
+ @model_validator(mode="after")
258
+ def validate_per_user_function_schema_declaration(self) -> Self:
259
+ """
260
+ Validate if the schemas are explicitly declared when is_per_user is True
261
+ """
262
+ if self.is_per_user:
263
+
264
+ if self.per_user_function_input_schema is None:
265
+ raise ValueError("per_user_function_input_schema must be provided if is_per_user is True")
266
+
267
+ if self.per_user_function_single_output_schema is None and \
268
+ self.per_user_function_streaming_output_schema is None:
269
+ raise ValueError(
270
+ "per_user_function_single_output_schema or per_user_function_streaming_output_schema must be "
271
+ "provided if is_per_user is True")
272
+
273
+ return self
274
+
185
275
 
186
276
  class RegisteredFunctionGroupInfo(RegisteredInfo[FunctionGroupBaseConfig]):
187
277
  """
@@ -193,6 +283,15 @@ class RegisteredFunctionGroupInfo(RegisteredInfo[FunctionGroupBaseConfig]):
193
283
  framework_wrappers: list[str] = Field(default_factory=list)
194
284
 
195
285
 
286
+ class RegisteredMiddlewareInfo(RegisteredInfo[MiddlewareBaseConfig]):
287
+ """
288
+ Represents registered middleware. Middleware provides middleware-style wrapping of
289
+ calls with preprocessing and postprocessing logic.
290
+ """
291
+
292
+ build_fn: MiddlewareRegisteredCallableT = Field(repr=False)
293
+
294
+
196
295
  class RegisteredLLMProviderInfo(RegisteredInfo[LLMBaseConfig]):
197
296
  """
198
297
  Represents a registered LLM provider. LLM Providers are the operators of the LLMs. i.e. NIMs, OpenAI, Anthropic,
@@ -268,7 +367,7 @@ class RegisteredTTCStrategyInfo(RegisteredInfo[TTCStrategyBaseConfig]):
268
367
  Represents a registered TTC strategy.
269
368
  """
270
369
 
271
- build_fn: TTCStrategyRegisterCallableT = Field(repr=False)
370
+ build_fn: TTCStrategyRegisteredCallableT = Field(repr=False)
272
371
 
273
372
 
274
373
  class RegisteredToolWrapper(BaseModel):
@@ -331,6 +430,9 @@ class TypeRegistry:
331
430
  # Function Groups
332
431
  self._registered_function_groups: dict[type[FunctionGroupBaseConfig], RegisteredFunctionGroupInfo] = {}
333
432
 
433
+ # Middleware
434
+ self._registered_middleware: dict[type[MiddlewareBaseConfig], RegisteredMiddlewareInfo] = {}
435
+
334
436
  # LLMs
335
437
  self._registered_llm_provider_infos: dict[type[LLMBaseConfig], RegisteredLLMProviderInfo] = {}
336
438
  self._llm_client_provider_to_framework: dict[type[LLMBaseConfig], dict[str, RegisteredLLMClientInfo]] = {}
@@ -374,6 +476,12 @@ class TypeRegistry:
374
476
  # TTC Strategies
375
477
  self._registered_ttc_strategies: dict[type[TTCStrategyBaseConfig], RegisteredTTCStrategyInfo] = {}
376
478
 
479
+ # Registered training things
480
+ self._registered_trainer_infos: dict[type[TrainerConfig], RegisteredTrainerInfo] = {}
481
+ self._registered_trainer_adapter_infos: dict[type[TrainerAdapterConfig], RegisteredTrainerAdapterInfo] = {}
482
+ self._registered_trajectory_builder_infos: dict[type[TrajectoryBuilderConfig],
483
+ RegisteredTrajectoryBuilderInfo] = {}
484
+
377
485
  # Packages
378
486
  self._registered_packages: dict[str, RegisteredPackage] = {}
379
487
 
@@ -452,6 +560,65 @@ class TypeRegistry:
452
560
 
453
561
  return list(self._registered_logging_methods.values())
454
562
 
563
+ def register_trainer(self, registration: RegisteredTrainerInfo):
564
+
565
+ if (registration.config_type in self._registered_trainer_infos):
566
+ raise ValueError(f"A trainer with the same config type `{registration.config_type}` has already "
567
+ "been registered.")
568
+
569
+ self._registered_trainer_infos[registration.config_type] = registration
570
+
571
+ self._registration_changed()
572
+
573
+ def register_trainer_adapter(self, registration: RegisteredTrainerAdapterInfo):
574
+ if (registration.config_type in self._registered_trainer_adapter_infos):
575
+ raise ValueError(f"A trainer adapter with the same config type `{registration.config_type}` has already "
576
+ "been registered.")
577
+
578
+ self._registered_trainer_adapter_infos[registration.config_type] = registration
579
+
580
+ self._registration_changed()
581
+
582
+ def register_trajectory_builder(self, registration: RegisteredTrajectoryBuilderInfo):
583
+ if (registration.config_type in self._registered_trajectory_builder_infos):
584
+ raise ValueError(f"A trajectory builder with the same config type `{registration.config_type}` has already "
585
+ "been registered.")
586
+
587
+ self._registered_trajectory_builder_infos[registration.config_type] = registration
588
+
589
+ self._registration_changed()
590
+
591
+ def get_trainer(self, config_type: type[TrainerConfig]) -> RegisteredTrainerInfo:
592
+
593
+ try:
594
+ return self._registered_trainer_infos[config_type]
595
+ except KeyError as err:
596
+ raise KeyError(f"Could not find a registered trainer for config `{config_type}`. "
597
+ f"Registered configs: {set(self._registered_trainer_infos.keys())}") from err
598
+
599
+ def get_trainer_adapter(self, config_type: type[TrainerAdapterConfig]) -> RegisteredTrainerAdapterInfo:
600
+ try:
601
+ return self._registered_trainer_adapter_infos[config_type]
602
+ except KeyError as err:
603
+ raise KeyError(f"Could not find a registered trainer adapter for config `{config_type}`. "
604
+ f"Registered configs: {set(self._registered_trainer_adapter_infos.keys())}") from err
605
+
606
+ def get_trajectory_builder(self, config_type: type[TrajectoryBuilderConfig]) -> RegisteredTrajectoryBuilderInfo:
607
+ try:
608
+ return self._registered_trajectory_builder_infos[config_type]
609
+ except KeyError as err:
610
+ raise KeyError(f"Could not find a registered trajectory builder for config `{config_type}`. "
611
+ f"Registered configs: {set(self._registered_trajectory_builder_infos.keys())}") from err
612
+
613
+ def get_registered_trainers(self) -> list[RegisteredInfo[TrainerConfig]]:
614
+ return list(self._registered_trainer_infos.values())
615
+
616
+ def get_registered_trainer_adapters(self) -> list[RegisteredInfo[TrainerAdapterConfig]]:
617
+ return list(self._registered_trainer_adapter_infos.values())
618
+
619
+ def get_registered_trajectory_builders(self) -> list[RegisteredInfo[TrajectoryBuilderConfig]]:
620
+ return list(self._registered_trajectory_builder_infos.values())
621
+
455
622
  def register_front_end(self, registration: RegisteredFrontEndInfo):
456
623
 
457
624
  if (registration.config_type in self._registered_front_end_infos):
@@ -540,6 +707,49 @@ class TypeRegistry:
540
707
  """
541
708
  return list(self._registered_function_groups.values())
542
709
 
710
+ def register_middleware(self, registration: RegisteredMiddlewareInfo):
711
+ """Register middleware with the type registry.
712
+
713
+ Args:
714
+ registration: The middleware registration information
715
+
716
+ Raises:
717
+ ValueError: If middleware with the same config type is already registered
718
+ """
719
+ if (registration.config_type in self._registered_middleware):
720
+ raise ValueError(f"Middleware with the same config type `{registration.config_type}` has already been "
721
+ "registered.")
722
+
723
+ self._registered_middleware[registration.config_type] = registration
724
+
725
+ self._registration_changed()
726
+
727
+ def get_middleware(self, config_type: type[MiddlewareBaseConfig]) -> RegisteredMiddlewareInfo:
728
+ """Get registered middleware by its config type.
729
+
730
+ Args:
731
+ config_type: The middleware configuration type
732
+
733
+ Returns:
734
+ RegisteredMiddlewareInfo: The registered middleware information
735
+
736
+ Raises:
737
+ KeyError: If no middleware is registered for the given config type
738
+ """
739
+ try:
740
+ return self._registered_middleware[config_type]
741
+ except KeyError as err:
742
+ raise KeyError(f"Could not find registered middleware for config `{config_type}`. "
743
+ f"Registered configs: {set(self._registered_middleware.keys())}") from err
744
+
745
+ def get_registered_middleware(self) -> list[RegisteredInfo[MiddlewareBaseConfig]]:
746
+ """Get all registered middleware.
747
+
748
+ Returns:
749
+ list[RegisteredInfo[MiddlewareBaseConfig]]: List of all registered middleware
750
+ """
751
+ return list(self._registered_middleware.values())
752
+
543
753
  def register_llm_provider(self, info: RegisteredLLMProviderInfo):
544
754
 
545
755
  if (info.config_type in self._registered_llm_provider_infos):
@@ -912,6 +1122,18 @@ class TypeRegistry:
912
1122
  if component_type == ComponentEnum.TTC_STRATEGY:
913
1123
  return self._registered_ttc_strategies
914
1124
 
1125
+ if component_type == ComponentEnum.MIDDLEWARE:
1126
+ return self._registered_middleware
1127
+
1128
+ if component_type == ComponentEnum.TRAINER:
1129
+ return self._registered_trainer_infos
1130
+
1131
+ if component_type == ComponentEnum.TRAJECTORY_BUILDER:
1132
+ return self._registered_trajectory_builder_infos
1133
+
1134
+ if component_type == ComponentEnum.TRAINER_ADAPTER:
1135
+ return self._registered_trainer_adapter_infos
1136
+
915
1137
  raise ValueError(f"Supplied an unsupported component type {component_type}")
916
1138
 
917
1139
  def get_registered_types_by_component_type(self, component_type: ComponentEnum) -> list[str]:
@@ -1038,6 +1260,18 @@ class TypeRegistry:
1038
1260
  if issubclass(cls, TTCStrategyBaseConfig):
1039
1261
  return self._do_compute_annotation(cls, self.get_registered_ttc_strategies())
1040
1262
 
1263
+ if issubclass(cls, MiddlewareBaseConfig):
1264
+ return self._do_compute_annotation(cls, self.get_registered_middleware())
1265
+
1266
+ if issubclass(cls, TrainerConfig):
1267
+ return self._do_compute_annotation(cls, self.get_registered_trainers())
1268
+
1269
+ if issubclass(cls, TrainerAdapterConfig):
1270
+ return self._do_compute_annotation(cls, self.get_registered_trainer_adapters())
1271
+
1272
+ if issubclass(cls, TrajectoryBuilderConfig):
1273
+ return self._do_compute_annotation(cls, self.get_registered_trajectory_builders())
1274
+
1041
1275
  raise ValueError(f"Supplied an unsupported component type {cls}")
1042
1276
 
1043
1277
 
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1
+ # SPDX-FileCopyrightText: Copyright (c) 2024-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");
@@ -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");
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1
+ # SPDX-FileCopyrightText: Copyright (c) 2024-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");
@@ -32,6 +32,14 @@ from nat.utils.type_utils import DecomposedType
32
32
  logger = logging.getLogger(__name__)
33
33
 
34
34
 
35
+ class SequentialExecutorExit(Exception):
36
+ """Raised when a tool wants to exit the sequential executor chain early with a custom message."""
37
+
38
+ def __init__(self, message: str):
39
+ self.message = message
40
+ super().__init__(message)
41
+
42
+
35
43
  class ToolExecutionConfig(BaseModel):
36
44
  """Configuration for individual tool execution within sequential execution."""
37
45
 
@@ -41,6 +49,7 @@ class ToolExecutionConfig(BaseModel):
41
49
  class SequentialExecutorConfig(FunctionBaseConfig, name="sequential_executor"):
42
50
  """Configuration for sequential execution of a list of functions."""
43
51
 
52
+ description: str = Field(default="Sequential Executor Workflow", description="Description of this functions use.")
44
53
  tool_list: list[FunctionRef] = Field(default_factory=list,
45
54
  description="A list of functions to execute sequentially.")
46
55
  tool_execution_config: dict[str, ToolExecutionConfig] = Field(default_factory=dict,
@@ -54,6 +63,11 @@ class SequentialExecutorConfig(FunctionBaseConfig, name="sequential_executor"):
54
63
  "which means the output type of the previous function is compatible with the input type of the next function."
55
64
  "If set to True, any incompatibility will raise an exception. If set to false, the incompatibility will only"
56
65
  "generate a warning message and the sequential execution will continue.")
66
+ return_error_on_exception: bool = Field(
67
+ default=False,
68
+ description="If set to True, when an uncaught exception occurs during tool execution, the sequential executor "
69
+ "will exit early and return an error message as the workflow output instead of raising the exception. "
70
+ "If set to False (default), exceptions are re-raised.")
57
71
 
58
72
 
59
73
  def _get_function_output_type(function: Function, tool_execution_config: dict[str, ToolExecutionConfig]) -> type:
@@ -126,11 +140,11 @@ async def sequential_execution(config: SequentialExecutorConfig, builder: Builde
126
140
  raise ValueError(f"Error with the sequential executor tool list: {e}")
127
141
 
128
142
  # The type annotation of _sequential_function_execution is dynamically set according to the tool list
129
- async def _sequential_function_execution(initial_tool_input):
143
+ async def _sequential_function_execution(input_message):
130
144
  logger.debug(f"Executing sequential executor with tool list: {config.tool_list}")
131
145
 
132
146
  tool_list: list[FunctionRef] = config.tool_list
133
- tool_input = initial_tool_input
147
+ tool_input = input_message
134
148
  tool_response = None
135
149
 
136
150
  for tool_name in tool_list:
@@ -148,7 +162,16 @@ async def sequential_execution(config: SequentialExecutorConfig, builder: Builde
148
162
  tool_response = await tool.ainvoke(tool_input)
149
163
  else:
150
164
  tool_response = await tool.ainvoke(tool_input)
165
+ except SequentialExecutorExit as e:
166
+ # Tool explicitly requested early exit - always return the message
167
+ logger.info(f"Tool {tool_name} requested early exit: {e.message}")
168
+ return e.message
151
169
  except Exception as e:
170
+ if config.return_error_on_exception:
171
+ # Return error message as workflow output instead of raising exception
172
+ logger.exception(f"Error with tool {tool_name}, returning error message")
173
+ error_message = f"Error in {tool_name}: {type(e).__name__}: {str(e)}"
174
+ return error_message
152
175
  logger.error(f"Error with tool {tool_name}: {e}")
153
176
  raise
154
177
 
@@ -158,9 +181,7 @@ async def sequential_execution(config: SequentialExecutorConfig, builder: Builde
158
181
  return tool_response
159
182
 
160
183
  # Dynamically set the annotations for the function
161
- _sequential_function_execution.__annotations__ = {"initial_tool_input": input_type, "return": output_type}
184
+ _sequential_function_execution.__annotations__ = {"input_message": input_type, "return": output_type}
162
185
  logger.debug(f"Sequential executor function annotations: {_sequential_function_execution.__annotations__}")
163
186
 
164
- yield FunctionInfo.from_fn(_sequential_function_execution,
165
- description="Executes a list of functions sequentially."
166
- "The input of the next tool is the response of the previous tool.")
187
+ yield FunctionInfo.from_fn(_sequential_function_execution, description=config.description)
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1
+ # SPDX-FileCopyrightText: Copyright (c) 2024-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");
nat/data_models/agent.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) 2024-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");
@@ -24,7 +24,6 @@ from pydantic import BaseModel
24
24
  from pydantic import ConfigDict
25
25
  from pydantic import Discriminator
26
26
  from pydantic import Field
27
- from pydantic import HttpUrl
28
27
  from pydantic import conlist
29
28
  from pydantic import field_serializer
30
29
  from pydantic import field_validator
@@ -90,7 +89,8 @@ class AudioContent(BaseModel):
90
89
 
91
90
 
92
91
  class ImageUrl(BaseModel):
93
- url: HttpUrl = HttpUrl(url="http://default.com")
92
+ url: str = Field(default="http://default.com",
93
+ description="Either a URL of the image or the base64 encoded image data.")
94
94
 
95
95
 
96
96
  class ImageContent(BaseModel):
@@ -494,6 +494,18 @@ class ResponseIntermediateStep(ResponseBaseModelIntermediate):
494
494
  payload: str
495
495
 
496
496
 
497
+ class ResponseObservabilityTrace(BaseModel, ResponseSerializable):
498
+ """
499
+ ResponseObservabilityTrace is a data model that represents an observability trace event
500
+ sent once when the trace ID becomes available
501
+ """
502
+
503
+ observability_trace_id: str
504
+
505
+ def get_stream_data(self) -> str:
506
+ return f"observability_trace: {self.model_dump_json()}\n\n"
507
+
508
+
497
509
  class ResponsePayloadOutput(BaseModel, ResponseSerializable):
498
510
 
499
511
  payload: typing.Any
@@ -525,6 +537,7 @@ class WebSocketMessageType(str, Enum):
525
537
  INTERMEDIATE_STEP_MESSAGE = "system_intermediate_message"
526
538
  SYSTEM_INTERACTION_MESSAGE = "system_interaction_message"
527
539
  USER_INTERACTION_MESSAGE = "user_interaction_message"
540
+ OBSERVABILITY_TRACE_MESSAGE = "observability_trace_message"
528
541
  ERROR_MESSAGE = "error_message"
529
542
 
530
543
 
@@ -700,6 +713,28 @@ class WebSocketSystemInteractionMessage(BaseModel):
700
713
  timestamp: str = str(datetime.datetime.now(datetime.UTC))
701
714
 
702
715
 
716
+ class ObservabilityTraceContent(BaseModel):
717
+ model_config = ConfigDict(extra="forbid")
718
+ observability_trace_id: str
719
+
720
+
721
+ class WebSocketObservabilityTraceMessage(BaseModel):
722
+ """
723
+ WebSocket message for observability trace ID.
724
+ Sent once after the workflow completes to correlate the request with observability traces.
725
+ """
726
+ # Allow extra fields in the model_config to support derived models
727
+ model_config = ConfigDict(extra="allow")
728
+
729
+ type: typing.Literal[
730
+ WebSocketMessageType.OBSERVABILITY_TRACE_MESSAGE] = WebSocketMessageType.OBSERVABILITY_TRACE_MESSAGE
731
+ id: str = "default"
732
+ parent_id: str = "default"
733
+ conversation_id: str | None = None
734
+ content: ObservabilityTraceContent
735
+ timestamp: str = str(datetime.datetime.now(datetime.UTC))
736
+
737
+
703
738
  # ======== GenerateResponse Converters ========
704
739
 
705
740
 
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1
+ # SPDX-FileCopyrightText: Copyright (c) 2024-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");
nat/data_models/common.py CHANGED
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1
+ # SPDX-FileCopyrightText: Copyright (c) 2024-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");
@@ -28,6 +28,7 @@ class ComponentEnum(StrEnum):
28
28
  FRONT_END = "front_end"
29
29
  FUNCTION = "function"
30
30
  FUNCTION_GROUP = "function_group"
31
+ MIDDLEWARE = "middleware"
31
32
  TTC_STRATEGY = "ttc_strategy"
32
33
  LLM_CLIENT = "llm_client"
33
34
  LLM_PROVIDER = "llm_provider"
@@ -40,6 +41,9 @@ class ComponentEnum(StrEnum):
40
41
  RETRIEVER_PROVIDER = "retriever_provider"
41
42
  TOOL_WRAPPER = "tool_wrapper"
42
43
  TRACING = "tracing"
44
+ TRAINER = "trainer"
45
+ TRAJECTORY_BUILDER = "trajectory_builder"
46
+ TRAINER_ADAPTER = "trainer_adapter"
43
47
  UNDEFINED = "undefined"
44
48
 
45
49
 
@@ -49,11 +53,15 @@ class ComponentGroup(StrEnum):
49
53
  EMBEDDERS = "embedders"
50
54
  FUNCTIONS = "functions"
51
55
  FUNCTION_GROUPS = "function_groups"
56
+ MIDDLEWARE = "middleware"
52
57
  TTC_STRATEGIES = "ttc_strategies"
53
58
  LLMS = "llms"
54
59
  MEMORY = "memory"
55
60
  OBJECT_STORES = "object_stores"
56
61
  RETRIEVERS = "retrievers"
62
+ TRAINERS = "trainers"
63
+ TRAINER_ADAPTERS = "trainer_adapters"
64
+ TRAJECTORY_BUILDERS = "trajectory_builders"
57
65
 
58
66
 
59
67
  # Compatibility aliases with previous releases