nvidia-nat 1.4.0a20251112__py3-none-any.whl → 1.4.0a20251120__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 (38) hide show
  1. nat/builder/builder.py +52 -0
  2. nat/builder/component_utils.py +7 -1
  3. nat/builder/context.py +17 -0
  4. nat/builder/framework_enum.py +1 -0
  5. nat/builder/function.py +74 -3
  6. nat/builder/workflow.py +4 -2
  7. nat/builder/workflow_builder.py +129 -0
  8. nat/cli/register_workflow.py +50 -0
  9. nat/cli/type_registry.py +68 -0
  10. nat/data_models/component.py +2 -0
  11. nat/data_models/component_ref.py +11 -0
  12. nat/data_models/config.py +16 -0
  13. nat/data_models/function.py +14 -1
  14. nat/data_models/middleware.py +35 -0
  15. nat/data_models/runtime_enum.py +26 -0
  16. nat/eval/evaluate.py +10 -2
  17. nat/front_ends/fastapi/fastapi_front_end_config.py +22 -0
  18. nat/front_ends/fastapi/fastapi_front_end_plugin_worker.py +124 -0
  19. nat/front_ends/mcp/mcp_front_end_plugin.py +4 -0
  20. nat/front_ends/mcp/mcp_front_end_plugin_worker.py +26 -0
  21. nat/middleware/__init__.py +35 -0
  22. nat/middleware/cache_middleware.py +256 -0
  23. nat/middleware/function_middleware.py +186 -0
  24. nat/middleware/middleware.py +184 -0
  25. nat/middleware/register.py +35 -0
  26. nat/profiler/decorators/framework_wrapper.py +16 -0
  27. nat/retriever/milvus/register.py +11 -3
  28. nat/retriever/milvus/retriever.py +102 -40
  29. nat/runtime/runner.py +12 -1
  30. nat/runtime/session.py +10 -3
  31. nat/tool/code_execution/code_sandbox.py +1 -1
  32. {nvidia_nat-1.4.0a20251112.dist-info → nvidia_nat-1.4.0a20251120.dist-info}/METADATA +9 -3
  33. {nvidia_nat-1.4.0a20251112.dist-info → nvidia_nat-1.4.0a20251120.dist-info}/RECORD +38 -31
  34. {nvidia_nat-1.4.0a20251112.dist-info → nvidia_nat-1.4.0a20251120.dist-info}/entry_points.txt +1 -0
  35. {nvidia_nat-1.4.0a20251112.dist-info → nvidia_nat-1.4.0a20251120.dist-info}/WHEEL +0 -0
  36. {nvidia_nat-1.4.0a20251112.dist-info → nvidia_nat-1.4.0a20251120.dist-info}/licenses/LICENSE-3rd-party.txt +0 -0
  37. {nvidia_nat-1.4.0a20251112.dist-info → nvidia_nat-1.4.0a20251120.dist-info}/licenses/LICENSE.md +0 -0
  38. {nvidia_nat-1.4.0a20251112.dist-info → nvidia_nat-1.4.0a20251120.dist-info}/top_level.txt +0 -0
@@ -48,6 +48,7 @@ class MilvusRetrieverConfig(RetrieverBaseConfig, name="milvus_retriever"):
48
48
  description: str | None = Field(default=None,
49
49
  description="If present it will be used as the tool description",
50
50
  alias="collection_description")
51
+ use_async_client: bool = Field(default=False, description="Use AsyncMilvusClient for async I/O operations. ")
51
52
 
52
53
 
53
54
  @register_retriever_provider(config_type=MilvusRetrieverConfig)
@@ -58,13 +59,20 @@ async def milvus_retriever(retriever_config: MilvusRetrieverConfig, builder: Bui
58
59
 
59
60
  @register_retriever_client(config_type=MilvusRetrieverConfig, wrapper_type=None)
60
61
  async def milvus_retriever_client(config: MilvusRetrieverConfig, builder: Builder):
61
- from pymilvus import MilvusClient
62
-
63
62
  from nat.retriever.milvus.retriever import MilvusRetriever
64
63
 
65
64
  embedder = await builder.get_embedder(embedder_name=config.embedding_model, wrapper_type=LLMFrameworkEnum.LANGCHAIN)
66
65
 
67
- milvus_client = MilvusClient(uri=str(config.uri), **config.connection_args)
66
+ # Create Milvus client based on use_async_client flag
67
+ if config.use_async_client:
68
+ from pymilvus import AsyncMilvusClient
69
+
70
+ milvus_client = AsyncMilvusClient(uri=str(config.uri), **config.connection_args)
71
+ else:
72
+ from pymilvus import MilvusClient
73
+
74
+ milvus_client = MilvusClient(uri=str(config.uri), **config.connection_args)
75
+
68
76
  retriever = MilvusRetriever(
69
77
  client=milvus_client,
70
78
  embedder=embedder,
@@ -13,13 +13,18 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
+ import inspect
16
17
  import logging
17
18
  from functools import partial
19
+ from typing import TYPE_CHECKING
18
20
 
19
21
  from langchain_core.embeddings import Embeddings
20
- from pymilvus import MilvusClient
21
22
  from pymilvus.client.abstract import Hit
22
23
 
24
+ if TYPE_CHECKING:
25
+ from pymilvus import AsyncMilvusClient
26
+ from pymilvus import MilvusClient
27
+
23
28
  from nat.retriever.interface import Retriever
24
29
  from nat.retriever.models import Document
25
30
  from nat.retriever.models import RetrieverError
@@ -39,20 +44,27 @@ class MilvusRetriever(Retriever):
39
44
 
40
45
  def __init__(
41
46
  self,
42
- client: MilvusClient,
47
+ client: "MilvusClient | AsyncMilvusClient",
43
48
  embedder: Embeddings,
44
49
  content_field: str = "text",
45
50
  use_iterator: bool = False,
46
51
  ) -> None:
47
52
  """
48
- Initialize the Milvus Retriever using a preconfigured MilvusClient
53
+ Initialize the Milvus Retriever using a preconfigured MilvusClient or AsyncMilvusClient
49
54
 
50
55
  Args:
51
- client (MilvusClient): Preinstantiate pymilvus.MilvusClient object.
52
56
  """
53
- self._client = client
57
+ self._client: MilvusClient | AsyncMilvusClient = client
54
58
  self._embedder = embedder
55
59
 
60
+ # Detect if client is async by inspecting method capabilities
61
+ search_method = getattr(client, "search", None)
62
+ list_collections_method = getattr(client, "list_collections", None)
63
+ self._is_async = any(
64
+ inspect.iscoroutinefunction(method) for method in (search_method, list_collections_method)
65
+ if method is not None)
66
+ logger.info("Initialized Milvus Retriever with %s client", "async" if self._is_async else "sync")
67
+
56
68
  if use_iterator and "search_iterator" not in dir(self._client):
57
69
  raise ValueError("This version of the pymilvus.MilvusClient does not support the search iterator.")
58
70
 
@@ -60,7 +72,7 @@ class MilvusRetriever(Retriever):
60
72
  self._default_params = None
61
73
  self._bound_params = []
62
74
  self.content_field = content_field
63
- logger.info("Mivlus Retriever using %s for search.", self._search_func.__name__)
75
+ logger.info("Milvus Retriever using %s for search.", self._search_func.__name__)
64
76
 
65
77
  def bind(self, **kwargs) -> None:
66
78
  """
@@ -81,8 +93,13 @@ class MilvusRetriever(Retriever):
81
93
  """
82
94
  return [param for param in ["query", "collection_name", "top_k", "filters"] if param not in self._bound_params]
83
95
 
84
- def _validate_collection(self, collection_name: str) -> bool:
85
- return collection_name in self._client.list_collections()
96
+ async def _validate_collection(self, collection_name: str) -> bool:
97
+ """Validate that a collection exists."""
98
+ if self._is_async:
99
+ collections = await self._client.list_collections()
100
+ else:
101
+ collections = self._client.list_collections()
102
+ return collection_name in collections
86
103
 
87
104
  async def search(self, query: str, **kwargs):
88
105
  return await self._search_func(query=query, **kwargs)
@@ -108,39 +125,64 @@ class MilvusRetriever(Retriever):
108
125
  collection_name,
109
126
  top_k)
110
127
 
111
- if not self._validate_collection(collection_name):
128
+ if not await self._validate_collection(collection_name):
112
129
  raise CollectionNotFoundError(f"Collection: {collection_name} does not exist")
113
130
 
114
131
  # If no output fields are specified, return all of them
115
132
  if not output_fields:
116
- collection_schema = self._client.describe_collection(collection_name)
133
+ if self._is_async:
134
+ collection_schema = await self._client.describe_collection(collection_name)
135
+ else:
136
+ collection_schema = self._client.describe_collection(collection_name)
117
137
  output_fields = [
118
138
  field["name"] for field in collection_schema.get("fields") if field["name"] != vector_field_name
119
139
  ]
120
140
 
121
- search_vector = self._embedder.embed_query(query)
122
-
123
- search_iterator = self._client.search_iterator(
124
- collection_name=collection_name,
125
- data=[search_vector],
126
- batch_size=kwargs.get("batch_size", 1000),
127
- filter=filters,
128
- limit=top_k,
129
- output_fields=output_fields,
130
- search_params=search_params if search_params else {"metric_type": "L2"},
131
- timeout=timeout,
132
- anns_field=vector_field_name,
133
- round_decimal=kwargs.get("round_decimal", -1),
134
- partition_names=kwargs.get("partition_names", None),
135
- )
141
+ search_vector = await self._embedder.aembed_query(query)
142
+
143
+ # Create search iterator
144
+ if self._is_async:
145
+ search_iterator = await self._client.search_iterator(
146
+ collection_name=collection_name,
147
+ data=[search_vector],
148
+ batch_size=kwargs.get("batch_size", 1000),
149
+ filter=filters,
150
+ limit=top_k,
151
+ output_fields=output_fields,
152
+ search_params=search_params if search_params else {"metric_type": "L2"},
153
+ timeout=timeout,
154
+ anns_field=vector_field_name,
155
+ round_decimal=kwargs.get("round_decimal", -1),
156
+ partition_names=kwargs.get("partition_names", None),
157
+ )
158
+ else:
159
+ search_iterator = self._client.search_iterator(
160
+ collection_name=collection_name,
161
+ data=[search_vector],
162
+ batch_size=kwargs.get("batch_size", 1000),
163
+ filter=filters,
164
+ limit=top_k,
165
+ output_fields=output_fields,
166
+ search_params=search_params if search_params else {"metric_type": "L2"},
167
+ timeout=timeout,
168
+ anns_field=vector_field_name,
169
+ round_decimal=kwargs.get("round_decimal", -1),
170
+ partition_names=kwargs.get("partition_names", None),
171
+ )
136
172
 
137
173
  results = []
138
174
  try:
139
175
  while True:
140
- _res = search_iterator.next()
176
+ if self._is_async:
177
+ _res = await search_iterator.next()
178
+ else:
179
+ _res = search_iterator.next()
141
180
  res = _res.get_res()
142
181
  if len(_res) == 0:
143
- search_iterator.close()
182
+ if self._is_async:
183
+ await search_iterator.close()
184
+ else:
185
+ search_iterator.close()
144
186
  break
145
187
 
146
188
  if distance_cutoff and res[0][-1].distance > distance_cutoff:
@@ -176,10 +218,16 @@ class MilvusRetriever(Retriever):
176
218
  collection_name,
177
219
  top_k)
178
220
 
179
- if not self._validate_collection(collection_name):
221
+ if not await self._validate_collection(collection_name):
180
222
  raise CollectionNotFoundError(f"Collection: {collection_name} does not exist")
181
223
 
182
- available_fields = [v.get("name") for v in self._client.describe_collection(collection_name).get("fields", {})]
224
+ # Get collection schema
225
+ if self._is_async:
226
+ collection_schema = await self._client.describe_collection(collection_name)
227
+ else:
228
+ collection_schema = self._client.describe_collection(collection_name)
229
+
230
+ available_fields = [v.get("name") for v in collection_schema.get("fields", [])]
183
231
 
184
232
  if self.content_field not in available_fields:
185
233
  raise ValueError(f"The specified content field: {self.content_field} is not part of the schema.")
@@ -194,17 +242,31 @@ class MilvusRetriever(Retriever):
194
242
  if self.content_field not in output_fields:
195
243
  output_fields.append(self.content_field)
196
244
 
197
- search_vector = self._embedder.embed_query(query)
198
- res = self._client.search(
199
- collection_name=collection_name,
200
- data=[search_vector],
201
- filter=filters,
202
- output_fields=output_fields,
203
- search_params=search_params if search_params else {"metric_type": "L2"},
204
- timeout=timeout,
205
- anns_field=vector_field_name,
206
- limit=top_k,
207
- )
245
+ search_vector = await self._embedder.aembed_query(query)
246
+
247
+ # Perform search
248
+ if self._is_async:
249
+ res = await self._client.search(
250
+ collection_name=collection_name,
251
+ data=[search_vector],
252
+ filter=filters,
253
+ output_fields=output_fields,
254
+ search_params=search_params if search_params else {"metric_type": "L2"},
255
+ timeout=timeout,
256
+ anns_field=vector_field_name,
257
+ limit=top_k,
258
+ )
259
+ else:
260
+ res = self._client.search(
261
+ collection_name=collection_name,
262
+ data=[search_vector],
263
+ filter=filters,
264
+ output_fields=output_fields,
265
+ search_params=search_params if search_params else {"metric_type": "L2"},
266
+ timeout=timeout,
267
+ anns_field=vector_field_name,
268
+ limit=top_k,
269
+ )
208
270
 
209
271
  return _wrap_milvus_results(res[0], content_field=self.content_field)
210
272
 
nat/runtime/runner.py CHANGED
@@ -26,6 +26,7 @@ from nat.data_models.intermediate_step import IntermediateStepType
26
26
  from nat.data_models.intermediate_step import StreamEventData
27
27
  from nat.data_models.intermediate_step import TraceMetadata
28
28
  from nat.data_models.invocation_node import InvocationNode
29
+ from nat.data_models.runtime_enum import RuntimeTypeEnum
29
30
  from nat.observability.exporter_manager import ExporterManager
30
31
  from nat.utils.reactive.subject import Subject
31
32
 
@@ -53,7 +54,8 @@ class Runner:
53
54
  input_message: typing.Any,
54
55
  entry_fn: Function,
55
56
  context_state: ContextState,
56
- exporter_manager: ExporterManager):
57
+ exporter_manager: ExporterManager,
58
+ runtime_type: RuntimeTypeEnum = RuntimeTypeEnum.RUN_OR_SERVE):
57
59
  """
58
60
  The Runner class is used to run a workflow. It handles converting input and output data types and running the
59
61
  workflow with the specified concurrency.
@@ -68,6 +70,8 @@ class Runner:
68
70
  The context state to use
69
71
  exporter_manager : ExporterManager
70
72
  The exporter manager to use
73
+ runtime_type : RuntimeTypeEnum
74
+ The runtime type (RUN_OR_SERVE, EVALUATE, OTHER)
71
75
  """
72
76
 
73
77
  if (entry_fn is None):
@@ -86,6 +90,9 @@ class Runner:
86
90
 
87
91
  self._exporter_manager = exporter_manager
88
92
 
93
+ self._runtime_type = runtime_type
94
+ self._runtime_type_token = None
95
+
89
96
  @property
90
97
  def context(self) -> Context:
91
98
  return self._context
@@ -105,6 +112,8 @@ class Runner:
105
112
  function_id="root",
106
113
  ))
107
114
 
115
+ self._runtime_type_token = self._context_state.runtime_type.set(self._runtime_type)
116
+
108
117
  if (self._state == RunnerState.UNINITIALIZED):
109
118
  self._state = RunnerState.INITIALIZED
110
119
  else:
@@ -119,6 +128,8 @@ class Runner:
119
128
 
120
129
  self._context_state.input_message.reset(self._input_message_token)
121
130
 
131
+ self._context_state.runtime_type.reset(self._runtime_type_token)
132
+
122
133
  if (self._state not in (RunnerState.COMPLETED, RunnerState.FAILED)):
123
134
  raise ValueError("Cannot exit the context without completing the workflow")
124
135
 
nat/runtime/session.py CHANGED
@@ -35,6 +35,7 @@ from nat.data_models.authentication import AuthProviderBaseConfig
35
35
  from nat.data_models.config import Config
36
36
  from nat.data_models.interactive import HumanResponse
37
37
  from nat.data_models.interactive import InteractionPrompt
38
+ from nat.data_models.runtime_enum import RuntimeTypeEnum
38
39
 
39
40
  _T = typing.TypeVar("_T")
40
41
 
@@ -45,7 +46,10 @@ class UserManagerBase:
45
46
 
46
47
  class SessionManager:
47
48
 
48
- def __init__(self, workflow: Workflow, max_concurrency: int = 8):
49
+ def __init__(self,
50
+ workflow: Workflow,
51
+ max_concurrency: int = 8,
52
+ runtime_type: RuntimeTypeEnum = RuntimeTypeEnum.RUN_OR_SERVE):
49
53
  """
50
54
  The SessionManager class is used to run and manage a user workflow session. It runs and manages the context,
51
55
  and configuration of a workflow with the specified concurrency.
@@ -56,6 +60,8 @@ class SessionManager:
56
60
  The workflow to run
57
61
  max_concurrency : int, optional
58
62
  The maximum number of simultaneous workflow invocations, by default 8
63
+ runtime_type : RuntimeTypeEnum, optional
64
+ The type of runtime the session manager is operating in, by default RuntimeTypeEnum.RUN_OR_SERVE
59
65
  """
60
66
 
61
67
  if (workflow is None):
@@ -66,6 +72,7 @@ class SessionManager:
66
72
  self._max_concurrency = max_concurrency
67
73
  self._context_state = ContextState.get()
68
74
  self._context = Context(self._context_state)
75
+ self._runtime_type = runtime_type
69
76
 
70
77
  # We save the context because Uvicorn spawns a new process
71
78
  # for each request, and we need to restore the context vars
@@ -128,7 +135,7 @@ class SessionManager:
128
135
  self._context_state.user_auth_callback.reset(token_user_authentication)
129
136
 
130
137
  @asynccontextmanager
131
- async def run(self, message):
138
+ async def run(self, message, runtime_type: RuntimeTypeEnum = RuntimeTypeEnum.RUN_OR_SERVE):
132
139
  """
133
140
  Start a workflow run
134
141
  """
@@ -137,7 +144,7 @@ class SessionManager:
137
144
  for k, v in self._saved_context.items():
138
145
  k.set(v)
139
146
 
140
- async with self._workflow.run(message) as runner:
147
+ async with self._workflow.run(message, runtime_type=runtime_type) as runner:
141
148
  yield runner
142
149
 
143
150
  def set_metadata_from_http_request(self, request: Request) -> None:
@@ -152,7 +152,7 @@ class LocalSandbox(Sandbox):
152
152
  output_json = output.json()
153
153
  assert isinstance(output_json, dict)
154
154
  return output_json
155
- except json.JSONDecodeError as e:
155
+ except (requests.exceptions.JSONDecodeError, AssertionError) as e:
156
156
  logger.exception("Error parsing output: %s. %s", output.text, e)
157
157
  return {'process_status': 'error', 'stdout': '', 'stderr': f'Unknown error: {e} \"{output.text}\"'}
158
158
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nvidia-nat
3
- Version: 1.4.0a20251112
3
+ Version: 1.4.0a20251120
4
4
  Summary: NVIDIA NeMo Agent toolkit
5
5
  Author: NVIDIA Corporation
6
6
  Maintainer: NVIDIA Corporation
@@ -39,11 +39,11 @@ Requires-Dist: pkce==1.0.3
39
39
  Requires-Dist: pkginfo~=1.12
40
40
  Requires-Dist: platformdirs~=4.3
41
41
  Requires-Dist: pydantic~=2.11
42
- Requires-Dist: pymilvus~=2.4
42
+ Requires-Dist: pymilvus~=2.5
43
43
  Requires-Dist: python-dotenv~=1.1.1
44
44
  Requires-Dist: PyYAML~=6.0
45
45
  Requires-Dist: ragas~=0.2.14
46
- Requires-Dist: rich~=13.9
46
+ Requires-Dist: rich<15.0.0,>=14.0.0
47
47
  Requires-Dist: tabulate~=0.9
48
48
  Requires-Dist: uvicorn[standard]<0.36
49
49
  Requires-Dist: wikipedia~=1.4
@@ -83,6 +83,8 @@ Provides-Extra: s3
83
83
  Requires-Dist: nvidia-nat-s3; extra == "s3"
84
84
  Provides-Extra: semantic-kernel
85
85
  Requires-Dist: nvidia-nat-semantic-kernel; extra == "semantic-kernel"
86
+ Provides-Extra: strands
87
+ Requires-Dist: nvidia-nat-strands; extra == "strands"
86
88
  Provides-Extra: telemetry
87
89
  Requires-Dist: nvidia-nat-data-flywheel; extra == "telemetry"
88
90
  Requires-Dist: nvidia-nat-opentelemetry; extra == "telemetry"
@@ -91,6 +93,8 @@ Requires-Dist: nvidia-nat-ragaai; extra == "telemetry"
91
93
  Requires-Dist: nvidia-nat-weave; extra == "telemetry"
92
94
  Provides-Extra: test
93
95
  Requires-Dist: nvidia-nat-test; extra == "test"
96
+ Provides-Extra: vanna
97
+ Requires-Dist: nvidia-nat-vanna; extra == "vanna"
94
98
  Provides-Extra: weave
95
99
  Requires-Dist: nvidia-nat-weave; extra == "weave"
96
100
  Provides-Extra: zep-cloud
@@ -109,6 +113,7 @@ Requires-Dist: nat_profiler_agent; extra == "examples"
109
113
  Requires-Dist: nat_router_agent; extra == "examples"
110
114
  Requires-Dist: nat_semantic_kernel_demo; extra == "examples"
111
115
  Requires-Dist: nat_sequential_executor; extra == "examples"
116
+ Requires-Dist: nat_service_account_auth_mcp; extra == "examples"
112
117
  Requires-Dist: nat_simple_auth; extra == "examples"
113
118
  Requires-Dist: nat_simple_auth_mcp; extra == "examples"
114
119
  Requires-Dist: nat_simple_web_query; extra == "examples"
@@ -120,6 +125,7 @@ Requires-Dist: nat_simple_calculator_mcp; extra == "examples"
120
125
  Requires-Dist: nat_simple_calculator_observability; extra == "examples"
121
126
  Requires-Dist: nat_simple_calculator_hitl; extra == "examples"
122
127
  Requires-Dist: nat_simple_rag; extra == "examples"
128
+ Requires-Dist: nat_strands_demo; extra == "examples"
123
129
  Requires-Dist: nat_swe_bench; extra == "examples"
124
130
  Requires-Dist: nat_user_report; extra == "examples"
125
131
  Provides-Extra: gunicorn
@@ -42,28 +42,28 @@ nat/authentication/oauth2/oauth2_auth_code_flow_provider_config.py,sha256=R261a2
42
42
  nat/authentication/oauth2/oauth2_resource_server_config.py,sha256=WtqFMsJ-FzIjP7tjqs-tdYN4Pck0wxvdSyKIObNtU_8,5374
43
43
  nat/authentication/oauth2/register.py,sha256=7rXhf-ilgSS_bUJsd9pOOCotL1FM8dKUt3ke1TllKkQ,1228
44
44
  nat/builder/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
- nat/builder/builder.py,sha256=okI3Y101hwF63AwazzxiahQx-W9eFZ_SNdFXzDuoftU,11608
46
- nat/builder/component_utils.py,sha256=gxDhm4NCLI1GU0XL9gFe_gife0oJLwgk_YuABJneFfs,13838
47
- nat/builder/context.py,sha256=YmgYHzXggPQCOIBj1Mirr7xKM7NvtVr3XrSfn979fDM,13138
45
+ nat/builder/builder.py,sha256=tASkiXNAia1rG-IfBY80CJIGSOrPb4bb6hKzZqPwbNw,13290
46
+ nat/builder/component_utils.py,sha256=yUOGpc-26WZvJIMZylXr0ykVmoSC-CbRQ0AZvW1fMkQ,14129
47
+ nat/builder/context.py,sha256=_TqYF4Gsdnt7jvUmcwoTCM-CtlFqbHIlsA_BeSwHCS0,13895
48
48
  nat/builder/embedder.py,sha256=NPkOEcxt_-wc53QRijCQQDLretRUYHRYaKoYmarmrBk,965
49
49
  nat/builder/eval_builder.py,sha256=I-ScvupmorClYoVBIs_PhSsB7Xf9e2nGWe0rCZp3txo,6857
50
50
  nat/builder/evaluator.py,sha256=xWHMND2vcAUkdFP7FU3jnVki1rUHeTa0-9saFh2hWKs,1162
51
- nat/builder/framework_enum.py,sha256=n7IaTQBxhFozIQqRMcX9kXntw28JhFzCj82jJ0C5tNU,901
51
+ nat/builder/framework_enum.py,sha256=mClqqhe1LXQKCpi64GdeJen_C_DJ8V3AhgY9I2GAYi8,925
52
52
  nat/builder/front_end.py,sha256=FCJ87NSshVVuTg8zZrq3YAr_u0RaYVZVcibnqlRFy-M,2173
53
- nat/builder/function.py,sha256=eZZWLwhphgQTnPvbga8sGleX7HCP46usZPIegE7zFzs,27725
53
+ nat/builder/function.py,sha256=lGRDVs0tTjMkDZNJSbb3aTraA4Z2XBI7qRWUX83nxvw,30996
54
54
  nat/builder/function_base.py,sha256=0Eg8RtjWhEU3Yme0CVxcRutobA0Qo8-YHZLI6L2qAgM,13116
55
55
  nat/builder/function_info.py,sha256=7Rmrn-gOFrT2TIJklJwA_O-ycx_oimwZ0-qMYpbuZrU,25161
56
56
  nat/builder/intermediate_step_manager.py,sha256=oHbvFg4R9Ka5a2KmUVETJFUxKZt90A96r9KH1TrJlR4,8999
57
57
  nat/builder/llm.py,sha256=DW-2q64A06VChsXNEL5PfBjH3DcsnTKVoCEWDuP7MF4,951
58
58
  nat/builder/retriever.py,sha256=ZyEqc7pFK31t_yr6Jaxa34c-tRas2edKqJZCNiVh9-0,970
59
59
  nat/builder/user_interaction_manager.py,sha256=-Z2qbQes7a2cuXgT7KEbWeuok0HcCnRdw9WB8Ghyl9k,3081
60
- nat/builder/workflow.py,sha256=bHrxK-VFsxUTw2wZgkWcCttpCMDeWNGPfmIGEW_bjZo,6908
61
- nat/builder/workflow_builder.py,sha256=GgNkeBmG_q3YGnGliuzpYhkC869q_PdaP4RoqXH6HdI,58709
60
+ nat/builder/workflow.py,sha256=3BPPYseD96zzj3lT4Iy_FnoAPkQyMEHwVQxoCV4tiCI,7080
61
+ nat/builder/workflow_builder.py,sha256=nvnoua_DJzbvloJLQQ884UbN7z4S2lqlCj5Dg_X7hzA,64444
62
62
  nat/cli/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
63
63
  nat/cli/entrypoint.py,sha256=vN9G8fe-7ITmsVciJU11Fk7JaSxFnN5A4FrD7WjYbxg,5105
64
64
  nat/cli/main.py,sha256=LZMKvoHYR926mghMjVpfLiI2qraqtrhMY9hvuAQCRWk,2258
65
- nat/cli/register_workflow.py,sha256=DOQQgUWB_NO9k7nlkP4cAx_RX03Cndk032K-kqyuvEs,23285
66
- nat/cli/type_registry.py,sha256=HbPU-7lzSHZ4aepJ3qOgfnl5LzK6-KHwcerhFpWw6mU,48839
65
+ nat/cli/register_workflow.py,sha256=UxhCsyrLJgPBBTgJnTQilQFHUtsgVc39iS6da6jHtto,25135
66
+ nat/cli/type_registry.py,sha256=OkR-K1JL_UGJUITA_mx-SJp9qAX9yJzPFDApAXHHCuI,51671
67
67
  nat/cli/cli_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
68
  nat/cli/cli_utils/config_override.py,sha256=6eYS_dYsf-4fSc70_z9dVc66EaTDsjOVwVFWQfKGlZE,8899
69
69
  nat/cli/cli_utils/validation.py,sha256=KVZvAkWZx-QVVBuCFTcH2muLzMB7ONQA1GE2TzEVN78,1288
@@ -117,16 +117,16 @@ nat/data_models/agent.py,sha256=IwDyb9Zc3R4Zd5rFeqt7q0EQswczAl5focxV9KozIzs,1625
117
117
  nat/data_models/api_server.py,sha256=sX_faprmycij1Zy_PQqEMtAcbvGD8PG1kWKLAyNQx6M,30775
118
118
  nat/data_models/authentication.py,sha256=XPu9W8nh4XRSuxPv3HxO-FMQ_JtTEoK6Y02JwnzDwTg,8457
119
119
  nat/data_models/common.py,sha256=dOtZI6g9AvFplu40nTsUDnahafVa9c2VITq19V_cb50,7302
120
- nat/data_models/component.py,sha256=b_hXOA8Gm5UNvlFkAhsR6kEvf33ST50MKtr5kWf75Ao,1894
121
- nat/data_models/component_ref.py,sha256=KFDWFVCcvJCfBBcXTh9f3R802EVHBtHXh9OdbRqFmdM,4747
122
- nat/data_models/config.py,sha256=P0JJmjqvUHUkpZ3Yc0IrMPoA2qP8HkmOjl7CwNq-nQQ,18833
120
+ nat/data_models/component.py,sha256=TA8wm5H8L_6hlihYqBmQvE2xRT2FXAsS4QxJ-0bZ4EU,1954
121
+ nat/data_models/component_ref.py,sha256=_hJiv-Uxogr0wT3u-2IwTLlRFIGRIBFilqSUuJk9kmY,4962
122
+ nat/data_models/config.py,sha256=6Sz06P3SnblHFD6Tm8FH1tE5C2HQe7ZVzD9vLYQxaMc,19695
123
123
  nat/data_models/dataset_handler.py,sha256=1zz0456WGcGdLA9bodbMd1EMtQC8pns8TpvjNkk27No,5611
124
124
  nat/data_models/discovery_metadata.py,sha256=_l97iQsqp_ihba8CbMBQ73mH1sipTQ19GiJDdzQYQGY,13432
125
125
  nat/data_models/embedder.py,sha256=nPhthEQDtzAMGd8gFRB1ZfJpN5M9DJvv0h28ohHnTmI,1002
126
126
  nat/data_models/evaluate.py,sha256=L0GdNh_c8jii-MiK8oHW9sUUsGO3l1FMsprr-UazT5c,4836
127
127
  nat/data_models/evaluator.py,sha256=bd2njsyQB2t6ClJ66gJiCjYHsQpWZwPD7rsU0J109TI,939
128
128
  nat/data_models/front_end.py,sha256=z8k6lSWjt1vMOYFbjWQxodpwAqPeuGS0hRBjsriDW2s,932
129
- nat/data_models/function.py,sha256=CuhV-fIjVVTsOJmTbvZ5Q9V370uKZJ0bJLyU2gEe35E,2265
129
+ nat/data_models/function.py,sha256=8kqyjNRSpSfTS4pXis351SRT6vlKMBYMyoeZmBflnNs,2832
130
130
  nat/data_models/function_dependencies.py,sha256=soDGXU4IwEn-3w3fGDm6vNLOR6jS6me-Ml_g7B6giBw,2901
131
131
  nat/data_models/gated_field_mixin.py,sha256=1xycSpXc_fq8CucLp3khE1w0-JYfcbr__EJkbvxTD0w,9817
132
132
  nat/data_models/interactive.py,sha256=qOkxyYPQYEBIBMDAA1rjfYcdvf6-iCM4qPV8Awc4VGw,8794
@@ -135,6 +135,7 @@ nat/data_models/invocation_node.py,sha256=nDRylgzBfJduGA-lme9xN4P6BdOYj0L6ytLHnT
135
135
  nat/data_models/llm.py,sha256=HQKNeWx3ZT15W19b7QX5dHRD4jFs9RnM6f-gh1B_7iY,1526
136
136
  nat/data_models/logging.py,sha256=1QtVjIQ99PgMYUuzw4h1FAoPRteZY7uf3oFTqV3ONgA,940
137
137
  nat/data_models/memory.py,sha256=IKwe7CflCto30j4yI5yQtq8DXfMilAJ17S5NcsSDrOQ,1052
138
+ nat/data_models/middleware.py,sha256=yk2b0WYFEt0RPXGgYPWi4_flYDB6TexFQCWsO9U-F70,1271
138
139
  nat/data_models/object_store.py,sha256=S8YY6i8ALgRPuggUI1FCG-xbvwPWuaCg1lJnZOx5scM,1515
139
140
  nat/data_models/openai_mcp.py,sha256=UkAalZE0my8a_sq-GynjsfDoSOw2NWLNZM9hcV23TzY,1911
140
141
  nat/data_models/optimizable.py,sha256=dG9YGM6MwAReLXimk31CzzOlbknGwsk0znfAiDuOeuI,8981
@@ -143,6 +144,7 @@ nat/data_models/profiler.py,sha256=z3IlEhj-veB4Yz85271bTkScSUkVwK50tR3dwlDRgcE,1
143
144
  nat/data_models/registry_handler.py,sha256=g1rFaz4uSydMJn7qpdX-DNHJd_rNf8tXYN49dLDYHPo,968
144
145
  nat/data_models/retriever.py,sha256=IJAIaeEXM8zj_towrvZ30Uoxt8e4WvOXrQwqGloS1qI,1202
145
146
  nat/data_models/retry_mixin.py,sha256=s7UAhAHhlwTJ3uz6POVaSD8Y5DwKnU8mmo7OkRzeaW8,1863
147
+ nat/data_models/runtime_enum.py,sha256=T6TKBtexRbxcZb8H1Esd9ogEhQwh_nDu57MuxwtPXHg,878
146
148
  nat/data_models/span.py,sha256=1ylpLf0UKwJSpKbwuFian9ut40GnF-AXsWYep1n2Y_0,8056
147
149
  nat/data_models/step_adaptor.py,sha256=1qn56wB_nIYBM5IjN4ftsltCAkqaJd3Sqe5v0TRR4K8,2615
148
150
  nat/data_models/streaming.py,sha256=sSqJqLqb70qyw69_4R9QC2RMbRw7UjTLPdo3FYBUGxE,1159
@@ -157,7 +159,7 @@ nat/embedder/openai_embedder.py,sha256=To7aCg8UyWPwSoA0MAHanH_MAKFDi3EcZxgLU1xYE
157
159
  nat/embedder/register.py,sha256=TM_LKuSlJr3tEceNVuHfAx_yrCzf1sryD5Ycep5rNGo,883
158
160
  nat/eval/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
159
161
  nat/eval/config.py,sha256=G0LE4JpZaQy3PvERldVATFpQCiDQcVJGUFChgorqzNo,2377
160
- nat/eval/evaluate.py,sha256=CrJk7HMNH4gzmvrnIvQxIPWeX1w9A3Zv5meat7J6dAg,26942
162
+ nat/eval/evaluate.py,sha256=BdddPjtvtZR0RXzJNxHPPl9uBovOJE3PiUTkRAbJWqQ,27421
161
163
  nat/eval/intermediate_step_adapter.py,sha256=mquQfPbq4-Owid2GzSyxtGNXoZ0i8crB6sA49rxnyrU,4483
162
164
  nat/eval/register.py,sha256=Vce8HGsu6KDj7MA_5W2ziQtss1F180ndMjuqGiHxTe8,1358
163
165
  nat/eval/remote_workflow.py,sha256=JAAbD0s753AOjo9baT4OqcB5dVEDmN34jPe0Uk13LcU,6024
@@ -240,10 +242,10 @@ nat/front_ends/console/register.py,sha256=2Kf6Mthx6jzWzU8YdhYIR1iABmZDvs1UXM_20n
240
242
  nat/front_ends/cron/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
241
243
  nat/front_ends/fastapi/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
242
244
  nat/front_ends/fastapi/dask_client_mixin.py,sha256=N_tw4yxA7EKIFTKp5_C2ZksIZucWxRYkFjmZszkAkXc,2072
243
- nat/front_ends/fastapi/fastapi_front_end_config.py,sha256=O_iRpGS3Vpht7ZNr1bYpvoldDEb9Z6f7tFPazVP5i9U,12383
245
+ nat/front_ends/fastapi/fastapi_front_end_config.py,sha256=lKRINEsWTLYMHJ6RRe9Gc1zP6I49yKEhNPak6lTe034,13603
244
246
  nat/front_ends/fastapi/fastapi_front_end_controller.py,sha256=ei-34KCMpyaeAgeAN4gVvSGFjewjjRhHZPN0FqAfhDY,2548
245
247
  nat/front_ends/fastapi/fastapi_front_end_plugin.py,sha256=5akdWipe8onOTdSqrbGq9KO71y0_BNQQJ3JAFj6LmFY,11575
246
- nat/front_ends/fastapi/fastapi_front_end_plugin_worker.py,sha256=QMERZEifVTDMWttSQqPZu3k8EEPJflPrIR6tkHTkZYg,60594
248
+ nat/front_ends/fastapi/fastapi_front_end_plugin_worker.py,sha256=Q7_FTWgMlWnp70OszJhXhJxExfyhfQXHmUsQJB6Bi74,67115
247
249
  nat/front_ends/fastapi/intermediate_steps_subscriber.py,sha256=kbyWlBVpyvyQQjeUnFG9nsR4RaqqNkx567ZSVwwl2RU,3104
248
250
  nat/front_ends/fastapi/job_store.py,sha256=cWIBnIgRdkGL7qbBunEKzTYzdPp3l3QCDHMP-qTZJpc,22743
249
251
  nat/front_ends/fastapi/main.py,sha256=s8gXCy61rJjK1aywMRpgPvzlkMGsCS-kI_0EIy4JjBM,2445
@@ -261,8 +263,8 @@ nat/front_ends/fastapi/html_snippets/auth_code_grant_success.py,sha256=BNpWwzmA5
261
263
  nat/front_ends/mcp/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
262
264
  nat/front_ends/mcp/introspection_token_verifier.py,sha256=s7Q4Q6rWZJ0ZVujSxxpvVI6Bnhkg1LJQ3RLkvhzFIGE,2836
263
265
  nat/front_ends/mcp/mcp_front_end_config.py,sha256=QHmz0OdB6pdUU9TH65NjLk7JsAnR-F6xisel5Bv2Po4,5744
264
- nat/front_ends/mcp/mcp_front_end_plugin.py,sha256=MVYJBCOhZAzUPlnXest6CYP3Gf0Ef1lbURaezgHpoyg,6701
265
- nat/front_ends/mcp/mcp_front_end_plugin_worker.py,sha256=qoRbYLC_HWqSH_jSNb-w7R_qwOmLyXaUA5JK0SX33GA,15362
266
+ nat/front_ends/mcp/mcp_front_end_plugin.py,sha256=dU2j6eD2xnDNeD-g8ydem4NuA82ccq3L6Y_8h_Ho5uc,6891
267
+ nat/front_ends/mcp/mcp_front_end_plugin_worker.py,sha256=ySbQOBdq2giLlldA7LHvIvgzA_YRAsEuf2cONT6WFwI,16438
266
268
  nat/front_ends/mcp/memory_profiler.py,sha256=OpcpLBAGCdQwYSFZbtAqdfncrnGYVjDcMpWydB71hjY,12811
267
269
  nat/front_ends/mcp/register.py,sha256=3aJtgG5VaiqujoeU1-Eq7Hl5pWslIlIwGFU2ASLTXgM,1173
268
270
  nat/front_ends/mcp/tool_converter.py,sha256=IOHb8UoW_TVvRoiML2yi6nlbx13KgcmUsuYOGS3xYe0,13349
@@ -283,6 +285,11 @@ nat/memory/__init__.py,sha256=ARS_HJipPR4mLDqw3VISSQLzeezru_vgNgsi1Ku0GRE,828
283
285
  nat/memory/interfaces.py,sha256=lyj1TGr3Fhibul8Y64Emj-BUEqDotmmFoVCEMqTujUA,5531
284
286
  nat/memory/models.py,sha256=c5dA7nKHQ4AS1_ptQZcfC_oXO495-ehocnf_qXTE6c8,4319
285
287
  nat/meta/pypi.md,sha256=BRG0KqnZlxRYorEkCpb8RoOe3RQC6FlvVeMWCcdAzY4,4502
288
+ nat/middleware/__init__.py,sha256=a-loyfA57ztnMUMv6ddTOui3lAGCxCHHX17fUKzjZNg,1426
289
+ nat/middleware/cache_middleware.py,sha256=DeiKyUKORoHGq47VHz_xW_dTaEKqPPotALg0QF6V44Q,10539
290
+ nat/middleware/function_middleware.py,sha256=oaTjcfsLIq-AT-fScltBa3yfkV-zC1PHdqutsr9eut4,7288
291
+ nat/middleware/middleware.py,sha256=s4Yz3FX1g-gE7YQ0RX51-dPs6u5K_2-WHmyoWvD9FR8,6512
292
+ nat/middleware/register.py,sha256=Wmhtaz8ZMk2T5kBrSC5IF5MbX2B5_2bQp2MIGJ2WavY,1451
286
293
  nat/object_store/__init__.py,sha256=81UKtZ6qcc__hfNjMnEYBHE16k7XBXX6R5IJNg1zfRs,831
287
294
  nat/object_store/in_memory_object_store.py,sha256=98UgQK2YdXTTQjBfQS-mjBCCugm1XUB7DZCFS8xe9yQ,2644
288
295
  nat/object_store/interfaces.py,sha256=5NbsE9TccihOf5ScG04hE1eNOaiajOZIUOeK_Kvukk8,2519
@@ -345,7 +352,7 @@ nat/profiler/callbacks/llama_index_callback_handler.py,sha256=niXcwdWbsvsNZotpBu
345
352
  nat/profiler/callbacks/semantic_kernel_callback_handler.py,sha256=BknzhQNB-MDMhR4QC9JScCp-zXq7KZ33SFb7X0MiTaI,11087
346
353
  nat/profiler/callbacks/token_usage_base_model.py,sha256=txWll6XpXrv8oQfF7Bl22W6Ya1P_GxIQpucKQqiRXfI,1292
347
354
  nat/profiler/decorators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
348
- nat/profiler/decorators/framework_wrapper.py,sha256=qlQ_o6fzsV6jUBbHYFuGjX_Aq-NDZ23l9l3ViDKxy5g,7682
355
+ nat/profiler/decorators/framework_wrapper.py,sha256=7zpwnJzbnBUsPtDkdn5SOvUvCMlfTGu5NbR9SpRB8MU,8466
349
356
  nat/profiler/decorators/function_tracking.py,sha256=-ai_4djCbNwMan5SiTq3MVMBrcKoUWyxzviAV-Eh4xg,16771
350
357
  nat/profiler/forecasting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
351
358
  nat/profiler/forecasting/config.py,sha256=5BhMa8csuPCjEnTaNQjo_2IoO7esh1ch02MoSWkvwPw,791
@@ -401,15 +408,15 @@ nat/retriever/interface.py,sha256=CRvx-UBFoa_bDcHrr_kkKhgUx2fthcaH_p50s59zE6Y,14
401
408
  nat/retriever/models.py,sha256=J75RLAFCPaxFUzJHSe25s6mqKcRPcw9wZjkQeuIaNGo,2432
402
409
  nat/retriever/register.py,sha256=jzvq063XByWmFbCft2pv0_uHgIwnhN1d9WNDPgQTexQ,872
403
410
  nat/retriever/milvus/__init__.py,sha256=GUJrgGtpvyMUCjUBvR3faAdv-tZzbU9W-izgx9aMEQg,680
404
- nat/retriever/milvus/register.py,sha256=FaWvUFj4rU6qcui-G459Z-bQV-QAVR3PNONT1qu7jxs,4027
405
- nat/retriever/milvus/retriever.py,sha256=wfWi-Ck17ZXbrCJE3MiEVD4DuVeeAkgifdAkoISqNa0,9485
411
+ nat/retriever/milvus/register.py,sha256=TInHJJAAde0nQJRYApe_WKnUeXsttdd8uV-rki8-OgY,4387
412
+ nat/retriever/milvus/retriever.py,sha256=rCe0REtrgvuCPSLhpeQNnd6hu12bqmIGJ37Ckk4S3tk,12180
406
413
  nat/retriever/nemo_retriever/__init__.py,sha256=GUJrgGtpvyMUCjUBvR3faAdv-tZzbU9W-izgx9aMEQg,680
407
414
  nat/retriever/nemo_retriever/register.py,sha256=j0K5wz4jS9LbSXMknKUjkZ5bnqLGqrkcKGKTQNSg0ro,2953
408
415
  nat/retriever/nemo_retriever/retriever.py,sha256=gi3_qJFqE-iqRh3of_cmJg-SwzaQ3z24zA9LwY_MSLY,6930
409
416
  nat/runtime/__init__.py,sha256=Xs1JQ16L9btwreh4pdGKwskffAw1YFO48jKrU4ib_7c,685
410
417
  nat/runtime/loader.py,sha256=obUdAgZVYCPGC0R8u3wcoKFJzzSPQgJvrbU4OWygtog,7953
411
- nat/runtime/runner.py,sha256=oOz0m6Hx_jPISo56GgzrnRxIeiewboLaGmNyHYzxVrY,12228
412
- nat/runtime/session.py,sha256=E8RTbnAhPbY5KCoSfiHzOJksmBh7xWjsoX0BC7Rn1ck,9101
418
+ nat/runtime/runner.py,sha256=uZdcfYIFASGYORFhXxR1RHCu0ygKhtQ1_8L_X-lwR0k,12714
419
+ nat/runtime/session.py,sha256=N9I0TSKWIUmfJ5V1-TrdXEkGGnZIcetWvvqL_bPqFDk,9560
413
420
  nat/runtime/user_metadata.py,sha256=ce37NRYJWnMOWk6A7VAQ1GQztjMmkhMOq-uYf2gNCwo,3692
414
421
  nat/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
415
422
  nat/settings/global_settings.py,sha256=dEw9nkyx7pEEufmLS1o3mWhcXy7-ZpES4BZx1OWfg5M,12467
@@ -425,7 +432,7 @@ nat/tool/retriever.py,sha256=FP5JL1vCQNrqaKz4F1up-osjxEPhxPFOyaScrgByc34,3877
425
432
  nat/tool/server_tools.py,sha256=sxsgaF5ZjKIc3cSLldt1MDhY3kptrDnkP3kVYvVexfY,3679
426
433
  nat/tool/code_execution/README.md,sha256=sl3YX4As95HX61XqTXOGnUcHBV1lla-OeuTnLI4qgng,4019
427
434
  nat/tool/code_execution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
428
- nat/tool/code_execution/code_sandbox.py,sha256=evu0n9oTc_MrrQuYbo1TP0sjnjLniRgCsOubO5G5WT4,10090
435
+ nat/tool/code_execution/code_sandbox.py,sha256=PCTdQMWA3CAmjVJ-RQy7pxWkdMnF3OrWkxmplMNUFhs,10123
429
436
  nat/tool/code_execution/register.py,sha256=zPFzYqaQhH2B3K8iildVYY_7RKgpoRNKdAo00KmBLQI,3322
430
437
  nat/tool/code_execution/utils.py,sha256=__W-T1kaphFKYSc2AydQW8lCdvD7zAccarvs7XVFTtI,4194
431
438
  nat/tool/code_execution/local_sandbox/.gitignore,sha256=BrV-H5osDtwwIx0eieoexolpnaJvc2DQLV15j95Qtyg,19
@@ -472,10 +479,10 @@ nat/utils/reactive/base/observer_base.py,sha256=6BiQfx26EMumotJ3KoVcdmFBYR_fnAss
472
479
  nat/utils/reactive/base/subject_base.py,sha256=UQOxlkZTIeeyYmG5qLtDpNf_63Y7p-doEeUA08_R8ME,2521
473
480
  nat/utils/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
474
481
  nat/utils/settings/global_settings.py,sha256=9JaO6pxKT_Pjw6rxJRsRlFCXdVKCl_xUKU2QHZQWWNM,7294
475
- nvidia_nat-1.4.0a20251112.dist-info/licenses/LICENSE-3rd-party.txt,sha256=fOk5jMmCX9YoKWyYzTtfgl-SUy477audFC5hNY4oP7Q,284609
476
- nvidia_nat-1.4.0a20251112.dist-info/licenses/LICENSE.md,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
477
- nvidia_nat-1.4.0a20251112.dist-info/METADATA,sha256=CsMXqgjYtSUgVHr054qEnXii5qeGgUdVjwns5rUpzA0,10317
478
- nvidia_nat-1.4.0a20251112.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
479
- nvidia_nat-1.4.0a20251112.dist-info/entry_points.txt,sha256=4jCqjyETMpyoWbCBf4GalZU8I_wbstpzwQNezdAVbbo,698
480
- nvidia_nat-1.4.0a20251112.dist-info/top_level.txt,sha256=lgJWLkigiVZuZ_O1nxVnD_ziYBwgpE2OStdaCduMEGc,8
481
- nvidia_nat-1.4.0a20251112.dist-info/RECORD,,
482
+ nvidia_nat-1.4.0a20251120.dist-info/licenses/LICENSE-3rd-party.txt,sha256=fOk5jMmCX9YoKWyYzTtfgl-SUy477audFC5hNY4oP7Q,284609
483
+ nvidia_nat-1.4.0a20251120.dist-info/licenses/LICENSE.md,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
484
+ nvidia_nat-1.4.0a20251120.dist-info/METADATA,sha256=pWdy7Ww1tM9rEivPnwiwnu4wOMnLGrViq7G95PS1hUw,10595
485
+ nvidia_nat-1.4.0a20251120.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
486
+ nvidia_nat-1.4.0a20251120.dist-info/entry_points.txt,sha256=rmr_Nr8Tp38euxp7MoNapg1FRCAaX7mD_-bzrFB0TME,739
487
+ nvidia_nat-1.4.0a20251120.dist-info/top_level.txt,sha256=lgJWLkigiVZuZ_O1nxVnD_ziYBwgpE2OStdaCduMEGc,8
488
+ nvidia_nat-1.4.0a20251120.dist-info/RECORD,,
@@ -9,6 +9,7 @@ nat_control_flow = nat.control_flow.register
9
9
  nat_embedders = nat.embedder.register
10
10
  nat_evaluators = nat.eval.register
11
11
  nat_llms = nat.llm.register
12
+ nat_middleware = nat.middleware.register
12
13
  nat_object_stores = nat.object_store.register
13
14
  nat_observability = nat.observability.register
14
15
  nat_retrievers = nat.retriever.register