nvidia-nat 1.3.0.dev2__py3-none-any.whl → 1.3.0rc2__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.
- aiq/__init__.py +2 -2
- nat/agent/base.py +24 -15
- nat/agent/dual_node.py +9 -4
- nat/agent/prompt_optimizer/prompt.py +68 -0
- nat/agent/prompt_optimizer/register.py +149 -0
- nat/agent/react_agent/agent.py +79 -47
- nat/agent/react_agent/register.py +50 -22
- nat/agent/reasoning_agent/reasoning_agent.py +11 -9
- nat/agent/register.py +1 -1
- nat/agent/rewoo_agent/agent.py +326 -148
- nat/agent/rewoo_agent/prompt.py +19 -22
- nat/agent/rewoo_agent/register.py +54 -27
- nat/agent/tool_calling_agent/agent.py +84 -28
- nat/agent/tool_calling_agent/register.py +51 -28
- nat/authentication/api_key/api_key_auth_provider.py +2 -2
- nat/authentication/credential_validator/bearer_token_validator.py +557 -0
- nat/authentication/http_basic_auth/http_basic_auth_provider.py +1 -1
- nat/authentication/interfaces.py +5 -2
- nat/authentication/oauth2/oauth2_auth_code_flow_provider.py +69 -36
- nat/authentication/oauth2/oauth2_resource_server_config.py +124 -0
- nat/authentication/register.py +0 -1
- nat/builder/builder.py +56 -24
- nat/builder/component_utils.py +9 -5
- nat/builder/context.py +68 -17
- nat/builder/eval_builder.py +16 -11
- nat/builder/framework_enum.py +1 -0
- nat/builder/front_end.py +1 -1
- nat/builder/function.py +378 -8
- nat/builder/function_base.py +3 -3
- nat/builder/function_info.py +6 -8
- nat/builder/user_interaction_manager.py +2 -2
- nat/builder/workflow.py +13 -1
- nat/builder/workflow_builder.py +281 -76
- nat/cli/cli_utils/config_override.py +2 -2
- nat/cli/commands/evaluate.py +1 -1
- nat/cli/commands/info/info.py +16 -6
- nat/cli/commands/info/list_channels.py +1 -1
- nat/cli/commands/info/list_components.py +7 -8
- nat/cli/commands/mcp/__init__.py +14 -0
- nat/cli/commands/mcp/mcp.py +986 -0
- nat/cli/commands/object_store/__init__.py +14 -0
- nat/cli/commands/object_store/object_store.py +227 -0
- nat/cli/commands/optimize.py +90 -0
- nat/cli/commands/registry/publish.py +2 -2
- nat/cli/commands/registry/pull.py +2 -2
- nat/cli/commands/registry/remove.py +2 -2
- nat/cli/commands/registry/search.py +15 -17
- nat/cli/commands/start.py +16 -5
- nat/cli/commands/uninstall.py +1 -1
- nat/cli/commands/workflow/templates/config.yml.j2 +14 -13
- nat/cli/commands/workflow/templates/pyproject.toml.j2 +4 -1
- nat/cli/commands/workflow/templates/register.py.j2 +2 -3
- nat/cli/commands/workflow/templates/workflow.py.j2 +35 -21
- nat/cli/commands/workflow/workflow_commands.py +62 -22
- nat/cli/entrypoint.py +8 -10
- nat/cli/main.py +3 -0
- nat/cli/register_workflow.py +38 -4
- nat/cli/type_registry.py +75 -6
- nat/control_flow/__init__.py +0 -0
- nat/control_flow/register.py +20 -0
- nat/control_flow/router_agent/__init__.py +0 -0
- nat/control_flow/router_agent/agent.py +329 -0
- nat/control_flow/router_agent/prompt.py +48 -0
- nat/control_flow/router_agent/register.py +91 -0
- nat/control_flow/sequential_executor.py +166 -0
- nat/data_models/agent.py +34 -0
- nat/data_models/api_server.py +74 -66
- nat/data_models/authentication.py +23 -9
- nat/data_models/common.py +1 -1
- nat/data_models/component.py +2 -0
- nat/data_models/component_ref.py +11 -0
- nat/data_models/config.py +41 -17
- nat/data_models/dataset_handler.py +1 -1
- nat/data_models/discovery_metadata.py +4 -4
- nat/data_models/evaluate.py +4 -1
- nat/data_models/function.py +34 -0
- nat/data_models/function_dependencies.py +14 -6
- nat/data_models/gated_field_mixin.py +242 -0
- nat/data_models/intermediate_step.py +3 -3
- nat/data_models/optimizable.py +119 -0
- nat/data_models/optimizer.py +149 -0
- nat/data_models/span.py +41 -3
- nat/data_models/swe_bench_model.py +1 -1
- nat/data_models/temperature_mixin.py +44 -0
- nat/data_models/thinking_mixin.py +86 -0
- nat/data_models/top_p_mixin.py +44 -0
- nat/embedder/nim_embedder.py +1 -1
- nat/embedder/openai_embedder.py +1 -1
- nat/embedder/register.py +0 -1
- nat/eval/config.py +3 -1
- nat/eval/dataset_handler/dataset_handler.py +71 -7
- nat/eval/evaluate.py +86 -31
- nat/eval/evaluator/base_evaluator.py +1 -1
- nat/eval/evaluator/evaluator_model.py +13 -0
- nat/eval/intermediate_step_adapter.py +1 -1
- nat/eval/rag_evaluator/evaluate.py +2 -2
- nat/eval/rag_evaluator/register.py +3 -3
- nat/eval/register.py +4 -1
- nat/eval/remote_workflow.py +3 -3
- nat/eval/runtime_evaluator/__init__.py +14 -0
- nat/eval/runtime_evaluator/evaluate.py +123 -0
- nat/eval/runtime_evaluator/register.py +100 -0
- nat/eval/swe_bench_evaluator/evaluate.py +6 -6
- nat/eval/trajectory_evaluator/evaluate.py +1 -1
- nat/eval/trajectory_evaluator/register.py +1 -1
- nat/eval/tunable_rag_evaluator/evaluate.py +4 -7
- nat/eval/utils/eval_trace_ctx.py +89 -0
- nat/eval/utils/weave_eval.py +18 -9
- nat/experimental/decorators/experimental_warning_decorator.py +27 -7
- nat/experimental/test_time_compute/functions/plan_select_execute_function.py +7 -3
- nat/experimental/test_time_compute/functions/ttc_tool_orchestration_function.py +3 -3
- nat/experimental/test_time_compute/functions/ttc_tool_wrapper_function.py +1 -1
- nat/experimental/test_time_compute/models/strategy_base.py +5 -4
- nat/experimental/test_time_compute/register.py +0 -1
- nat/experimental/test_time_compute/selection/llm_based_output_merging_selector.py +1 -3
- nat/front_ends/console/authentication_flow_handler.py +82 -30
- nat/front_ends/console/console_front_end_plugin.py +8 -5
- nat/front_ends/fastapi/auth_flow_handlers/websocket_flow_handler.py +52 -17
- nat/front_ends/fastapi/dask_client_mixin.py +65 -0
- nat/front_ends/fastapi/fastapi_front_end_config.py +36 -5
- nat/front_ends/fastapi/fastapi_front_end_controller.py +4 -4
- nat/front_ends/fastapi/fastapi_front_end_plugin.py +135 -4
- nat/front_ends/fastapi/fastapi_front_end_plugin_worker.py +452 -282
- nat/front_ends/fastapi/job_store.py +518 -99
- nat/front_ends/fastapi/main.py +11 -19
- nat/front_ends/fastapi/message_handler.py +13 -14
- nat/front_ends/fastapi/message_validator.py +19 -19
- nat/front_ends/fastapi/response_helpers.py +4 -4
- nat/front_ends/fastapi/step_adaptor.py +2 -2
- nat/front_ends/fastapi/utils.py +57 -0
- nat/front_ends/mcp/introspection_token_verifier.py +73 -0
- nat/front_ends/mcp/mcp_front_end_config.py +10 -1
- nat/front_ends/mcp/mcp_front_end_plugin.py +45 -13
- nat/front_ends/mcp/mcp_front_end_plugin_worker.py +116 -8
- nat/front_ends/mcp/tool_converter.py +44 -14
- nat/front_ends/register.py +0 -1
- nat/front_ends/simple_base/simple_front_end_plugin_base.py +3 -1
- nat/llm/aws_bedrock_llm.py +24 -12
- nat/llm/azure_openai_llm.py +13 -6
- nat/llm/litellm_llm.py +69 -0
- nat/llm/nim_llm.py +20 -8
- nat/llm/openai_llm.py +14 -6
- nat/llm/register.py +4 -1
- nat/llm/utils/env_config_value.py +2 -3
- nat/llm/utils/thinking.py +215 -0
- nat/meta/pypi.md +9 -9
- nat/object_store/register.py +0 -1
- nat/observability/exporter/base_exporter.py +3 -3
- nat/observability/exporter/file_exporter.py +1 -1
- nat/observability/exporter/processing_exporter.py +309 -81
- nat/observability/exporter/span_exporter.py +35 -15
- nat/observability/exporter_manager.py +7 -7
- nat/observability/mixin/file_mixin.py +7 -7
- nat/observability/mixin/redaction_config_mixin.py +42 -0
- nat/observability/mixin/tagging_config_mixin.py +62 -0
- nat/observability/mixin/type_introspection_mixin.py +420 -107
- nat/observability/processor/batching_processor.py +5 -7
- nat/observability/processor/falsy_batch_filter_processor.py +55 -0
- nat/observability/processor/processor.py +3 -0
- nat/observability/processor/processor_factory.py +70 -0
- nat/observability/processor/redaction/__init__.py +24 -0
- nat/observability/processor/redaction/contextual_redaction_processor.py +125 -0
- nat/observability/processor/redaction/contextual_span_redaction_processor.py +66 -0
- nat/observability/processor/redaction/redaction_processor.py +177 -0
- nat/observability/processor/redaction/span_header_redaction_processor.py +92 -0
- nat/observability/processor/span_tagging_processor.py +68 -0
- nat/observability/register.py +6 -4
- nat/profiler/calc/calc_runner.py +3 -4
- nat/profiler/callbacks/agno_callback_handler.py +1 -1
- nat/profiler/callbacks/langchain_callback_handler.py +6 -6
- nat/profiler/callbacks/llama_index_callback_handler.py +3 -3
- nat/profiler/callbacks/semantic_kernel_callback_handler.py +3 -3
- nat/profiler/data_frame_row.py +1 -1
- nat/profiler/decorators/framework_wrapper.py +62 -13
- nat/profiler/decorators/function_tracking.py +160 -3
- nat/profiler/forecasting/models/forecasting_base_model.py +3 -1
- nat/profiler/forecasting/models/linear_model.py +1 -1
- nat/profiler/forecasting/models/random_forest_regressor.py +1 -1
- nat/profiler/inference_optimization/bottleneck_analysis/nested_stack_analysis.py +1 -1
- nat/profiler/inference_optimization/bottleneck_analysis/simple_stack_analysis.py +1 -1
- nat/profiler/inference_optimization/data_models.py +3 -3
- nat/profiler/inference_optimization/experimental/prefix_span_analysis.py +8 -9
- nat/profiler/inference_optimization/token_uniqueness.py +1 -1
- nat/profiler/parameter_optimization/__init__.py +0 -0
- nat/profiler/parameter_optimization/optimizable_utils.py +93 -0
- nat/profiler/parameter_optimization/optimizer_runtime.py +67 -0
- nat/profiler/parameter_optimization/parameter_optimizer.py +153 -0
- nat/profiler/parameter_optimization/parameter_selection.py +107 -0
- nat/profiler/parameter_optimization/pareto_visualizer.py +380 -0
- nat/profiler/parameter_optimization/prompt_optimizer.py +384 -0
- nat/profiler/parameter_optimization/update_helpers.py +66 -0
- nat/profiler/profile_runner.py +14 -9
- nat/profiler/utils.py +4 -2
- nat/registry_handlers/local/local_handler.py +2 -2
- nat/registry_handlers/package_utils.py +1 -2
- nat/registry_handlers/pypi/pypi_handler.py +23 -26
- nat/registry_handlers/register.py +3 -4
- nat/registry_handlers/rest/rest_handler.py +12 -13
- nat/retriever/milvus/retriever.py +2 -2
- nat/retriever/nemo_retriever/retriever.py +1 -1
- nat/retriever/register.py +0 -1
- nat/runtime/loader.py +2 -2
- nat/runtime/runner.py +106 -8
- nat/runtime/session.py +69 -8
- nat/settings/global_settings.py +16 -5
- nat/tool/chat_completion.py +5 -2
- nat/tool/code_execution/local_sandbox/local_sandbox_server.py +3 -3
- nat/tool/datetime_tools.py +49 -9
- nat/tool/document_search.py +2 -2
- nat/tool/github_tools.py +450 -0
- nat/tool/memory_tools/get_memory_tool.py +1 -1
- nat/tool/nvidia_rag.py +1 -1
- nat/tool/register.py +2 -9
- nat/tool/retriever.py +3 -2
- nat/utils/callable_utils.py +70 -0
- nat/utils/data_models/schema_validator.py +3 -3
- nat/utils/decorators.py +210 -0
- nat/utils/exception_handlers/automatic_retries.py +104 -51
- nat/utils/exception_handlers/schemas.py +1 -1
- nat/utils/io/yaml_tools.py +2 -2
- nat/utils/log_levels.py +25 -0
- nat/utils/reactive/base/observable_base.py +2 -2
- nat/utils/reactive/base/observer_base.py +1 -1
- nat/utils/reactive/observable.py +2 -2
- nat/utils/reactive/observer.py +4 -4
- nat/utils/reactive/subscription.py +1 -1
- nat/utils/settings/global_settings.py +6 -8
- nat/utils/type_converter.py +4 -3
- nat/utils/type_utils.py +9 -5
- {nvidia_nat-1.3.0.dev2.dist-info → nvidia_nat-1.3.0rc2.dist-info}/METADATA +42 -18
- {nvidia_nat-1.3.0.dev2.dist-info → nvidia_nat-1.3.0rc2.dist-info}/RECORD +238 -196
- {nvidia_nat-1.3.0.dev2.dist-info → nvidia_nat-1.3.0rc2.dist-info}/entry_points.txt +1 -0
- nat/cli/commands/info/list_mcp.py +0 -304
- nat/tool/github_tools/create_github_commit.py +0 -133
- nat/tool/github_tools/create_github_issue.py +0 -87
- nat/tool/github_tools/create_github_pr.py +0 -106
- nat/tool/github_tools/get_github_file.py +0 -106
- nat/tool/github_tools/get_github_issue.py +0 -166
- nat/tool/github_tools/get_github_pr.py +0 -256
- nat/tool/github_tools/update_github_issue.py +0 -100
- nat/tool/mcp/exceptions.py +0 -142
- nat/tool/mcp/mcp_client.py +0 -255
- nat/tool/mcp/mcp_tool.py +0 -96
- nat/utils/exception_handlers/mcp.py +0 -211
- /nat/{tool/github_tools → agent/prompt_optimizer}/__init__.py +0 -0
- /nat/{tool/mcp → authentication/credential_validator}/__init__.py +0 -0
- {nvidia_nat-1.3.0.dev2.dist-info → nvidia_nat-1.3.0rc2.dist-info}/WHEEL +0 -0
- {nvidia_nat-1.3.0.dev2.dist-info → nvidia_nat-1.3.0rc2.dist-info}/licenses/LICENSE-3rd-party.txt +0 -0
- {nvidia_nat-1.3.0.dev2.dist-info → nvidia_nat-1.3.0rc2.dist-info}/licenses/LICENSE.md +0 -0
- {nvidia_nat-1.3.0.dev2.dist-info → nvidia_nat-1.3.0rc2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,215 @@
|
|
|
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 functools
|
|
17
|
+
import inspect
|
|
18
|
+
import logging
|
|
19
|
+
import types
|
|
20
|
+
from abc import abstractmethod
|
|
21
|
+
from collections.abc import AsyncGenerator
|
|
22
|
+
from collections.abc import Callable
|
|
23
|
+
from collections.abc import Iterable
|
|
24
|
+
from dataclasses import dataclass
|
|
25
|
+
from typing import Any
|
|
26
|
+
from typing import TypeVar
|
|
27
|
+
|
|
28
|
+
ModelType = TypeVar("ModelType")
|
|
29
|
+
MessagesType = TypeVar("MessagesType")
|
|
30
|
+
|
|
31
|
+
logger = logging.getLogger(__name__)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class FunctionArgumentWrapper:
|
|
35
|
+
"""
|
|
36
|
+
Wrapper for the arguments and keyword arguments of a function.
|
|
37
|
+
|
|
38
|
+
The arguments and keyword arguments are stored in the args and kwargs attributes, respectively.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
def __init__(self, *args: Any, **kwargs: Any):
|
|
42
|
+
"""
|
|
43
|
+
Initialize the FunctionArgumentWrapper.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
args: The arguments to the function.
|
|
47
|
+
kwargs: The keyword arguments to the function.
|
|
48
|
+
"""
|
|
49
|
+
self.args = args
|
|
50
|
+
self.kwargs = kwargs
|
|
51
|
+
|
|
52
|
+
def __repr__(self) -> str:
|
|
53
|
+
return f"FunctionArgumentWrapper(args={self.args}, kwargs={self.kwargs})"
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@dataclass
|
|
57
|
+
class BaseThinkingInjector:
|
|
58
|
+
"""
|
|
59
|
+
Base class for thinking injectors.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
system_prompt: The system prompt to inject.
|
|
63
|
+
function_names: The function names to inject the system prompt into.
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
system_prompt: str
|
|
67
|
+
function_names: list[str]
|
|
68
|
+
|
|
69
|
+
@abstractmethod
|
|
70
|
+
def inject(self, *args, **kwargs) -> FunctionArgumentWrapper:
|
|
71
|
+
"""
|
|
72
|
+
Inject the system prompt into the arguments.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
args: The arguments to inject the system prompt into.
|
|
76
|
+
kwargs: The keyword arguments to inject the system prompt into.
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
FunctionArgumentWrapper: An object that contains the transformed args and kwargs.
|
|
80
|
+
"""
|
|
81
|
+
pass
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _make_thinking_decorator(injector: BaseThinkingInjector):
|
|
85
|
+
|
|
86
|
+
def decorate(fn: Callable[..., Any]) -> Callable[..., Any]:
|
|
87
|
+
|
|
88
|
+
async def _call_async(obj: object, *call_args, **call_kwargs) -> Any:
|
|
89
|
+
new_args = injector.inject(*call_args, **call_kwargs)
|
|
90
|
+
return await fn(obj, *new_args.args, **new_args.kwargs)
|
|
91
|
+
|
|
92
|
+
async def _agen(obj: object, *call_args, **call_kwargs) -> AsyncGenerator[Any, None]:
|
|
93
|
+
new_args = injector.inject(*call_args, **call_kwargs)
|
|
94
|
+
async for item in fn(obj, *new_args.args, **new_args.kwargs):
|
|
95
|
+
yield item
|
|
96
|
+
|
|
97
|
+
def _gen(obj: object, *call_args, **call_kwargs) -> Iterable[Any]:
|
|
98
|
+
new_args = injector.inject(*call_args, **call_kwargs)
|
|
99
|
+
yield from fn(obj, *new_args.args, **new_args.kwargs)
|
|
100
|
+
return
|
|
101
|
+
|
|
102
|
+
def _sync(obj: object, *call_args, **call_kwargs) -> Any:
|
|
103
|
+
new_args = injector.inject(*call_args, **call_kwargs)
|
|
104
|
+
return fn(obj, *new_args.args, **new_args.kwargs)
|
|
105
|
+
|
|
106
|
+
# Decide which wrapper to return
|
|
107
|
+
if inspect.iscoroutinefunction(fn):
|
|
108
|
+
wrapper = _call_async
|
|
109
|
+
elif inspect.isasyncgenfunction(fn):
|
|
110
|
+
wrapper = _agen
|
|
111
|
+
elif inspect.isgeneratorfunction(fn):
|
|
112
|
+
wrapper = _gen
|
|
113
|
+
else:
|
|
114
|
+
wrapper = _sync
|
|
115
|
+
|
|
116
|
+
return functools.wraps(fn)(wrapper)
|
|
117
|
+
|
|
118
|
+
return decorate
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def patch_with_thinking(obj: ModelType, injector: BaseThinkingInjector) -> ModelType:
|
|
122
|
+
"""
|
|
123
|
+
Patch the given object with a decorator that injects a system prompt into the supplied messages.
|
|
124
|
+
There is an assumption that the first non-object argument is the messages.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
obj: The object to patch.
|
|
128
|
+
injector: The injector to use.
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
The patched object.
|
|
132
|
+
|
|
133
|
+
Examples:
|
|
134
|
+
>>> from nat.llm.utils.thinking import BaseThinkingInjector
|
|
135
|
+
>>> from nat.llm.utils.thinking import FunctionArgumentWrapper
|
|
136
|
+
>>> from nat.llm.utils.thinking import patch_with_thinking
|
|
137
|
+
>>>
|
|
138
|
+
>>> class MockClass:
|
|
139
|
+
... def sync_method(self, *args, **kwargs):
|
|
140
|
+
... return (args, kwargs)
|
|
141
|
+
...
|
|
142
|
+
>>> mock_obj_1 = MockClass()
|
|
143
|
+
>>> class AddThinking(BaseThinkingInjector):
|
|
144
|
+
... def inject(self, x: str, *args, **kwargs) -> FunctionArgumentWrapper:
|
|
145
|
+
... return FunctionArgumentWrapper(("thinking " + x), *args, **kwargs)
|
|
146
|
+
>>>
|
|
147
|
+
>>> patched_obj = patch_with_thinking(mock_obj_1, AddThinking(
|
|
148
|
+
... system_prompt="thinking",
|
|
149
|
+
... function_names=["sync_method"],
|
|
150
|
+
... ))
|
|
151
|
+
>>> patched_obj.sync_method("test", 1, 2, 3, foo="bar")
|
|
152
|
+
(('thinking test', 1, 2, 3), {'foo': 'bar'})
|
|
153
|
+
>>>
|
|
154
|
+
>>> mock_obj_2 = MockClass()
|
|
155
|
+
>>> class AddThinkingWithArgs(BaseThinkingInjector):
|
|
156
|
+
... def inject(self, *args, **kwargs) -> FunctionArgumentWrapper:
|
|
157
|
+
... return FunctionArgumentWrapper("thinking", *args, **kwargs)
|
|
158
|
+
>>>
|
|
159
|
+
>>> patched_obj = patch_with_thinking(mock_obj_2, AddThinkingWithArgs(
|
|
160
|
+
... system_prompt="thinking",
|
|
161
|
+
... function_names=["sync_method"],
|
|
162
|
+
... ))
|
|
163
|
+
>>> patched_obj.sync_method("test", 1, 2, 3, foo="bar")
|
|
164
|
+
(('thinking', 'test', 1, 2, 3), {'foo': 'bar'})
|
|
165
|
+
>>>
|
|
166
|
+
>>> mock_obj_3 = MockClass()
|
|
167
|
+
>>> class AddThinkingWithKwargs(BaseThinkingInjector):
|
|
168
|
+
... def inject(self, *args, **kwargs) -> FunctionArgumentWrapper:
|
|
169
|
+
... return FunctionArgumentWrapper(*args, thinking=True, **kwargs)
|
|
170
|
+
>>>
|
|
171
|
+
>>> patched_obj = patch_with_thinking(mock_obj_3, AddThinkingWithKwargs(
|
|
172
|
+
... system_prompt="thinking",
|
|
173
|
+
... function_names=["sync_method"],
|
|
174
|
+
... ))
|
|
175
|
+
>>> patched_obj.sync_method("test", 1, 2, 3, foo="bar")
|
|
176
|
+
(('test', 1, 2, 3), {'thinking': True, 'foo': 'bar'})
|
|
177
|
+
"""
|
|
178
|
+
|
|
179
|
+
decorator = _make_thinking_decorator(injector)
|
|
180
|
+
|
|
181
|
+
cls = obj if inspect.isclass(obj) else type(obj)
|
|
182
|
+
cls_name = getattr(cls, "__name__", str(cls))
|
|
183
|
+
|
|
184
|
+
for name, _ in inspect.getmembers(cls, callable):
|
|
185
|
+
if name not in injector.function_names:
|
|
186
|
+
continue
|
|
187
|
+
|
|
188
|
+
descriptor = inspect.getattr_static(cls, name)
|
|
189
|
+
original = descriptor.__func__ if isinstance(descriptor, types.MethodType) else descriptor
|
|
190
|
+
wrapped = decorator(original)
|
|
191
|
+
|
|
192
|
+
try: # instance‑level first
|
|
193
|
+
if not inspect.isclass(obj):
|
|
194
|
+
object.__setattr__(obj, name, types.MethodType(wrapped, obj))
|
|
195
|
+
continue
|
|
196
|
+
except Exception as exc:
|
|
197
|
+
logger.info(
|
|
198
|
+
"Instance‑level patch failed for %s.%s (%s); "
|
|
199
|
+
"falling back to class‑level patch.",
|
|
200
|
+
cls_name,
|
|
201
|
+
name,
|
|
202
|
+
exc,
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
try: # class‑level fallback
|
|
206
|
+
setattr(cls, name, wrapped)
|
|
207
|
+
except Exception as exc:
|
|
208
|
+
logger.info(
|
|
209
|
+
"Cannot patch method %s.%s with thinking: %s",
|
|
210
|
+
cls_name,
|
|
211
|
+
name,
|
|
212
|
+
exc,
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
return obj
|
nat/meta/pypi.md
CHANGED
|
@@ -23,19 +23,19 @@ NeMo Agent toolkit is a flexible library designed to seamlessly integrate your e
|
|
|
23
23
|
|
|
24
24
|
## Key Features
|
|
25
25
|
|
|
26
|
-
- [**Framework Agnostic:**](https://docs.nvidia.com/nemo/agent-toolkit/1.
|
|
27
|
-
- [**Reusability:**](https://docs.nvidia.com/nemo/agent-toolkit/1.
|
|
28
|
-
- [**Rapid Development:**](https://docs.nvidia.com/nemo/agent-toolkit/1.
|
|
29
|
-
- [**Profiling:**](https://docs.nvidia.com/nemo/agent-toolkit/1.
|
|
30
|
-
- [**Observability:**](https://docs.nvidia.com/nemo/agent-toolkit/1.
|
|
31
|
-
- [**Evaluation System:**](https://docs.nvidia.com/nemo/agent-toolkit/1.
|
|
32
|
-
- [**User Interface:**](https://docs.nvidia.com/nemo/agent-toolkit/1.
|
|
33
|
-
- [**MCP Compatibility**](https://docs.nvidia.com/nemo/agent-toolkit/1.
|
|
26
|
+
- [**Framework Agnostic:**](https://docs.nvidia.com/nemo/agent-toolkit/1.3/extend/plugins.html) Works with any agentic framework, so you can use your current technology stack without replatforming.
|
|
27
|
+
- [**Reusability:**](https://docs.nvidia.com/nemo/agent-toolkit/1.3/extend/sharing-components.html) Every agent, tool, or workflow can be combined and repurposed, allowing developers to leverage existing work in new scenarios.
|
|
28
|
+
- [**Rapid Development:**](https://docs.nvidia.com/nemo/agent-toolkit/1.3/tutorials/index.html) Start with a pre-built agent, tool, or workflow, and customize it to your needs.
|
|
29
|
+
- [**Profiling:**](https://docs.nvidia.com/nemo/agent-toolkit/1.3/workflows/profiler.html) Profile entire workflows down to the tool and agent level, track input/output tokens and timings, and identify bottlenecks.
|
|
30
|
+
- [**Observability:**](https://docs.nvidia.com/nemo/agent-toolkit/1.3/workflows/observe/observe-workflow-with-phoenix.html) Monitor and debug your workflows with any OpenTelemetry-compatible observability tool, with examples using [Phoenix](https://docs.nvidia.com/nemo/agent-toolkit/1.3/workflows/observe/observe-workflow-with-phoenix.html) and [W&B Weave](https://docs.nvidia.com/nemo/agent-toolkit/1.3/workflows/observe/observe-workflow-with-weave.html).
|
|
31
|
+
- [**Evaluation System:**](https://docs.nvidia.com/nemo/agent-toolkit/1.3/workflows/evaluate.html) Validate and maintain accuracy of agentic workflows with built-in evaluation tools.
|
|
32
|
+
- [**User Interface:**](https://docs.nvidia.com/nemo/agent-toolkit/1.3/quick-start/launching-ui.html) Use the NeMo Agent toolkit UI chat interface to interact with your agents, visualize output, and debug workflows.
|
|
33
|
+
- [**MCP Compatibility**](https://docs.nvidia.com/nemo/agent-toolkit/1.3/workflows/mcp/mcp-client.html) Compatible with Model Context Protocol (MCP), allowing tools served by MCP Servers to be used as NeMo Agent toolkit functions.
|
|
34
34
|
|
|
35
35
|
With NeMo Agent toolkit, you can move quickly, experiment freely, and ensure reliability across all your agent-driven projects.
|
|
36
36
|
|
|
37
37
|
## Links
|
|
38
|
-
* [Documentation](https://docs.nvidia.com/nemo/agent-toolkit/1.
|
|
38
|
+
* [Documentation](https://docs.nvidia.com/nemo/agent-toolkit/1.3/index.html): Explore the full documentation for NeMo Agent toolkit.
|
|
39
39
|
|
|
40
40
|
## First time user?
|
|
41
41
|
If this is your first time using NeMo Agent toolkit, it is recommended to install the latest version from the [source repository](https://github.com/NVIDIA/NeMo-Agent-Toolkit?tab=readme-ov-file#quick-start) on GitHub. This package is intended for users who are familiar with NeMo Agent toolkit applications and need to add NeMo Agent toolkit as a dependency to their project.
|
nat/object_store/register.py
CHANGED
|
@@ -357,7 +357,7 @@ class BaseExporter(Exporter):
|
|
|
357
357
|
except Exception as e:
|
|
358
358
|
logger.warning("Error while canceling task %s: %s", task.get_name(), e)
|
|
359
359
|
|
|
360
|
-
async def
|
|
360
|
+
async def wait_for_tasks(self, timeout: float = 5.0):
|
|
361
361
|
"""Wait for all tracked tasks to complete with a timeout.
|
|
362
362
|
|
|
363
363
|
Note: This method is NOT called during normal stop() operation for performance.
|
|
@@ -372,10 +372,10 @@ class BaseExporter(Exporter):
|
|
|
372
372
|
try:
|
|
373
373
|
# Wait for all tasks to complete with a timeout
|
|
374
374
|
await asyncio.wait_for(asyncio.gather(*self._tasks, return_exceptions=True), timeout=timeout)
|
|
375
|
-
except
|
|
375
|
+
except TimeoutError:
|
|
376
376
|
logger.warning("%s: Some tasks did not complete within %s seconds", self.name, timeout)
|
|
377
377
|
except Exception as e:
|
|
378
|
-
logger.
|
|
378
|
+
logger.exception("%s: Error while waiting for tasks: %s", self.name, e)
|
|
379
379
|
|
|
380
380
|
@override
|
|
381
381
|
async def stop(self):
|
|
@@ -24,7 +24,7 @@ from nat.observability.processor.intermediate_step_serializer import Intermediat
|
|
|
24
24
|
logger = logging.getLogger(__name__)
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
class FileExporter(FileExportMixin, RawExporter[IntermediateStep, str]):
|
|
27
|
+
class FileExporter(FileExportMixin, RawExporter[IntermediateStep, str]):
|
|
28
28
|
"""A File exporter that exports telemetry traces to a local file."""
|
|
29
29
|
|
|
30
30
|
def __init__(self, context_state: ContextState | None = None, **file_kwargs):
|