nvidia-nat 1.2.0__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 (435) hide show
  1. aiq/__init__.py +66 -0
  2. nat/agent/__init__.py +0 -0
  3. nat/agent/base.py +256 -0
  4. nat/agent/dual_node.py +67 -0
  5. nat/agent/react_agent/__init__.py +0 -0
  6. nat/agent/react_agent/agent.py +363 -0
  7. nat/agent/react_agent/output_parser.py +104 -0
  8. nat/agent/react_agent/prompt.py +44 -0
  9. nat/agent/react_agent/register.py +149 -0
  10. nat/agent/reasoning_agent/__init__.py +0 -0
  11. nat/agent/reasoning_agent/reasoning_agent.py +225 -0
  12. nat/agent/register.py +23 -0
  13. nat/agent/rewoo_agent/__init__.py +0 -0
  14. nat/agent/rewoo_agent/agent.py +415 -0
  15. nat/agent/rewoo_agent/prompt.py +110 -0
  16. nat/agent/rewoo_agent/register.py +157 -0
  17. nat/agent/tool_calling_agent/__init__.py +0 -0
  18. nat/agent/tool_calling_agent/agent.py +119 -0
  19. nat/agent/tool_calling_agent/register.py +106 -0
  20. nat/authentication/__init__.py +14 -0
  21. nat/authentication/api_key/__init__.py +14 -0
  22. nat/authentication/api_key/api_key_auth_provider.py +96 -0
  23. nat/authentication/api_key/api_key_auth_provider_config.py +124 -0
  24. nat/authentication/api_key/register.py +26 -0
  25. nat/authentication/exceptions/__init__.py +14 -0
  26. nat/authentication/exceptions/api_key_exceptions.py +38 -0
  27. nat/authentication/http_basic_auth/__init__.py +0 -0
  28. nat/authentication/http_basic_auth/http_basic_auth_provider.py +81 -0
  29. nat/authentication/http_basic_auth/register.py +30 -0
  30. nat/authentication/interfaces.py +93 -0
  31. nat/authentication/oauth2/__init__.py +14 -0
  32. nat/authentication/oauth2/oauth2_auth_code_flow_provider.py +107 -0
  33. nat/authentication/oauth2/oauth2_auth_code_flow_provider_config.py +39 -0
  34. nat/authentication/oauth2/register.py +25 -0
  35. nat/authentication/register.py +21 -0
  36. nat/builder/__init__.py +0 -0
  37. nat/builder/builder.py +285 -0
  38. nat/builder/component_utils.py +316 -0
  39. nat/builder/context.py +270 -0
  40. nat/builder/embedder.py +24 -0
  41. nat/builder/eval_builder.py +161 -0
  42. nat/builder/evaluator.py +29 -0
  43. nat/builder/framework_enum.py +24 -0
  44. nat/builder/front_end.py +73 -0
  45. nat/builder/function.py +344 -0
  46. nat/builder/function_base.py +380 -0
  47. nat/builder/function_info.py +627 -0
  48. nat/builder/intermediate_step_manager.py +174 -0
  49. nat/builder/llm.py +25 -0
  50. nat/builder/retriever.py +25 -0
  51. nat/builder/user_interaction_manager.py +78 -0
  52. nat/builder/workflow.py +148 -0
  53. nat/builder/workflow_builder.py +1117 -0
  54. nat/cli/__init__.py +14 -0
  55. nat/cli/cli_utils/__init__.py +0 -0
  56. nat/cli/cli_utils/config_override.py +231 -0
  57. nat/cli/cli_utils/validation.py +37 -0
  58. nat/cli/commands/__init__.py +0 -0
  59. nat/cli/commands/configure/__init__.py +0 -0
  60. nat/cli/commands/configure/channel/__init__.py +0 -0
  61. nat/cli/commands/configure/channel/add.py +28 -0
  62. nat/cli/commands/configure/channel/channel.py +34 -0
  63. nat/cli/commands/configure/channel/remove.py +30 -0
  64. nat/cli/commands/configure/channel/update.py +30 -0
  65. nat/cli/commands/configure/configure.py +33 -0
  66. nat/cli/commands/evaluate.py +139 -0
  67. nat/cli/commands/info/__init__.py +14 -0
  68. nat/cli/commands/info/info.py +37 -0
  69. nat/cli/commands/info/list_channels.py +32 -0
  70. nat/cli/commands/info/list_components.py +129 -0
  71. nat/cli/commands/info/list_mcp.py +304 -0
  72. nat/cli/commands/registry/__init__.py +14 -0
  73. nat/cli/commands/registry/publish.py +88 -0
  74. nat/cli/commands/registry/pull.py +118 -0
  75. nat/cli/commands/registry/registry.py +36 -0
  76. nat/cli/commands/registry/remove.py +108 -0
  77. nat/cli/commands/registry/search.py +155 -0
  78. nat/cli/commands/sizing/__init__.py +14 -0
  79. nat/cli/commands/sizing/calc.py +297 -0
  80. nat/cli/commands/sizing/sizing.py +27 -0
  81. nat/cli/commands/start.py +246 -0
  82. nat/cli/commands/uninstall.py +81 -0
  83. nat/cli/commands/validate.py +47 -0
  84. nat/cli/commands/workflow/__init__.py +14 -0
  85. nat/cli/commands/workflow/templates/__init__.py.j2 +0 -0
  86. nat/cli/commands/workflow/templates/config.yml.j2 +16 -0
  87. nat/cli/commands/workflow/templates/pyproject.toml.j2 +22 -0
  88. nat/cli/commands/workflow/templates/register.py.j2 +5 -0
  89. nat/cli/commands/workflow/templates/workflow.py.j2 +36 -0
  90. nat/cli/commands/workflow/workflow.py +37 -0
  91. nat/cli/commands/workflow/workflow_commands.py +317 -0
  92. nat/cli/entrypoint.py +135 -0
  93. nat/cli/main.py +57 -0
  94. nat/cli/register_workflow.py +488 -0
  95. nat/cli/type_registry.py +1000 -0
  96. nat/data_models/__init__.py +14 -0
  97. nat/data_models/api_server.py +716 -0
  98. nat/data_models/authentication.py +231 -0
  99. nat/data_models/common.py +171 -0
  100. nat/data_models/component.py +58 -0
  101. nat/data_models/component_ref.py +168 -0
  102. nat/data_models/config.py +410 -0
  103. nat/data_models/dataset_handler.py +169 -0
  104. nat/data_models/discovery_metadata.py +305 -0
  105. nat/data_models/embedder.py +27 -0
  106. nat/data_models/evaluate.py +127 -0
  107. nat/data_models/evaluator.py +26 -0
  108. nat/data_models/front_end.py +26 -0
  109. nat/data_models/function.py +30 -0
  110. nat/data_models/function_dependencies.py +72 -0
  111. nat/data_models/interactive.py +246 -0
  112. nat/data_models/intermediate_step.py +302 -0
  113. nat/data_models/invocation_node.py +38 -0
  114. nat/data_models/llm.py +27 -0
  115. nat/data_models/logging.py +26 -0
  116. nat/data_models/memory.py +27 -0
  117. nat/data_models/object_store.py +44 -0
  118. nat/data_models/profiler.py +54 -0
  119. nat/data_models/registry_handler.py +26 -0
  120. nat/data_models/retriever.py +30 -0
  121. nat/data_models/retry_mixin.py +35 -0
  122. nat/data_models/span.py +190 -0
  123. nat/data_models/step_adaptor.py +64 -0
  124. nat/data_models/streaming.py +33 -0
  125. nat/data_models/swe_bench_model.py +54 -0
  126. nat/data_models/telemetry_exporter.py +26 -0
  127. nat/data_models/ttc_strategy.py +30 -0
  128. nat/embedder/__init__.py +0 -0
  129. nat/embedder/nim_embedder.py +59 -0
  130. nat/embedder/openai_embedder.py +43 -0
  131. nat/embedder/register.py +22 -0
  132. nat/eval/__init__.py +14 -0
  133. nat/eval/config.py +60 -0
  134. nat/eval/dataset_handler/__init__.py +0 -0
  135. nat/eval/dataset_handler/dataset_downloader.py +106 -0
  136. nat/eval/dataset_handler/dataset_filter.py +52 -0
  137. nat/eval/dataset_handler/dataset_handler.py +367 -0
  138. nat/eval/evaluate.py +510 -0
  139. nat/eval/evaluator/__init__.py +14 -0
  140. nat/eval/evaluator/base_evaluator.py +77 -0
  141. nat/eval/evaluator/evaluator_model.py +45 -0
  142. nat/eval/intermediate_step_adapter.py +99 -0
  143. nat/eval/rag_evaluator/__init__.py +0 -0
  144. nat/eval/rag_evaluator/evaluate.py +178 -0
  145. nat/eval/rag_evaluator/register.py +143 -0
  146. nat/eval/register.py +23 -0
  147. nat/eval/remote_workflow.py +133 -0
  148. nat/eval/runners/__init__.py +14 -0
  149. nat/eval/runners/config.py +39 -0
  150. nat/eval/runners/multi_eval_runner.py +54 -0
  151. nat/eval/runtime_event_subscriber.py +52 -0
  152. nat/eval/swe_bench_evaluator/__init__.py +0 -0
  153. nat/eval/swe_bench_evaluator/evaluate.py +215 -0
  154. nat/eval/swe_bench_evaluator/register.py +36 -0
  155. nat/eval/trajectory_evaluator/__init__.py +0 -0
  156. nat/eval/trajectory_evaluator/evaluate.py +75 -0
  157. nat/eval/trajectory_evaluator/register.py +40 -0
  158. nat/eval/tunable_rag_evaluator/__init__.py +0 -0
  159. nat/eval/tunable_rag_evaluator/evaluate.py +245 -0
  160. nat/eval/tunable_rag_evaluator/register.py +52 -0
  161. nat/eval/usage_stats.py +41 -0
  162. nat/eval/utils/__init__.py +0 -0
  163. nat/eval/utils/output_uploader.py +140 -0
  164. nat/eval/utils/tqdm_position_registry.py +40 -0
  165. nat/eval/utils/weave_eval.py +184 -0
  166. nat/experimental/__init__.py +0 -0
  167. nat/experimental/decorators/__init__.py +0 -0
  168. nat/experimental/decorators/experimental_warning_decorator.py +134 -0
  169. nat/experimental/test_time_compute/__init__.py +0 -0
  170. nat/experimental/test_time_compute/editing/__init__.py +0 -0
  171. nat/experimental/test_time_compute/editing/iterative_plan_refinement_editor.py +147 -0
  172. nat/experimental/test_time_compute/editing/llm_as_a_judge_editor.py +204 -0
  173. nat/experimental/test_time_compute/editing/motivation_aware_summarization.py +107 -0
  174. nat/experimental/test_time_compute/functions/__init__.py +0 -0
  175. nat/experimental/test_time_compute/functions/execute_score_select_function.py +105 -0
  176. nat/experimental/test_time_compute/functions/plan_select_execute_function.py +224 -0
  177. nat/experimental/test_time_compute/functions/ttc_tool_orchestration_function.py +205 -0
  178. nat/experimental/test_time_compute/functions/ttc_tool_wrapper_function.py +146 -0
  179. nat/experimental/test_time_compute/models/__init__.py +0 -0
  180. nat/experimental/test_time_compute/models/editor_config.py +132 -0
  181. nat/experimental/test_time_compute/models/scoring_config.py +112 -0
  182. nat/experimental/test_time_compute/models/search_config.py +120 -0
  183. nat/experimental/test_time_compute/models/selection_config.py +154 -0
  184. nat/experimental/test_time_compute/models/stage_enums.py +43 -0
  185. nat/experimental/test_time_compute/models/strategy_base.py +66 -0
  186. nat/experimental/test_time_compute/models/tool_use_config.py +41 -0
  187. nat/experimental/test_time_compute/models/ttc_item.py +48 -0
  188. nat/experimental/test_time_compute/register.py +36 -0
  189. nat/experimental/test_time_compute/scoring/__init__.py +0 -0
  190. nat/experimental/test_time_compute/scoring/llm_based_agent_scorer.py +168 -0
  191. nat/experimental/test_time_compute/scoring/llm_based_plan_scorer.py +168 -0
  192. nat/experimental/test_time_compute/scoring/motivation_aware_scorer.py +111 -0
  193. nat/experimental/test_time_compute/search/__init__.py +0 -0
  194. nat/experimental/test_time_compute/search/multi_llm_planner.py +128 -0
  195. nat/experimental/test_time_compute/search/multi_query_retrieval_search.py +122 -0
  196. nat/experimental/test_time_compute/search/single_shot_multi_plan_planner.py +128 -0
  197. nat/experimental/test_time_compute/selection/__init__.py +0 -0
  198. nat/experimental/test_time_compute/selection/best_of_n_selector.py +63 -0
  199. nat/experimental/test_time_compute/selection/llm_based_agent_output_selector.py +131 -0
  200. nat/experimental/test_time_compute/selection/llm_based_output_merging_selector.py +159 -0
  201. nat/experimental/test_time_compute/selection/llm_based_plan_selector.py +128 -0
  202. nat/experimental/test_time_compute/selection/threshold_selector.py +58 -0
  203. nat/front_ends/__init__.py +14 -0
  204. nat/front_ends/console/__init__.py +14 -0
  205. nat/front_ends/console/authentication_flow_handler.py +233 -0
  206. nat/front_ends/console/console_front_end_config.py +32 -0
  207. nat/front_ends/console/console_front_end_plugin.py +96 -0
  208. nat/front_ends/console/register.py +25 -0
  209. nat/front_ends/cron/__init__.py +14 -0
  210. nat/front_ends/fastapi/__init__.py +14 -0
  211. nat/front_ends/fastapi/auth_flow_handlers/__init__.py +0 -0
  212. nat/front_ends/fastapi/auth_flow_handlers/http_flow_handler.py +27 -0
  213. nat/front_ends/fastapi/auth_flow_handlers/websocket_flow_handler.py +107 -0
  214. nat/front_ends/fastapi/fastapi_front_end_config.py +241 -0
  215. nat/front_ends/fastapi/fastapi_front_end_controller.py +68 -0
  216. nat/front_ends/fastapi/fastapi_front_end_plugin.py +116 -0
  217. nat/front_ends/fastapi/fastapi_front_end_plugin_worker.py +1087 -0
  218. nat/front_ends/fastapi/html_snippets/__init__.py +14 -0
  219. nat/front_ends/fastapi/html_snippets/auth_code_grant_success.py +35 -0
  220. nat/front_ends/fastapi/intermediate_steps_subscriber.py +80 -0
  221. nat/front_ends/fastapi/job_store.py +183 -0
  222. nat/front_ends/fastapi/main.py +72 -0
  223. nat/front_ends/fastapi/message_handler.py +320 -0
  224. nat/front_ends/fastapi/message_validator.py +352 -0
  225. nat/front_ends/fastapi/register.py +25 -0
  226. nat/front_ends/fastapi/response_helpers.py +195 -0
  227. nat/front_ends/fastapi/step_adaptor.py +319 -0
  228. nat/front_ends/mcp/__init__.py +14 -0
  229. nat/front_ends/mcp/mcp_front_end_config.py +36 -0
  230. nat/front_ends/mcp/mcp_front_end_plugin.py +81 -0
  231. nat/front_ends/mcp/mcp_front_end_plugin_worker.py +143 -0
  232. nat/front_ends/mcp/register.py +27 -0
  233. nat/front_ends/mcp/tool_converter.py +241 -0
  234. nat/front_ends/register.py +22 -0
  235. nat/front_ends/simple_base/__init__.py +14 -0
  236. nat/front_ends/simple_base/simple_front_end_plugin_base.py +54 -0
  237. nat/llm/__init__.py +0 -0
  238. nat/llm/aws_bedrock_llm.py +57 -0
  239. nat/llm/nim_llm.py +46 -0
  240. nat/llm/openai_llm.py +46 -0
  241. nat/llm/register.py +23 -0
  242. nat/llm/utils/__init__.py +14 -0
  243. nat/llm/utils/env_config_value.py +94 -0
  244. nat/llm/utils/error.py +17 -0
  245. nat/memory/__init__.py +20 -0
  246. nat/memory/interfaces.py +183 -0
  247. nat/memory/models.py +112 -0
  248. nat/meta/pypi.md +58 -0
  249. nat/object_store/__init__.py +20 -0
  250. nat/object_store/in_memory_object_store.py +76 -0
  251. nat/object_store/interfaces.py +84 -0
  252. nat/object_store/models.py +38 -0
  253. nat/object_store/register.py +20 -0
  254. nat/observability/__init__.py +14 -0
  255. nat/observability/exporter/__init__.py +14 -0
  256. nat/observability/exporter/base_exporter.py +449 -0
  257. nat/observability/exporter/exporter.py +78 -0
  258. nat/observability/exporter/file_exporter.py +33 -0
  259. nat/observability/exporter/processing_exporter.py +322 -0
  260. nat/observability/exporter/raw_exporter.py +52 -0
  261. nat/observability/exporter/span_exporter.py +288 -0
  262. nat/observability/exporter_manager.py +335 -0
  263. nat/observability/mixin/__init__.py +14 -0
  264. nat/observability/mixin/batch_config_mixin.py +26 -0
  265. nat/observability/mixin/collector_config_mixin.py +23 -0
  266. nat/observability/mixin/file_mixin.py +288 -0
  267. nat/observability/mixin/file_mode.py +23 -0
  268. nat/observability/mixin/resource_conflict_mixin.py +134 -0
  269. nat/observability/mixin/serialize_mixin.py +61 -0
  270. nat/observability/mixin/type_introspection_mixin.py +183 -0
  271. nat/observability/processor/__init__.py +14 -0
  272. nat/observability/processor/batching_processor.py +310 -0
  273. nat/observability/processor/callback_processor.py +42 -0
  274. nat/observability/processor/intermediate_step_serializer.py +28 -0
  275. nat/observability/processor/processor.py +71 -0
  276. nat/observability/register.py +96 -0
  277. nat/observability/utils/__init__.py +14 -0
  278. nat/observability/utils/dict_utils.py +236 -0
  279. nat/observability/utils/time_utils.py +31 -0
  280. nat/plugins/.namespace +1 -0
  281. nat/profiler/__init__.py +0 -0
  282. nat/profiler/calc/__init__.py +14 -0
  283. nat/profiler/calc/calc_runner.py +627 -0
  284. nat/profiler/calc/calculations.py +288 -0
  285. nat/profiler/calc/data_models.py +188 -0
  286. nat/profiler/calc/plot.py +345 -0
  287. nat/profiler/callbacks/__init__.py +0 -0
  288. nat/profiler/callbacks/agno_callback_handler.py +295 -0
  289. nat/profiler/callbacks/base_callback_class.py +20 -0
  290. nat/profiler/callbacks/langchain_callback_handler.py +290 -0
  291. nat/profiler/callbacks/llama_index_callback_handler.py +205 -0
  292. nat/profiler/callbacks/semantic_kernel_callback_handler.py +238 -0
  293. nat/profiler/callbacks/token_usage_base_model.py +27 -0
  294. nat/profiler/data_frame_row.py +51 -0
  295. nat/profiler/data_models.py +24 -0
  296. nat/profiler/decorators/__init__.py +0 -0
  297. nat/profiler/decorators/framework_wrapper.py +131 -0
  298. nat/profiler/decorators/function_tracking.py +254 -0
  299. nat/profiler/forecasting/__init__.py +0 -0
  300. nat/profiler/forecasting/config.py +18 -0
  301. nat/profiler/forecasting/model_trainer.py +75 -0
  302. nat/profiler/forecasting/models/__init__.py +22 -0
  303. nat/profiler/forecasting/models/forecasting_base_model.py +40 -0
  304. nat/profiler/forecasting/models/linear_model.py +197 -0
  305. nat/profiler/forecasting/models/random_forest_regressor.py +269 -0
  306. nat/profiler/inference_metrics_model.py +28 -0
  307. nat/profiler/inference_optimization/__init__.py +0 -0
  308. nat/profiler/inference_optimization/bottleneck_analysis/__init__.py +0 -0
  309. nat/profiler/inference_optimization/bottleneck_analysis/nested_stack_analysis.py +460 -0
  310. nat/profiler/inference_optimization/bottleneck_analysis/simple_stack_analysis.py +258 -0
  311. nat/profiler/inference_optimization/data_models.py +386 -0
  312. nat/profiler/inference_optimization/experimental/__init__.py +0 -0
  313. nat/profiler/inference_optimization/experimental/concurrency_spike_analysis.py +468 -0
  314. nat/profiler/inference_optimization/experimental/prefix_span_analysis.py +405 -0
  315. nat/profiler/inference_optimization/llm_metrics.py +212 -0
  316. nat/profiler/inference_optimization/prompt_caching.py +163 -0
  317. nat/profiler/inference_optimization/token_uniqueness.py +107 -0
  318. nat/profiler/inference_optimization/workflow_runtimes.py +72 -0
  319. nat/profiler/intermediate_property_adapter.py +102 -0
  320. nat/profiler/profile_runner.py +473 -0
  321. nat/profiler/utils.py +184 -0
  322. nat/registry_handlers/__init__.py +0 -0
  323. nat/registry_handlers/local/__init__.py +0 -0
  324. nat/registry_handlers/local/local_handler.py +176 -0
  325. nat/registry_handlers/local/register_local.py +37 -0
  326. nat/registry_handlers/metadata_factory.py +60 -0
  327. nat/registry_handlers/package_utils.py +571 -0
  328. nat/registry_handlers/pypi/__init__.py +0 -0
  329. nat/registry_handlers/pypi/pypi_handler.py +251 -0
  330. nat/registry_handlers/pypi/register_pypi.py +40 -0
  331. nat/registry_handlers/register.py +21 -0
  332. nat/registry_handlers/registry_handler_base.py +157 -0
  333. nat/registry_handlers/rest/__init__.py +0 -0
  334. nat/registry_handlers/rest/register_rest.py +56 -0
  335. nat/registry_handlers/rest/rest_handler.py +237 -0
  336. nat/registry_handlers/schemas/__init__.py +0 -0
  337. nat/registry_handlers/schemas/headers.py +42 -0
  338. nat/registry_handlers/schemas/package.py +68 -0
  339. nat/registry_handlers/schemas/publish.py +68 -0
  340. nat/registry_handlers/schemas/pull.py +82 -0
  341. nat/registry_handlers/schemas/remove.py +36 -0
  342. nat/registry_handlers/schemas/search.py +91 -0
  343. nat/registry_handlers/schemas/status.py +47 -0
  344. nat/retriever/__init__.py +0 -0
  345. nat/retriever/interface.py +41 -0
  346. nat/retriever/milvus/__init__.py +14 -0
  347. nat/retriever/milvus/register.py +81 -0
  348. nat/retriever/milvus/retriever.py +228 -0
  349. nat/retriever/models.py +77 -0
  350. nat/retriever/nemo_retriever/__init__.py +14 -0
  351. nat/retriever/nemo_retriever/register.py +60 -0
  352. nat/retriever/nemo_retriever/retriever.py +190 -0
  353. nat/retriever/register.py +22 -0
  354. nat/runtime/__init__.py +14 -0
  355. nat/runtime/loader.py +220 -0
  356. nat/runtime/runner.py +195 -0
  357. nat/runtime/session.py +162 -0
  358. nat/runtime/user_metadata.py +130 -0
  359. nat/settings/__init__.py +0 -0
  360. nat/settings/global_settings.py +318 -0
  361. nat/test/.namespace +1 -0
  362. nat/tool/__init__.py +0 -0
  363. nat/tool/chat_completion.py +74 -0
  364. nat/tool/code_execution/README.md +151 -0
  365. nat/tool/code_execution/__init__.py +0 -0
  366. nat/tool/code_execution/code_sandbox.py +267 -0
  367. nat/tool/code_execution/local_sandbox/.gitignore +1 -0
  368. nat/tool/code_execution/local_sandbox/Dockerfile.sandbox +60 -0
  369. nat/tool/code_execution/local_sandbox/__init__.py +13 -0
  370. nat/tool/code_execution/local_sandbox/local_sandbox_server.py +198 -0
  371. nat/tool/code_execution/local_sandbox/sandbox.requirements.txt +6 -0
  372. nat/tool/code_execution/local_sandbox/start_local_sandbox.sh +50 -0
  373. nat/tool/code_execution/register.py +74 -0
  374. nat/tool/code_execution/test_code_execution_sandbox.py +414 -0
  375. nat/tool/code_execution/utils.py +100 -0
  376. nat/tool/datetime_tools.py +42 -0
  377. nat/tool/document_search.py +141 -0
  378. nat/tool/github_tools/__init__.py +0 -0
  379. nat/tool/github_tools/create_github_commit.py +133 -0
  380. nat/tool/github_tools/create_github_issue.py +87 -0
  381. nat/tool/github_tools/create_github_pr.py +106 -0
  382. nat/tool/github_tools/get_github_file.py +106 -0
  383. nat/tool/github_tools/get_github_issue.py +166 -0
  384. nat/tool/github_tools/get_github_pr.py +256 -0
  385. nat/tool/github_tools/update_github_issue.py +100 -0
  386. nat/tool/mcp/__init__.py +14 -0
  387. nat/tool/mcp/exceptions.py +142 -0
  388. nat/tool/mcp/mcp_client.py +255 -0
  389. nat/tool/mcp/mcp_tool.py +96 -0
  390. nat/tool/memory_tools/__init__.py +0 -0
  391. nat/tool/memory_tools/add_memory_tool.py +79 -0
  392. nat/tool/memory_tools/delete_memory_tool.py +67 -0
  393. nat/tool/memory_tools/get_memory_tool.py +72 -0
  394. nat/tool/nvidia_rag.py +95 -0
  395. nat/tool/register.py +38 -0
  396. nat/tool/retriever.py +94 -0
  397. nat/tool/server_tools.py +66 -0
  398. nat/utils/__init__.py +0 -0
  399. nat/utils/data_models/__init__.py +0 -0
  400. nat/utils/data_models/schema_validator.py +58 -0
  401. nat/utils/debugging_utils.py +43 -0
  402. nat/utils/dump_distro_mapping.py +32 -0
  403. nat/utils/exception_handlers/__init__.py +0 -0
  404. nat/utils/exception_handlers/automatic_retries.py +289 -0
  405. nat/utils/exception_handlers/mcp.py +211 -0
  406. nat/utils/exception_handlers/schemas.py +114 -0
  407. nat/utils/io/__init__.py +0 -0
  408. nat/utils/io/model_processing.py +28 -0
  409. nat/utils/io/yaml_tools.py +119 -0
  410. nat/utils/log_utils.py +37 -0
  411. nat/utils/metadata_utils.py +74 -0
  412. nat/utils/optional_imports.py +142 -0
  413. nat/utils/producer_consumer_queue.py +178 -0
  414. nat/utils/reactive/__init__.py +0 -0
  415. nat/utils/reactive/base/__init__.py +0 -0
  416. nat/utils/reactive/base/observable_base.py +65 -0
  417. nat/utils/reactive/base/observer_base.py +55 -0
  418. nat/utils/reactive/base/subject_base.py +79 -0
  419. nat/utils/reactive/observable.py +59 -0
  420. nat/utils/reactive/observer.py +76 -0
  421. nat/utils/reactive/subject.py +131 -0
  422. nat/utils/reactive/subscription.py +49 -0
  423. nat/utils/settings/__init__.py +0 -0
  424. nat/utils/settings/global_settings.py +197 -0
  425. nat/utils/string_utils.py +38 -0
  426. nat/utils/type_converter.py +290 -0
  427. nat/utils/type_utils.py +484 -0
  428. nat/utils/url_utils.py +27 -0
  429. nvidia_nat-1.2.0.dist-info/METADATA +365 -0
  430. nvidia_nat-1.2.0.dist-info/RECORD +435 -0
  431. nvidia_nat-1.2.0.dist-info/WHEEL +5 -0
  432. nvidia_nat-1.2.0.dist-info/entry_points.txt +21 -0
  433. nvidia_nat-1.2.0.dist-info/licenses/LICENSE-3rd-party.txt +5478 -0
  434. nvidia_nat-1.2.0.dist-info/licenses/LICENSE.md +201 -0
  435. nvidia_nat-1.2.0.dist-info/top_level.txt +2 -0
@@ -0,0 +1,238 @@
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 copy
17
+ import logging
18
+ import threading
19
+ import time
20
+ from collections.abc import Callable
21
+ from typing import Any
22
+ from uuid import uuid4
23
+
24
+ import semantic_kernel
25
+ from pydantic import BaseModel
26
+ from pydantic import Field
27
+ from semantic_kernel.connectors.ai.open_ai.services.open_ai_chat_completion_base import OpenAIChatCompletionBase
28
+
29
+ from nat.builder.context import Context
30
+ from nat.builder.framework_enum import LLMFrameworkEnum
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.intermediate_step import UsageInfo
36
+ from nat.profiler.callbacks.base_callback_class import BaseProfilerCallback
37
+ from nat.profiler.callbacks.token_usage_base_model import TokenUsageBaseModel
38
+
39
+ logger = logging.getLogger(__name__)
40
+
41
+
42
+ class SemanticKernelPatchMethod(BaseModel):
43
+ """
44
+ Stores the module and function to patch in Semantic Kernel.
45
+ """
46
+ module: Any = Field(..., description="The module to patch")
47
+ function: str = Field(..., description="The function to patch")
48
+
49
+
50
+ class SemanticKernelProfilerHandler(BaseProfilerCallback):
51
+ """
52
+ A callback manager/handler for Msft Semantic Kernel that intercepts calls to:
53
+
54
+ - Chat Completions Endpoints
55
+ - Tool calls
56
+
57
+ to collect usage statistics (tokens, inputs, outputs, time intervals, etc.)
58
+ and store them in NAT's usage_stats queue for subsequent analysis.
59
+ """
60
+
61
+ def __init__(self, workflow_llms: dict) -> None:
62
+ super().__init__()
63
+ self._lock = threading.Lock()
64
+ self.last_call_ts = time.time()
65
+ self.step_manager = Context.get().intermediate_step_manager
66
+ self._builder_llms = workflow_llms
67
+
68
+ # Original references to SK methods
69
+ self._original_tool_call = None
70
+
71
+ # Store a mapping of current SK methods we support patching for
72
+ self._patch_methods = {
73
+ "openai_streaming":
74
+ SemanticKernelPatchMethod(module=OpenAIChatCompletionBase,
75
+ function="_inner_get_streaming_chat_message_contents"),
76
+ "openai_non_streaming":
77
+ SemanticKernelPatchMethod(module=OpenAIChatCompletionBase, function="_inner_get_chat_message_contents")
78
+ }
79
+
80
+ def instrument(self) -> None:
81
+ """
82
+ Monkey-patch the relevant Semantic Kernel methods with usage-stat collection logic.
83
+ """
84
+
85
+ functions_to_patch = []
86
+
87
+ # Gather the appropriate modules/functions based on your builder config
88
+ for llm in self._builder_llms:
89
+ if self._builder_llms[llm].provider_type == 'openai': # pylint: disable=consider-using-in
90
+ functions_to_patch.extend(["openai_non_streaming", "openai_streaming"])
91
+
92
+ # Grab original reference for the tool call
93
+ self._original_tool_call = getattr(semantic_kernel.Kernel, "invoke_function_call", None)
94
+
95
+ # Now do direct monkey-patching: replace each function with a closure
96
+ for method in functions_to_patch:
97
+ patch_method = self._patch_methods[method]
98
+ setattr(patch_method.module,
99
+ patch_method.function,
100
+ self._build_llm_call_patch(getattr(patch_method.module, patch_method.function)))
101
+
102
+ if self._original_tool_call:
103
+ patched_tool_call = self._build_tool_call_patch(self._original_tool_call)
104
+ setattr(semantic_kernel.Kernel, "invoke_function_call", patched_tool_call)
105
+
106
+ logger.debug("SemanticKernelProfilerHandler instrumentation applied successfully.")
107
+
108
+ def _build_llm_call_patch(self, original_func: Callable[..., Any]) -> Callable[..., Any]:
109
+ """
110
+ Returns an async monkey-patch that wraps the original chat-completion method.
111
+ Replicates the usage collection from _llm_call_wrapper.
112
+ """
113
+
114
+ async def patched_llm_call(sk_self, *args, **kwargs) -> Any:
115
+ now = time.time()
116
+ seconds_between_calls = int(now - self.last_call_ts)
117
+ uuid = str(uuid4())
118
+
119
+ # Build the input stats
120
+ if args:
121
+ chat_input = [copy.deepcopy(args[0].model_dump())]
122
+ else:
123
+ # if no args, fallback on kwargs["chat_history"]
124
+ chat_input = [kwargs["chat_history"].model_dump()]
125
+
126
+ model_name = sk_self.ai_model_id
127
+
128
+ model_input = ""
129
+ try:
130
+ for message in chat_input[0]["messages"]:
131
+ for item in message["items"]:
132
+ if "text" in item:
133
+ model_input += item["text"]
134
+ except Exception as e:
135
+ logger.exception("Error in getting model input: %s", e, exc_info=True)
136
+
137
+ input_stats = IntermediateStepPayload(event_type=IntermediateStepType.LLM_START,
138
+ framework=LLMFrameworkEnum.SEMANTIC_KERNEL,
139
+ name=model_name,
140
+ UUID=uuid,
141
+ data=StreamEventData(input=model_input),
142
+ metadata=TraceMetadata(chat_inputs=copy.deepcopy(chat_input)),
143
+ usage_info=UsageInfo(token_usage=TokenUsageBaseModel(),
144
+ num_llm_calls=1,
145
+ seconds_between_calls=seconds_between_calls))
146
+
147
+ self.step_manager.push_intermediate_step(input_stats)
148
+
149
+ # Call the original method
150
+ output = await original_func(sk_self, *args, **kwargs)
151
+
152
+ model_output = output[0].content
153
+ now = time.time()
154
+ # Build the output stats
155
+ output_stats = IntermediateStepPayload(
156
+ event_type=IntermediateStepType.LLM_END,
157
+ span_event_timestamp=now,
158
+ framework=LLMFrameworkEnum.SEMANTIC_KERNEL,
159
+ name=model_name,
160
+ UUID=uuid,
161
+ data=StreamEventData(input=model_input, output=model_output),
162
+ metadata=TraceMetadata(chat_responses=output[0].model_dump()),
163
+ usage_info=UsageInfo(token_usage=TokenUsageBaseModel(**output[0].metadata["usage"].model_dump())))
164
+
165
+ self.step_manager.push_intermediate_step(output_stats)
166
+
167
+ # Update last_call_ts
168
+ self.last_call_ts = time.time()
169
+
170
+ return output
171
+
172
+ return patched_llm_call
173
+
174
+ def _build_tool_call_patch(self, original_func: Callable[..., Any]) -> Callable[..., Any]:
175
+ """
176
+ Returns an async monkey-patch that wraps the original tool call (invoke_function_call).
177
+ Replicates usage collection from _tool_use_wrapper.
178
+ """
179
+
180
+ async def patched_tool_call(kernel_self, *args, **kwargs) -> Any:
181
+
182
+ uuid = str(uuid4())
183
+ now = time.time()
184
+ # Extract the tool input
185
+ if kwargs:
186
+ tool_input = kwargs["function_call"].model_dump(exclude="content_type")
187
+ else:
188
+ tool_input = args[0].model_dump(exclude="content_type")
189
+
190
+ try:
191
+ # Pre-call usage event
192
+ input_stat = IntermediateStepPayload(event_type=IntermediateStepType.TOOL_START,
193
+ framework=LLMFrameworkEnum.SEMANTIC_KERNEL,
194
+ name=tool_input["name"],
195
+ UUID=uuid,
196
+ data=StreamEventData(input=tool_input),
197
+ metadata=TraceMetadata(tool_inputs=copy.deepcopy(tool_input),
198
+ tool_info=copy.deepcopy(tool_input)),
199
+ usage_info=UsageInfo(token_usage=TokenUsageBaseModel()))
200
+
201
+ self.step_manager.push_intermediate_step(input_stat)
202
+ now = time.time()
203
+ # Call the original invoke_function_call
204
+ result = await original_func(kernel_self, *args, **kwargs)
205
+
206
+ # Try to get the chat history from kwargs or args
207
+ if kwargs:
208
+ chat_history = copy.deepcopy(kwargs["chat_history"])
209
+ else:
210
+ chat_history = copy.deepcopy(args[1])
211
+
212
+ # Post-call usage event
213
+ output_stat = IntermediateStepPayload(event_type=IntermediateStepType.TOOL_END,
214
+ span_event_timestamp=now,
215
+ framework=LLMFrameworkEnum.SEMANTIC_KERNEL,
216
+ name=tool_input["name"],
217
+ UUID=uuid,
218
+ data=StreamEventData(input=tool_input,
219
+ output=[
220
+ item.model_dump(exclude="content_type")
221
+ for item in chat_history[-1].items
222
+ ]),
223
+ metadata=TraceMetadata(tool_outputs=[
224
+ item.model_dump(exclude="content_type")
225
+ for item in chat_history[-1].items
226
+ ],
227
+ tool_info=copy.deepcopy(tool_input)),
228
+ usage_info=UsageInfo(token_usage=TokenUsageBaseModel()))
229
+
230
+ self.step_manager.push_intermediate_step(output_stat)
231
+
232
+ return result
233
+
234
+ except Exception as e:
235
+ logger.exception("ToolUsage._use error: %s", e)
236
+ raise
237
+
238
+ return patched_tool_call
@@ -0,0 +1,27 @@
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 pydantic import BaseModel
17
+ from pydantic import Field
18
+
19
+
20
+ class TokenUsageBaseModel(BaseModel):
21
+ """
22
+ Base model for token usage callbacks.
23
+ """
24
+
25
+ prompt_tokens: int = Field(default=0, description="Number of tokens in the prompt.")
26
+ completion_tokens: int = Field(default=0, description="Number of tokens in the completion.")
27
+ total_tokens: int = Field(default=0, description="Number of tokens total.")
@@ -0,0 +1,51 @@
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 typing import Any
17
+
18
+ from pydantic import BaseModel
19
+ from pydantic import ConfigDict
20
+ from pydantic import field_validator
21
+
22
+
23
+ class DataFrameRow(BaseModel):
24
+ model_config = ConfigDict(extra="allow", validate_assignment=True)
25
+
26
+ event_type: Any
27
+ event_timestamp: float | None
28
+ example_number: int | None
29
+ prompt_tokens: int | None
30
+ completion_tokens: int | None
31
+ total_tokens: int | None
32
+ llm_text_input: str | None
33
+ llm_text_output: str | None
34
+ llm_new_token: str | None
35
+ llm_name: str | None
36
+ tool_name: str | None
37
+ function_name: str | None
38
+ function_id: str | None
39
+ parent_function_name: str | None
40
+ parent_function_id: str | None
41
+ UUID: str | None
42
+ framework: str | None
43
+
44
+ @field_validator('llm_text_input', 'llm_text_output', 'llm_new_token', mode='before')
45
+ def cast_to_str(cls, v): # pylint: disable=no-self-argument
46
+ if v is None:
47
+ return v
48
+ try:
49
+ return str(v)
50
+ except Exception as e:
51
+ raise ValueError(f"Value {v} cannot be cast to str: {e}") from e
@@ -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 pydantic import BaseModel
17
+
18
+ from nat.profiler.inference_metrics_model import InferenceMetricsModel
19
+ from nat.profiler.inference_optimization.data_models import WorkflowRuntimeMetrics
20
+
21
+
22
+ class ProfilerResults(BaseModel):
23
+ workflow_runtime_metrics: WorkflowRuntimeMetrics | None = None
24
+ llm_latency_ci: InferenceMetricsModel | None = None
File without changes
@@ -0,0 +1,131 @@
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
+ # pylint disable=ungrouped-imports
17
+
18
+ from __future__ import annotations
19
+
20
+ import functools
21
+ import logging
22
+ from collections.abc import Callable
23
+ from contextlib import AbstractAsyncContextManager as AsyncContextManager
24
+ from contextlib import asynccontextmanager
25
+ from contextvars import ContextVar
26
+ from typing import Any
27
+
28
+ from nat.builder.framework_enum import LLMFrameworkEnum
29
+
30
+ logger = logging.getLogger(__name__)
31
+
32
+ _library_instrumented = {
33
+ "langchain": False,
34
+ "crewai": False,
35
+ "semantic_kernel": False,
36
+ "agno": False,
37
+ }
38
+
39
+ callback_handler_var: ContextVar[Any | None] = ContextVar("callback_handler_var", default=None)
40
+
41
+
42
+ def set_framework_profiler_handler(
43
+ workflow_llms: dict = None,
44
+ frameworks: list[LLMFrameworkEnum] = None,
45
+ ) -> Callable[[Callable[..., AsyncContextManager[Any]]], Callable[..., AsyncContextManager[Any]]]:
46
+ """
47
+ Decorator that wraps an async context manager function to set up framework-specific profiling.
48
+ """
49
+
50
+ def decorator(func: Callable[..., AsyncContextManager[Any]]) -> Callable[..., AsyncContextManager[Any]]:
51
+
52
+ @functools.wraps(func)
53
+ @asynccontextmanager
54
+ async def wrapper(workflow_config, builder):
55
+
56
+ if LLMFrameworkEnum.LANGCHAIN in frameworks and not _library_instrumented["langchain"]:
57
+ from langchain_core.tracers.context import register_configure_hook
58
+
59
+ from nat.profiler.callbacks.langchain_callback_handler import LangchainProfilerHandler
60
+
61
+ handler = LangchainProfilerHandler()
62
+ callback_handler_var.set(handler)
63
+ register_configure_hook(callback_handler_var, inheritable=True)
64
+ _library_instrumented["langchain"] = True
65
+ logger.debug("Langchain callback handler registered")
66
+
67
+ if LLMFrameworkEnum.LLAMA_INDEX in frameworks:
68
+ from llama_index.core import Settings
69
+ from llama_index.core.callbacks import CallbackManager
70
+
71
+ from nat.profiler.callbacks.llama_index_callback_handler import LlamaIndexProfilerHandler
72
+
73
+ handler = LlamaIndexProfilerHandler()
74
+ Settings.callback_manager = CallbackManager([handler])
75
+ logger.debug("LlamaIndex callback handler registered")
76
+
77
+ if LLMFrameworkEnum.CREWAI in frameworks and not _library_instrumented["crewai"]:
78
+ from nat.plugins.crewai.crewai_callback_handler import \
79
+ CrewAIProfilerHandler # pylint: disable=ungrouped-imports,line-too-long # noqa E501
80
+
81
+ handler = CrewAIProfilerHandler()
82
+ handler.instrument()
83
+ _library_instrumented["crewai"] = True
84
+ logger.debug("CrewAI callback handler registered")
85
+
86
+ if LLMFrameworkEnum.SEMANTIC_KERNEL in frameworks and not _library_instrumented["semantic_kernel"]:
87
+ from nat.profiler.callbacks.semantic_kernel_callback_handler import SemanticKernelProfilerHandler
88
+
89
+ handler = SemanticKernelProfilerHandler(workflow_llms=workflow_llms)
90
+ handler.instrument()
91
+ _library_instrumented["semantic_kernel"] = True
92
+ logger.debug("SemanticKernel callback handler registered")
93
+
94
+ if LLMFrameworkEnum.AGNO in frameworks and not _library_instrumented["agno"]:
95
+ from nat.profiler.callbacks.agno_callback_handler import AgnoProfilerHandler
96
+
97
+ handler = AgnoProfilerHandler()
98
+ handler.instrument()
99
+ _library_instrumented["agno"] = True
100
+ logger.info("Agno callback handler registered")
101
+
102
+ # IMPORTANT: actually call the wrapped function as an async context manager
103
+ async with func(workflow_config, builder) as result:
104
+ yield result
105
+
106
+ return wrapper
107
+
108
+ return decorator
109
+
110
+
111
+ def chain_wrapped_build_fn(
112
+ original_build_fn: Callable[..., AsyncContextManager],
113
+ workflow_llms: dict,
114
+ function_frameworks: list[LLMFrameworkEnum],
115
+ ) -> Callable[..., AsyncContextManager]:
116
+ """
117
+ Convert an original build function into an async context manager that
118
+ wraps it with a single call to set_framework_profiler_handler, passing
119
+ all frameworks at once.
120
+ """
121
+
122
+ # Define a base async context manager that simply calls the original build function.
123
+ @asynccontextmanager
124
+ async def base_fn(*args, **kwargs):
125
+ async with original_build_fn(*args, **kwargs) as w:
126
+ yield w
127
+
128
+ # Instead of wrapping iteratively, we now call the decorator once,
129
+ # passing the entire list of frameworks along with the workflow_llms.
130
+ wrapped_fn = set_framework_profiler_handler(workflow_llms, function_frameworks)(base_fn)
131
+ return wrapped_fn