nvidia-nat 1.3.0a20250924__py3-none-any.whl → 1.3.0a20250926__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.
@@ -59,6 +59,7 @@ class ReActGraphState(BaseModel):
59
59
  messages: list[BaseMessage] = Field(default_factory=list) # input and output of the ReAct Agent
60
60
  agent_scratchpad: list[AgentAction] = Field(default_factory=list) # agent thoughts / intermediate steps
61
61
  tool_responses: list[BaseMessage] = Field(default_factory=list) # the responses from any tool calls
62
+ final_answer: str | None = Field(default=None) # the final answer from the ReAct Agent
62
63
 
63
64
 
64
65
  class ReActAgentGraph(DualNodeAgent):
@@ -204,6 +205,7 @@ class ReActAgentGraph(DualNodeAgent):
204
205
  # this is where we handle the final output of the Agent, we can clean-up/format/postprocess here
205
206
  # the final answer goes in the "messages" state channel
206
207
  state.messages += [AIMessage(content=final_answer)]
208
+ state.final_answer = final_answer
207
209
  else:
208
210
  # the agent wants to call a tool, ensure the thoughts are preserved for the next agentic cycle
209
211
  agent_output.log = output_message.content
@@ -242,10 +244,9 @@ class ReActAgentGraph(DualNodeAgent):
242
244
  async def conditional_edge(self, state: ReActGraphState):
243
245
  try:
244
246
  logger.debug("%s Starting the ReAct Conditional Edge", AGENT_LOG_PREFIX)
245
- if len(state.messages) > 1:
246
- # the ReAct Agent has finished executing, the last agent output was AgentFinish
247
- last_message_content = str(state.messages[-1].content)
248
- logger.debug("%s Final answer:\n%s", AGENT_LOG_PREFIX, last_message_content)
247
+ if state.final_answer:
248
+ # the ReAct Agent has finished executing
249
+ logger.debug("%s Final answer:\n%s", AGENT_LOG_PREFIX, state.final_answer)
249
250
  return AgentDecision.END
250
251
  # else the agent wants to call a tool
251
252
  agent_output = state.agent_scratchpad[-1]
@@ -152,11 +152,8 @@ async def react_agent_workflow(config: ReActAgentWorkflowConfig, builder: Builde
152
152
  return ChatResponse.from_string(str(output_message.content))
153
153
 
154
154
  except Exception as ex:
155
- logger.exception("%s ReAct Agent failed with exception: %s", AGENT_LOG_PREFIX, ex)
156
- # here, we can implement custom error messages
157
- if config.verbose:
158
- return ChatResponse.from_string(str(ex))
159
- return ChatResponse.from_string("I seem to be having a problem.")
155
+ logger.exception("%s ReAct Agent failed with exception: %s", AGENT_LOG_PREFIX, str(ex))
156
+ raise RuntimeError
160
157
 
161
158
  if (config.use_openai_api):
162
159
  yield FunctionInfo.from_fn(_response_fn, description=config.description)
@@ -158,10 +158,7 @@ async def rewoo_agent_workflow(config: ReWOOAgentWorkflowConfig, builder: Builde
158
158
 
159
159
  except Exception as ex:
160
160
  logger.exception("ReWOO Agent failed with exception: %s", ex)
161
- # here, we can implement custom error messages
162
- if config.verbose:
163
- return ChatResponse.from_string(str(ex))
164
- return ChatResponse.from_string("I seem to be having a problem.")
161
+ raise RuntimeError
165
162
 
166
163
  if (config.use_openai_api):
167
164
  yield FunctionInfo.from_fn(_response_fn, description=config.description)
@@ -115,9 +115,7 @@ async def tool_calling_agent_workflow(config: ToolCallAgentWorkflowConfig, build
115
115
  return str(output_message.content)
116
116
  except Exception as ex:
117
117
  logger.exception("%s Tool Calling Agent failed with exception: %s", AGENT_LOG_PREFIX, ex)
118
- if config.verbose:
119
- return str(ex)
120
- return "I seem to be having a problem."
118
+ raise RuntimeError
121
119
 
122
120
  try:
123
121
  yield FunctionInfo.from_fn(_response_fn, description=config.description)
@@ -158,7 +158,7 @@ def recursive_componentref_discovery(cls: TypedBaseModel, value: typing.Any,
158
158
  yield from recursive_componentref_discovery(cls, field_data, field_info.annotation)
159
159
  if (decomposed_type.is_union):
160
160
  for arg in decomposed_type.args:
161
- if arg is typing.Any or (isinstance(value, DecomposedType(arg).root)):
161
+ if arg is typing.Any or DecomposedType(arg).is_instance(value):
162
162
  yield from recursive_componentref_discovery(cls, value, arg)
163
163
  else:
164
164
  for arg in decomposed_type.args:
@@ -22,3 +22,4 @@ class LLMFrameworkEnum(str, Enum):
22
22
  CREWAI = "crewai"
23
23
  SEMANTIC_KERNEL = "semantic_kernel"
24
24
  AGNO = "agno"
25
+ ADK = "adk"
nat/builder/function.py CHANGED
@@ -159,7 +159,8 @@ class Function(FunctionBase[InputT, StreamingOutputT, SingleOutputT], ABC):
159
159
 
160
160
  return result
161
161
  except Exception as e:
162
- logger.error("Error with ainvoke in function with input: %s. Error: %s", value, e)
162
+ err_msg = f"Error: {e}" if str(e).strip() else ""
163
+ logger.error("Error with ainvoke in function with input: %s. %s", value, err_msg)
163
164
  raise
164
165
 
165
166
  @typing.final
@@ -55,9 +55,10 @@ class ConsoleFrontEndPlugin(SimpleFrontEndPluginBase[ConsoleFrontEndConfig]):
55
55
  self.auth_flow_handler = ConsoleAuthenticationFlowHandler()
56
56
 
57
57
  async def pre_run(self):
58
-
59
- if (not self.front_end_config.input_query and not self.front_end_config.input_file):
60
- raise click.UsageError("Must specify either --input_query or --input_file")
58
+ if (self.front_end_config.input_query is not None and self.front_end_config.input_file is not None):
59
+ raise click.UsageError("Must specify either --input or --input_file, not both")
60
+ if (self.front_end_config.input_query is None and self.front_end_config.input_file is None):
61
+ raise click.UsageError("Must specify either --input or --input_file")
61
62
 
62
63
  async def run_workflow(self, session_manager: SessionManager):
63
64
 
@@ -80,7 +81,9 @@ class ConsoleFrontEndPlugin(SimpleFrontEndPluginBase[ConsoleFrontEndConfig]):
80
81
  input_list = list(self.front_end_config.input_query)
81
82
  logger.debug("Processing input: %s", self.front_end_config.input_query)
82
83
 
83
- runner_outputs = await asyncio.gather(*[run_single_query(query) for query in input_list])
84
+ # Make `return_exceptions=False` explicit; all exceptions are raised instead of being silenced
85
+ runner_outputs = await asyncio.gather(*[run_single_query(query) for query in input_list],
86
+ return_exceptions=False)
84
87
 
85
88
  elif (self.front_end_config.input_file):
86
89
 
@@ -35,6 +35,8 @@ class SimpleFrontEndPluginBase(FrontEndBase[FrontEndConfigT], ABC):
35
35
 
36
36
  async def run(self):
37
37
 
38
+ await self.pre_run()
39
+
38
40
  # Must yield the workflow function otherwise it cleans up
39
41
  async with WorkflowBuilder.from_config(config=self.full_config) as builder:
40
42
 
nat/llm/litellm_llm.py ADDED
@@ -0,0 +1,69 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from collections.abc import AsyncIterator
17
+
18
+ from pydantic import AliasChoices
19
+ from pydantic import ConfigDict
20
+ from pydantic import Field
21
+
22
+ from nat.builder.builder import Builder
23
+ from nat.builder.llm import LLMProviderInfo
24
+ from nat.cli.register_workflow import register_llm_provider
25
+ from nat.data_models.llm import LLMBaseConfig
26
+ from nat.data_models.retry_mixin import RetryMixin
27
+ from nat.data_models.temperature_mixin import TemperatureMixin
28
+ from nat.data_models.thinking_mixin import ThinkingMixin
29
+ from nat.data_models.top_p_mixin import TopPMixin
30
+
31
+
32
+ class LiteLlmModelConfig(
33
+ LLMBaseConfig,
34
+ RetryMixin,
35
+ TemperatureMixin,
36
+ TopPMixin,
37
+ ThinkingMixin,
38
+ name="litellm",
39
+ ):
40
+ """A LiteLlm provider to be used with an LLM client."""
41
+
42
+ model_config = ConfigDict(protected_namespaces=(), extra="allow")
43
+
44
+ api_key: str | None = Field(default=None, description="API key to interact with hosted model.")
45
+ base_url: str | None = Field(default=None,
46
+ description="Base url to the hosted model.",
47
+ validation_alias=AliasChoices("base_url", "api_base"),
48
+ serialization_alias="api_base")
49
+ model_name: str = Field(validation_alias=AliasChoices("model_name", "model"),
50
+ serialization_alias="model",
51
+ description="The LiteLlm hosted model name.")
52
+ seed: int | None = Field(default=None, description="Random seed to set for generation.")
53
+
54
+
55
+ @register_llm_provider(config_type=LiteLlmModelConfig)
56
+ async def litellm_model(
57
+ config: LiteLlmModelConfig,
58
+ _builder: Builder,
59
+ ) -> AsyncIterator[LLMProviderInfo]:
60
+ """Litellm model provider.
61
+
62
+ Args:
63
+ config (LiteLlmModelConfig): The LiteLlm model configuration.
64
+ _builder (Builder): The NAT builder instance.
65
+
66
+ Returns:
67
+ AsyncIterator[LLMProviderInfo]: An async iterator that yields an LLMProviderInfo object.
68
+ """
69
+ yield LLMProviderInfo(config=config, description="A LiteLlm model for use with an LLM client.")
nat/llm/register.py CHANGED
@@ -15,9 +15,13 @@
15
15
 
16
16
  # flake8: noqa
17
17
  # isort:skip_file
18
+ """Register LLM providers via import side effects.
18
19
 
20
+ This module is imported by the NeMo Agent Toolkit runtime to ensure providers are registered and discoverable.
21
+ """
19
22
  # Import any providers which need to be automatically registered here
20
23
  from . import aws_bedrock_llm
21
24
  from . import azure_openai_llm
25
+ from . import litellm_llm
22
26
  from . import nim_llm
23
27
  from . import openai_llm
@@ -17,6 +17,7 @@ from __future__ import annotations
17
17
 
18
18
  import functools
19
19
  import logging
20
+ from collections.abc import AsyncIterator
20
21
  from collections.abc import Callable
21
22
  from contextlib import AbstractAsyncContextManager as AsyncContextManager
22
23
  from contextlib import asynccontextmanager
@@ -32,20 +33,37 @@ _library_instrumented = {
32
33
  "crewai": False,
33
34
  "semantic_kernel": False,
34
35
  "agno": False,
36
+ "adk": False,
35
37
  }
36
38
 
37
39
  callback_handler_var: ContextVar[Any | None] = ContextVar("callback_handler_var", default=None)
38
40
 
39
41
 
40
42
  def set_framework_profiler_handler(
41
- workflow_llms: dict = None,
42
- frameworks: list[LLMFrameworkEnum] = None,
43
+ workflow_llms: dict | None = None,
44
+ frameworks: list[LLMFrameworkEnum] | None = None,
43
45
  ) -> Callable[[Callable[..., AsyncContextManager[Any]]], Callable[..., AsyncContextManager[Any]]]:
44
46
  """
45
47
  Decorator that wraps an async context manager function to set up framework-specific profiling.
48
+
49
+ Args:
50
+ workflow_llms (dict | None): A dictionary of workflow LLM configurations.
51
+ frameworks (list[LLMFrameworkEnum] | None): A list of LLM frameworks used in the workflow functions.
52
+
53
+ Returns:
54
+ Callable[[Callable[..., AsyncContextManager[Any]]], Callable[..., AsyncContextManager[Any]]]:
55
+ A decorator that wraps the original function with profiling setup.
46
56
  """
47
57
 
48
58
  def decorator(func: Callable[..., AsyncContextManager[Any]]) -> Callable[..., AsyncContextManager[Any]]:
59
+ """The actual decorator that wraps the function.
60
+
61
+ Args:
62
+ func (Callable[..., AsyncContextManager[Any]]): The function to wrap.
63
+
64
+ Returns:
65
+ Callable[..., AsyncContextManager[Any]]: The wrapped function.
66
+ """
49
67
 
50
68
  @functools.wraps(func)
51
69
  @asynccontextmanager
@@ -99,6 +117,20 @@ def set_framework_profiler_handler(
99
117
  _library_instrumented["agno"] = True
100
118
  logger.info("Agno callback handler registered")
101
119
 
120
+ if LLMFrameworkEnum.ADK in frameworks and not _library_instrumented["adk"]:
121
+ try:
122
+ from nat.plugins.adk.adk_callback_handler import ADKProfilerHandler
123
+ except ImportError as e:
124
+ logger.warning(
125
+ "ADK profiler not available. " +
126
+ "Install NAT with ADK extras: pip install 'nvidia-nat[adk]'. Error: %s",
127
+ e)
128
+ else:
129
+ handler = ADKProfilerHandler()
130
+ handler.instrument()
131
+ _library_instrumented["adk"] = True
132
+ logger.debug("ADK callback handler registered")
133
+
102
134
  # IMPORTANT: actually call the wrapped function as an async context manager
103
135
  async with func(workflow_config, builder) as result:
104
136
  yield result
@@ -117,11 +149,28 @@ def chain_wrapped_build_fn(
117
149
  Convert an original build function into an async context manager that
118
150
  wraps it with a single call to set_framework_profiler_handler, passing
119
151
  all frameworks at once.
152
+
153
+ Args:
154
+ original_build_fn (Callable[..., AsyncContextManager]): The original build function to wrap.
155
+ workflow_llms (dict): A dictionary of workflow LLM configurations.
156
+ function_frameworks (list[LLMFrameworkEnum]): A list of LLM frameworks used in the workflow functions.
157
+
158
+ Returns:
159
+ Callable[..., AsyncContextManager]: The wrapped build function.
120
160
  """
121
161
 
122
162
  # Define a base async context manager that simply calls the original build function.
123
163
  @asynccontextmanager
124
- async def base_fn(*args, **kwargs):
164
+ async def base_fn(*args, **kwargs) -> AsyncIterator[Any]:
165
+ """Base async context manager that calls the original build function.
166
+
167
+ Args:
168
+ *args: Positional arguments to pass to the original build function.
169
+ **kwargs: Keyword arguments to pass to the original build function.
170
+
171
+ Yields:
172
+ The result of the original build function.
173
+ """
125
174
  async with original_build_fn(*args, **kwargs) as w:
126
175
  yield w
127
176
 
nat/runtime/runner.py CHANGED
@@ -149,7 +149,8 @@ class Runner:
149
149
 
150
150
  return result
151
151
  except Exception as e:
152
- logger.error("Error running workflow: %s", e)
152
+ err_msg = f": {e}" if str(e).strip() else "."
153
+ logger.error("Error running workflow%s", err_msg)
153
154
  event_stream = self._context_state.event_stream.get()
154
155
  if event_stream:
155
156
  event_stream.on_complete()
@@ -90,7 +90,7 @@ class TypeConverter:
90
90
  decomposed = DecomposedType(to_type)
91
91
 
92
92
  # 1) If data is already correct type, return it
93
- if to_type is None or decomposed.is_instance((data, to_type)):
93
+ if to_type is None or decomposed.is_instance(data):
94
94
  return data
95
95
 
96
96
  root = decomposed.root
@@ -198,16 +198,17 @@ class TypeConverter:
198
198
  """
199
199
  visited = set()
200
200
  final = self._try_indirect_conversion(data, to_type, visited)
201
+ src_type = type(data)
201
202
  if final is not None:
202
203
  # Warn once if found a chain
203
- self._maybe_warn_indirect(type(data), to_type)
204
+ self._maybe_warn_indirect(src_type, to_type)
204
205
  return final
205
206
 
206
207
  # If no success, try parent's indirect
207
208
  if self._parent is not None:
208
209
  parent_final = self._parent._try_indirect_convert(data, to_type)
209
210
  if parent_final is not None:
210
- self._maybe_warn_indirect(type(data), to_type)
211
+ self._maybe_warn_indirect(src_type, to_type)
211
212
  return parent_final
212
213
 
213
214
  return None
nat/utils/type_utils.py CHANGED
@@ -353,7 +353,7 @@ class DecomposedType:
353
353
  True if the current type is an instance of the specified instance, False otherwise
354
354
  """
355
355
 
356
- return isinstance(instance, self.root)
356
+ return isinstance(instance, self.get_base_type().root)
357
357
 
358
358
  def get_pydantic_schema(self,
359
359
  converters: list[collections.abc.Callable] | None = None) -> type[BaseModel] | type[None]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nvidia-nat
3
- Version: 1.3.0a20250924
3
+ Version: 1.3.0a20250926
4
4
  Summary: NVIDIA NeMo Agent toolkit
5
5
  Author: NVIDIA Corporation
6
6
  Maintainer: NVIDIA Corporation
@@ -215,7 +215,7 @@ Description-Content-Type: text/markdown
215
215
  License-File: LICENSE-3rd-party.txt
216
216
  License-File: LICENSE.md
217
217
  Requires-Dist: aioboto3>=11.0.0
218
- Requires-Dist: authlib~=1.3.1
218
+ Requires-Dist: authlib~=1.5
219
219
  Requires-Dist: click~=8.1
220
220
  Requires-Dist: colorama~=0.4.6
221
221
  Requires-Dist: datasets~=4.0
@@ -241,10 +241,12 @@ Requires-Dist: PyYAML~=6.0
241
241
  Requires-Dist: ragas~=0.2.14
242
242
  Requires-Dist: rich~=13.9
243
243
  Requires-Dist: tabulate~=0.9
244
- Requires-Dist: uvicorn[standard]~=0.32.0
244
+ Requires-Dist: uvicorn[standard]~=0.34
245
245
  Requires-Dist: wikipedia~=1.4
246
246
  Provides-Extra: all
247
247
  Requires-Dist: nvidia-nat-all; extra == "all"
248
+ Provides-Extra: adk
249
+ Requires-Dist: nvidia-nat-adk; extra == "adk"
248
250
  Provides-Extra: agno
249
251
  Requires-Dist: nvidia-nat-agno; extra == "agno"
250
252
  Provides-Extra: crewai
@@ -287,6 +289,7 @@ Requires-Dist: nvidia-nat-weave; extra == "weave"
287
289
  Provides-Extra: zep-cloud
288
290
  Requires-Dist: nvidia-nat-zep-cloud; extra == "zep-cloud"
289
291
  Provides-Extra: examples
292
+ Requires-Dist: nat_adk_demo; extra == "examples"
290
293
  Requires-Dist: nat_agno_personal_finance; extra == "examples"
291
294
  Requires-Dist: nat_alert_triage_agent; extra == "examples"
292
295
  Requires-Dist: nat_automated_description_generation; extra == "examples"
@@ -320,6 +323,10 @@ Requires-Dist: aiosqlite~=0.21; extra == "async-endpoints"
320
323
  Requires-Dist: dask==2023.6; extra == "async-endpoints"
321
324
  Requires-Dist: distributed==2023.6; extra == "async-endpoints"
322
325
  Requires-Dist: sqlalchemy[asyncio]~=2.0; extra == "async-endpoints"
326
+ Provides-Extra: litellm
327
+ Requires-Dist: litellm==1.74.9; extra == "litellm"
328
+ Provides-Extra: openai
329
+ Requires-Dist: openai~=1.106; extra == "openai"
323
330
  Dynamic: license-file
324
331
 
325
332
  <!--
@@ -7,19 +7,19 @@ nat/agent/prompt_optimizer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
7
7
  nat/agent/prompt_optimizer/prompt.py,sha256=2I1cGZH73Q1pwxA_V-9b1sFCdQ1PLFxliaRtrIkVVVU,3042
8
8
  nat/agent/prompt_optimizer/register.py,sha256=qV9Qkd4XDfwVYSzZOyI9RlRzK26jukaB51RriYgWd6k,6790
9
9
  nat/agent/react_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- nat/agent/react_agent/agent.py,sha256=zz1rmXdx53QG-07KGJffLZCpI3ULvYEWyCdufD42CB4,21261
10
+ nat/agent/react_agent/agent.py,sha256=sWrg9WrglTKQQyG3EcjNm2JTEchCPEo9li-Po7TJKss,21294
11
11
  nat/agent/react_agent/output_parser.py,sha256=m7K6wRwtckBBpAHqOf3BZ9mqZLwrP13Kxz5fvNxbyZE,4219
12
12
  nat/agent/react_agent/prompt.py,sha256=N47JJrT6xwYQCv1jedHhlul2AE7EfKsSYfAbgJwWRew,1758
13
- nat/agent/react_agent/register.py,sha256=IYd6VAsgK8lwT78ScmSrGv2QOyB5d_bh-L3MwlHVN1A,9004
13
+ nat/agent/react_agent/register.py,sha256=b97dfNtA0I3bNBOGdr9_akQ89UDwPHPPb7LqpsZNaWI,8815
14
14
  nat/agent/reasoning_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  nat/agent/reasoning_agent/reasoning_agent.py,sha256=k_0wEDqACQn1Rn1MAKxoXyqOKsthHCQ1gt990YYUqHU,9575
16
16
  nat/agent/rewoo_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
17
  nat/agent/rewoo_agent/agent.py,sha256=ogTtUsNqbAjEprBKp2ZEoYfuHvgxnjV7NgygvSgMz7M,19264
18
18
  nat/agent/rewoo_agent/prompt.py,sha256=nFMav3Zl_vmKPLzAIhbQHlldWnurPJb1GlwnekUuxDs,3720
19
- nat/agent/rewoo_agent/register.py,sha256=C1dUBg53QVhdniiURyWGzbi5y4GvzCIOtErH2Q0zSbQ,9148
19
+ nat/agent/rewoo_agent/register.py,sha256=668zAag6eqajX_PIfh6c-0I0UQN5D-lRiz_mNKHXXjM,8954
20
20
  nat/agent/tool_calling_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  nat/agent/tool_calling_agent/agent.py,sha256=4SIp29I56oznPRQu7B3HCoX53Ri3_o3BRRYNJjeBkF8,11006
22
- nat/agent/tool_calling_agent/register.py,sha256=Jll3Trb4rF7yYxNbZhkcRbW1sEsZ6tZkBdGN-Qw0Hb8,6905
22
+ nat/agent/tool_calling_agent/register.py,sha256=ijiRfgDVtt2p7_q1YbIQZmUVV8-jf3yT18HwtKyReUI,6822
23
23
  nat/authentication/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
24
24
  nat/authentication/interfaces.py,sha256=FAYM-QXVUn3a_8bmAZ7kP-lmN_BrLW8mo6krZJ3e0ME,3314
25
25
  nat/authentication/register.py,sha256=lFhswYUk9iZ53mq33fClR9UfjJPdjGIivGGNHQeWiYo,915
@@ -41,14 +41,14 @@ nat/authentication/oauth2/oauth2_resource_server_config.py,sha256=ltcNp8Dwb2Q4tl
41
41
  nat/authentication/oauth2/register.py,sha256=7rXhf-ilgSS_bUJsd9pOOCotL1FM8dKUt3ke1TllKkQ,1228
42
42
  nat/builder/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
43
  nat/builder/builder.py,sha256=vf5Vv5kq0gJ8D5bWw0bA64pDaszUWL19QHDiLuSP-Fs,11610
44
- nat/builder/component_utils.py,sha256=rbKjs-Yo2uJ4xgEfTWbRWnSsJRrvalOb7TTOBljQZig,13839
44
+ nat/builder/component_utils.py,sha256=-5vEWLwj9ch-1B9vbkBjCIkXB9SL8Tj9yl6zFwhV6wU,13832
45
45
  nat/builder/context.py,sha256=6mpk7H_gZ5_gVOKbWp8BrToqJraP1GEh9-uKX4vRrpA,12462
46
46
  nat/builder/embedder.py,sha256=NPkOEcxt_-wc53QRijCQQDLretRUYHRYaKoYmarmrBk,965
47
47
  nat/builder/eval_builder.py,sha256=I-ScvupmorClYoVBIs_PhSsB7Xf9e2nGWe0rCZp3txo,6857
48
48
  nat/builder/evaluator.py,sha256=xWHMND2vcAUkdFP7FU3jnVki1rUHeTa0-9saFh2hWKs,1162
49
- nat/builder/framework_enum.py,sha256=eYwHQifZ86dx-OTubVA3qhCLRqhB4ElMBYBGA0gYtic,885
49
+ nat/builder/framework_enum.py,sha256=n7IaTQBxhFozIQqRMcX9kXntw28JhFzCj82jJ0C5tNU,901
50
50
  nat/builder/front_end.py,sha256=mHooS1M7mVo1swSgbYoqbzQENXkuG7_Es9q4gFiuL8E,2175
51
- nat/builder/function.py,sha256=udq0pUpaQss8Fr-EzPnJ4aahvCK298xXNYyf4jceFfg,27698
51
+ nat/builder/function.py,sha256=RrfKSCt9WunPhwn5fk8X7wuvb9A21iO8T-IySHUi3KM,27763
52
52
  nat/builder/function_base.py,sha256=0Eg8RtjWhEU3Yme0CVxcRutobA0Qo8-YHZLI6L2qAgM,13116
53
53
  nat/builder/function_info.py,sha256=7Rmrn-gOFrT2TIJklJwA_O-ycx_oimwZ0-qMYpbuZrU,25161
54
54
  nat/builder/intermediate_step_manager.py,sha256=iOuMLWTaES0J0XzaLxhTUqFvuoCAChJu3V69T43K0k0,7599
@@ -234,7 +234,7 @@ nat/front_ends/register.py,sha256=_C6AFpsQ8hUXavKHaBMy0g137fOcLfEjyU0EAuYqtao,85
234
234
  nat/front_ends/console/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
235
235
  nat/front_ends/console/authentication_flow_handler.py,sha256=Q1A7dv-pUlzsGZ8NXu8r-aGCqRiFqadPPBOw2TmyUNk,9566
236
236
  nat/front_ends/console/console_front_end_config.py,sha256=wkMXk-RCdlEj3303kB1gh47UKJnubX2R-vzBzhedpS4,1318
237
- nat/front_ends/console/console_front_end_plugin.py,sha256=BJ1o2IflZeFKC2gGfL_gI24pg0t2inT33H0Z14wCwY4,3931
237
+ nat/front_ends/console/console_front_end_plugin.py,sha256=euUxC794jhZgODNMfxriCkeHn9eluU1UwWYUnyDh-iU,4315
238
238
  nat/front_ends/console/register.py,sha256=2Kf6Mthx6jzWzU8YdhYIR1iABmZDvs1UXM_20npXWXs,1153
239
239
  nat/front_ends/cron/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
240
240
  nat/front_ends/fastapi/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
@@ -265,13 +265,14 @@ nat/front_ends/mcp/mcp_front_end_plugin_worker.py,sha256=jMclC0qEd910oTGCqd1kQ8W
265
265
  nat/front_ends/mcp/register.py,sha256=3aJtgG5VaiqujoeU1-Eq7Hl5pWslIlIwGFU2ASLTXgM,1173
266
266
  nat/front_ends/mcp/tool_converter.py,sha256=J0GS85qs2rVO2ZyGfxQcbtlWevoMJCEiEfa83PK10Ew,11548
267
267
  nat/front_ends/simple_base/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
268
- nat/front_ends/simple_base/simple_front_end_plugin_base.py,sha256=ctD92Wrn0SI23cCSNcvYtfhk6sBnkX1nf_4wzb-jluM,1771
268
+ nat/front_ends/simple_base/simple_front_end_plugin_base.py,sha256=py_yA9XAw-yHfK5cQJLM8ElnubEEM2ac8M0bvz-ScWs,1801
269
269
  nat/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
270
270
  nat/llm/aws_bedrock_llm.py,sha256=-P6OltFz8CPHmKmgUipFaIpROLGdnnRmd-q5BfjY7lM,3219
271
271
  nat/llm/azure_openai_llm.py,sha256=30JWbNyscHhuRjFdWF2yLAEcKurY0q2BSMVFTdtSv9g,2649
272
+ nat/llm/litellm_llm.py,sha256=3XtAKdI4lmbbuiEGKSJob0mqAp8RvYRpxK6t0GQk0UE,2770
272
273
  nat/llm/nim_llm.py,sha256=9sU3FUOedx5jY3He3qiN0T-AC48F5maIpz87NxP7Q0Q,2696
273
274
  nat/llm/openai_llm.py,sha256=AMf8Xxzo3kYVi7XfyqatuU1-CH0-8QGmshDbSHHREXY,2487
274
- nat/llm/register.py,sha256=DAM4rKfdwArZiKrhx_XhWVKik9ubUIrnPHE1Gy0pH1Q,898
275
+ nat/llm/register.py,sha256=7xDYdK4w4opAwIjzDM5x7moJXT3QeEGaGGc_nDfY0i4,1090
275
276
  nat/llm/utils/__init__.py,sha256=GUJrgGtpvyMUCjUBvR3faAdv-tZzbU9W-izgx9aMEQg,680
276
277
  nat/llm/utils/env_config_value.py,sha256=kBVsv0pEokIAfDQx5omR7_FevFv_5fTPswcbnvhVT2c,3548
277
278
  nat/llm/utils/error.py,sha256=gFFDG_v_3hBZVWpcD7HWkno-NBHDjXae7qDGnfiCNwA,820
@@ -342,7 +343,7 @@ nat/profiler/callbacks/llama_index_callback_handler.py,sha256=xzYve07uMlSTDjj929
342
343
  nat/profiler/callbacks/semantic_kernel_callback_handler.py,sha256=BknzhQNB-MDMhR4QC9JScCp-zXq7KZ33SFb7X0MiTaI,11087
343
344
  nat/profiler/callbacks/token_usage_base_model.py,sha256=X0b_AbBgVQAAbgbDMim-3S3XdQ7PaPs9qMUACvMAe5o,1104
344
345
  nat/profiler/decorators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
345
- nat/profiler/decorators/framework_wrapper.py,sha256=r-ysp4IRZhsfuUzeEukMwvLqD-hIVbF4yfJQ5PXr_5A,5517
346
+ nat/profiler/decorators/framework_wrapper.py,sha256=lKX-nMkwKc4Pcb3PiA_w6f0Zfa_aC8BQsDB1pWwJTjI,7680
346
347
  nat/profiler/decorators/function_tracking.py,sha256=ro4KdkoS9Y2cF36wxbY-XCQHGpL6o-JNU0MC0uP4jFg,16769
347
348
  nat/profiler/forecasting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
348
349
  nat/profiler/forecasting/config.py,sha256=5BhMa8csuPCjEnTaNQjo_2IoO7esh1ch02MoSWkvwPw,791
@@ -405,7 +406,7 @@ nat/retriever/nemo_retriever/register.py,sha256=3XdrvEJzX2Zc8wpdm__4YYlEWBW-FK3t
405
406
  nat/retriever/nemo_retriever/retriever.py,sha256=gi3_qJFqE-iqRh3of_cmJg-SwzaQ3z24zA9LwY_MSLY,6930
406
407
  nat/runtime/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
407
408
  nat/runtime/loader.py,sha256=obUdAgZVYCPGC0R8u3wcoKFJzzSPQgJvrbU4OWygtog,7953
408
- nat/runtime/runner.py,sha256=CVC8F6D3cm4kNCzFSzl36G9F6rWgmGGMcMoN5IlFeTo,6388
409
+ nat/runtime/runner.py,sha256=Kzm5GRrGUFMQ_fbLOCJumYc4R-JXdTm5tUw2yMMDJpE,6450
409
410
  nat/runtime/session.py,sha256=U3UHQpdCBkCiJetsWdq9r6wUEVDBa2gv1VQedE64kY8,6959
410
411
  nat/runtime/user_metadata.py,sha256=ce37NRYJWnMOWk6A7VAQ1GQztjMmkhMOq-uYf2gNCwo,3692
411
412
  nat/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -446,8 +447,8 @@ nat/utils/metadata_utils.py,sha256=BSsiB6jIWd8oEuEynJi55qCG762UuTYFaiUH0OT9HdY,2
446
447
  nat/utils/optional_imports.py,sha256=jQSVBc2fBSRw-2d6r8cEwvh5-di2EUUPakuuo9QbbwA,4039
447
448
  nat/utils/producer_consumer_queue.py,sha256=AcSYkAMBxLx06A5Xdy960PP3AJ7YaSPGJ7rbN_hJsjI,6599
448
449
  nat/utils/string_utils.py,sha256=71HuIzGx7rF8ocTmeoUBpnCi1Qf1yynYlNLLIKP4BVs,1415
449
- nat/utils/type_converter.py,sha256=tO5XPbr5MPhBqbseEM2hROAk_CTcnlzibTGdOPT3MfQ,10640
450
- nat/utils/type_utils.py,sha256=bOsRUaMnGRH3R8xPYKJc40ddSV_QYTErVPiCqKyB_rg,14819
450
+ nat/utils/type_converter.py,sha256=-2PwMsEm7tlmrniZzO7x2DnRxhOEeJGVAIJc3c5n2g4,10655
451
+ nat/utils/type_utils.py,sha256=xdD-_jmqPewBooqs_N0ZVGO_xsKv4ZOgISWi3EcFZXo,14835
451
452
  nat/utils/url_utils.py,sha256=UzDP_xaS6brWTu7vAws0B4jZyrITIK9Si3U6pZBZqDE,1028
452
453
  nat/utils/data_models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
453
454
  nat/utils/data_models/schema_validator.py,sha256=pmGr5KuRX5tbVsymG1NxaSnGrKIfzxXEJNd58wIQ9SM,1532
@@ -468,10 +469,10 @@ nat/utils/reactive/base/observer_base.py,sha256=6BiQfx26EMumotJ3KoVcdmFBYR_fnAss
468
469
  nat/utils/reactive/base/subject_base.py,sha256=UQOxlkZTIeeyYmG5qLtDpNf_63Y7p-doEeUA08_R8ME,2521
469
470
  nat/utils/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
470
471
  nat/utils/settings/global_settings.py,sha256=9JaO6pxKT_Pjw6rxJRsRlFCXdVKCl_xUKU2QHZQWWNM,7294
471
- nvidia_nat-1.3.0a20250924.dist-info/licenses/LICENSE-3rd-party.txt,sha256=fOk5jMmCX9YoKWyYzTtfgl-SUy477audFC5hNY4oP7Q,284609
472
- nvidia_nat-1.3.0a20250924.dist-info/licenses/LICENSE.md,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
473
- nvidia_nat-1.3.0a20250924.dist-info/METADATA,sha256=o7QdYxrPASsVZT2v_EipTYj5aCzuFUfYnW6pAgVn7m4,22605
474
- nvidia_nat-1.3.0a20250924.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
475
- nvidia_nat-1.3.0a20250924.dist-info/entry_points.txt,sha256=4jCqjyETMpyoWbCBf4GalZU8I_wbstpzwQNezdAVbbo,698
476
- nvidia_nat-1.3.0a20250924.dist-info/top_level.txt,sha256=lgJWLkigiVZuZ_O1nxVnD_ziYBwgpE2OStdaCduMEGc,8
477
- nvidia_nat-1.3.0a20250924.dist-info/RECORD,,
472
+ nvidia_nat-1.3.0a20250926.dist-info/licenses/LICENSE-3rd-party.txt,sha256=fOk5jMmCX9YoKWyYzTtfgl-SUy477audFC5hNY4oP7Q,284609
473
+ nvidia_nat-1.3.0a20250926.dist-info/licenses/LICENSE.md,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
474
+ nvidia_nat-1.3.0a20250926.dist-info/METADATA,sha256=AsBqos4EXJEwd-G-QSIF4iXItfZ7ULCpgwh0QCVd1lQ,22862
475
+ nvidia_nat-1.3.0a20250926.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
476
+ nvidia_nat-1.3.0a20250926.dist-info/entry_points.txt,sha256=4jCqjyETMpyoWbCBf4GalZU8I_wbstpzwQNezdAVbbo,698
477
+ nvidia_nat-1.3.0a20250926.dist-info/top_level.txt,sha256=lgJWLkigiVZuZ_O1nxVnD_ziYBwgpE2OStdaCduMEGc,8
478
+ nvidia_nat-1.3.0a20250926.dist-info/RECORD,,