nvidia-nat 1.3.0rc6__py3-none-any.whl → 1.3.1__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.
- nat/agent/rewoo_agent/agent.py +1 -1
- nat/data_models/api_server.py +2 -0
- nat/data_models/top_p_mixin.py +5 -2
- nat/front_ends/fastapi/fastapi_front_end_config.py +7 -0
- nat/front_ends/fastapi/fastapi_front_end_plugin.py +13 -7
- nat/front_ends/fastapi/fastapi_front_end_plugin_worker.py +20 -14
- nat/front_ends/mcp/mcp_front_end_config.py +5 -2
- nat/front_ends/mcp/mcp_front_end_plugin_worker.py +4 -0
- nat/front_ends/mcp/tool_converter.py +53 -22
- nat/profiler/parameter_optimization/parameter_optimizer.py +1 -1
- nat/tool/code_execution/code_sandbox.py +3 -6
- nat/tool/server_tools.py +15 -2
- {nvidia_nat-1.3.0rc6.dist-info → nvidia_nat-1.3.1.dist-info}/METADATA +3 -1
- {nvidia_nat-1.3.0rc6.dist-info → nvidia_nat-1.3.1.dist-info}/RECORD +19 -19
- {nvidia_nat-1.3.0rc6.dist-info → nvidia_nat-1.3.1.dist-info}/WHEEL +0 -0
- {nvidia_nat-1.3.0rc6.dist-info → nvidia_nat-1.3.1.dist-info}/entry_points.txt +0 -0
- {nvidia_nat-1.3.0rc6.dist-info → nvidia_nat-1.3.1.dist-info}/licenses/LICENSE-3rd-party.txt +0 -0
- {nvidia_nat-1.3.0rc6.dist-info → nvidia_nat-1.3.1.dist-info}/licenses/LICENSE.md +0 -0
- {nvidia_nat-1.3.0rc6.dist-info → nvidia_nat-1.3.1.dist-info}/top_level.txt +0 -0
nat/agent/rewoo_agent/agent.py
CHANGED
|
@@ -217,7 +217,7 @@ class ReWOOAgentGraph(BaseAgent):
|
|
|
217
217
|
if value is not None:
|
|
218
218
|
if value == placeholder:
|
|
219
219
|
tool_input[key] = tool_output
|
|
220
|
-
elif placeholder in value:
|
|
220
|
+
elif isinstance(value, str) and placeholder in value:
|
|
221
221
|
# If the placeholder is part of the value, replace it with the stringified output
|
|
222
222
|
tool_input[key] = value.replace(placeholder, str(tool_output))
|
|
223
223
|
|
nat/data_models/api_server.py
CHANGED
|
@@ -608,6 +608,8 @@ class WebSocketUserInteractionResponseMessage(BaseModel):
|
|
|
608
608
|
type: typing.Literal[WebSocketMessageType.USER_INTERACTION_MESSAGE]
|
|
609
609
|
id: str = "default"
|
|
610
610
|
thread_id: str = "default"
|
|
611
|
+
parent_id: str = "default"
|
|
612
|
+
conversation_id: str | None = None
|
|
611
613
|
content: UserMessageContent
|
|
612
614
|
user: User = User()
|
|
613
615
|
security: Security = Security()
|
nat/data_models/top_p_mixin.py
CHANGED
|
@@ -28,10 +28,13 @@ class TopPMixin(
|
|
|
28
28
|
field_name="top_p",
|
|
29
29
|
default_if_supported=1.0,
|
|
30
30
|
keys=("model_name", "model", "azure_deployment"),
|
|
31
|
-
unsupported=(
|
|
31
|
+
unsupported=(
|
|
32
|
+
re.compile(r"gpt-?5", re.IGNORECASE),
|
|
33
|
+
re.compile(r"claude.?sonnet.?4.5", re.IGNORECASE),
|
|
34
|
+
),
|
|
32
35
|
):
|
|
33
36
|
"""
|
|
34
|
-
Mixin class for top-p configuration. Unsupported on models like gpt-5.
|
|
37
|
+
Mixin class for top-p configuration. Unsupported on models like gpt-5 and claude-sonnet-4.5.
|
|
35
38
|
|
|
36
39
|
Attributes:
|
|
37
40
|
top_p: Top-p for distribution sampling. Defaults to 1.0 when supported on the model.
|
|
@@ -211,6 +211,13 @@ class FastApiFrontEndConfig(FrontEndBaseConfig, name="fastapi"):
|
|
|
211
211
|
"Maximum number of async jobs to run concurrently, this controls the number of dask workers created. "
|
|
212
212
|
"This parameter is only used when scheduler_address is `None` and a Dask local cluster is created."),
|
|
213
213
|
ge=1)
|
|
214
|
+
dask_workers: typing.Literal["threads", "processes"] = Field(
|
|
215
|
+
default="processes",
|
|
216
|
+
description=(
|
|
217
|
+
"Type of Dask workers to use. Options are 'threads' for Threaded Dask workers or 'processes' for "
|
|
218
|
+
"Process based Dask workers. This parameter is only used when scheduler_address is `None` and a local Dask "
|
|
219
|
+
"cluster is created."),
|
|
220
|
+
)
|
|
214
221
|
dask_log_level: str = Field(
|
|
215
222
|
default="WARNING",
|
|
216
223
|
description="Logging level for Dask.",
|
|
@@ -120,18 +120,24 @@ class FastApiFrontEndPlugin(DaskClientMixin, FrontEndBase[FastApiFrontEndConfig]
|
|
|
120
120
|
|
|
121
121
|
from dask.distributed import LocalCluster
|
|
122
122
|
|
|
123
|
-
self.
|
|
123
|
+
use_threads = self.front_end_config.dask_workers == 'threads'
|
|
124
|
+
|
|
125
|
+
# set n_workers to max_running_async_jobs + 1 to allow for one worker to handle the cleanup task
|
|
126
|
+
self._cluster = LocalCluster(processes=not use_threads,
|
|
124
127
|
silence_logs=dask_log_level,
|
|
125
|
-
|
|
126
|
-
|
|
128
|
+
protocol="tcp",
|
|
129
|
+
n_workers=self.front_end_config.max_running_async_jobs + 1)
|
|
127
130
|
|
|
128
131
|
self._scheduler_address = self._cluster.scheduler.address
|
|
129
132
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
+
if not use_threads and sys.platform != "win32":
|
|
134
|
+
with self.blocking_client(self._scheduler_address) as client:
|
|
135
|
+
# Client.run submits a function to be run on each worker
|
|
136
|
+
client.run(self._setup_worker)
|
|
133
137
|
|
|
134
|
-
logger.info("Created local Dask cluster with scheduler at %s",
|
|
138
|
+
logger.info("Created local Dask cluster with scheduler at %s using %s workers",
|
|
139
|
+
self._scheduler_address,
|
|
140
|
+
self.front_end_config.dask_workers)
|
|
135
141
|
|
|
136
142
|
except ImportError:
|
|
137
143
|
logger.warning("Dask is not installed, async execution and evaluation will not be available.")
|
|
@@ -544,7 +544,8 @@ class FastApiFrontEndPluginWorker(FastApiFrontEndPluginWorkerBase):
|
|
|
544
544
|
GenerateStreamResponseType = workflow.streaming_output_schema
|
|
545
545
|
GenerateSingleResponseType = workflow.single_output_schema
|
|
546
546
|
|
|
547
|
-
|
|
547
|
+
# Skip async generation for custom routes (those with function_name)
|
|
548
|
+
if self._dask_available and not hasattr(endpoint, 'function_name'):
|
|
548
549
|
# Append job_id and expiry_seconds to the input schema, this effectively makes these reserved keywords
|
|
549
550
|
# Consider prefixing these with "nat_" to avoid conflicts
|
|
550
551
|
|
|
@@ -562,6 +563,10 @@ class FastApiFrontEndPluginWorker(FastApiFrontEndPluginWorkerBase):
|
|
|
562
563
|
description="Optional time (in seconds) before the job expires. "
|
|
563
564
|
"Clamped between 600 (10 min) and 86400 (24h).")
|
|
564
565
|
|
|
566
|
+
def validate_model(self):
|
|
567
|
+
# Override to ensure that the parent class validator is not called
|
|
568
|
+
return self
|
|
569
|
+
|
|
565
570
|
# Ensure that the input is in the body. POD types are treated as query parameters
|
|
566
571
|
if (not issubclass(GenerateBodyType, BaseModel)):
|
|
567
572
|
GenerateBodyType = typing.Annotated[GenerateBodyType, Body()]
|
|
@@ -760,17 +765,18 @@ class FastApiFrontEndPluginWorker(FastApiFrontEndPluginWorkerBase):
|
|
|
760
765
|
return AsyncGenerateResponse(job_id=job.job_id, status=job.status)
|
|
761
766
|
|
|
762
767
|
job_id = self._job_store.ensure_job_id(request.job_id)
|
|
763
|
-
(_, job) = await self._job_store.submit_job(
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
768
|
+
(_, job) = await self._job_store.submit_job(
|
|
769
|
+
job_id=job_id,
|
|
770
|
+
expiry_seconds=request.expiry_seconds,
|
|
771
|
+
job_fn=run_generation,
|
|
772
|
+
sync_timeout=request.sync_timeout,
|
|
773
|
+
job_args=[
|
|
774
|
+
self._scheduler_address,
|
|
775
|
+
self._db_url,
|
|
776
|
+
self._config_file_path,
|
|
777
|
+
job_id,
|
|
778
|
+
request.model_dump(mode="json", exclude=["job_id", "sync_timeout", "expiry_seconds"])
|
|
779
|
+
])
|
|
774
780
|
|
|
775
781
|
if job is not None:
|
|
776
782
|
response.status_code = 200
|
|
@@ -916,7 +922,7 @@ class FastApiFrontEndPluginWorker(FastApiFrontEndPluginWorkerBase):
|
|
|
916
922
|
responses={500: response_500},
|
|
917
923
|
)
|
|
918
924
|
|
|
919
|
-
if self._dask_available:
|
|
925
|
+
if self._dask_available and not hasattr(endpoint, 'function_name'):
|
|
920
926
|
app.add_api_route(
|
|
921
927
|
path=f"{endpoint.path}/async",
|
|
922
928
|
endpoint=post_async_generation(request_type=AsyncGenerateRequest),
|
|
@@ -930,7 +936,7 @@ class FastApiFrontEndPluginWorker(FastApiFrontEndPluginWorkerBase):
|
|
|
930
936
|
else:
|
|
931
937
|
raise ValueError(f"Unsupported method {endpoint.method}")
|
|
932
938
|
|
|
933
|
-
if self._dask_available:
|
|
939
|
+
if self._dask_available and not hasattr(endpoint, 'function_name'):
|
|
934
940
|
app.add_api_route(
|
|
935
941
|
path=f"{endpoint.path}/async/job/{{job_id}}",
|
|
936
942
|
endpoint=get_async_job_status,
|
|
@@ -37,8 +37,11 @@ class MCPFrontEndConfig(FrontEndBaseConfig, name="mcp"):
|
|
|
37
37
|
port: int = Field(default=9901, description="Port to bind the server to (default: 9901)", ge=0, le=65535)
|
|
38
38
|
debug: bool = Field(default=False, description="Enable debug mode (default: False)")
|
|
39
39
|
log_level: str = Field(default="INFO", description="Log level for the MCP server (default: INFO)")
|
|
40
|
-
tool_names: list[str] = Field(
|
|
41
|
-
|
|
40
|
+
tool_names: list[str] = Field(
|
|
41
|
+
default_factory=list,
|
|
42
|
+
description="The list of tools MCP server will expose (default: all tools)."
|
|
43
|
+
"Tool names can be functions or function groups",
|
|
44
|
+
)
|
|
42
45
|
transport: Literal["sse", "streamable-http"] = Field(
|
|
43
46
|
default="streamable-http",
|
|
44
47
|
description="Transport type for the MCP server (default: streamable-http, backwards compatible with sse)")
|
|
@@ -234,6 +234,10 @@ class MCPFrontEndPluginWorker(MCPFrontEndPluginWorkerBase):
|
|
|
234
234
|
filtered_functions: dict[str, Function] = {}
|
|
235
235
|
for function_name, function in functions.items():
|
|
236
236
|
if function_name in self.front_end_config.tool_names:
|
|
237
|
+
# Treat current tool_names as function names, so check if the function name is in the list
|
|
238
|
+
filtered_functions[function_name] = function
|
|
239
|
+
elif any(function_name.startswith(f"{group_name}.") for group_name in self.front_end_config.tool_names):
|
|
240
|
+
# Treat tool_names as function group names, so check if the function name starts with the group name
|
|
237
241
|
filtered_functions[function_name] = function
|
|
238
242
|
else:
|
|
239
243
|
logger.debug("Skipping function %s as it's not in tool_names", function_name)
|
|
@@ -18,9 +18,12 @@ import logging
|
|
|
18
18
|
from inspect import Parameter
|
|
19
19
|
from inspect import Signature
|
|
20
20
|
from typing import TYPE_CHECKING
|
|
21
|
+
from typing import Any
|
|
21
22
|
|
|
22
23
|
from mcp.server.fastmcp import FastMCP
|
|
23
24
|
from pydantic import BaseModel
|
|
25
|
+
from pydantic.fields import FieldInfo
|
|
26
|
+
from pydantic_core import PydanticUndefined
|
|
24
27
|
|
|
25
28
|
from nat.builder.context import ContextState
|
|
26
29
|
from nat.builder.function import Function
|
|
@@ -31,6 +34,41 @@ if TYPE_CHECKING:
|
|
|
31
34
|
|
|
32
35
|
logger = logging.getLogger(__name__)
|
|
33
36
|
|
|
37
|
+
# Sentinel: marks "optional; let Pydantic supply default/factory"
|
|
38
|
+
_USE_PYDANTIC_DEFAULT = object()
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def is_field_optional(field: FieldInfo) -> tuple[bool, Any]:
|
|
42
|
+
"""Determine if a Pydantic field is optional and extract its default value for MCP signatures.
|
|
43
|
+
|
|
44
|
+
For MCP tool signatures, we need to distinguish:
|
|
45
|
+
- Required fields: marked with Parameter.empty
|
|
46
|
+
- Optional with concrete default: use that default
|
|
47
|
+
- Optional with factory: use sentinel so Pydantic can apply the factory later
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
field: The Pydantic FieldInfo to check
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
A tuple of (is_optional, default_value):
|
|
54
|
+
- (False, Parameter.empty) for required fields
|
|
55
|
+
- (True, actual_default) for optional fields with explicit defaults
|
|
56
|
+
- (True, _USE_PYDANTIC_DEFAULT) for optional fields with default_factory
|
|
57
|
+
"""
|
|
58
|
+
if field.is_required():
|
|
59
|
+
return False, Parameter.empty
|
|
60
|
+
|
|
61
|
+
# Field is optional - has either default or factory
|
|
62
|
+
if field.default is not PydanticUndefined:
|
|
63
|
+
return True, field.default
|
|
64
|
+
|
|
65
|
+
# Factory case: mark optional in signature but don't fabricate a value
|
|
66
|
+
if field.default_factory is not None:
|
|
67
|
+
return True, _USE_PYDANTIC_DEFAULT
|
|
68
|
+
|
|
69
|
+
# Rare corner case: non-required yet no default surfaced
|
|
70
|
+
return True, _USE_PYDANTIC_DEFAULT
|
|
71
|
+
|
|
34
72
|
|
|
35
73
|
def create_function_wrapper(
|
|
36
74
|
function_name: str,
|
|
@@ -76,12 +114,15 @@ def create_function_wrapper(
|
|
|
76
114
|
# Get the field type and convert to appropriate Python type
|
|
77
115
|
field_type = field.annotation
|
|
78
116
|
|
|
117
|
+
# Check if field is optional and get its default value
|
|
118
|
+
_is_optional, param_default = is_field_optional(field)
|
|
119
|
+
|
|
79
120
|
# Add the parameter to our list
|
|
80
121
|
parameters.append(
|
|
81
122
|
Parameter(
|
|
82
123
|
name=name,
|
|
83
124
|
kind=Parameter.KEYWORD_ONLY,
|
|
84
|
-
default=
|
|
125
|
+
default=param_default,
|
|
85
126
|
annotation=field_type,
|
|
86
127
|
))
|
|
87
128
|
|
|
@@ -140,33 +181,23 @@ def create_function_wrapper(
|
|
|
140
181
|
result = await call_with_observability(lambda: function.ainvoke(chat_request, to_type=str))
|
|
141
182
|
else:
|
|
142
183
|
# Regular handling
|
|
143
|
-
#
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
# If it's a pydantic model, we need to create an instance
|
|
151
|
-
if field_type and hasattr(field_type, "model_validate"):
|
|
152
|
-
# Create the nested object
|
|
153
|
-
nested_obj = field_type.model_validate(kwargs)
|
|
154
|
-
# Call with the nested object
|
|
155
|
-
kwargs = {field_name: nested_obj}
|
|
184
|
+
# Strip sentinel values so Pydantic can apply defaults/factories
|
|
185
|
+
cleaned_kwargs = {k: v for k, v in kwargs.items() if v is not _USE_PYDANTIC_DEFAULT}
|
|
186
|
+
|
|
187
|
+
# Always validate with the declared schema
|
|
188
|
+
# This handles defaults, factories, nested models, validators, etc.
|
|
189
|
+
model_input = schema.model_validate(cleaned_kwargs)
|
|
156
190
|
|
|
157
191
|
# Call the NAT function with the parameters - special handling for Workflow
|
|
158
192
|
if is_workflow:
|
|
159
|
-
#
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
# Workflows have a run method that is an async context manager
|
|
163
|
-
# that returns a Runner
|
|
164
|
-
async with function.run(input_value) as runner:
|
|
193
|
+
# Workflows expect the model instance directly
|
|
194
|
+
async with function.run(model_input) as runner:
|
|
165
195
|
# Get the result from the runner
|
|
166
196
|
result = await runner.result(to_type=str)
|
|
167
197
|
else:
|
|
168
|
-
# Regular function call
|
|
169
|
-
result = await call_with_observability(lambda: function.acall_invoke(**
|
|
198
|
+
# Regular function call - unpack the validated model
|
|
199
|
+
result = await call_with_observability(lambda: function.acall_invoke(**model_input.model_dump())
|
|
200
|
+
)
|
|
170
201
|
|
|
171
202
|
# Report completion
|
|
172
203
|
if ctx:
|
|
@@ -117,7 +117,7 @@ def optimize_parameters(
|
|
|
117
117
|
|
|
118
118
|
# Save final results (out_dir already created and defined above)
|
|
119
119
|
with (out_dir / "optimized_config.yml").open("w") as fh:
|
|
120
|
-
yaml.dump(tuned_cfg.model_dump(), fh)
|
|
120
|
+
yaml.dump(tuned_cfg.model_dump(mode='json'), fh)
|
|
121
121
|
with (out_dir / "trials_dataframe_params.csv").open("w") as fh:
|
|
122
122
|
# Export full trials DataFrame (values, params, timings, etc.).
|
|
123
123
|
df = study.trials_dataframe()
|
|
@@ -92,7 +92,9 @@ class Sandbox(abc.ABC):
|
|
|
92
92
|
raise ValueError(f"Language {language} not supported")
|
|
93
93
|
|
|
94
94
|
generated_code = generated_code.strip().strip("`")
|
|
95
|
-
|
|
95
|
+
# Use json.dumps to properly escape the generated_code instead of repr()
|
|
96
|
+
escaped_code = json.dumps(generated_code)
|
|
97
|
+
code_to_execute = textwrap.dedent(f"""
|
|
96
98
|
import traceback
|
|
97
99
|
import json
|
|
98
100
|
import os
|
|
@@ -101,11 +103,6 @@ class Sandbox(abc.ABC):
|
|
|
101
103
|
import io
|
|
102
104
|
warnings.filterwarnings('ignore')
|
|
103
105
|
os.environ['OPENBLAS_NUM_THREADS'] = '16'
|
|
104
|
-
""").strip()
|
|
105
|
-
|
|
106
|
-
# Use json.dumps to properly escape the generated_code instead of repr()
|
|
107
|
-
escaped_code = json.dumps(generated_code)
|
|
108
|
-
code_to_execute += textwrap.dedent(f"""
|
|
109
106
|
|
|
110
107
|
generated_code = {escaped_code}
|
|
111
108
|
|
nat/tool/server_tools.py
CHANGED
|
@@ -32,14 +32,23 @@ class RequestAttributesTool(FunctionBaseConfig, name="current_request_attributes
|
|
|
32
32
|
@register_function(config_type=RequestAttributesTool)
|
|
33
33
|
async def current_request_attributes(config: RequestAttributesTool, builder: Builder):
|
|
34
34
|
|
|
35
|
+
from pydantic import RootModel
|
|
36
|
+
from pydantic.types import JsonValue
|
|
35
37
|
from starlette.datastructures import Headers
|
|
36
38
|
from starlette.datastructures import QueryParams
|
|
37
39
|
|
|
38
|
-
|
|
40
|
+
class RequestBody(RootModel[JsonValue]):
|
|
41
|
+
"""
|
|
42
|
+
Data model that accepts a request body of any valid JSON type.
|
|
43
|
+
"""
|
|
44
|
+
root: JsonValue
|
|
45
|
+
|
|
46
|
+
async def _get_request_attributes(request_body: RequestBody) -> str:
|
|
39
47
|
|
|
40
48
|
from nat.builder.context import Context
|
|
41
49
|
nat_context = Context.get()
|
|
42
50
|
|
|
51
|
+
# Access request attributes from context
|
|
43
52
|
method: str | None = nat_context.metadata.method
|
|
44
53
|
url_path: str | None = nat_context.metadata.url_path
|
|
45
54
|
url_scheme: str | None = nat_context.metadata.url_scheme
|
|
@@ -51,6 +60,9 @@ async def current_request_attributes(config: RequestAttributesTool, builder: Bui
|
|
|
51
60
|
cookies: dict[str, str] | None = nat_context.metadata.cookies
|
|
52
61
|
conversation_id: str | None = nat_context.conversation_id
|
|
53
62
|
|
|
63
|
+
# Access the request body data - can be any valid JSON type
|
|
64
|
+
request_body_data: JsonValue = request_body.root
|
|
65
|
+
|
|
54
66
|
return (f"Method: {method}, "
|
|
55
67
|
f"URL Path: {url_path}, "
|
|
56
68
|
f"URL Scheme: {url_scheme}, "
|
|
@@ -60,7 +72,8 @@ async def current_request_attributes(config: RequestAttributesTool, builder: Bui
|
|
|
60
72
|
f"Client Host: {client_host}, "
|
|
61
73
|
f"Client Port: {client_port}, "
|
|
62
74
|
f"Cookies: {cookies}, "
|
|
63
|
-
f"Conversation Id: {conversation_id}"
|
|
75
|
+
f"Conversation Id: {conversation_id}, "
|
|
76
|
+
f"Request Body: {request_body_data}")
|
|
64
77
|
|
|
65
78
|
yield FunctionInfo.from_fn(_get_request_attributes,
|
|
66
79
|
description="Returns the acquired user defined request attributes.")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nvidia-nat
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.1
|
|
4
4
|
Summary: NVIDIA NeMo Agent toolkit
|
|
5
5
|
Author: NVIDIA Corporation
|
|
6
6
|
Maintainer: NVIDIA Corporation
|
|
@@ -89,6 +89,8 @@ Requires-Dist: nvidia-nat-opentelemetry; extra == "telemetry"
|
|
|
89
89
|
Requires-Dist: nvidia-nat-phoenix; extra == "telemetry"
|
|
90
90
|
Requires-Dist: nvidia-nat-ragaai; extra == "telemetry"
|
|
91
91
|
Requires-Dist: nvidia-nat-weave; extra == "telemetry"
|
|
92
|
+
Provides-Extra: test
|
|
93
|
+
Requires-Dist: nvidia-nat-test; extra == "test"
|
|
92
94
|
Provides-Extra: weave
|
|
93
95
|
Requires-Dist: nvidia-nat-weave; extra == "weave"
|
|
94
96
|
Provides-Extra: zep-cloud
|
|
@@ -14,7 +14,7 @@ nat/agent/react_agent/register.py,sha256=qkPaK6AvXjolL-q_Z3waVobXDz24GMfuqGqCn-2
|
|
|
14
14
|
nat/agent/reasoning_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
15
|
nat/agent/reasoning_agent/reasoning_agent.py,sha256=fFQtzvaBWtmr_B6S9KSkqAfyl1BdcOc9xkhnbO4O8Pk,9603
|
|
16
16
|
nat/agent/rewoo_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
-
nat/agent/rewoo_agent/agent.py,sha256=
|
|
17
|
+
nat/agent/rewoo_agent/agent.py,sha256=ZcTHOX2cj5zJBgy6suLf_DMFEyBLhjQklPrJuMCjAtU,26226
|
|
18
18
|
nat/agent/rewoo_agent/prompt.py,sha256=B0JeL1xDX4VKcShlkkviEcAsOKAwzSlX8NcAQdmUUPw,3645
|
|
19
19
|
nat/agent/rewoo_agent/register.py,sha256=XArlOR37QOBtAvsdKJUjRok5qTmx39S2mJHSteOwU58,9283
|
|
20
20
|
nat/agent/tool_calling_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -112,7 +112,7 @@ nat/control_flow/router_agent/prompt.py,sha256=fIAiNsAs1zXRAatButR76zSpHJNxSkXXK
|
|
|
112
112
|
nat/control_flow/router_agent/register.py,sha256=4RGmS9sy-QtIMmvh8mfMcR1VqxFPLpG4RckWCIExh40,4144
|
|
113
113
|
nat/data_models/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
|
|
114
114
|
nat/data_models/agent.py,sha256=IwDyb9Zc3R4Zd5rFeqt7q0EQswczAl5focxV9KozIzs,1625
|
|
115
|
-
nat/data_models/api_server.py,sha256=
|
|
115
|
+
nat/data_models/api_server.py,sha256=oQtSiP7jpkHIZ75g21A_lTiidNsQo54pq3qy2StIJcs,30652
|
|
116
116
|
nat/data_models/authentication.py,sha256=XPu9W8nh4XRSuxPv3HxO-FMQ_JtTEoK6Y02JwnzDwTg,8457
|
|
117
117
|
nat/data_models/common.py,sha256=nXXfGrjpxebzBUa55mLdmzePLt7VFHvTAc6Znj3yEv0,5875
|
|
118
118
|
nat/data_models/component.py,sha256=b_hXOA8Gm5UNvlFkAhsR6kEvf33ST50MKtr5kWf75Ao,1894
|
|
@@ -147,7 +147,7 @@ nat/data_models/swe_bench_model.py,sha256=uZs-hLFuT1B5CiPFwFg1PHinDW8PHne8TBzu7t
|
|
|
147
147
|
nat/data_models/telemetry_exporter.py,sha256=P7kqxIQnFVuvo_UFpH9QSB8fACy_0U2Uzkw_IfWXagE,998
|
|
148
148
|
nat/data_models/temperature_mixin.py,sha256=LlpfWrWtDrPJfSKfNx5E0P3p5SNGZli7ACRRpmO0QqA,1628
|
|
149
149
|
nat/data_models/thinking_mixin.py,sha256=VRDUJZ8XP_Vv0gW2FRZUf8O9-kVgNEdZCEZ8oEmHyMk,3335
|
|
150
|
-
nat/data_models/top_p_mixin.py,sha256=
|
|
150
|
+
nat/data_models/top_p_mixin.py,sha256=07wOZ7iK2FuNvoyS1LYuIEP0z-7qKDCMoeeeKIAm28k,1705
|
|
151
151
|
nat/data_models/ttc_strategy.py,sha256=tAkKWcyEBmBOOYtHMtQTgeCbHxFTk5SEkmFunNVnfyE,1114
|
|
152
152
|
nat/embedder/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
153
153
|
nat/embedder/azure_openai_embedder.py,sha256=8OM54DCVCmWuQ8eZ5lXxsKYQktRmHMoIelRHZmKurUk,2381
|
|
@@ -239,10 +239,10 @@ nat/front_ends/console/register.py,sha256=2Kf6Mthx6jzWzU8YdhYIR1iABmZDvs1UXM_20n
|
|
|
239
239
|
nat/front_ends/cron/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
|
|
240
240
|
nat/front_ends/fastapi/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
|
|
241
241
|
nat/front_ends/fastapi/dask_client_mixin.py,sha256=N_tw4yxA7EKIFTKp5_C2ZksIZucWxRYkFjmZszkAkXc,2072
|
|
242
|
-
nat/front_ends/fastapi/fastapi_front_end_config.py,sha256=
|
|
242
|
+
nat/front_ends/fastapi/fastapi_front_end_config.py,sha256=O_iRpGS3Vpht7ZNr1bYpvoldDEb9Z6f7tFPazVP5i9U,12383
|
|
243
243
|
nat/front_ends/fastapi/fastapi_front_end_controller.py,sha256=ei-34KCMpyaeAgeAN4gVvSGFjewjjRhHZPN0FqAfhDY,2548
|
|
244
|
-
nat/front_ends/fastapi/fastapi_front_end_plugin.py,sha256=
|
|
245
|
-
nat/front_ends/fastapi/fastapi_front_end_plugin_worker.py,sha256=
|
|
244
|
+
nat/front_ends/fastapi/fastapi_front_end_plugin.py,sha256=5akdWipe8onOTdSqrbGq9KO71y0_BNQQJ3JAFj6LmFY,11575
|
|
245
|
+
nat/front_ends/fastapi/fastapi_front_end_plugin_worker.py,sha256=QMERZEifVTDMWttSQqPZu3k8EEPJflPrIR6tkHTkZYg,60594
|
|
246
246
|
nat/front_ends/fastapi/intermediate_steps_subscriber.py,sha256=kbyWlBVpyvyQQjeUnFG9nsR4RaqqNkx567ZSVwwl2RU,3104
|
|
247
247
|
nat/front_ends/fastapi/job_store.py,sha256=cWIBnIgRdkGL7qbBunEKzTYzdPp3l3QCDHMP-qTZJpc,22743
|
|
248
248
|
nat/front_ends/fastapi/main.py,sha256=s8gXCy61rJjK1aywMRpgPvzlkMGsCS-kI_0EIy4JjBM,2445
|
|
@@ -259,11 +259,11 @@ nat/front_ends/fastapi/html_snippets/__init__.py,sha256=GUJrgGtpvyMUCjUBvR3faAdv
|
|
|
259
259
|
nat/front_ends/fastapi/html_snippets/auth_code_grant_success.py,sha256=BNpWwzmA58UM0GK4kZXG4PHJy_5K9ihaVHu8SgCs5JA,1131
|
|
260
260
|
nat/front_ends/mcp/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
|
|
261
261
|
nat/front_ends/mcp/introspection_token_verifier.py,sha256=s7Q4Q6rWZJ0ZVujSxxpvVI6Bnhkg1LJQ3RLkvhzFIGE,2836
|
|
262
|
-
nat/front_ends/mcp/mcp_front_end_config.py,sha256=
|
|
262
|
+
nat/front_ends/mcp/mcp_front_end_config.py,sha256=KP13AKCyqOwXqebMmYrPwx1Ogq5iPo7R9uzLNSIHySY,4089
|
|
263
263
|
nat/front_ends/mcp/mcp_front_end_plugin.py,sha256=4u_kpen_T-_Uh62V5M7dfW9KyzbqXI7tGBG4AxJXWm0,5231
|
|
264
|
-
nat/front_ends/mcp/mcp_front_end_plugin_worker.py,sha256=
|
|
264
|
+
nat/front_ends/mcp/mcp_front_end_plugin_worker.py,sha256=rOF5Z4o-4n3ky57ncNm8XCdBsbRazGeOeiw55nKbZF4,10618
|
|
265
265
|
nat/front_ends/mcp/register.py,sha256=3aJtgG5VaiqujoeU1-Eq7Hl5pWslIlIwGFU2ASLTXgM,1173
|
|
266
|
-
nat/front_ends/mcp/tool_converter.py,sha256=
|
|
266
|
+
nat/front_ends/mcp/tool_converter.py,sha256=q3GgouOAQ8CGeX8nYtpwHUDEm3BWJgstgZHfKSg2m80,12470
|
|
267
267
|
nat/front_ends/simple_base/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
|
|
268
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
|
|
@@ -367,7 +367,7 @@ nat/profiler/inference_optimization/experimental/prefix_span_analysis.py,sha256=
|
|
|
367
367
|
nat/profiler/parameter_optimization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
368
368
|
nat/profiler/parameter_optimization/optimizable_utils.py,sha256=93Pl8A14Zq_f3XsxSH-yFnEJ6B7W5hp7doPnPoLlRB4,3714
|
|
369
369
|
nat/profiler/parameter_optimization/optimizer_runtime.py,sha256=rXmCOq81o7ZorQOUYociVjuO3NO9CIjFBbwql2u_4H4,2715
|
|
370
|
-
nat/profiler/parameter_optimization/parameter_optimizer.py,sha256=
|
|
370
|
+
nat/profiler/parameter_optimization/parameter_optimizer.py,sha256=61U2jW0md2oqaN8cy7cmF8oMTbHlgyzdlAXhG5DqfI8,6962
|
|
371
371
|
nat/profiler/parameter_optimization/parameter_selection.py,sha256=pfnNQIx1evNICgChsOJXIFQHoL1R_kmh_vNDsVMC9kg,3982
|
|
372
372
|
nat/profiler/parameter_optimization/pareto_visualizer.py,sha256=QclLZmmsWINIAh4n0XAKmnIZOqGHTMr-iggZS0kxj-Y,17055
|
|
373
373
|
nat/profiler/parameter_optimization/prompt_optimizer.py,sha256=_AmdeB1jRamd93qR5UqRy5LweYR3bjnD7zoLxzXYE0k,17658
|
|
@@ -420,10 +420,10 @@ nat/tool/github_tools.py,sha256=Pn6p6ebLClNUy6MJIWf-Pl5NguMUT-IJ-bhmpJmvBrg,2190
|
|
|
420
420
|
nat/tool/nvidia_rag.py,sha256=cEHSc3CZwpd71YcOQngya-Ca_B6ZOb87Dmsoza0VhFY,4163
|
|
421
421
|
nat/tool/register.py,sha256=F1mQs9gI3Ee0EESFyBiTFZeqscY173ENQlfKcWZup0c,1208
|
|
422
422
|
nat/tool/retriever.py,sha256=FP5JL1vCQNrqaKz4F1up-osjxEPhxPFOyaScrgByc34,3877
|
|
423
|
-
nat/tool/server_tools.py,sha256=
|
|
423
|
+
nat/tool/server_tools.py,sha256=sxsgaF5ZjKIc3cSLldt1MDhY3kptrDnkP3kVYvVexfY,3679
|
|
424
424
|
nat/tool/code_execution/README.md,sha256=sl3YX4As95HX61XqTXOGnUcHBV1lla-OeuTnLI4qgng,4019
|
|
425
425
|
nat/tool/code_execution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
426
|
-
nat/tool/code_execution/code_sandbox.py,sha256=
|
|
426
|
+
nat/tool/code_execution/code_sandbox.py,sha256=evu0n9oTc_MrrQuYbo1TP0sjnjLniRgCsOubO5G5WT4,10090
|
|
427
427
|
nat/tool/code_execution/register.py,sha256=zPFzYqaQhH2B3K8iildVYY_7RKgpoRNKdAo00KmBLQI,3322
|
|
428
428
|
nat/tool/code_execution/test_code_execution_sandbox.py,sha256=iyK9awJs6ST8fc_S3lNPye6It0DxSNp1UIrAUKPJ1h4,14776
|
|
429
429
|
nat/tool/code_execution/utils.py,sha256=__W-T1kaphFKYSc2AydQW8lCdvD7zAccarvs7XVFTtI,4194
|
|
@@ -470,10 +470,10 @@ nat/utils/reactive/base/observer_base.py,sha256=6BiQfx26EMumotJ3KoVcdmFBYR_fnAss
|
|
|
470
470
|
nat/utils/reactive/base/subject_base.py,sha256=UQOxlkZTIeeyYmG5qLtDpNf_63Y7p-doEeUA08_R8ME,2521
|
|
471
471
|
nat/utils/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
472
472
|
nat/utils/settings/global_settings.py,sha256=9JaO6pxKT_Pjw6rxJRsRlFCXdVKCl_xUKU2QHZQWWNM,7294
|
|
473
|
-
nvidia_nat-1.3.
|
|
474
|
-
nvidia_nat-1.3.
|
|
475
|
-
nvidia_nat-1.3.
|
|
476
|
-
nvidia_nat-1.3.
|
|
477
|
-
nvidia_nat-1.3.
|
|
478
|
-
nvidia_nat-1.3.
|
|
479
|
-
nvidia_nat-1.3.
|
|
473
|
+
nvidia_nat-1.3.1.dist-info/licenses/LICENSE-3rd-party.txt,sha256=fOk5jMmCX9YoKWyYzTtfgl-SUy477audFC5hNY4oP7Q,284609
|
|
474
|
+
nvidia_nat-1.3.1.dist-info/licenses/LICENSE.md,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
|
|
475
|
+
nvidia_nat-1.3.1.dist-info/METADATA,sha256=ruhwwSGFasQJ8s7Mai4F3ziiq5VQzCf_d9H7evi4wVA,10308
|
|
476
|
+
nvidia_nat-1.3.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
477
|
+
nvidia_nat-1.3.1.dist-info/entry_points.txt,sha256=4jCqjyETMpyoWbCBf4GalZU8I_wbstpzwQNezdAVbbo,698
|
|
478
|
+
nvidia_nat-1.3.1.dist-info/top_level.txt,sha256=lgJWLkigiVZuZ_O1nxVnD_ziYBwgpE2OStdaCduMEGc,8
|
|
479
|
+
nvidia_nat-1.3.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|