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/llm/openai_llm.py ADDED
@@ -0,0 +1,54 @@
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 pydantic import AliasChoices
17
+ from pydantic import ConfigDict
18
+ from pydantic import Field
19
+
20
+ from nat.builder.builder import Builder
21
+ from nat.builder.llm import LLMProviderInfo
22
+ from nat.cli.register_workflow import register_llm_provider
23
+ from nat.data_models.llm import LLMBaseConfig
24
+ from nat.data_models.optimizable import OptimizableMixin
25
+ from nat.data_models.retry_mixin import RetryMixin
26
+ from nat.data_models.temperature_mixin import TemperatureMixin
27
+ from nat.data_models.thinking_mixin import ThinkingMixin
28
+ from nat.data_models.top_p_mixin import TopPMixin
29
+
30
+
31
+ class OpenAIModelConfig(LLMBaseConfig,
32
+ RetryMixin,
33
+ OptimizableMixin,
34
+ TemperatureMixin,
35
+ TopPMixin,
36
+ ThinkingMixin,
37
+ name="openai"):
38
+ """An OpenAI LLM provider to be used with an LLM client."""
39
+
40
+ model_config = ConfigDict(protected_namespaces=(), extra="allow")
41
+
42
+ api_key: str | None = Field(default=None, description="OpenAI API key to interact with hosted model.")
43
+ base_url: str | None = Field(default=None, description="Base url to the hosted model.")
44
+ model_name: str = Field(validation_alias=AliasChoices("model_name", "model"),
45
+ serialization_alias="model",
46
+ description="The OpenAI hosted model name.")
47
+ seed: int | None = Field(default=None, description="Random seed to set for generation.")
48
+ max_retries: int = Field(default=10, description="The max number of retries for the request.")
49
+
50
+
51
+ @register_llm_provider(config_type=OpenAIModelConfig)
52
+ async def openai_llm(config: OpenAIModelConfig, _builder: Builder):
53
+
54
+ yield LLMProviderInfo(config=config, description="An OpenAI model for use with an LLM client.")
nat/llm/register.py ADDED
@@ -0,0 +1,27 @@
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
+ # flake8: noqa
17
+ # isort:skip_file
18
+ """Register LLM providers via import side effects.
19
+
20
+ This module is imported by the NeMo Agent Toolkit runtime to ensure providers are registered and discoverable.
21
+ """
22
+ # Import any providers which need to be automatically registered here
23
+ from . import aws_bedrock_llm
24
+ from . import azure_openai_llm
25
+ from . import litellm_llm
26
+ from . import nim_llm
27
+ from . import openai_llm
@@ -0,0 +1,14 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
@@ -0,0 +1,93 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import os
17
+ from abc import ABC
18
+ from enum import Enum
19
+
20
+
21
+ class EnvConfigValueSource(Enum):
22
+ ENV_DEFAULT = 1
23
+ CONSTRUCTOR = 2
24
+ ENV_OVERRIDE = 3
25
+
26
+
27
+ class EnvConfigValue(ABC):
28
+ """
29
+ A wrapper for a string used as a configuration value which can be loaded from the system environment or injected via
30
+ the constructor. This class should be subclassed and the class fields `_ENV_KEY` and `_ENV_KEY_OVERRIDE` can be set
31
+ to enable environment-loading functionality. Convienience properties are available to check from where the value was
32
+ loaded.
33
+ """
34
+
35
+ _ENV_KEY: str | None = None
36
+ _ENV_KEY_OVERRIDE: str | None = None
37
+ _ALLOW_NONE: bool = False
38
+
39
+ def __init__(self, value: str | None = None, use_env: bool = True):
40
+ """
41
+ Parameters
42
+ ----------
43
+ value : str, optional
44
+ The value to be contained in the EnvConfigValue. If the value is `None`, an attempt will be made to load it
45
+ from the environment using `_ENV_KEY`. if the `_ENV_KEY_OVERRIDE` field is not `None`, an attempt will be
46
+ made to load that environment variable in place of the passed-in value.
47
+ use_env : bool
48
+ If False, all environment-loading logic will be bypassed and the passed-in value will be used as-is.
49
+ defaults to True.
50
+ """
51
+
52
+ self._source = EnvConfigValueSource.CONSTRUCTOR
53
+
54
+ if use_env:
55
+ if value is None and self.__class__._ENV_KEY is not None:
56
+ value = os.environ.get(self.__class__._ENV_KEY, None)
57
+ self._source = EnvConfigValueSource.ENV_DEFAULT
58
+
59
+ if self.__class__._ENV_KEY_OVERRIDE is not None and self.__class__._ENV_KEY_OVERRIDE in os.environ:
60
+ value = os.environ[self.__class__._ENV_KEY_OVERRIDE]
61
+ self._source = EnvConfigValueSource.ENV_OVERRIDE
62
+
63
+ if not self.__class__._ALLOW_NONE and value is None:
64
+
65
+ message = ("value must not be None, but provided value was None and no environment-based default or "
66
+ "override was found.")
67
+
68
+ if self.__class__._ENV_KEY is None:
69
+ raise ValueError(message)
70
+
71
+ raise ValueError(
72
+ f"{message} Try passing a value to the constructor, or setting the `{self.__class__._ENV_KEY}` "
73
+ "environment variable.")
74
+
75
+ elif not self.__class__._ALLOW_NONE and value is None:
76
+ raise ValueError("value must not be none")
77
+
78
+ assert isinstance(value, str) or value is None
79
+
80
+ self._value = value
81
+ self._use_env = use_env
82
+
83
+ @property
84
+ def source(self) -> EnvConfigValueSource:
85
+ return self._source
86
+
87
+ @property
88
+ def use_env(self) -> bool:
89
+ return self._use_env
90
+
91
+ @property
92
+ def value(self) -> str | None:
93
+ return self._value
nat/llm/utils/error.py ADDED
@@ -0,0 +1,17 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ IMPORT_ERROR_MESSAGE = (
17
+ "{package} not found. Install it and other additional dependencies by running the following command:\n")
@@ -0,0 +1,215 @@
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 functools
17
+ import inspect
18
+ import logging
19
+ import types
20
+ from abc import abstractmethod
21
+ from collections.abc import AsyncGenerator
22
+ from collections.abc import Callable
23
+ from collections.abc import Iterable
24
+ from dataclasses import dataclass
25
+ from typing import Any
26
+ from typing import TypeVar
27
+
28
+ ModelType = TypeVar("ModelType")
29
+ MessagesType = TypeVar("MessagesType")
30
+
31
+ logger = logging.getLogger(__name__)
32
+
33
+
34
+ class FunctionArgumentWrapper:
35
+ """
36
+ Wrapper for the arguments and keyword arguments of a function.
37
+
38
+ The arguments and keyword arguments are stored in the args and kwargs attributes, respectively.
39
+ """
40
+
41
+ def __init__(self, *args: Any, **kwargs: Any):
42
+ """
43
+ Initialize the FunctionArgumentWrapper.
44
+
45
+ Args:
46
+ args: The arguments to the function.
47
+ kwargs: The keyword arguments to the function.
48
+ """
49
+ self.args = args
50
+ self.kwargs = kwargs
51
+
52
+ def __repr__(self) -> str:
53
+ return f"FunctionArgumentWrapper(args={self.args}, kwargs={self.kwargs})"
54
+
55
+
56
+ @dataclass
57
+ class BaseThinkingInjector:
58
+ """
59
+ Base class for thinking injectors.
60
+
61
+ Args:
62
+ system_prompt: The system prompt to inject.
63
+ function_names: The function names to inject the system prompt into.
64
+ """
65
+
66
+ system_prompt: str
67
+ function_names: list[str]
68
+
69
+ @abstractmethod
70
+ def inject(self, *args, **kwargs) -> FunctionArgumentWrapper:
71
+ """
72
+ Inject the system prompt into the arguments.
73
+
74
+ Args:
75
+ args: The arguments to inject the system prompt into.
76
+ kwargs: The keyword arguments to inject the system prompt into.
77
+
78
+ Returns:
79
+ FunctionArgumentWrapper: An object that contains the transformed args and kwargs.
80
+ """
81
+ pass
82
+
83
+
84
+ def _make_thinking_decorator(injector: BaseThinkingInjector):
85
+
86
+ def decorate(fn: Callable[..., Any]) -> Callable[..., Any]:
87
+
88
+ async def _call_async(obj: object, *call_args, **call_kwargs) -> Any:
89
+ new_args = injector.inject(*call_args, **call_kwargs)
90
+ return await fn(obj, *new_args.args, **new_args.kwargs)
91
+
92
+ async def _agen(obj: object, *call_args, **call_kwargs) -> AsyncGenerator[Any, None]:
93
+ new_args = injector.inject(*call_args, **call_kwargs)
94
+ async for item in fn(obj, *new_args.args, **new_args.kwargs):
95
+ yield item
96
+
97
+ def _gen(obj: object, *call_args, **call_kwargs) -> Iterable[Any]:
98
+ new_args = injector.inject(*call_args, **call_kwargs)
99
+ yield from fn(obj, *new_args.args, **new_args.kwargs)
100
+ return
101
+
102
+ def _sync(obj: object, *call_args, **call_kwargs) -> Any:
103
+ new_args = injector.inject(*call_args, **call_kwargs)
104
+ return fn(obj, *new_args.args, **new_args.kwargs)
105
+
106
+ # Decide which wrapper to return
107
+ if inspect.iscoroutinefunction(fn):
108
+ wrapper = _call_async
109
+ elif inspect.isasyncgenfunction(fn):
110
+ wrapper = _agen
111
+ elif inspect.isgeneratorfunction(fn):
112
+ wrapper = _gen
113
+ else:
114
+ wrapper = _sync
115
+
116
+ return functools.wraps(fn)(wrapper)
117
+
118
+ return decorate
119
+
120
+
121
+ def patch_with_thinking(obj: ModelType, injector: BaseThinkingInjector) -> ModelType:
122
+ """
123
+ Patch the given object with a decorator that injects a system prompt into the supplied messages.
124
+ There is an assumption that the first non-object argument is the messages.
125
+
126
+ Args:
127
+ obj: The object to patch.
128
+ injector: The injector to use.
129
+
130
+ Returns:
131
+ The patched object.
132
+
133
+ Examples:
134
+ >>> from nat.llm.utils.thinking import BaseThinkingInjector
135
+ >>> from nat.llm.utils.thinking import FunctionArgumentWrapper
136
+ >>> from nat.llm.utils.thinking import patch_with_thinking
137
+ >>>
138
+ >>> class MockClass:
139
+ ... def sync_method(self, *args, **kwargs):
140
+ ... return (args, kwargs)
141
+ ...
142
+ >>> mock_obj_1 = MockClass()
143
+ >>> class AddThinking(BaseThinkingInjector):
144
+ ... def inject(self, x: str, *args, **kwargs) -> FunctionArgumentWrapper:
145
+ ... return FunctionArgumentWrapper(("thinking " + x), *args, **kwargs)
146
+ >>>
147
+ >>> patched_obj = patch_with_thinking(mock_obj_1, AddThinking(
148
+ ... system_prompt="thinking",
149
+ ... function_names=["sync_method"],
150
+ ... ))
151
+ >>> patched_obj.sync_method("test", 1, 2, 3, foo="bar")
152
+ (('thinking test', 1, 2, 3), {'foo': 'bar'})
153
+ >>>
154
+ >>> mock_obj_2 = MockClass()
155
+ >>> class AddThinkingWithArgs(BaseThinkingInjector):
156
+ ... def inject(self, *args, **kwargs) -> FunctionArgumentWrapper:
157
+ ... return FunctionArgumentWrapper("thinking", *args, **kwargs)
158
+ >>>
159
+ >>> patched_obj = patch_with_thinking(mock_obj_2, AddThinkingWithArgs(
160
+ ... system_prompt="thinking",
161
+ ... function_names=["sync_method"],
162
+ ... ))
163
+ >>> patched_obj.sync_method("test", 1, 2, 3, foo="bar")
164
+ (('thinking', 'test', 1, 2, 3), {'foo': 'bar'})
165
+ >>>
166
+ >>> mock_obj_3 = MockClass()
167
+ >>> class AddThinkingWithKwargs(BaseThinkingInjector):
168
+ ... def inject(self, *args, **kwargs) -> FunctionArgumentWrapper:
169
+ ... return FunctionArgumentWrapper(*args, thinking=True, **kwargs)
170
+ >>>
171
+ >>> patched_obj = patch_with_thinking(mock_obj_3, AddThinkingWithKwargs(
172
+ ... system_prompt="thinking",
173
+ ... function_names=["sync_method"],
174
+ ... ))
175
+ >>> patched_obj.sync_method("test", 1, 2, 3, foo="bar")
176
+ (('test', 1, 2, 3), {'thinking': True, 'foo': 'bar'})
177
+ """
178
+
179
+ decorator = _make_thinking_decorator(injector)
180
+
181
+ cls = obj if inspect.isclass(obj) else type(obj)
182
+ cls_name = getattr(cls, "__name__", str(cls))
183
+
184
+ for name, _ in inspect.getmembers(cls, callable):
185
+ if name not in injector.function_names:
186
+ continue
187
+
188
+ descriptor = inspect.getattr_static(cls, name)
189
+ original = descriptor.__func__ if isinstance(descriptor, types.MethodType) else descriptor
190
+ wrapped = decorator(original)
191
+
192
+ try: # instance‑level first
193
+ if not inspect.isclass(obj):
194
+ object.__setattr__(obj, name, types.MethodType(wrapped, obj))
195
+ continue
196
+ except Exception as exc:
197
+ logger.info(
198
+ "Instance‑level patch failed for %s.%s (%s); "
199
+ "falling back to class‑level patch.",
200
+ cls_name,
201
+ name,
202
+ exc,
203
+ )
204
+
205
+ try: # class‑level fallback
206
+ setattr(cls, name, wrapped)
207
+ except Exception as exc:
208
+ logger.info(
209
+ "Cannot patch method %s.%s with thinking: %s",
210
+ cls_name,
211
+ name,
212
+ exc,
213
+ )
214
+
215
+ return obj
nat/memory/__init__.py ADDED
@@ -0,0 +1,20 @@
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
+ NAT Memory Module
17
+
18
+ This package provides foundational classes and interfaces
19
+ for managing text-based memory in NAT's LLM-based agents.
20
+ """
@@ -0,0 +1,183 @@
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 abc import ABC
17
+ from abc import abstractmethod
18
+ from collections.abc import Callable
19
+
20
+ from .models import MemoryItem
21
+
22
+
23
+ class MemoryEditor(ABC):
24
+ """
25
+ Abstract interface for editing and
26
+ retrieving memory items.
27
+
28
+ A MemoryEditor is responsible for adding, searching, and
29
+ removing MemoryItems.
30
+
31
+ Implementations may integrate with
32
+ vector stores or other indexing backends.
33
+ """
34
+
35
+ @abstractmethod
36
+ async def add_items(self, items: list[MemoryItem]) -> None:
37
+ """
38
+ Insert multiple MemoryItems into the memory.
39
+
40
+ Args:
41
+ items (list[MemoryItem]): The items to be added.
42
+ """
43
+ raise NotImplementedError
44
+
45
+ @abstractmethod
46
+ async def search(self, query: str, top_k: int = 5, **kwargs) -> list[MemoryItem]:
47
+ """
48
+ Retrieve items relevant to the given query.
49
+ Relevance criteria depend on implementation.
50
+
51
+ Args:
52
+ query (str): The query string to match.
53
+ top_k (int): Maximum number of items to return.
54
+ kwargs (dict): Keyword arguments to pass to the search method.
55
+
56
+ Returns:
57
+ list[MemoryItem]: The most relevant MemoryItems.
58
+ """
59
+ raise NotImplementedError
60
+
61
+ @abstractmethod
62
+ async def remove_items(self, **kwargs) -> None:
63
+ """
64
+ Remove items. Additional parameters
65
+ needed for deletion can be specified in keyword arguments.
66
+
67
+ Args:
68
+ kwargs (dict): Keyword arguments to pass to the remove-items method.
69
+ """
70
+ raise NotImplementedError
71
+
72
+
73
+ class MemoryIOBase(ABC):
74
+ """
75
+ Base abstract class for I/O operations
76
+ on memory, providing a common interface for
77
+
78
+ MemoryReader and MemoryWriter to interact
79
+ with a MemoryEditor.
80
+
81
+ Concrete subclasses should hold a
82
+ reference to a MemoryEditor instance.
83
+ """
84
+
85
+ def __init__(self, editor: MemoryEditor) -> None:
86
+ self._editor = editor
87
+
88
+
89
+ class MemoryReader(MemoryIOBase):
90
+ """
91
+ Responsible for retrieving MemoryItems
92
+ from the MemoryEditor based on context or queries.
93
+ """
94
+
95
+ @abstractmethod
96
+ async def retrieve(self, context: str, top_k: int = 5) -> list[MemoryItem]:
97
+ """
98
+ Retrieve a subset of
99
+ MemoryItems relevant to the provided context.
100
+
101
+ Args:
102
+ context (str): A string representing
103
+ the current user context or query.
104
+ top_k (int): Maximum number of items to return.
105
+
106
+ Returns:
107
+ list[MemoryItem]: Relevant MemoryItems.
108
+ """
109
+ raise NotImplementedError
110
+
111
+
112
+ class MemoryWriter(MemoryIOBase):
113
+ """
114
+ Responsible for converting new observations
115
+ (textual inputs) into MemoryItems andstoring
116
+ them via the MemoryEditor.
117
+ """
118
+
119
+ @abstractmethod
120
+ async def write(self, observation: str, context: str | None = None) -> list[MemoryItem]:
121
+ """
122
+ Process the given observation and store the resulting MemoryItems.
123
+
124
+ Args:
125
+ observation (str): The new textual input to record.
126
+ context (Optional[str]): Additional
127
+ context that might influence how the observation is stored.
128
+
129
+ Returns:
130
+ list[MemoryItem]: The newly created MemoryItems.
131
+ """
132
+ raise NotImplementedError
133
+
134
+
135
+ class MemoryManager(ABC):
136
+ """
137
+ Manages the lifecycle of the stored
138
+ memory by applying policies such as summarization,
139
+ reflection, forgetting, and mergingn
140
+ to ensure long-term coherence and relevance.
141
+ """
142
+
143
+ @abstractmethod
144
+ async def summarize(self) -> None:
145
+ """
146
+ Summarize long or numerous MemoryItems into a more compact form.
147
+ This may remove the original items and store a new summary item.
148
+ """
149
+ raise NotImplementedError
150
+
151
+ @abstractmethod
152
+ async def reflect(self) -> None:
153
+ """
154
+ Generate higher-level insights or
155
+ abstractions from existing MemoryItems.
156
+ This may call out to an LLM or other
157
+ logic to produce conceptual memory.
158
+ """
159
+ raise NotImplementedError
160
+
161
+ @abstractmethod
162
+ async def forget(self, criteria: Callable[[MemoryItem], bool]) -> None:
163
+ """
164
+ Remove MemoryItems that are no
165
+ longer relevant or have low importance.
166
+
167
+ Args:
168
+ criteria (Callable[[MemoryItem], bool]): A function that
169
+ returns True for items to forget.
170
+ """
171
+ raise NotImplementedError
172
+
173
+ @abstractmethod
174
+ async def merge(self, criteria: Callable[[MemoryItem, MemoryItem], bool]) -> None:
175
+ """
176
+ Merge similar or redundant MemoryItems
177
+ into a smaller set of more concise items.
178
+
179
+ Args:
180
+ criteria (Callable[[MemoryItem, MemoryItem], bool]): A function
181
+ that determines which items can be merged.
182
+ """
183
+ raise NotImplementedError