nvidia-nat 1.1.0a20251020__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (480) hide show
  1. aiq/__init__.py +66 -0
  2. nat/agent/__init__.py +0 -0
  3. nat/agent/base.py +265 -0
  4. nat/agent/dual_node.py +72 -0
  5. nat/agent/prompt_optimizer/__init__.py +0 -0
  6. nat/agent/prompt_optimizer/prompt.py +68 -0
  7. nat/agent/prompt_optimizer/register.py +149 -0
  8. nat/agent/react_agent/__init__.py +0 -0
  9. nat/agent/react_agent/agent.py +394 -0
  10. nat/agent/react_agent/output_parser.py +104 -0
  11. nat/agent/react_agent/prompt.py +44 -0
  12. nat/agent/react_agent/register.py +168 -0
  13. nat/agent/reasoning_agent/__init__.py +0 -0
  14. nat/agent/reasoning_agent/reasoning_agent.py +227 -0
  15. nat/agent/register.py +23 -0
  16. nat/agent/rewoo_agent/__init__.py +0 -0
  17. nat/agent/rewoo_agent/agent.py +593 -0
  18. nat/agent/rewoo_agent/prompt.py +107 -0
  19. nat/agent/rewoo_agent/register.py +175 -0
  20. nat/agent/tool_calling_agent/__init__.py +0 -0
  21. nat/agent/tool_calling_agent/agent.py +246 -0
  22. nat/agent/tool_calling_agent/register.py +129 -0
  23. nat/authentication/__init__.py +14 -0
  24. nat/authentication/api_key/__init__.py +14 -0
  25. nat/authentication/api_key/api_key_auth_provider.py +96 -0
  26. nat/authentication/api_key/api_key_auth_provider_config.py +124 -0
  27. nat/authentication/api_key/register.py +26 -0
  28. nat/authentication/credential_validator/__init__.py +14 -0
  29. nat/authentication/credential_validator/bearer_token_validator.py +557 -0
  30. nat/authentication/exceptions/__init__.py +14 -0
  31. nat/authentication/exceptions/api_key_exceptions.py +38 -0
  32. nat/authentication/http_basic_auth/__init__.py +0 -0
  33. nat/authentication/http_basic_auth/http_basic_auth_provider.py +81 -0
  34. nat/authentication/http_basic_auth/register.py +30 -0
  35. nat/authentication/interfaces.py +96 -0
  36. nat/authentication/oauth2/__init__.py +14 -0
  37. nat/authentication/oauth2/oauth2_auth_code_flow_provider.py +140 -0
  38. nat/authentication/oauth2/oauth2_auth_code_flow_provider_config.py +39 -0
  39. nat/authentication/oauth2/oauth2_resource_server_config.py +124 -0
  40. nat/authentication/oauth2/register.py +25 -0
  41. nat/authentication/register.py +20 -0
  42. nat/builder/__init__.py +0 -0
  43. nat/builder/builder.py +317 -0
  44. nat/builder/component_utils.py +320 -0
  45. nat/builder/context.py +321 -0
  46. nat/builder/embedder.py +24 -0
  47. nat/builder/eval_builder.py +166 -0
  48. nat/builder/evaluator.py +29 -0
  49. nat/builder/framework_enum.py +25 -0
  50. nat/builder/front_end.py +73 -0
  51. nat/builder/function.py +714 -0
  52. nat/builder/function_base.py +380 -0
  53. nat/builder/function_info.py +625 -0
  54. nat/builder/intermediate_step_manager.py +206 -0
  55. nat/builder/llm.py +25 -0
  56. nat/builder/retriever.py +25 -0
  57. nat/builder/user_interaction_manager.py +78 -0
  58. nat/builder/workflow.py +160 -0
  59. nat/builder/workflow_builder.py +1365 -0
  60. nat/cli/__init__.py +14 -0
  61. nat/cli/cli_utils/__init__.py +0 -0
  62. nat/cli/cli_utils/config_override.py +231 -0
  63. nat/cli/cli_utils/validation.py +37 -0
  64. nat/cli/commands/__init__.py +0 -0
  65. nat/cli/commands/configure/__init__.py +0 -0
  66. nat/cli/commands/configure/channel/__init__.py +0 -0
  67. nat/cli/commands/configure/channel/add.py +28 -0
  68. nat/cli/commands/configure/channel/channel.py +34 -0
  69. nat/cli/commands/configure/channel/remove.py +30 -0
  70. nat/cli/commands/configure/channel/update.py +30 -0
  71. nat/cli/commands/configure/configure.py +33 -0
  72. nat/cli/commands/evaluate.py +139 -0
  73. nat/cli/commands/info/__init__.py +14 -0
  74. nat/cli/commands/info/info.py +47 -0
  75. nat/cli/commands/info/list_channels.py +32 -0
  76. nat/cli/commands/info/list_components.py +128 -0
  77. nat/cli/commands/mcp/__init__.py +14 -0
  78. nat/cli/commands/mcp/mcp.py +986 -0
  79. nat/cli/commands/object_store/__init__.py +14 -0
  80. nat/cli/commands/object_store/object_store.py +227 -0
  81. nat/cli/commands/optimize.py +90 -0
  82. nat/cli/commands/registry/__init__.py +14 -0
  83. nat/cli/commands/registry/publish.py +88 -0
  84. nat/cli/commands/registry/pull.py +118 -0
  85. nat/cli/commands/registry/registry.py +36 -0
  86. nat/cli/commands/registry/remove.py +108 -0
  87. nat/cli/commands/registry/search.py +153 -0
  88. nat/cli/commands/sizing/__init__.py +14 -0
  89. nat/cli/commands/sizing/calc.py +297 -0
  90. nat/cli/commands/sizing/sizing.py +27 -0
  91. nat/cli/commands/start.py +257 -0
  92. nat/cli/commands/uninstall.py +81 -0
  93. nat/cli/commands/validate.py +47 -0
  94. nat/cli/commands/workflow/__init__.py +14 -0
  95. nat/cli/commands/workflow/templates/__init__.py.j2 +0 -0
  96. nat/cli/commands/workflow/templates/config.yml.j2 +17 -0
  97. nat/cli/commands/workflow/templates/pyproject.toml.j2 +25 -0
  98. nat/cli/commands/workflow/templates/register.py.j2 +4 -0
  99. nat/cli/commands/workflow/templates/workflow.py.j2 +50 -0
  100. nat/cli/commands/workflow/workflow.py +37 -0
  101. nat/cli/commands/workflow/workflow_commands.py +403 -0
  102. nat/cli/entrypoint.py +141 -0
  103. nat/cli/main.py +60 -0
  104. nat/cli/register_workflow.py +522 -0
  105. nat/cli/type_registry.py +1069 -0
  106. nat/control_flow/__init__.py +0 -0
  107. nat/control_flow/register.py +20 -0
  108. nat/control_flow/router_agent/__init__.py +0 -0
  109. nat/control_flow/router_agent/agent.py +329 -0
  110. nat/control_flow/router_agent/prompt.py +48 -0
  111. nat/control_flow/router_agent/register.py +91 -0
  112. nat/control_flow/sequential_executor.py +166 -0
  113. nat/data_models/__init__.py +14 -0
  114. nat/data_models/agent.py +34 -0
  115. nat/data_models/api_server.py +843 -0
  116. nat/data_models/authentication.py +245 -0
  117. nat/data_models/common.py +171 -0
  118. nat/data_models/component.py +60 -0
  119. nat/data_models/component_ref.py +179 -0
  120. nat/data_models/config.py +434 -0
  121. nat/data_models/dataset_handler.py +169 -0
  122. nat/data_models/discovery_metadata.py +305 -0
  123. nat/data_models/embedder.py +27 -0
  124. nat/data_models/evaluate.py +130 -0
  125. nat/data_models/evaluator.py +26 -0
  126. nat/data_models/front_end.py +26 -0
  127. nat/data_models/function.py +64 -0
  128. nat/data_models/function_dependencies.py +80 -0
  129. nat/data_models/gated_field_mixin.py +242 -0
  130. nat/data_models/interactive.py +246 -0
  131. nat/data_models/intermediate_step.py +302 -0
  132. nat/data_models/invocation_node.py +38 -0
  133. nat/data_models/llm.py +27 -0
  134. nat/data_models/logging.py +26 -0
  135. nat/data_models/memory.py +27 -0
  136. nat/data_models/object_store.py +44 -0
  137. nat/data_models/optimizable.py +119 -0
  138. nat/data_models/optimizer.py +149 -0
  139. nat/data_models/profiler.py +54 -0
  140. nat/data_models/registry_handler.py +26 -0
  141. nat/data_models/retriever.py +30 -0
  142. nat/data_models/retry_mixin.py +35 -0
  143. nat/data_models/span.py +228 -0
  144. nat/data_models/step_adaptor.py +64 -0
  145. nat/data_models/streaming.py +33 -0
  146. nat/data_models/swe_bench_model.py +54 -0
  147. nat/data_models/telemetry_exporter.py +26 -0
  148. nat/data_models/temperature_mixin.py +44 -0
  149. nat/data_models/thinking_mixin.py +86 -0
  150. nat/data_models/top_p_mixin.py +44 -0
  151. nat/data_models/ttc_strategy.py +30 -0
  152. nat/embedder/__init__.py +0 -0
  153. nat/embedder/azure_openai_embedder.py +46 -0
  154. nat/embedder/nim_embedder.py +59 -0
  155. nat/embedder/openai_embedder.py +42 -0
  156. nat/embedder/register.py +22 -0
  157. nat/eval/__init__.py +14 -0
  158. nat/eval/config.py +62 -0
  159. nat/eval/dataset_handler/__init__.py +0 -0
  160. nat/eval/dataset_handler/dataset_downloader.py +106 -0
  161. nat/eval/dataset_handler/dataset_filter.py +52 -0
  162. nat/eval/dataset_handler/dataset_handler.py +431 -0
  163. nat/eval/evaluate.py +565 -0
  164. nat/eval/evaluator/__init__.py +14 -0
  165. nat/eval/evaluator/base_evaluator.py +77 -0
  166. nat/eval/evaluator/evaluator_model.py +58 -0
  167. nat/eval/intermediate_step_adapter.py +99 -0
  168. nat/eval/rag_evaluator/__init__.py +0 -0
  169. nat/eval/rag_evaluator/evaluate.py +178 -0
  170. nat/eval/rag_evaluator/register.py +143 -0
  171. nat/eval/register.py +26 -0
  172. nat/eval/remote_workflow.py +133 -0
  173. nat/eval/runners/__init__.py +14 -0
  174. nat/eval/runners/config.py +39 -0
  175. nat/eval/runners/multi_eval_runner.py +54 -0
  176. nat/eval/runtime_evaluator/__init__.py +14 -0
  177. nat/eval/runtime_evaluator/evaluate.py +123 -0
  178. nat/eval/runtime_evaluator/register.py +100 -0
  179. nat/eval/runtime_event_subscriber.py +52 -0
  180. nat/eval/swe_bench_evaluator/__init__.py +0 -0
  181. nat/eval/swe_bench_evaluator/evaluate.py +215 -0
  182. nat/eval/swe_bench_evaluator/register.py +36 -0
  183. nat/eval/trajectory_evaluator/__init__.py +0 -0
  184. nat/eval/trajectory_evaluator/evaluate.py +75 -0
  185. nat/eval/trajectory_evaluator/register.py +40 -0
  186. nat/eval/tunable_rag_evaluator/__init__.py +0 -0
  187. nat/eval/tunable_rag_evaluator/evaluate.py +242 -0
  188. nat/eval/tunable_rag_evaluator/register.py +52 -0
  189. nat/eval/usage_stats.py +41 -0
  190. nat/eval/utils/__init__.py +0 -0
  191. nat/eval/utils/eval_trace_ctx.py +89 -0
  192. nat/eval/utils/output_uploader.py +140 -0
  193. nat/eval/utils/tqdm_position_registry.py +40 -0
  194. nat/eval/utils/weave_eval.py +193 -0
  195. nat/experimental/__init__.py +0 -0
  196. nat/experimental/decorators/__init__.py +0 -0
  197. nat/experimental/decorators/experimental_warning_decorator.py +154 -0
  198. nat/experimental/test_time_compute/__init__.py +0 -0
  199. nat/experimental/test_time_compute/editing/__init__.py +0 -0
  200. nat/experimental/test_time_compute/editing/iterative_plan_refinement_editor.py +147 -0
  201. nat/experimental/test_time_compute/editing/llm_as_a_judge_editor.py +204 -0
  202. nat/experimental/test_time_compute/editing/motivation_aware_summarization.py +107 -0
  203. nat/experimental/test_time_compute/functions/__init__.py +0 -0
  204. nat/experimental/test_time_compute/functions/execute_score_select_function.py +105 -0
  205. nat/experimental/test_time_compute/functions/plan_select_execute_function.py +228 -0
  206. nat/experimental/test_time_compute/functions/ttc_tool_orchestration_function.py +205 -0
  207. nat/experimental/test_time_compute/functions/ttc_tool_wrapper_function.py +146 -0
  208. nat/experimental/test_time_compute/models/__init__.py +0 -0
  209. nat/experimental/test_time_compute/models/editor_config.py +132 -0
  210. nat/experimental/test_time_compute/models/scoring_config.py +112 -0
  211. nat/experimental/test_time_compute/models/search_config.py +120 -0
  212. nat/experimental/test_time_compute/models/selection_config.py +154 -0
  213. nat/experimental/test_time_compute/models/stage_enums.py +43 -0
  214. nat/experimental/test_time_compute/models/strategy_base.py +67 -0
  215. nat/experimental/test_time_compute/models/tool_use_config.py +41 -0
  216. nat/experimental/test_time_compute/models/ttc_item.py +48 -0
  217. nat/experimental/test_time_compute/register.py +35 -0
  218. nat/experimental/test_time_compute/scoring/__init__.py +0 -0
  219. nat/experimental/test_time_compute/scoring/llm_based_agent_scorer.py +168 -0
  220. nat/experimental/test_time_compute/scoring/llm_based_plan_scorer.py +168 -0
  221. nat/experimental/test_time_compute/scoring/motivation_aware_scorer.py +111 -0
  222. nat/experimental/test_time_compute/search/__init__.py +0 -0
  223. nat/experimental/test_time_compute/search/multi_llm_planner.py +128 -0
  224. nat/experimental/test_time_compute/search/multi_query_retrieval_search.py +122 -0
  225. nat/experimental/test_time_compute/search/single_shot_multi_plan_planner.py +128 -0
  226. nat/experimental/test_time_compute/selection/__init__.py +0 -0
  227. nat/experimental/test_time_compute/selection/best_of_n_selector.py +63 -0
  228. nat/experimental/test_time_compute/selection/llm_based_agent_output_selector.py +131 -0
  229. nat/experimental/test_time_compute/selection/llm_based_output_merging_selector.py +157 -0
  230. nat/experimental/test_time_compute/selection/llm_based_plan_selector.py +128 -0
  231. nat/experimental/test_time_compute/selection/threshold_selector.py +58 -0
  232. nat/front_ends/__init__.py +14 -0
  233. nat/front_ends/console/__init__.py +14 -0
  234. nat/front_ends/console/authentication_flow_handler.py +285 -0
  235. nat/front_ends/console/console_front_end_config.py +32 -0
  236. nat/front_ends/console/console_front_end_plugin.py +108 -0
  237. nat/front_ends/console/register.py +25 -0
  238. nat/front_ends/cron/__init__.py +14 -0
  239. nat/front_ends/fastapi/__init__.py +14 -0
  240. nat/front_ends/fastapi/auth_flow_handlers/__init__.py +0 -0
  241. nat/front_ends/fastapi/auth_flow_handlers/http_flow_handler.py +27 -0
  242. nat/front_ends/fastapi/auth_flow_handlers/websocket_flow_handler.py +142 -0
  243. nat/front_ends/fastapi/dask_client_mixin.py +65 -0
  244. nat/front_ends/fastapi/fastapi_front_end_config.py +272 -0
  245. nat/front_ends/fastapi/fastapi_front_end_controller.py +68 -0
  246. nat/front_ends/fastapi/fastapi_front_end_plugin.py +247 -0
  247. nat/front_ends/fastapi/fastapi_front_end_plugin_worker.py +1257 -0
  248. nat/front_ends/fastapi/html_snippets/__init__.py +14 -0
  249. nat/front_ends/fastapi/html_snippets/auth_code_grant_success.py +35 -0
  250. nat/front_ends/fastapi/intermediate_steps_subscriber.py +80 -0
  251. nat/front_ends/fastapi/job_store.py +602 -0
  252. nat/front_ends/fastapi/main.py +64 -0
  253. nat/front_ends/fastapi/message_handler.py +344 -0
  254. nat/front_ends/fastapi/message_validator.py +351 -0
  255. nat/front_ends/fastapi/register.py +25 -0
  256. nat/front_ends/fastapi/response_helpers.py +195 -0
  257. nat/front_ends/fastapi/step_adaptor.py +319 -0
  258. nat/front_ends/fastapi/utils.py +57 -0
  259. nat/front_ends/mcp/__init__.py +14 -0
  260. nat/front_ends/mcp/introspection_token_verifier.py +73 -0
  261. nat/front_ends/mcp/mcp_front_end_config.py +90 -0
  262. nat/front_ends/mcp/mcp_front_end_plugin.py +113 -0
  263. nat/front_ends/mcp/mcp_front_end_plugin_worker.py +268 -0
  264. nat/front_ends/mcp/memory_profiler.py +320 -0
  265. nat/front_ends/mcp/register.py +27 -0
  266. nat/front_ends/mcp/tool_converter.py +290 -0
  267. nat/front_ends/register.py +21 -0
  268. nat/front_ends/simple_base/__init__.py +14 -0
  269. nat/front_ends/simple_base/simple_front_end_plugin_base.py +56 -0
  270. nat/llm/__init__.py +0 -0
  271. nat/llm/aws_bedrock_llm.py +69 -0
  272. nat/llm/azure_openai_llm.py +57 -0
  273. nat/llm/litellm_llm.py +69 -0
  274. nat/llm/nim_llm.py +58 -0
  275. nat/llm/openai_llm.py +54 -0
  276. nat/llm/register.py +27 -0
  277. nat/llm/utils/__init__.py +14 -0
  278. nat/llm/utils/env_config_value.py +93 -0
  279. nat/llm/utils/error.py +17 -0
  280. nat/llm/utils/thinking.py +215 -0
  281. nat/memory/__init__.py +20 -0
  282. nat/memory/interfaces.py +183 -0
  283. nat/memory/models.py +112 -0
  284. nat/meta/pypi.md +58 -0
  285. nat/object_store/__init__.py +20 -0
  286. nat/object_store/in_memory_object_store.py +76 -0
  287. nat/object_store/interfaces.py +84 -0
  288. nat/object_store/models.py +38 -0
  289. nat/object_store/register.py +19 -0
  290. nat/observability/__init__.py +14 -0
  291. nat/observability/exporter/__init__.py +14 -0
  292. nat/observability/exporter/base_exporter.py +449 -0
  293. nat/observability/exporter/exporter.py +78 -0
  294. nat/observability/exporter/file_exporter.py +33 -0
  295. nat/observability/exporter/processing_exporter.py +550 -0
  296. nat/observability/exporter/raw_exporter.py +52 -0
  297. nat/observability/exporter/span_exporter.py +308 -0
  298. nat/observability/exporter_manager.py +335 -0
  299. nat/observability/mixin/__init__.py +14 -0
  300. nat/observability/mixin/batch_config_mixin.py +26 -0
  301. nat/observability/mixin/collector_config_mixin.py +23 -0
  302. nat/observability/mixin/file_mixin.py +288 -0
  303. nat/observability/mixin/file_mode.py +23 -0
  304. nat/observability/mixin/redaction_config_mixin.py +42 -0
  305. nat/observability/mixin/resource_conflict_mixin.py +134 -0
  306. nat/observability/mixin/serialize_mixin.py +61 -0
  307. nat/observability/mixin/tagging_config_mixin.py +62 -0
  308. nat/observability/mixin/type_introspection_mixin.py +496 -0
  309. nat/observability/processor/__init__.py +14 -0
  310. nat/observability/processor/batching_processor.py +308 -0
  311. nat/observability/processor/callback_processor.py +42 -0
  312. nat/observability/processor/falsy_batch_filter_processor.py +55 -0
  313. nat/observability/processor/intermediate_step_serializer.py +28 -0
  314. nat/observability/processor/processor.py +74 -0
  315. nat/observability/processor/processor_factory.py +70 -0
  316. nat/observability/processor/redaction/__init__.py +24 -0
  317. nat/observability/processor/redaction/contextual_redaction_processor.py +125 -0
  318. nat/observability/processor/redaction/contextual_span_redaction_processor.py +66 -0
  319. nat/observability/processor/redaction/redaction_processor.py +177 -0
  320. nat/observability/processor/redaction/span_header_redaction_processor.py +92 -0
  321. nat/observability/processor/span_tagging_processor.py +68 -0
  322. nat/observability/register.py +114 -0
  323. nat/observability/utils/__init__.py +14 -0
  324. nat/observability/utils/dict_utils.py +236 -0
  325. nat/observability/utils/time_utils.py +31 -0
  326. nat/plugins/.namespace +1 -0
  327. nat/profiler/__init__.py +0 -0
  328. nat/profiler/calc/__init__.py +14 -0
  329. nat/profiler/calc/calc_runner.py +626 -0
  330. nat/profiler/calc/calculations.py +288 -0
  331. nat/profiler/calc/data_models.py +188 -0
  332. nat/profiler/calc/plot.py +345 -0
  333. nat/profiler/callbacks/__init__.py +0 -0
  334. nat/profiler/callbacks/agno_callback_handler.py +295 -0
  335. nat/profiler/callbacks/base_callback_class.py +20 -0
  336. nat/profiler/callbacks/langchain_callback_handler.py +297 -0
  337. nat/profiler/callbacks/llama_index_callback_handler.py +205 -0
  338. nat/profiler/callbacks/semantic_kernel_callback_handler.py +238 -0
  339. nat/profiler/callbacks/token_usage_base_model.py +27 -0
  340. nat/profiler/data_frame_row.py +51 -0
  341. nat/profiler/data_models.py +24 -0
  342. nat/profiler/decorators/__init__.py +0 -0
  343. nat/profiler/decorators/framework_wrapper.py +180 -0
  344. nat/profiler/decorators/function_tracking.py +411 -0
  345. nat/profiler/forecasting/__init__.py +0 -0
  346. nat/profiler/forecasting/config.py +18 -0
  347. nat/profiler/forecasting/model_trainer.py +75 -0
  348. nat/profiler/forecasting/models/__init__.py +22 -0
  349. nat/profiler/forecasting/models/forecasting_base_model.py +42 -0
  350. nat/profiler/forecasting/models/linear_model.py +197 -0
  351. nat/profiler/forecasting/models/random_forest_regressor.py +269 -0
  352. nat/profiler/inference_metrics_model.py +28 -0
  353. nat/profiler/inference_optimization/__init__.py +0 -0
  354. nat/profiler/inference_optimization/bottleneck_analysis/__init__.py +0 -0
  355. nat/profiler/inference_optimization/bottleneck_analysis/nested_stack_analysis.py +460 -0
  356. nat/profiler/inference_optimization/bottleneck_analysis/simple_stack_analysis.py +258 -0
  357. nat/profiler/inference_optimization/data_models.py +386 -0
  358. nat/profiler/inference_optimization/experimental/__init__.py +0 -0
  359. nat/profiler/inference_optimization/experimental/concurrency_spike_analysis.py +468 -0
  360. nat/profiler/inference_optimization/experimental/prefix_span_analysis.py +404 -0
  361. nat/profiler/inference_optimization/llm_metrics.py +212 -0
  362. nat/profiler/inference_optimization/prompt_caching.py +163 -0
  363. nat/profiler/inference_optimization/token_uniqueness.py +107 -0
  364. nat/profiler/inference_optimization/workflow_runtimes.py +72 -0
  365. nat/profiler/intermediate_property_adapter.py +102 -0
  366. nat/profiler/parameter_optimization/__init__.py +0 -0
  367. nat/profiler/parameter_optimization/optimizable_utils.py +93 -0
  368. nat/profiler/parameter_optimization/optimizer_runtime.py +67 -0
  369. nat/profiler/parameter_optimization/parameter_optimizer.py +153 -0
  370. nat/profiler/parameter_optimization/parameter_selection.py +107 -0
  371. nat/profiler/parameter_optimization/pareto_visualizer.py +380 -0
  372. nat/profiler/parameter_optimization/prompt_optimizer.py +384 -0
  373. nat/profiler/parameter_optimization/update_helpers.py +66 -0
  374. nat/profiler/profile_runner.py +478 -0
  375. nat/profiler/utils.py +186 -0
  376. nat/registry_handlers/__init__.py +0 -0
  377. nat/registry_handlers/local/__init__.py +0 -0
  378. nat/registry_handlers/local/local_handler.py +176 -0
  379. nat/registry_handlers/local/register_local.py +37 -0
  380. nat/registry_handlers/metadata_factory.py +60 -0
  381. nat/registry_handlers/package_utils.py +570 -0
  382. nat/registry_handlers/pypi/__init__.py +0 -0
  383. nat/registry_handlers/pypi/pypi_handler.py +248 -0
  384. nat/registry_handlers/pypi/register_pypi.py +40 -0
  385. nat/registry_handlers/register.py +20 -0
  386. nat/registry_handlers/registry_handler_base.py +157 -0
  387. nat/registry_handlers/rest/__init__.py +0 -0
  388. nat/registry_handlers/rest/register_rest.py +56 -0
  389. nat/registry_handlers/rest/rest_handler.py +236 -0
  390. nat/registry_handlers/schemas/__init__.py +0 -0
  391. nat/registry_handlers/schemas/headers.py +42 -0
  392. nat/registry_handlers/schemas/package.py +68 -0
  393. nat/registry_handlers/schemas/publish.py +68 -0
  394. nat/registry_handlers/schemas/pull.py +82 -0
  395. nat/registry_handlers/schemas/remove.py +36 -0
  396. nat/registry_handlers/schemas/search.py +91 -0
  397. nat/registry_handlers/schemas/status.py +47 -0
  398. nat/retriever/__init__.py +0 -0
  399. nat/retriever/interface.py +41 -0
  400. nat/retriever/milvus/__init__.py +14 -0
  401. nat/retriever/milvus/register.py +81 -0
  402. nat/retriever/milvus/retriever.py +228 -0
  403. nat/retriever/models.py +77 -0
  404. nat/retriever/nemo_retriever/__init__.py +14 -0
  405. nat/retriever/nemo_retriever/register.py +60 -0
  406. nat/retriever/nemo_retriever/retriever.py +190 -0
  407. nat/retriever/register.py +21 -0
  408. nat/runtime/__init__.py +14 -0
  409. nat/runtime/loader.py +220 -0
  410. nat/runtime/runner.py +292 -0
  411. nat/runtime/session.py +223 -0
  412. nat/runtime/user_metadata.py +130 -0
  413. nat/settings/__init__.py +0 -0
  414. nat/settings/global_settings.py +329 -0
  415. nat/test/.namespace +1 -0
  416. nat/tool/__init__.py +0 -0
  417. nat/tool/chat_completion.py +77 -0
  418. nat/tool/code_execution/README.md +151 -0
  419. nat/tool/code_execution/__init__.py +0 -0
  420. nat/tool/code_execution/code_sandbox.py +267 -0
  421. nat/tool/code_execution/local_sandbox/.gitignore +1 -0
  422. nat/tool/code_execution/local_sandbox/Dockerfile.sandbox +60 -0
  423. nat/tool/code_execution/local_sandbox/__init__.py +13 -0
  424. nat/tool/code_execution/local_sandbox/local_sandbox_server.py +198 -0
  425. nat/tool/code_execution/local_sandbox/sandbox.requirements.txt +6 -0
  426. nat/tool/code_execution/local_sandbox/start_local_sandbox.sh +50 -0
  427. nat/tool/code_execution/register.py +74 -0
  428. nat/tool/code_execution/test_code_execution_sandbox.py +414 -0
  429. nat/tool/code_execution/utils.py +100 -0
  430. nat/tool/datetime_tools.py +82 -0
  431. nat/tool/document_search.py +141 -0
  432. nat/tool/github_tools.py +450 -0
  433. nat/tool/memory_tools/__init__.py +0 -0
  434. nat/tool/memory_tools/add_memory_tool.py +79 -0
  435. nat/tool/memory_tools/delete_memory_tool.py +66 -0
  436. nat/tool/memory_tools/get_memory_tool.py +72 -0
  437. nat/tool/nvidia_rag.py +95 -0
  438. nat/tool/register.py +31 -0
  439. nat/tool/retriever.py +95 -0
  440. nat/tool/server_tools.py +66 -0
  441. nat/utils/__init__.py +0 -0
  442. nat/utils/callable_utils.py +70 -0
  443. nat/utils/data_models/__init__.py +0 -0
  444. nat/utils/data_models/schema_validator.py +58 -0
  445. nat/utils/debugging_utils.py +43 -0
  446. nat/utils/decorators.py +210 -0
  447. nat/utils/dump_distro_mapping.py +32 -0
  448. nat/utils/exception_handlers/__init__.py +0 -0
  449. nat/utils/exception_handlers/automatic_retries.py +342 -0
  450. nat/utils/exception_handlers/schemas.py +114 -0
  451. nat/utils/io/__init__.py +0 -0
  452. nat/utils/io/model_processing.py +28 -0
  453. nat/utils/io/yaml_tools.py +119 -0
  454. nat/utils/log_levels.py +25 -0
  455. nat/utils/log_utils.py +37 -0
  456. nat/utils/metadata_utils.py +74 -0
  457. nat/utils/optional_imports.py +142 -0
  458. nat/utils/producer_consumer_queue.py +178 -0
  459. nat/utils/reactive/__init__.py +0 -0
  460. nat/utils/reactive/base/__init__.py +0 -0
  461. nat/utils/reactive/base/observable_base.py +65 -0
  462. nat/utils/reactive/base/observer_base.py +55 -0
  463. nat/utils/reactive/base/subject_base.py +79 -0
  464. nat/utils/reactive/observable.py +59 -0
  465. nat/utils/reactive/observer.py +76 -0
  466. nat/utils/reactive/subject.py +131 -0
  467. nat/utils/reactive/subscription.py +49 -0
  468. nat/utils/settings/__init__.py +0 -0
  469. nat/utils/settings/global_settings.py +195 -0
  470. nat/utils/string_utils.py +38 -0
  471. nat/utils/type_converter.py +299 -0
  472. nat/utils/type_utils.py +488 -0
  473. nat/utils/url_utils.py +27 -0
  474. nvidia_nat-1.1.0a20251020.dist-info/METADATA +195 -0
  475. nvidia_nat-1.1.0a20251020.dist-info/RECORD +480 -0
  476. nvidia_nat-1.1.0a20251020.dist-info/WHEEL +5 -0
  477. nvidia_nat-1.1.0a20251020.dist-info/entry_points.txt +22 -0
  478. nvidia_nat-1.1.0a20251020.dist-info/licenses/LICENSE-3rd-party.txt +5478 -0
  479. nvidia_nat-1.1.0a20251020.dist-info/licenses/LICENSE.md +201 -0
  480. nvidia_nat-1.1.0a20251020.dist-info/top_level.txt +2 -0
nat/builder/context.py ADDED
@@ -0,0 +1,321 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import typing
17
+ import uuid
18
+ from collections.abc import Awaitable
19
+ from collections.abc import Callable
20
+ from contextlib import contextmanager
21
+ from contextvars import ContextVar
22
+
23
+ from nat.builder.intermediate_step_manager import IntermediateStepManager
24
+ from nat.builder.user_interaction_manager import UserInteractionManager
25
+ from nat.data_models.authentication import AuthenticatedContext
26
+ from nat.data_models.authentication import AuthFlowType
27
+ from nat.data_models.authentication import AuthProviderBaseConfig
28
+ from nat.data_models.interactive import HumanResponse
29
+ from nat.data_models.interactive import InteractionPrompt
30
+ from nat.data_models.intermediate_step import IntermediateStep
31
+ from nat.data_models.intermediate_step import IntermediateStepPayload
32
+ from nat.data_models.intermediate_step import IntermediateStepType
33
+ from nat.data_models.intermediate_step import StreamEventData
34
+ from nat.data_models.intermediate_step import TraceMetadata
35
+ from nat.data_models.invocation_node import InvocationNode
36
+ from nat.runtime.user_metadata import RequestAttributes
37
+ from nat.utils.reactive.subject import Subject
38
+
39
+
40
+ class Singleton(type):
41
+
42
+ def __init__(cls, name, bases, dict):
43
+ super().__init__(name, bases, dict)
44
+ cls.instance = None
45
+
46
+ def __call__(cls, *args, **kw):
47
+ if cls.instance is None:
48
+ cls.instance = super().__call__(*args, **kw)
49
+ return cls.instance
50
+
51
+
52
+ class ActiveFunctionContextManager:
53
+
54
+ def __init__(self):
55
+ self._output: typing.Any | None = None
56
+
57
+ @property
58
+ def output(self) -> typing.Any | None:
59
+ return self._output
60
+
61
+ def set_output(self, output: typing.Any):
62
+ self._output = output
63
+
64
+
65
+ class ContextState(metaclass=Singleton):
66
+
67
+ def __init__(self):
68
+ self.conversation_id: ContextVar[str | None] = ContextVar("conversation_id", default=None)
69
+ self.user_message_id: ContextVar[str | None] = ContextVar("user_message_id", default=None)
70
+ self.workflow_run_id: ContextVar[str | None] = ContextVar("workflow_run_id", default=None)
71
+ self.workflow_trace_id: ContextVar[int | None] = ContextVar("workflow_trace_id", default=None)
72
+ self.input_message: ContextVar[typing.Any] = ContextVar("input_message", default=None)
73
+ self.user_manager: ContextVar[typing.Any] = ContextVar("user_manager", default=None)
74
+ self._metadata: ContextVar[RequestAttributes | None] = ContextVar("request_attributes", default=None)
75
+ self._event_stream: ContextVar[Subject[IntermediateStep] | None] = ContextVar("event_stream", default=None)
76
+ self._active_function: ContextVar[InvocationNode | None] = ContextVar("active_function", default=None)
77
+ self._active_span_id_stack: ContextVar[list[str] | None] = ContextVar("active_span_id_stack", default=None)
78
+
79
+ # Default is a lambda no-op which returns NoneType
80
+ self.user_input_callback: ContextVar[Callable[[InteractionPrompt], Awaitable[HumanResponse | None]]
81
+ | None] = ContextVar(
82
+ "user_input_callback",
83
+ default=UserInteractionManager.default_callback_handler)
84
+ self.user_auth_callback: ContextVar[Callable[[AuthProviderBaseConfig, AuthFlowType],
85
+ Awaitable[AuthenticatedContext]]
86
+ | None] = ContextVar("user_auth_callback", default=None)
87
+
88
+ @property
89
+ def metadata(self) -> ContextVar[RequestAttributes]:
90
+ if self._metadata.get() is None:
91
+ self._metadata.set(RequestAttributes())
92
+ return typing.cast(ContextVar[RequestAttributes], self._metadata)
93
+
94
+ @property
95
+ def active_function(self) -> ContextVar[InvocationNode]:
96
+ if self._active_function.get() is None:
97
+ self._active_function.set(InvocationNode(function_id="root", function_name="root"))
98
+ return typing.cast(ContextVar[InvocationNode], self._active_function)
99
+
100
+ @property
101
+ def event_stream(self) -> ContextVar[Subject[IntermediateStep]]:
102
+ if self._event_stream.get() is None:
103
+ self._event_stream.set(Subject())
104
+ return typing.cast(ContextVar[Subject[IntermediateStep]], self._event_stream)
105
+
106
+ @property
107
+ def active_span_id_stack(self) -> ContextVar[list[str]]:
108
+ if self._active_span_id_stack.get() is None:
109
+ self._active_span_id_stack.set(["root"])
110
+ return typing.cast(ContextVar[list[str]], self._active_span_id_stack)
111
+
112
+ @staticmethod
113
+ def get() -> "ContextState":
114
+ return ContextState()
115
+
116
+
117
+ class Context:
118
+
119
+ def __init__(self, context: ContextState):
120
+ self._context_state = context
121
+
122
+ @property
123
+ def input_message(self):
124
+ """
125
+ Retrieves the input message from the context state.
126
+
127
+ The input_message property is used to access the message stored in the
128
+ context state. This property returns the message as it is currently
129
+ maintained in the context.
130
+
131
+ Returns:
132
+ str: The input message retrieved from the context state.
133
+ """
134
+ return self._context_state.input_message.get()
135
+
136
+ @property
137
+ def user_manager(self):
138
+ """
139
+ Retrieves the user manager instance from the current context state.
140
+
141
+ This property provides access to the user manager through the context
142
+ state, allowing interaction with user management functionalities.
143
+
144
+ Returns:
145
+ UserManager: The instance of the user manager retrieved from the
146
+ context state.
147
+ """
148
+ return self._context_state.user_manager.get()
149
+
150
+ @property
151
+ def metadata(self):
152
+ """
153
+ Retrieves the request attributes instance from the current context state
154
+ providing access to user-defined metadata.
155
+
156
+ Returns:
157
+ RequestAttributes: The instance of the request attributes
158
+ retrieved from the context state.
159
+ """
160
+ return self._context_state.metadata.get()
161
+
162
+ @property
163
+ def user_interaction_manager(self) -> UserInteractionManager:
164
+ """
165
+ Return an instance of UserInteractionManager that uses
166
+ the current context's user_input_callback.
167
+ """
168
+ return UserInteractionManager(self._context_state)
169
+
170
+ @property
171
+ def intermediate_step_manager(self) -> IntermediateStepManager:
172
+ """
173
+ Retrieves the intermediate step manager instance from the current context state.
174
+
175
+ This property provides access to the intermediate step manager through the context
176
+ state, allowing interaction with intermediate step management functionalities.
177
+
178
+ Returns:
179
+ IntermediateStepManager: The instance of the intermediate step manager retrieved
180
+ from the context state.
181
+ """
182
+ return IntermediateStepManager(self._context_state)
183
+
184
+ @property
185
+ def conversation_id(self) -> str | None:
186
+ """
187
+ This property retrieves the conversation ID which is the unique identifier for the current chat conversation.
188
+
189
+ Returns:
190
+ str | None
191
+ """
192
+ return self._context_state.conversation_id.get()
193
+
194
+ @property
195
+ def user_message_id(self) -> str | None:
196
+ """
197
+ This property retrieves the user message ID which is the unique identifier for the current user message.
198
+ """
199
+ return self._context_state.user_message_id.get()
200
+
201
+ @property
202
+ def workflow_run_id(self) -> str | None:
203
+ """
204
+ Returns a stable identifier for the current workflow/agent invocation (UUID string).
205
+ """
206
+ return self._context_state.workflow_run_id.get()
207
+
208
+ @property
209
+ def workflow_trace_id(self) -> int | None:
210
+ """
211
+ Returns the 128-bit trace identifier for the current run, used as the OpenTelemetry trace_id.
212
+ """
213
+ return self._context_state.workflow_trace_id.get()
214
+
215
+ @contextmanager
216
+ def push_active_function(self,
217
+ function_name: str,
218
+ input_data: typing.Any | None,
219
+ metadata: dict[str, typing.Any] | TraceMetadata | None = None):
220
+ """
221
+ Set the 'active_function' in context, push an invocation node,
222
+ AND create an OTel child span for that function call.
223
+ """
224
+ parent_function_node = self._context_state.active_function.get()
225
+ current_function_id = str(uuid.uuid4())
226
+ current_function_node = InvocationNode(function_id=current_function_id,
227
+ function_name=function_name,
228
+ parent_id=parent_function_node.function_id,
229
+ parent_name=parent_function_node.function_name)
230
+
231
+ # 1) Set the active function in the contextvar
232
+ fn_token = self._context_state.active_function.set(current_function_node)
233
+
234
+ # 2) Optionally record function start as an intermediate step
235
+ step_manager = self.intermediate_step_manager
236
+ step_manager.push_intermediate_step(
237
+ IntermediateStepPayload(UUID=current_function_id,
238
+ event_type=IntermediateStepType.FUNCTION_START,
239
+ name=function_name,
240
+ data=StreamEventData(input=input_data),
241
+ metadata=metadata))
242
+
243
+ manager = ActiveFunctionContextManager()
244
+
245
+ try:
246
+ yield manager # run the function body
247
+ finally:
248
+ # 3) Record function end
249
+
250
+ data = StreamEventData(input=input_data, output=manager.output)
251
+
252
+ step_manager.push_intermediate_step(
253
+ IntermediateStepPayload(UUID=current_function_id,
254
+ event_type=IntermediateStepType.FUNCTION_END,
255
+ name=function_name,
256
+ data=data))
257
+
258
+ # 4) Unset the function contextvar
259
+ self._context_state.active_function.reset(fn_token)
260
+
261
+ @property
262
+ def active_function(self) -> InvocationNode:
263
+ """
264
+ Retrieves the active function from the context state.
265
+
266
+ This property is used to access the active function stored in the context
267
+ state. The active function is the function that is currently being executed.
268
+ """
269
+ return self._context_state.active_function.get()
270
+
271
+ @property
272
+ def active_span_id(self) -> str:
273
+ """
274
+ Retrieves the active span ID from the context state.
275
+
276
+ This property provides access to the active span ID stored in the context state. The active span ID represents
277
+ the currently running function/tool/llm/agent/etc and can be used to group telemetry data together.
278
+
279
+ Returns:
280
+ str: The active span ID.
281
+ """
282
+ return self._context_state.active_span_id_stack.get()[-1]
283
+
284
+ @property
285
+ def user_auth_callback(self) -> Callable[[AuthProviderBaseConfig, AuthFlowType], Awaitable[AuthenticatedContext]]:
286
+ """
287
+ Retrieves the user authentication callback function from the context state.
288
+
289
+ This property provides access to the user authentication callback function stored in the context state.
290
+ The callback function is responsible for handling user authentication based on the provided configuration.
291
+
292
+ Returns:
293
+ Callable[[AuthenticationBaseConfig], Awaitable[AuthenticatedContext]]: The user authentication
294
+ callback function.
295
+
296
+ Raises:
297
+ RuntimeError: If the user authentication callback is not set in the context.
298
+ """
299
+ callback = self._context_state.user_auth_callback.get()
300
+ if callback is None:
301
+ raise RuntimeError("User authentication callback is not set in the context.")
302
+ return callback
303
+
304
+ @staticmethod
305
+ def get() -> "Context":
306
+ """
307
+ Static method to retrieve the current Context instance.
308
+
309
+ This method creates and returns an instance of the Context class
310
+ by obtaining the current state from the ContextState.
311
+
312
+ Returns:
313
+ Context: The created Context instance.
314
+ """
315
+ return Context(ContextState.get())
316
+
317
+
318
+ # Compatibility aliases with previous releases
319
+
320
+ AIQContextState = ContextState
321
+ AIQContext = Context
@@ -0,0 +1,24 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from nat.data_models.embedder import EmbedderBaseConfig
17
+
18
+
19
+ class EmbedderProviderInfo:
20
+
21
+ def __init__(self, *, config: EmbedderBaseConfig, description: str):
22
+ self.config = config
23
+ self.provider_type = type(config).static_type()
24
+ self.description = description
@@ -0,0 +1,166 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import asyncio
17
+ import dataclasses
18
+ import logging
19
+ from contextlib import asynccontextmanager
20
+ from pathlib import Path
21
+
22
+ from nat.builder.builder import EvalBuilder
23
+ from nat.builder.evaluator import EvaluatorInfo
24
+ from nat.builder.framework_enum import LLMFrameworkEnum
25
+ from nat.builder.workflow_builder import WorkflowBuilder
26
+ from nat.cli.type_registry import TypeRegistry
27
+ from nat.data_models.config import Config
28
+ from nat.data_models.config import GeneralConfig
29
+ from nat.data_models.evaluate import EvalGeneralConfig
30
+ from nat.data_models.evaluator import EvaluatorBaseConfig
31
+ from nat.data_models.function import EmptyFunctionConfig
32
+ from nat.utils.type_utils import override
33
+
34
+ logger = logging.getLogger(__name__)
35
+
36
+
37
+ @dataclasses.dataclass
38
+ class ConfiguredEvaluator:
39
+ config: EvaluatorBaseConfig
40
+ instance: EvaluatorInfo
41
+
42
+
43
+ class WorkflowEvalBuilder(WorkflowBuilder, EvalBuilder):
44
+
45
+ def __init__(self,
46
+ general_config: GeneralConfig | None = None,
47
+ eval_general_config: EvalGeneralConfig | None = None,
48
+ registry: TypeRegistry | None = None):
49
+ super().__init__(general_config=general_config, registry=registry)
50
+ self.eval_general_config = eval_general_config
51
+ self._evaluators: dict[str, ConfiguredEvaluator] = {}
52
+
53
+ @override
54
+ async def add_evaluator(self, name: str, config: EvaluatorBaseConfig):
55
+ if name in self._evaluators:
56
+ raise ValueError(f"Evaluator `{name}` already exists in the list of evaluators")
57
+
58
+ try:
59
+ evaluator_info = self._registry.get_evaluator(type(config))
60
+ info_obj = await self._get_exit_stack().enter_async_context(evaluator_info.build_fn(config, self))
61
+
62
+ # Store the evaluator
63
+ self._evaluators[name] = ConfiguredEvaluator(config=config, instance=info_obj)
64
+ except Exception as e:
65
+ logger.error("Error %s adding evaluator `%s` with config `%s`", e, name, config)
66
+ raise
67
+
68
+ @override
69
+ def get_evaluator(self, evaluator_name: str) -> EvaluatorInfo:
70
+
71
+ if (evaluator_name not in self._evaluators):
72
+ raise ValueError(f"Evaluator `{evaluator_name}` not found")
73
+
74
+ return self._evaluators[evaluator_name].instance
75
+
76
+ @override
77
+ def get_evaluator_config(self, evaluator_name: str) -> EvaluatorBaseConfig:
78
+
79
+ if evaluator_name not in self._evaluators:
80
+ raise ValueError(f"Evaluator `{evaluator_name}` not found")
81
+
82
+ # Return the tool configuration object
83
+ return self._evaluators[evaluator_name].config
84
+
85
+ @override
86
+ def get_max_concurrency(self) -> int:
87
+ return self.eval_general_config.max_concurrency
88
+
89
+ @override
90
+ def get_output_dir(self) -> Path:
91
+ return self.eval_general_config.output_dir
92
+
93
+ @override
94
+ async def get_all_tools(self, wrapper_type: LLMFrameworkEnum | str):
95
+ tool_wrapper_reg = self._registry.get_tool_wrapper(llm_framework=wrapper_type)
96
+
97
+ async def get_tool(fn_name: str):
98
+ fn = await self.get_function(fn_name)
99
+ try:
100
+ return tool_wrapper_reg.build_fn(fn_name, fn, self)
101
+ except Exception:
102
+ logger.exception("Error fetching tool `%s`", fn_name)
103
+ return None
104
+
105
+ tasks = [get_tool(fn_name) for fn_name in self._functions]
106
+ tools = await asyncio.gather(*tasks, return_exceptions=False)
107
+ return [tool for tool in tools if tool is not None]
108
+
109
+ def _log_build_failure_evaluator(self,
110
+ failing_evaluator_name: str,
111
+ completed_evaluators: list[str],
112
+ remaining_evaluators: list[str],
113
+ original_error: Exception) -> None:
114
+ """
115
+ Log comprehensive evaluator build failure information.
116
+
117
+ Args:
118
+ failing_evaluator_name (str): The name of the evaluator that failed to build
119
+ completed_evaluators (list[str]): List of evaluator names that were successfully built
120
+ remaining_evaluators (list[str]): List of evaluator names still to be built
121
+ original_error (Exception): The original exception that caused the failure
122
+ """
123
+ # Convert evaluator names to (name, type) tuples for consistent logging
124
+ completed_components = [(name, "evaluator") for name in completed_evaluators]
125
+ remaining_components = [(name, "evaluator") for name in remaining_evaluators]
126
+
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)
133
+
134
+ @override
135
+ async def populate_builder(self, config: Config, skip_workflow: bool = False):
136
+ # Skip setting workflow if workflow config is EmptyFunctionConfig
137
+ skip_workflow = skip_workflow or isinstance(config.workflow, EmptyFunctionConfig)
138
+
139
+ await super().populate_builder(config, skip_workflow=skip_workflow)
140
+
141
+ # Initialize progress tracking for evaluators
142
+ completed_evaluators = []
143
+ remaining_evaluators = list(config.eval.evaluators.keys())
144
+
145
+ # Instantiate the evaluators with enhanced error logging
146
+ for name, evaluator_config in config.eval.evaluators.items():
147
+ try:
148
+ # Remove from remaining as we start building
149
+ remaining_evaluators.remove(name)
150
+
151
+ await self.add_evaluator(name, evaluator_config)
152
+
153
+ # Add to completed after successful build
154
+ completed_evaluators.append(name)
155
+
156
+ except Exception as e:
157
+ self._log_build_failure_evaluator(name, completed_evaluators, remaining_evaluators, e)
158
+ raise
159
+
160
+ @classmethod
161
+ @asynccontextmanager
162
+ async def from_config(cls, config: Config):
163
+
164
+ async with cls(config.general, config.eval.general, registry=None) as builder:
165
+ await builder.populate_builder(config)
166
+ yield builder
@@ -0,0 +1,29 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from collections.abc import Callable
17
+
18
+ from nat.data_models.evaluator import EvaluatorBaseConfig
19
+ from nat.eval.evaluator.evaluator_model import EvalInput
20
+ from nat.eval.evaluator.evaluator_model import EvalOutput
21
+
22
+
23
+ class EvaluatorInfo:
24
+
25
+ def __init__(self, *, config: EvaluatorBaseConfig, evaluate_fn: Callable[[EvalInput], EvalOutput],
26
+ description: str):
27
+ self.config = config
28
+ self.evaluate_fn = evaluate_fn
29
+ self.description = description
@@ -0,0 +1,25 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from enum import Enum
17
+
18
+
19
+ class LLMFrameworkEnum(str, Enum):
20
+ LANGCHAIN = "langchain"
21
+ LLAMA_INDEX = "llama_index"
22
+ CREWAI = "crewai"
23
+ SEMANTIC_KERNEL = "semantic_kernel"
24
+ AGNO = "agno"
25
+ ADK = "adk"
@@ -0,0 +1,73 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import typing
17
+ from abc import ABC
18
+ from abc import abstractmethod
19
+
20
+ from nat.data_models.front_end import FrontEndConfigT
21
+
22
+ if (typing.TYPE_CHECKING):
23
+ from nat.data_models.config import Config
24
+
25
+
26
+ class FrontEndBase(typing.Generic[FrontEndConfigT], ABC):
27
+
28
+ def __init__(self, full_config: "Config"):
29
+ """
30
+ Initializes the FrontEndBase object with the specified NAT configuration.
31
+
32
+ Parameters
33
+ ----------
34
+ full_config : Config
35
+ The configuration object to use for the front end.
36
+ """
37
+
38
+ super().__init__()
39
+
40
+ self._full_config: Config = full_config
41
+ self._front_end_config: FrontEndConfigT = typing.cast(FrontEndConfigT, full_config.general.front_end)
42
+
43
+ @property
44
+ def front_end_config(self) -> FrontEndConfigT:
45
+ """
46
+ Returns the front end configuration object extracted from the NAT configuration.
47
+
48
+ Returns
49
+ -------
50
+ FrontEndConfigT
51
+ The front end configuration object.
52
+ """
53
+ return self._front_end_config
54
+
55
+ @property
56
+ def full_config(self) -> "Config":
57
+ """
58
+ Returns the full NAT configuration object.
59
+
60
+ Returns
61
+ -------
62
+ Config
63
+ The full NAT configuration object.
64
+ """
65
+
66
+ return self._full_config
67
+
68
+ @abstractmethod
69
+ async def run(self):
70
+ """
71
+ Runs the specified configuration file, launching the workflow until the front end is complete.
72
+ """
73
+ pass