nvidia-nat 1.3.0a20250829__py3-none-any.whl → 1.3.0a20250830__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.
@@ -0,0 +1,229 @@
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 logging
17
+ from typing import Literal
18
+
19
+ from pydantic import BaseModel
20
+ from pydantic import Field
21
+ from pydantic import HttpUrl
22
+ from pydantic import model_validator
23
+
24
+ from nat.builder.builder import Builder
25
+ from nat.builder.function_info import FunctionInfo
26
+ from nat.cli.register_workflow import register_function
27
+ from nat.data_models.function import FunctionBaseConfig
28
+ from nat.experimental.decorators.experimental_warning_decorator import experimental
29
+ from nat.tool.mcp.mcp_client_base import MCPBaseClient
30
+
31
+ logger = logging.getLogger(__name__)
32
+
33
+ # All functions in this file are experimental
34
+
35
+
36
+ class ToolOverrideConfig(BaseModel):
37
+ """
38
+ Configuration for overriding tool properties when exposing from MCP server.
39
+ """
40
+ alias: str | None = Field(default=None, description="Override the tool name (function name in the workflow)")
41
+ description: str | None = Field(default=None, description="Override the tool description")
42
+
43
+
44
+ class MCPServerConfig(BaseModel):
45
+ """
46
+ Server connection details for MCP client.
47
+ Supports stdio, sse, and streamable-http transports.
48
+ streamable-http is the recommended default for HTTP-based connections.
49
+ """
50
+ transport: Literal["stdio", "sse", "streamable-http"] = Field(
51
+ ..., description="Transport type to connect to the MCP server (stdio, sse, or streamable-http)")
52
+ url: HttpUrl | None = Field(default=None,
53
+ description="URL of the MCP server (for sse or streamable-http transport)")
54
+ command: str | None = Field(default=None,
55
+ description="Command to run for stdio transport (e.g. 'python' or 'docker')")
56
+ args: list[str] | None = Field(default=None, description="Arguments for the stdio command")
57
+ env: dict[str, str] | None = Field(default=None, description="Environment variables for the stdio process")
58
+
59
+ @model_validator(mode="after")
60
+ def validate_model(self):
61
+ """Validate that stdio and SSE/Streamable HTTP properties are mutually exclusive."""
62
+ if self.transport == "stdio":
63
+ if self.url is not None:
64
+ raise ValueError("url should not be set when using stdio transport")
65
+ if not self.command:
66
+ raise ValueError("command is required when using stdio transport")
67
+ elif self.transport in ("sse", "streamable-http"):
68
+ if self.command is not None or self.args is not None or self.env is not None:
69
+ raise ValueError("command, args, and env should not be set when using sse or streamable-http transport")
70
+ if not self.url:
71
+ raise ValueError("url is required when using sse or streamable-http transport")
72
+ return self
73
+
74
+
75
+ class MCPClientConfig(FunctionBaseConfig, name="mcp_client"):
76
+ """
77
+ Configuration for connecting to an MCP server as a client and exposing selected tools.
78
+ """
79
+ server: MCPServerConfig = Field(..., description="Server connection details (transport, url/command, etc.)")
80
+ tool_filter: dict[str, ToolOverrideConfig] | list[str] | None = Field(
81
+ default=None,
82
+ description="""Filter or map tools to expose from the server (list or dict).
83
+ Can be:
84
+ - A list of tool names to expose: ['tool1', 'tool2']
85
+ - A dict mapping tool names to override configs:
86
+ {'tool1': {'alias': 'new_name', 'description': 'New desc'}}
87
+ {'tool2': {'description': 'Override description only'}} # alias defaults to 'tool2'
88
+ """)
89
+
90
+
91
+ class MCPSingleToolConfig(FunctionBaseConfig, name="mcp_single_tool"):
92
+ """
93
+ Configuration for wrapping a single tool from an MCP server as a NeMo Agent toolkit function.
94
+ """
95
+ client: MCPBaseClient = Field(..., description="MCP client to use for the tool")
96
+ tool_name: str = Field(..., description="Name of the tool to use")
97
+ tool_description: str | None = Field(default=None, description="Description of the tool")
98
+
99
+ model_config = {"arbitrary_types_allowed": True}
100
+
101
+
102
+ def _get_server_name_safe(client: MCPBaseClient) -> str:
103
+
104
+ # Avoid leaking env secrets from stdio client in logs.
105
+ if client.transport == "stdio":
106
+ safe_server = f"stdio: {client.command}"
107
+ else:
108
+ safe_server = f"{client.transport}: {client.url}"
109
+
110
+ return safe_server
111
+
112
+
113
+ @register_function(config_type=MCPSingleToolConfig)
114
+ async def mcp_single_tool(config: MCPSingleToolConfig, builder: Builder):
115
+ """
116
+ Wrap a single tool from an MCP server as a NeMo Agent toolkit function.
117
+ """
118
+ tool = await config.client.get_tool(config.tool_name)
119
+ if config.tool_description:
120
+ tool.set_description(description=config.tool_description)
121
+ input_schema = tool.input_schema
122
+
123
+ logger.info("Configured to use tool: %s from MCP server at %s", tool.name, _get_server_name_safe(config.client))
124
+
125
+ def _convert_from_str(input_str: str) -> BaseModel:
126
+ return input_schema.model_validate_json(input_str)
127
+
128
+ @experimental(feature_name="mcp_client")
129
+ async def _response_fn(tool_input: BaseModel | None = None, **kwargs) -> str:
130
+ try:
131
+ if tool_input:
132
+ return await tool.acall(tool_input.model_dump())
133
+ _ = input_schema.model_validate(kwargs)
134
+ return await tool.acall(kwargs)
135
+ except Exception as e:
136
+ return str(e)
137
+
138
+ fn = FunctionInfo.create(single_fn=_response_fn,
139
+ description=tool.description,
140
+ input_schema=input_schema,
141
+ converters=[_convert_from_str])
142
+ yield fn
143
+
144
+
145
+ @register_function(MCPClientConfig)
146
+ async def mcp_client_function_handler(config: MCPClientConfig, builder: Builder):
147
+ """
148
+ Connect to an MCP server, discover tools, and register them as functions in the workflow.
149
+
150
+ Note:
151
+ - Uses builder's exit stack to manage client lifecycle
152
+ - Applies tool filters if provided
153
+ """
154
+ from nat.tool.mcp.mcp_client_base import MCPSSEClient
155
+ from nat.tool.mcp.mcp_client_base import MCPStdioClient
156
+ from nat.tool.mcp.mcp_client_base import MCPStreamableHTTPClient
157
+
158
+ # Build the appropriate client
159
+ client_cls = {
160
+ "stdio": lambda: MCPStdioClient(config.server.command, config.server.args, config.server.env),
161
+ "sse": lambda: MCPSSEClient(str(config.server.url)),
162
+ "streamable-http": lambda: MCPStreamableHTTPClient(str(config.server.url)),
163
+ }.get(config.server.transport)
164
+
165
+ if not client_cls:
166
+ raise ValueError(f"Unsupported transport: {config.server.transport}")
167
+
168
+ client = client_cls()
169
+ logger.info("Configured to use MCP server at %s", _get_server_name_safe(client))
170
+
171
+ # client aenter connects to the server and stores the client in the exit stack
172
+ # so it's cleaned up when the workflow is done
173
+ async with client:
174
+ all_tools = await client.get_tools()
175
+ tool_configs = _filter_and_configure_tools(all_tools, config.tool_filter)
176
+
177
+ for tool_name, tool_cfg in tool_configs.items():
178
+ await builder.add_function(
179
+ tool_cfg["function_name"],
180
+ MCPSingleToolConfig(
181
+ client=client,
182
+ tool_name=tool_name,
183
+ tool_description=tool_cfg["description"],
184
+ ))
185
+
186
+ @experimental(feature_name="mcp_client")
187
+ async def idle_fn(text: str) -> str:
188
+ # This function is a placeholder and will be removed when function groups are used
189
+ return f"MCP client connected: {text}"
190
+
191
+ yield FunctionInfo.create(single_fn=idle_fn, description="MCP client")
192
+
193
+
194
+ def _filter_and_configure_tools(all_tools: dict, tool_filter) -> dict[str, dict]:
195
+ """
196
+ Apply tool filtering and optional aliasing/description overrides.
197
+
198
+ Returns:
199
+ Dict[str, dict] where each value has:
200
+ - function_name
201
+ - description
202
+ """
203
+ if tool_filter is None:
204
+ return {name: {"function_name": name, "description": tool.description} for name, tool in all_tools.items()}
205
+
206
+ if isinstance(tool_filter, list):
207
+ return {
208
+ name: {
209
+ "function_name": name, "description": all_tools[name].description
210
+ }
211
+ for name in tool_filter if name in all_tools
212
+ }
213
+
214
+ if isinstance(tool_filter, dict):
215
+ result = {}
216
+ for name, override in tool_filter.items():
217
+ tool = all_tools.get(name)
218
+ if not tool:
219
+ logger.warning("Tool '%s' specified in tool_filter not found in MCP server", name)
220
+ continue
221
+
222
+ if isinstance(override, ToolOverrideConfig):
223
+ result[name] = {
224
+ "function_name": override.alias or name, "description": override.description or tool.description
225
+ }
226
+ else:
227
+ logger.warning("Unsupported override type for '%s': %s", name, type(override))
228
+ result[name] = {"function_name": name, "description": tool.description}
229
+ return result
nat/tool/mcp/mcp_tool.py CHANGED
@@ -14,10 +14,12 @@
14
14
  # limitations under the License.
15
15
 
16
16
  import logging
17
+ from typing import Literal
17
18
 
18
19
  from pydantic import BaseModel
19
20
  from pydantic import Field
20
21
  from pydantic import HttpUrl
22
+ from pydantic import model_validator
21
23
 
22
24
  from nat.builder.builder import Builder
23
25
  from nat.builder.function_info import FunctionInfo
@@ -33,8 +35,16 @@ class MCPToolConfig(FunctionBaseConfig, name="mcp_tool_wrapper"):
33
35
  function.
34
36
  """
35
37
  # Add your custom configuration parameters here
36
- url: HttpUrl = Field(description="The URL of the MCP server")
38
+ url: HttpUrl | None = Field(default=None,
39
+ description="The URL of the MCP server (for streamable-http or sse modes)")
37
40
  mcp_tool_name: str = Field(description="The name of the tool served by the MCP Server that you want to use")
41
+ transport: Literal["sse", "stdio", "streamable-http"] = Field(
42
+ default="streamable-http",
43
+ description="The type of transport to use (default: streamable-http, backwards compatible with sse)")
44
+ command: str | None = Field(default=None,
45
+ description="The command to run for stdio mode (e.g. 'docker' or 'python')")
46
+ args: list[str] | None = Field(default=None, description="Additional arguments for the stdio command")
47
+ env: dict[str, str] | None = Field(default=None, description="Environment variables to set for the stdio process")
38
48
  description: str | None = Field(default=None,
39
49
  description="""
40
50
  Description for the tool that will override the description provided by the MCP server. Should only be used if
@@ -46,51 +56,78 @@ class MCPToolConfig(FunctionBaseConfig, name="mcp_tool_wrapper"):
46
56
  If false, raise the exception.
47
57
  """)
48
58
 
59
+ @model_validator(mode="after")
60
+ def validate_model(self):
61
+ """Validate that stdio and SSE/Streamable HTTP properties are mutually exclusive."""
62
+ if self.transport == 'stdio':
63
+ if self.url is not None:
64
+ raise ValueError("url should not be set when using stdio client type")
65
+ if not self.command:
66
+ raise ValueError("command is required when using stdio client type")
67
+ elif self.transport in ['streamable-http', 'sse']:
68
+ if self.command is not None or self.args is not None or self.env is not None:
69
+ raise ValueError(
70
+ "command, args, and env should not be set when using streamable-http or sse client type")
71
+ if not self.url:
72
+ raise ValueError("url is required when using streamable-http or sse client type")
73
+ return self
74
+
49
75
 
50
76
  @register_function(config_type=MCPToolConfig)
51
77
  async def mcp_tool(config: MCPToolConfig, builder: Builder):
52
78
  """
53
- Generate a NAT Function that wraps a tool provided by the MCP server.
79
+ Generate a NeMo Agent Toolkit Function that wraps a tool provided by the MCP server.
54
80
  """
55
81
 
56
- from nat.tool.mcp.mcp_client import MCPBuilder
57
- from nat.tool.mcp.mcp_client import MCPToolClient
58
-
59
- client = MCPBuilder(url=str(config.url))
60
-
61
- tool: MCPToolClient = await client.get_tool(config.mcp_tool_name)
62
- if config.description:
63
- tool.set_description(description=config.description)
64
-
65
- logger.info("Configured to use tool: %s from MCP server at %s", tool.name, str(config.url))
66
-
67
- def _convert_from_str(input_str: str) -> tool.input_schema:
68
- return tool.input_schema.model_validate_json(input_str)
69
-
70
- async def _response_fn(tool_input: BaseModel | None = None, **kwargs) -> str:
71
- # Run the tool, catching any errors and sending to agent for correction
72
- try:
73
- if tool_input:
74
- args = tool_input.model_dump()
75
- return await tool.acall(args)
76
-
77
- _ = tool.input_schema.model_validate(kwargs)
78
- filtered_kwargs = {k: v for k, v in kwargs.items() if v is not None}
79
- return await tool.acall(filtered_kwargs)
80
- except Exception as e:
81
- if config.return_exception:
82
+ from nat.tool.mcp.mcp_client_base import MCPSSEClient
83
+ from nat.tool.mcp.mcp_client_base import MCPStdioClient
84
+ from nat.tool.mcp.mcp_client_base import MCPStreamableHTTPClient
85
+ from nat.tool.mcp.mcp_client_base import MCPToolClient
86
+
87
+ # Initialize the client
88
+ if config.transport == 'stdio':
89
+ client = MCPStdioClient(command=config.command, args=config.args, env=config.env)
90
+ elif config.transport == 'streamable-http':
91
+ client = MCPStreamableHTTPClient(url=str(config.url))
92
+ elif config.transport == 'sse':
93
+ client = MCPSSEClient(url=str(config.url))
94
+ else:
95
+ raise ValueError(f"Invalid transport type: {config.transport}")
96
+
97
+ async with client:
98
+ # If the tool is found create a MCPToolClient object and set the description if provided
99
+ tool: MCPToolClient = await client.get_tool(config.mcp_tool_name)
100
+ if config.description:
101
+ tool.set_description(description=config.description)
102
+
103
+ logger.info("Configured to use tool: %s from MCP server at %s", tool.name, client.server_name)
104
+
105
+ def _convert_from_str(input_str: str) -> tool.input_schema:
106
+ return tool.input_schema.model_validate_json(input_str)
107
+
108
+ async def _response_fn(tool_input: BaseModel | None = None, **kwargs) -> str:
109
+ # Run the tool, catching any errors and sending to agent for correction
110
+ try:
82
111
  if tool_input:
83
- logger.warning("Error calling tool %s with serialized input: %s",
84
- tool.name,
85
- tool_input.model_dump(),
86
- exc_info=True)
87
- else:
88
- logger.warning("Error calling tool %s with input: %s", tool.name, kwargs, exc_info=True)
89
- return str(e)
90
- # If the tool call fails, raise the exception.
91
- raise
92
-
93
- yield FunctionInfo.create(single_fn=_response_fn,
94
- description=tool.description,
95
- input_schema=tool.input_schema,
96
- converters=[_convert_from_str])
112
+ args = tool_input.model_dump()
113
+ return await tool.acall(args)
114
+
115
+ _ = tool.input_schema.model_validate(kwargs)
116
+ return await tool.acall(kwargs)
117
+ except Exception as e:
118
+ if config.return_exception:
119
+ if tool_input:
120
+ logger.warning("Error calling tool %s with serialized input: %s",
121
+ tool.name,
122
+ tool_input.model_dump(),
123
+ exc_info=True)
124
+ else:
125
+ logger.warning("Error calling tool %s with input: %s", tool.name, kwargs, exc_info=True)
126
+ return str(e)
127
+ # If the tool call fails, raise the exception.
128
+ raise
129
+
130
+ yield FunctionInfo.create(single_fn=_response_fn,
131
+ description=tool.description,
132
+ input_schema=tool.input_schema,
133
+ converters=[_convert_from_str])
nat/tool/register.py CHANGED
@@ -31,6 +31,7 @@ from .github_tools import get_github_file
31
31
  from .github_tools import get_github_issue
32
32
  from .github_tools import get_github_pr
33
33
  from .github_tools import update_github_issue
34
+ from .mcp import mcp_client_impl
34
35
  from .mcp import mcp_tool
35
36
  from .memory_tools import add_memory_tool
36
37
  from .memory_tools import delete_memory_tool
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nvidia-nat
3
- Version: 1.3.0a20250829
3
+ Version: 1.3.0a20250830
4
4
  Summary: NVIDIA NeMo Agent toolkit
5
5
  Author: NVIDIA Corporation
6
6
  Maintainer: NVIDIA Corporation
@@ -221,7 +221,7 @@ Requires-Dist: fastapi~=0.115.5
221
221
  Requires-Dist: httpx~=0.27
222
222
  Requires-Dist: jinja2~=3.1
223
223
  Requires-Dist: jsonpath-ng~=1.7
224
- Requires-Dist: mcp~=1.10
224
+ Requires-Dist: mcp~=1.13
225
225
  Requires-Dist: networkx~=3.4
226
226
  Requires-Dist: numpy~=1.26
227
227
  Requires-Dist: openinference-semantic-conventions~=0.1.14
@@ -229,7 +229,7 @@ Requires-Dist: openpyxl~=3.1
229
229
  Requires-Dist: pkce==1.0.3
230
230
  Requires-Dist: pkginfo~=1.12
231
231
  Requires-Dist: platformdirs~=4.3
232
- Requires-Dist: pydantic==2.10.*
232
+ Requires-Dist: pydantic~=2.11
233
233
  Requires-Dist: pymilvus~=2.4
234
234
  Requires-Dist: PyYAML~=6.0
235
235
  Requires-Dist: ragas~=0.2.14
@@ -4,10 +4,10 @@ nat/agent/base.py,sha256=TnspR3rLYyUbzKkPHQknQhk9nLyrKcoyKdSJN7vy9aU,9856
4
4
  nat/agent/dual_node.py,sha256=YRGRwwkui-2iV_TafTWRnVjWLYFcFIs1HC4kR6AEPyE,2553
5
5
  nat/agent/register.py,sha256=1utq5-6GxtEh2kIEj521q1R17GyxKlWOLBFwuSd0BNs,973
6
6
  nat/agent/react_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- nat/agent/react_agent/agent.py,sha256=IP6c8M_kHLbhIqQc8PKMnOZMuP-bmLWcuhEtPB_cXsw,20637
7
+ nat/agent/react_agent/agent.py,sha256=ead5hwZ9AdklAyem85pbfj5gq6lcpaGMW2YpFBtH4JA,21277
8
8
  nat/agent/react_agent/output_parser.py,sha256=m7K6wRwtckBBpAHqOf3BZ9mqZLwrP13Kxz5fvNxbyZE,4219
9
9
  nat/agent/react_agent/prompt.py,sha256=N47JJrT6xwYQCv1jedHhlul2AE7EfKsSYfAbgJwWRew,1758
10
- nat/agent/react_agent/register.py,sha256=VZFBgR6nuliWvYOp1bqatiWZoUUa5pLUcunY2sAdWP0,8319
10
+ nat/agent/react_agent/register.py,sha256=B3LMOxWa47rQi5XpFMo7hrSb3UsfXHEMp2otNTxZ4lA,8625
11
11
  nat/agent/reasoning_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  nat/agent/reasoning_agent/reasoning_agent.py,sha256=2NDDHeesM2s2PnJfRsv2OTYjeajR1rYUVDvJZLzWGAQ,9434
13
13
  nat/agent/rewoo_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -49,7 +49,7 @@ nat/builder/intermediate_step_manager.py,sha256=iOuMLWTaES0J0XzaLxhTUqFvuoCAChJu
49
49
  nat/builder/llm.py,sha256=DW-2q64A06VChsXNEL5PfBjH3DcsnTKVoCEWDuP7MF4,951
50
50
  nat/builder/retriever.py,sha256=ZyEqc7pFK31t_yr6Jaxa34c-tRas2edKqJZCNiVh9-0,970
51
51
  nat/builder/user_interaction_manager.py,sha256=-Z2qbQes7a2cuXgT7KEbWeuok0HcCnRdw9WB8Ghyl9k,3081
52
- nat/builder/workflow.py,sha256=toK6Zek2k0SqfXRLV7zCvDvYJ-V7DHdf0_U3YLrN_ag,6492
52
+ nat/builder/workflow.py,sha256=t2rnXyNreW-0UN1ZT67X_Bp7yDNov6IwhBi66QNUVGU,6594
53
53
  nat/builder/workflow_builder.py,sha256=dXSP-b3160qEX2_NC2J_3iGfXfTlFqEaRhB8KYjzfws,46084
54
54
  nat/cli/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
55
55
  nat/cli/entrypoint.py,sha256=lKx3aRjEEaP6mBaO7Hn28dtRN-vA-ooIJG93ZkchmOo,4975
@@ -61,7 +61,7 @@ nat/cli/cli_utils/config_override.py,sha256=hLhJDjkLTLkUSYXMjK1qT7USy7ds1ddEDxcE
61
61
  nat/cli/cli_utils/validation.py,sha256=KVZvAkWZx-QVVBuCFTcH2muLzMB7ONQA1GE2TzEVN78,1288
62
62
  nat/cli/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
63
  nat/cli/commands/evaluate.py,sha256=_gSK9km6DQNxFcOZnOpzYuXtM0MG3-ng6S-1UNccG80,4748
64
- nat/cli/commands/start.py,sha256=vm3boXXI3sB5lOZrhlRIg-wkLtelx-WQkFORyu0nv7Y,9730
64
+ nat/cli/commands/start.py,sha256=kYXLWj-jNQZLyC1JjM4UEvqSK9vP7As6C9pzhNwHQsg,10431
65
65
  nat/cli/commands/uninstall.py,sha256=KJDe-BCUD5ws_lTpCNPj3Ac26TQO8kys0AZqjZsljfs,3180
66
66
  nat/cli/commands/validate.py,sha256=mseAUfwRP8RL2Jc_a7MA9_0j9CRQFojEFPTPSuLiFGI,1669
67
67
  nat/cli/commands/configure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -75,7 +75,7 @@ nat/cli/commands/info/__init__.py,sha256=GUJrgGtpvyMUCjUBvR3faAdv-tZzbU9W-izgx9a
75
75
  nat/cli/commands/info/info.py,sha256=5_s2_MMYn6ZLQpADdZ3aVRg4uvyXvF-4xVJclXxN15U,1317
76
76
  nat/cli/commands/info/list_channels.py,sha256=K97TE6wtikgImY-wAbFNi0HHUGtkvIFd2woaG06VkT0,1277
77
77
  nat/cli/commands/info/list_components.py,sha256=QlAJVONBA77xW8Lx6Autw5NTAZNy_VrJGr1GL9MfnHM,4532
78
- nat/cli/commands/info/list_mcp.py,sha256=W94X0kWjqMX_yqJSEtZJOCDy6SoUx7PlXbak3crCSUc,12619
78
+ nat/cli/commands/info/list_mcp.py,sha256=-gFrAfsfu--LdP1V-GpFn5jG70H1LMWs2N2l_hDm2p8,18152
79
79
  nat/cli/commands/object_store/__init__.py,sha256=GUJrgGtpvyMUCjUBvR3faAdv-tZzbU9W-izgx9aMEQg,680
80
80
  nat/cli/commands/object_store/object_store.py,sha256=_ivB-R30a-66fNy-fUzi58HQ0Ay0gYsGz7T1xXoRa3Y,8576
81
81
  nat/cli/commands/registry/__init__.py,sha256=GUJrgGtpvyMUCjUBvR3faAdv-tZzbU9W-izgx9aMEQg,680
@@ -128,7 +128,7 @@ nat/data_models/streaming.py,sha256=sSqJqLqb70qyw69_4R9QC2RMbRw7UjTLPdo3FYBUGxE,
128
128
  nat/data_models/swe_bench_model.py,sha256=uZs-hLFuT1B5CiPFwFg1PHinDW8PHne8TBzu7tHFv_k,1718
129
129
  nat/data_models/telemetry_exporter.py,sha256=P7kqxIQnFVuvo_UFpH9QSB8fACy_0U2Uzkw_IfWXagE,998
130
130
  nat/data_models/temperature_mixin.py,sha256=nUvA_tvjMfILGpBx52RLmJrApJzuswQqlNpS6netkxM,1485
131
- nat/data_models/thinking_mixin.py,sha256=KnGvk7b97pcHo7IfORGQoTaXfClqk13UEoFnlElSY7w,2666
131
+ nat/data_models/thinking_mixin.py,sha256=bRvMiuaBKInypZ2OU3npR1RjJTrOzTSWE-xFLHQAFuc,3293
132
132
  nat/data_models/top_p_mixin.py,sha256=33cRWjgT0lctucSl8rzioMVeabw3977aGRRWupD9ZaY,1456
133
133
  nat/data_models/ttc_strategy.py,sha256=tAkKWcyEBmBOOYtHMtQTgeCbHxFTk5SEkmFunNVnfyE,1114
134
134
  nat/embedder/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -235,11 +235,11 @@ nat/front_ends/fastapi/auth_flow_handlers/websocket_flow_handler.py,sha256=5HX6m
235
235
  nat/front_ends/fastapi/html_snippets/__init__.py,sha256=GUJrgGtpvyMUCjUBvR3faAdv-tZzbU9W-izgx9aMEQg,680
236
236
  nat/front_ends/fastapi/html_snippets/auth_code_grant_success.py,sha256=BNpWwzmA58UM0GK4kZXG4PHJy_5K9ihaVHu8SgCs5JA,1131
237
237
  nat/front_ends/mcp/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
238
- nat/front_ends/mcp/mcp_front_end_config.py,sha256=QS8DUVOPqg71RrU7gtw_gBApmmADUAZHNy69I425QNg,1826
239
- nat/front_ends/mcp/mcp_front_end_plugin.py,sha256=kHR7jhenSuibrsKoXVHAeLoAiDcZxalStYEFR-38gDo,3243
240
- nat/front_ends/mcp/mcp_front_end_plugin_worker.py,sha256=Ssgv6ORdRmdfANLSehOCuTr_zzUS9Ok6Rkn7uWNyoZk,5249
238
+ nat/front_ends/mcp/mcp_front_end_config.py,sha256=ivj8xWzE-Z1675jS7KB4LgpI3A7Atq-zJ6FgFQxdQuU,2062
239
+ nat/front_ends/mcp/mcp_front_end_plugin.py,sha256=CerJGbuPaHVcpnMFtjs8IKeQaa3blHzX90VKptUM_3g,3674
240
+ nat/front_ends/mcp/mcp_front_end_plugin_worker.py,sha256=OvNXRMsp9k9MEwBJ6J27Sa-EfMs07qP1ikTJ8amVcmU,5303
241
241
  nat/front_ends/mcp/register.py,sha256=3aJtgG5VaiqujoeU1-Eq7Hl5pWslIlIwGFU2ASLTXgM,1173
242
- nat/front_ends/mcp/tool_converter.py,sha256=rCvFL8lrztkjC0nFtfzgfFrPK_IUKk-M_er8jBCM9Ic,9755
242
+ nat/front_ends/mcp/tool_converter.py,sha256=vNPaTckcqjKakwdjkqET_T4-ChjlLkMfdw0_H-x6eVc,11309
243
243
  nat/front_ends/simple_base/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
244
244
  nat/front_ends/simple_base/simple_front_end_plugin_base.py,sha256=3kevZVhvzj_Wvu8HYhRz-CRrO2OldW6wcmtcsIQCELk,1765
245
245
  nat/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -263,7 +263,7 @@ nat/object_store/models.py,sha256=xsch4o3GzEFxVbFEYBfr92lEMZk5XHHr224WZGsQUNM,15
263
263
  nat/object_store/register.py,sha256=jNuZfyG2rSuxS-DNK_aFdgfjiHK3VC1_4A5lmpmRP_A,756
264
264
  nat/observability/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
265
265
  nat/observability/exporter_manager.py,sha256=4AcF-EbuJ9lTfL06NL1Nz6rgmzkHWOPZJ9KSJlFiv2E,13852
266
- nat/observability/register.py,sha256=ONNZca9oUtF3twcLaXy5gp6kVBzJFTSSQcap1AhTYYY,4192
266
+ nat/observability/register.py,sha256=Hpk5aYYXCKdvkTqE245QgtmhCKrGh75uZZoefcxa38Y,4225
267
267
  nat/observability/exporter/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
268
268
  nat/observability/exporter/base_exporter.py,sha256=tP7c5O-gQnHB_1TwIJJUib1xmtUhX4f4Mf_bmpejtkI,16612
269
269
  nat/observability/exporter/exporter.py,sha256=fqF0GYuhZRQEq0skq_FK2nlnsaUAzLpQi-OciaOkRno,2391
@@ -376,7 +376,7 @@ nat/tool/chat_completion.py,sha256=zB8sqEBEHW0QDcnv0NdqO43ybxe5Q-WKZr9s349UBvA,3
376
376
  nat/tool/datetime_tools.py,sha256=yZV5lE3FsQuIZE3B36gg38hxfavxgaG04eVFbL0UBTI,3239
377
377
  nat/tool/document_search.py,sha256=M6OjKdqUm_HdNn5-rgm5SDOeFGTNuwjYiuMQL43myGc,6741
378
378
  nat/tool/nvidia_rag.py,sha256=cEHSc3CZwpd71YcOQngya-Ca_B6ZOb87Dmsoza0VhFY,4163
379
- nat/tool/register.py,sha256=zlf6uGVrq_baCAqo8d_lWtcJOzlAbnznq4J8g9fg58k,1459
379
+ nat/tool/register.py,sha256=IAvxfeUVYu9fa1bUgQ1iLtLh9MNauZH9iorbhXegnqc,1492
380
380
  nat/tool/retriever.py,sha256=FP5JL1vCQNrqaKz4F1up-osjxEPhxPFOyaScrgByc34,3877
381
381
  nat/tool/server_tools.py,sha256=rQLipwRv8lAyU-gohky2JoVDxWQTUTSttNWjhu7lcHU,3194
382
382
  nat/tool/code_execution/README.md,sha256=sl3YX4As95HX61XqTXOGnUcHBV1lla-OeuTnLI4qgng,4019
@@ -401,8 +401,9 @@ nat/tool/github_tools/get_github_pr.py,sha256=p4Xu-YA6L1dQ8O0e5LDzphrn5DknjttDhL
401
401
  nat/tool/github_tools/update_github_issue.py,sha256=fj_OAp5bSmSyj-wPAUvzfCGRBuwPyoK1kJ95Fn8XDg8,4103
402
402
  nat/tool/mcp/__init__.py,sha256=GUJrgGtpvyMUCjUBvR3faAdv-tZzbU9W-izgx9aMEQg,680
403
403
  nat/tool/mcp/exceptions.py,sha256=EGVOnYlui8xufm8dhJyPL1SUqBLnCGOTvRoeyNcmcWE,5980
404
- nat/tool/mcp/mcp_client.py,sha256=jdlJULJG1EGdj2CwT26x6hBatG6vz0cXsh14c_ttv20,8963
405
- nat/tool/mcp/mcp_tool.py,sha256=fZGFRupumjXKMXaO_6IhOZ8t1HqHxyv4yytjmoFKlZE,4061
404
+ nat/tool/mcp/mcp_client_base.py,sha256=uZ9WCJYhPiYYCaZfC3oa2EwXYJUMDSnm2b5Z6_VSfZE,13412
405
+ nat/tool/mcp/mcp_client_impl.py,sha256=Q2qJAUFWq__opXXUzO6XhhRf9gjwJcEkdHXSiQz4S4I,9668
406
+ nat/tool/mcp/mcp_tool.py,sha256=OIvoLnl2d9PWqE9625jj0CiVEPBVS9LajxFD1VOJlVY,6382
406
407
  nat/tool/memory_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
407
408
  nat/tool/memory_tools/add_memory_tool.py,sha256=DYaYkVlH2myRshJpzmULfzdF0wFoPCAkTBokFVmhfzU,3349
408
409
  nat/tool/memory_tools/delete_memory_tool.py,sha256=EWJVgzIzLDqktY5domXph-N2U9FmybdWl4J7KM7uK4g,2532
@@ -438,10 +439,10 @@ nat/utils/reactive/base/observer_base.py,sha256=6BiQfx26EMumotJ3KoVcdmFBYR_fnAss
438
439
  nat/utils/reactive/base/subject_base.py,sha256=UQOxlkZTIeeyYmG5qLtDpNf_63Y7p-doEeUA08_R8ME,2521
439
440
  nat/utils/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
440
441
  nat/utils/settings/global_settings.py,sha256=9JaO6pxKT_Pjw6rxJRsRlFCXdVKCl_xUKU2QHZQWWNM,7294
441
- nvidia_nat-1.3.0a20250829.dist-info/licenses/LICENSE-3rd-party.txt,sha256=fOk5jMmCX9YoKWyYzTtfgl-SUy477audFC5hNY4oP7Q,284609
442
- nvidia_nat-1.3.0a20250829.dist-info/licenses/LICENSE.md,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
443
- nvidia_nat-1.3.0a20250829.dist-info/METADATA,sha256=8OmfLMouhRsMDaTaLEq3z37MLT_Mp1GsRh2NFT_hptM,21858
444
- nvidia_nat-1.3.0a20250829.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
445
- nvidia_nat-1.3.0a20250829.dist-info/entry_points.txt,sha256=FNh4pZVSe_61s29zdks66lmXBPtsnko8KSZ4ffv7WVE,653
446
- nvidia_nat-1.3.0a20250829.dist-info/top_level.txt,sha256=lgJWLkigiVZuZ_O1nxVnD_ziYBwgpE2OStdaCduMEGc,8
447
- nvidia_nat-1.3.0a20250829.dist-info/RECORD,,
442
+ nvidia_nat-1.3.0a20250830.dist-info/licenses/LICENSE-3rd-party.txt,sha256=fOk5jMmCX9YoKWyYzTtfgl-SUy477audFC5hNY4oP7Q,284609
443
+ nvidia_nat-1.3.0a20250830.dist-info/licenses/LICENSE.md,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
444
+ nvidia_nat-1.3.0a20250830.dist-info/METADATA,sha256=gLncdxCW0y8zo8IgT0J-PY-GOhfC1so3uX94K6Qqcns,21856
445
+ nvidia_nat-1.3.0a20250830.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
446
+ nvidia_nat-1.3.0a20250830.dist-info/entry_points.txt,sha256=FNh4pZVSe_61s29zdks66lmXBPtsnko8KSZ4ffv7WVE,653
447
+ nvidia_nat-1.3.0a20250830.dist-info/top_level.txt,sha256=lgJWLkigiVZuZ_O1nxVnD_ziYBwgpE2OStdaCduMEGc,8
448
+ nvidia_nat-1.3.0a20250830.dist-info/RECORD,,