nvidia-nat 1.3.0a20250828__py3-none-any.whl → 1.3.0a20250829__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 (70) hide show
  1. nat/agent/base.py +6 -1
  2. nat/agent/react_agent/agent.py +9 -13
  3. nat/agent/react_agent/register.py +1 -1
  4. nat/agent/rewoo_agent/agent.py +16 -30
  5. nat/agent/rewoo_agent/register.py +3 -3
  6. nat/agent/tool_calling_agent/agent.py +9 -19
  7. nat/agent/tool_calling_agent/register.py +2 -2
  8. nat/builder/eval_builder.py +2 -2
  9. nat/builder/function.py +8 -8
  10. nat/builder/workflow_builder.py +21 -24
  11. nat/cli/cli_utils/config_override.py +1 -1
  12. nat/cli/commands/info/list_channels.py +1 -1
  13. nat/cli/commands/registry/publish.py +2 -2
  14. nat/cli/commands/registry/pull.py +2 -2
  15. nat/cli/commands/registry/remove.py +2 -2
  16. nat/cli/commands/registry/search.py +1 -1
  17. nat/cli/commands/start.py +1 -1
  18. nat/cli/commands/uninstall.py +1 -1
  19. nat/cli/commands/workflow/workflow_commands.py +4 -4
  20. nat/data_models/discovery_metadata.py +4 -4
  21. nat/eval/evaluate.py +6 -6
  22. nat/eval/intermediate_step_adapter.py +1 -1
  23. nat/eval/rag_evaluator/evaluate.py +2 -2
  24. nat/eval/rag_evaluator/register.py +1 -1
  25. nat/eval/remote_workflow.py +3 -3
  26. nat/eval/swe_bench_evaluator/evaluate.py +5 -5
  27. nat/eval/trajectory_evaluator/evaluate.py +1 -1
  28. nat/eval/tunable_rag_evaluator/evaluate.py +3 -3
  29. nat/experimental/test_time_compute/functions/ttc_tool_orchestration_function.py +2 -2
  30. nat/front_ends/fastapi/fastapi_front_end_controller.py +4 -4
  31. nat/front_ends/fastapi/fastapi_front_end_plugin.py +1 -1
  32. nat/front_ends/fastapi/fastapi_front_end_plugin_worker.py +3 -3
  33. nat/front_ends/fastapi/message_handler.py +2 -2
  34. nat/front_ends/fastapi/message_validator.py +8 -10
  35. nat/front_ends/fastapi/response_helpers.py +4 -4
  36. nat/front_ends/fastapi/step_adaptor.py +1 -1
  37. nat/observability/exporter/base_exporter.py +1 -1
  38. nat/observability/exporter/processing_exporter.py +8 -9
  39. nat/observability/exporter_manager.py +5 -5
  40. nat/observability/mixin/file_mixin.py +7 -7
  41. nat/observability/processor/batching_processor.py +4 -6
  42. nat/profiler/calc/calc_runner.py +3 -4
  43. nat/profiler/callbacks/agno_callback_handler.py +1 -1
  44. nat/profiler/callbacks/langchain_callback_handler.py +5 -5
  45. nat/profiler/callbacks/llama_index_callback_handler.py +3 -3
  46. nat/profiler/callbacks/semantic_kernel_callback_handler.py +2 -2
  47. nat/profiler/profile_runner.py +1 -1
  48. nat/profiler/utils.py +1 -1
  49. nat/registry_handlers/local/local_handler.py +2 -2
  50. nat/registry_handlers/package_utils.py +1 -1
  51. nat/registry_handlers/pypi/pypi_handler.py +3 -3
  52. nat/registry_handlers/rest/rest_handler.py +4 -4
  53. nat/retriever/milvus/retriever.py +1 -1
  54. nat/retriever/nemo_retriever/retriever.py +1 -1
  55. nat/runtime/loader.py +1 -1
  56. nat/runtime/runner.py +2 -2
  57. nat/settings/global_settings.py +1 -1
  58. nat/tool/code_execution/local_sandbox/local_sandbox_server.py +1 -1
  59. nat/tool/nvidia_rag.py +1 -1
  60. nat/tool/retriever.py +3 -2
  61. nat/utils/io/yaml_tools.py +1 -1
  62. nat/utils/reactive/observer.py +2 -2
  63. nat/utils/settings/global_settings.py +2 -2
  64. {nvidia_nat-1.3.0a20250828.dist-info → nvidia_nat-1.3.0a20250829.dist-info}/METADATA +1 -1
  65. {nvidia_nat-1.3.0a20250828.dist-info → nvidia_nat-1.3.0a20250829.dist-info}/RECORD +70 -70
  66. {nvidia_nat-1.3.0a20250828.dist-info → nvidia_nat-1.3.0a20250829.dist-info}/WHEEL +0 -0
  67. {nvidia_nat-1.3.0a20250828.dist-info → nvidia_nat-1.3.0a20250829.dist-info}/entry_points.txt +0 -0
  68. {nvidia_nat-1.3.0a20250828.dist-info → nvidia_nat-1.3.0a20250829.dist-info}/licenses/LICENSE-3rd-party.txt +0 -0
  69. {nvidia_nat-1.3.0a20250828.dist-info → nvidia_nat-1.3.0a20250829.dist-info}/licenses/LICENSE.md +0 -0
  70. {nvidia_nat-1.3.0a20250828.dist-info → nvidia_nat-1.3.0a20250829.dist-info}/top_level.txt +0 -0
@@ -442,7 +442,7 @@ class CalcRunner:
442
442
  runtime_fit=self.linear_analyzer.wf_runtime_fit # May be None
443
443
  )
444
444
  except Exception as e:
445
- logger.exception("Failed to plot concurrency vs. time metrics: %s", e, exc_info=True)
445
+ logger.exception("Failed to plot concurrency vs. time metrics: %s", e)
446
446
  logger.warning("Skipping plot of concurrency vs. time metrics")
447
447
 
448
448
  def write_output(self, output_dir: Path, calc_runner_output: CalcRunnerOutput):
@@ -506,11 +506,10 @@ class CalcRunner:
506
506
  continue
507
507
  try:
508
508
  calc_output = CalcRunnerOutput.model_validate_json(calc_runner_output_path.read_text())
509
- except ValidationError as e:
509
+ except ValidationError:
510
510
  logger.exception("Failed to validate calc runner output file %s. Skipping job %s.",
511
511
  calc_runner_output_path,
512
- e,
513
- exc_info=True)
512
+ job_dir.name)
514
513
  continue
515
514
 
516
515
  # Extract sizing metrics from calc_data
@@ -144,7 +144,7 @@ class AgnoProfilerHandler(BaseProfilerCallback):
144
144
  return result
145
145
 
146
146
  except Exception as e:
147
- logger.exception("Tool execution error: %s", e)
147
+ logger.error("Tool execution error: %s", e)
148
148
  raise
149
149
 
150
150
  return wrapped_tool_execute
@@ -106,7 +106,7 @@ class LangchainProfilerHandler(AsyncCallbackHandler, BaseProfilerCallback):
106
106
  try:
107
107
  model_name = kwargs.get("metadata")["ls_model_name"]
108
108
  except Exception as e:
109
- logger.exception("Error getting model name: %s", e, exc_info=True)
109
+ logger.exception("Error getting model name: %s", e)
110
110
 
111
111
  run_id = str(kwargs.get("run_id", str(uuid4())))
112
112
  self._run_id_to_model_name[run_id] = model_name
@@ -144,7 +144,7 @@ class LangchainProfilerHandler(AsyncCallbackHandler, BaseProfilerCallback):
144
144
  try:
145
145
  model_name = metadata["ls_model_name"] if metadata else kwargs.get("metadata")["ls_model_name"]
146
146
  except Exception as e:
147
- logger.exception("Error getting model name: %s", e, exc_info=True)
147
+ logger.exception("Error getting model name: %s", e)
148
148
 
149
149
  run_id = str(run_id)
150
150
  self._run_id_to_model_name[run_id] = model_name
@@ -173,13 +173,13 @@ class LangchainProfilerHandler(AsyncCallbackHandler, BaseProfilerCallback):
173
173
  try:
174
174
  model_name = self._run_id_to_model_name.get(str(kwargs.get("run_id", "")), "")
175
175
  except Exception as e:
176
- logger.exception("Error getting model name: %s", e, exc_info=True)
176
+ logger.exception("Error getting model name: %s", e)
177
177
 
178
178
  usage_metadata = {}
179
179
  try:
180
180
  usage_metadata = kwargs.get("chunk").message.usage_metadata if kwargs.get("chunk") else {}
181
181
  except Exception as e:
182
- logger.exception("Error getting usage metadata: %s", e, exc_info=True)
182
+ logger.exception("Error getting usage metadata: %s", e)
183
183
 
184
184
  stats = IntermediateStepPayload(
185
185
  event_type=IntermediateStepType.LLM_NEW_TOKEN,
@@ -206,7 +206,7 @@ class LangchainProfilerHandler(AsyncCallbackHandler, BaseProfilerCallback):
206
206
  try:
207
207
  model_name = self._run_id_to_model_name.get(str(kwargs.get("run_id", "")), "")
208
208
  except Exception as e_inner:
209
- logger.exception("Error getting model name: %s from outer error %s", e_inner, e, exc_info=True)
209
+ logger.exception("Error getting model name: %s from outer error %s", e_inner, e)
210
210
 
211
211
  try:
212
212
  generation = response.generations[0][0]
@@ -94,7 +94,7 @@ class LlamaIndexProfilerHandler(BaseCallbackHandler, BaseProfilerCallback):
94
94
  try:
95
95
  model_name = payload.get(EventPayload.SERIALIZED)['model']
96
96
  except Exception as e:
97
- logger.exception("Error getting model name: %s", e, exc_info=True)
97
+ logger.exception("Error getting model name: %s", e)
98
98
 
99
99
  llm_text_input = " ".join(prompts_or_messages) if prompts_or_messages else ""
100
100
 
@@ -159,13 +159,13 @@ class LlamaIndexProfilerHandler(BaseCallbackHandler, BaseProfilerCallback):
159
159
  for block in response.message.blocks:
160
160
  llm_text_output += block.text
161
161
  except Exception as e:
162
- logger.exception("Error getting LLM text output: %s", e, exc_info=True)
162
+ logger.exception("Error getting LLM text output: %s", e)
163
163
 
164
164
  model_name = ""
165
165
  try:
166
166
  model_name = response.raw.model
167
167
  except Exception as e:
168
- logger.exception("Error getting model name: %s", e, exc_info=True)
168
+ logger.exception("Error getting model name: %s", e)
169
169
 
170
170
  # Append usage data to NAT usage stats
171
171
  with self._lock:
@@ -132,7 +132,7 @@ class SemanticKernelProfilerHandler(BaseProfilerCallback):
132
132
  if "text" in item:
133
133
  model_input += item["text"]
134
134
  except Exception as e:
135
- logger.exception("Error in getting model input: %s", e, exc_info=True)
135
+ logger.exception("Error in getting model input: %s", e)
136
136
 
137
137
  input_stats = IntermediateStepPayload(event_type=IntermediateStepType.LLM_START,
138
138
  framework=LLMFrameworkEnum.SEMANTIC_KERNEL,
@@ -232,7 +232,7 @@ class SemanticKernelProfilerHandler(BaseProfilerCallback):
232
232
  return result
233
233
 
234
234
  except Exception as e:
235
- logger.exception("ToolUsage._use error: %s", e)
235
+ logger.error("ToolUsage._use error: %s", e)
236
236
  raise
237
237
 
238
238
  return patched_tool_call
@@ -282,7 +282,7 @@ class ProfilerRunner:
282
282
  fitted_model = model_trainer.train(all_steps)
283
283
  logger.info("Fitted model for forecasting.")
284
284
  except Exception as e:
285
- logger.exception("Fitting model failed. %s", e, exc_info=True)
285
+ logger.exception("Fitting model failed. %s", e)
286
286
  return ProfilerResults()
287
287
 
288
288
  if self.write_output:
nat/profiler/utils.py CHANGED
@@ -175,7 +175,7 @@ def create_standardized_dataframe(requests_data: list[list[IntermediateStep]]) -
175
175
  event_type=step.event_type).model_dump(), )
176
176
 
177
177
  except Exception as e:
178
- logger.exception("Error creating standardized DataFrame: %s", e, exc_info=True)
178
+ logger.exception("Error creating standardized DataFrame: %s", e)
179
179
  return pd.DataFrame()
180
180
 
181
181
  if not all_rows:
@@ -133,7 +133,7 @@ class LocalRegistryHandler(AbstractRegistryHandler):
133
133
  "message": msg,
134
134
  "action": ActionEnum.SEARCH
135
135
  })
136
- logger.exception(validated_search_response.status.message, exc_info=True)
136
+ logger.exception(validated_search_response.status.message)
137
137
 
138
138
  yield validated_search_response
139
139
 
@@ -168,7 +168,7 @@ class LocalRegistryHandler(AbstractRegistryHandler):
168
168
  validated_remove_response = RemoveResponse(status={
169
169
  "status": StatusEnum.ERROR, "message": msg, "action": ActionEnum.REMOVE
170
170
  }) # type: ignore
171
- logger.exception(validated_remove_response.status.message, exc_info=True)
171
+ logger.exception(validated_remove_response.status.message)
172
172
 
173
173
  yield validated_remove_response
174
174
 
@@ -396,7 +396,7 @@ def get_transitive_dependencies(distribution_names: list[str]) -> dict[str, set[
396
396
  except importlib.metadata.PackageNotFoundError:
397
397
  pass
398
398
 
399
- logger.error("Distribution %s not found (tried common variations)", dist_name)
399
+ logger.error("Distribution %s not found (tried common variations)", dist_name, exc_info=True)
400
400
  result[dist_name] = set()
401
401
 
402
402
  return result
@@ -85,7 +85,7 @@ class PypiRegistryHandler(AbstractRegistryHandler):
85
85
  validated_publish_response = PublishResponse(status={
86
86
  "status": StatusEnum.ERROR, "message": msg, "action": ActionEnum.PUBLISH
87
87
  })
88
- logger.exception(validated_publish_response.status.message, exc_info=True)
88
+ logger.exception(validated_publish_response.status.message)
89
89
 
90
90
  yield validated_publish_response
91
91
 
@@ -149,7 +149,7 @@ class PypiRegistryHandler(AbstractRegistryHandler):
149
149
  validated_pull_response = PullResponse(status={
150
150
  "status": StatusEnum.ERROR, "message": msg, "action": ActionEnum.PULL
151
151
  })
152
- logger.exception(validated_pull_response.status.message, exc_info=True)
152
+ logger.exception(validated_pull_response.status.message)
153
153
 
154
154
  yield validated_pull_response
155
155
 
@@ -212,7 +212,7 @@ class PypiRegistryHandler(AbstractRegistryHandler):
212
212
 
213
213
  except Exception as e:
214
214
  msg = f"Error searching for artifacts: {e}"
215
- logger.exception(msg, exc_info=True)
215
+ logger.exception(msg)
216
216
  validated_search_response = SearchResponse(params=query,
217
217
  status={
218
218
  "status": StatusEnum.ERROR,
@@ -88,7 +88,7 @@ class RestRegistryHandler(AbstractRegistryHandler):
88
88
  validated_publish_response = PublishResponse(status={
89
89
  "status": StatusEnum.ERROR, "message": msg, "action": ActionEnum.PUBLISH
90
90
  })
91
- logger.exception(validated_publish_response.status.message, exc_info=True)
91
+ logger.exception(validated_publish_response.status.message)
92
92
 
93
93
  yield validated_publish_response
94
94
 
@@ -155,7 +155,7 @@ class RestRegistryHandler(AbstractRegistryHandler):
155
155
  validated_pull_response = PullResponse(status={
156
156
  "status": StatusEnum.ERROR, "message": msg, "action": ActionEnum.PULL
157
157
  })
158
- logger.exception(validated_pull_response.status.message, exc_info=True)
158
+ logger.exception(validated_pull_response.status.message)
159
159
 
160
160
  yield validated_pull_response
161
161
 
@@ -193,7 +193,7 @@ class RestRegistryHandler(AbstractRegistryHandler):
193
193
  "message": msg,
194
194
  "action": ActionEnum.SEARCH
195
195
  })
196
- logger.exception(validated_search_response.status.message, exc_info=True)
196
+ logger.exception(validated_search_response.status.message)
197
197
 
198
198
  yield validated_search_response
199
199
 
@@ -228,7 +228,7 @@ class RestRegistryHandler(AbstractRegistryHandler):
228
228
  validated_remove_response = RemoveResponse(status={
229
229
  "status": StatusEnum.ERROR, "message": msg, "action": ActionEnum.REMOVE
230
230
  })
231
- logger.exception(validated_remove_response.status.message, exc_info=True)
231
+ logger.exception(validated_remove_response.status.message)
232
232
 
233
233
  yield validated_remove_response
234
234
 
@@ -154,7 +154,7 @@ class MilvusRetriever(Retriever):
154
154
  return _wrap_milvus_results(results, content_field=self.content_field)
155
155
 
156
156
  except Exception as e:
157
- logger.exception("Exception when retrieving results from milvus for query %s: %s", query, e)
157
+ logger.error("Exception when retrieving results from milvus for query %s: %s", query, e)
158
158
  raise RetrieverError(f"Error when retrieving documents from {collection_name} for query '{query}'") from e
159
159
 
160
160
  async def _search(self,
@@ -143,7 +143,7 @@ class NemoRetriever(Retriever):
143
143
  return _wrap_nemo_results(output=output, content_field="content")
144
144
 
145
145
  except Exception as e:
146
- logger.exception("Encountered an error when retrieving results from Nemo Retriever: %s", e)
146
+ logger.error("Encountered an error when retrieving results from Nemo Retriever: %s", e)
147
147
  raise CollectionUnavailableError(
148
148
  f"Error when retrieving documents from {collection_name} for query '{query}'") from e
149
149
 
nat/runtime/loader.py CHANGED
@@ -210,7 +210,7 @@ def discover_and_register_plugins(plugin_type: PluginTypes):
210
210
  # Optionally, you can mark the plugin as unavailable or take other actions
211
211
 
212
212
  except Exception:
213
- logger.exception("An error occurred while loading plugin '%s': {e}", entry_point.name, exc_info=True)
213
+ logger.exception("An error occurred while loading plugin '%s'", entry_point.name)
214
214
 
215
215
  finally:
216
216
  count += 1
nat/runtime/runner.py CHANGED
@@ -149,7 +149,7 @@ class Runner:
149
149
 
150
150
  return result
151
151
  except Exception as e:
152
- logger.exception("Error running workflow: %s", e)
152
+ logger.error("Error running workflow: %s", e)
153
153
  event_stream = self._context_state.event_stream.get()
154
154
  if event_stream:
155
155
  event_stream.on_complete()
@@ -181,7 +181,7 @@ class Runner:
181
181
  event_stream.on_complete()
182
182
 
183
183
  except Exception as e:
184
- logger.exception("Error running workflow: %s", e)
184
+ logger.error("Error running workflow: %s", e)
185
185
  event_stream = self._context_state.event_stream.get()
186
186
  if event_stream:
187
187
  event_stream.on_complete()
@@ -231,7 +231,7 @@ class Settings(HashableBaseModel):
231
231
  return True
232
232
 
233
233
  except Exception as e:
234
- logger.exception("Unable to validate user settings configuration: %s", e, exc_info=True)
234
+ logger.exception("Unable to validate user settings configuration: %s", e)
235
235
  return False
236
236
 
237
237
  def print_channel_settings(self, channel_type: str | None = None) -> None:
@@ -121,7 +121,7 @@ def execute_code_subprocess(generated_code: str, queue):
121
121
  resource.setrlimit(resource.RLIMIT_AS, (limit, limit))
122
122
  resource.setrlimit(resource.RLIMIT_DATA, (limit, limit))
123
123
  except Exception as e:
124
- logger.error("Failed to set resource limits, PID: %s, error: %s", os.getpid(), e)
124
+ logger.exception("Failed to set resource limits, PID: %s, error: %s", os.getpid(), e)
125
125
 
126
126
  stdout_capture = StringIO()
127
127
  stderr_capture = StringIO()
nat/tool/nvidia_rag.py CHANGED
@@ -86,7 +86,7 @@ async def nvidia_rag_tool(config: NVIDIARAGToolConfig, builder: Builder):
86
86
  [await aformat_document(doc, document_prompt) for doc in docs])
87
87
  return parsed_output
88
88
  except Exception as e:
89
- logger.exception("Error while running the tool", exc_info=True)
89
+ logger.exception("Error while running the tool")
90
90
  return f"Error while running the tool: {e}"
91
91
 
92
92
  yield FunctionInfo.from_fn(
nat/tool/retriever.py CHANGED
@@ -78,8 +78,9 @@ async def retriever_tool(config: RetrieverConfig, builder: Builder):
78
78
 
79
79
  except RetrieverError as e:
80
80
  if config.raise_errors:
81
- raise e
82
- logger.warning("Retriever threw an error: %s. Returning an empty response.", e)
81
+ logger.error("Retriever threw an error: %s.", e)
82
+ raise
83
+ logger.exception("Retriever threw an error: %s. Returning an empty response.", e)
83
84
  return RetrieverOutput(results=[])
84
85
 
85
86
  yield FunctionInfo.from_fn(
@@ -85,7 +85,7 @@ def yaml_loads(config: str) -> dict:
85
85
  try:
86
86
  config_data = yaml.safe_load(stream)
87
87
  except yaml.YAMLError as e:
88
- logger.error("Error loading YAML: %s", interpolated_config_str, exc_info=True)
88
+ logger.error("Error loading YAML: %s", interpolated_config_str)
89
89
  raise ValueError(f"Error loading YAML: {e}") from e
90
90
 
91
91
  assert isinstance(config_data, dict)
@@ -64,7 +64,7 @@ class Observer(ObserverBase[_T_in_contra]):
64
64
  try:
65
65
  self._on_error(exc)
66
66
  except Exception as e:
67
- logger.exception("Error in on_error callback: %s", e, exc_info=True)
67
+ logger.exception("Error in on_error callback: %s", e)
68
68
 
69
69
  def on_complete(self) -> None:
70
70
  if not self._stopped:
@@ -73,4 +73,4 @@ class Observer(ObserverBase[_T_in_contra]):
73
73
  try:
74
74
  self._on_complete()
75
75
  except Exception as e:
76
- logger.exception("Error in on_complete callback: %s", e, exc_info=True)
76
+ logger.exception("Error in on_complete callback: %s", e)
@@ -55,7 +55,7 @@ def configure_registry_channel(config_type: RegistryHandlerBaseConfig, channel_n
55
55
  channel_registry_pre[field] = getattr(validated_field_model, field)
56
56
  break
57
57
  except Exception as e:
58
- logger.exception(e, exc_info=True)
58
+ logger.exception(e)
59
59
  logger.warning("Invalid '%s' input, input must be of type %s.", field, info.annotation)
60
60
 
61
61
  validated_model = config_type(**channel_registry_pre)
@@ -78,7 +78,7 @@ def add_channel_interative(channel_type: str) -> None:
78
78
  try:
79
79
  ChannelConfigType = registry.get_registered_channel_info_by_channel_type(channel_type=channel_type).config_type
80
80
  except Exception as e:
81
- logger.exception("Invalid channel type: %s", e, exc_info=True)
81
+ logger.exception("Invalid channel type: %s", e)
82
82
  return
83
83
 
84
84
  while (True):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nvidia-nat
3
- Version: 1.3.0a20250828
3
+ Version: 1.3.0a20250829
4
4
  Summary: NVIDIA NeMo Agent toolkit
5
5
  Author: NVIDIA Corporation
6
6
  Maintainer: NVIDIA Corporation