nvidia-nat 1.2.0a20250813__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/__init__.py +0 -0
- nat/agent/base.py +239 -0
- nat/agent/dual_node.py +67 -0
- nat/agent/react_agent/__init__.py +0 -0
- nat/agent/react_agent/agent.py +355 -0
- nat/agent/react_agent/output_parser.py +104 -0
- nat/agent/react_agent/prompt.py +41 -0
- nat/agent/react_agent/register.py +149 -0
- nat/agent/reasoning_agent/__init__.py +0 -0
- nat/agent/reasoning_agent/reasoning_agent.py +225 -0
- nat/agent/register.py +23 -0
- nat/agent/rewoo_agent/__init__.py +0 -0
- nat/agent/rewoo_agent/agent.py +411 -0
- nat/agent/rewoo_agent/prompt.py +108 -0
- nat/agent/rewoo_agent/register.py +158 -0
- nat/agent/tool_calling_agent/__init__.py +0 -0
- nat/agent/tool_calling_agent/agent.py +119 -0
- nat/agent/tool_calling_agent/register.py +106 -0
- nat/authentication/__init__.py +14 -0
- nat/authentication/api_key/__init__.py +14 -0
- nat/authentication/api_key/api_key_auth_provider.py +96 -0
- nat/authentication/api_key/api_key_auth_provider_config.py +124 -0
- nat/authentication/api_key/register.py +26 -0
- nat/authentication/exceptions/__init__.py +14 -0
- nat/authentication/exceptions/api_key_exceptions.py +38 -0
- nat/authentication/http_basic_auth/__init__.py +0 -0
- nat/authentication/http_basic_auth/http_basic_auth_provider.py +81 -0
- nat/authentication/http_basic_auth/register.py +30 -0
- nat/authentication/interfaces.py +93 -0
- nat/authentication/oauth2/__init__.py +14 -0
- nat/authentication/oauth2/oauth2_auth_code_flow_provider.py +107 -0
- nat/authentication/oauth2/oauth2_auth_code_flow_provider_config.py +39 -0
- nat/authentication/oauth2/register.py +25 -0
- nat/authentication/register.py +21 -0
- nat/builder/__init__.py +0 -0
- nat/builder/builder.py +285 -0
- nat/builder/component_utils.py +316 -0
- nat/builder/context.py +270 -0
- nat/builder/embedder.py +24 -0
- nat/builder/eval_builder.py +161 -0
- nat/builder/evaluator.py +29 -0
- nat/builder/framework_enum.py +24 -0
- nat/builder/front_end.py +73 -0
- nat/builder/function.py +344 -0
- nat/builder/function_base.py +380 -0
- nat/builder/function_info.py +627 -0
- nat/builder/intermediate_step_manager.py +174 -0
- nat/builder/llm.py +25 -0
- nat/builder/retriever.py +25 -0
- nat/builder/user_interaction_manager.py +78 -0
- nat/builder/workflow.py +148 -0
- nat/builder/workflow_builder.py +1117 -0
- nat/cli/__init__.py +14 -0
- nat/cli/cli_utils/__init__.py +0 -0
- nat/cli/cli_utils/config_override.py +231 -0
- nat/cli/cli_utils/validation.py +37 -0
- nat/cli/commands/__init__.py +0 -0
- nat/cli/commands/configure/__init__.py +0 -0
- nat/cli/commands/configure/channel/__init__.py +0 -0
- nat/cli/commands/configure/channel/add.py +28 -0
- nat/cli/commands/configure/channel/channel.py +36 -0
- nat/cli/commands/configure/channel/remove.py +30 -0
- nat/cli/commands/configure/channel/update.py +30 -0
- nat/cli/commands/configure/configure.py +33 -0
- nat/cli/commands/evaluate.py +139 -0
- nat/cli/commands/info/__init__.py +14 -0
- nat/cli/commands/info/info.py +39 -0
- nat/cli/commands/info/list_channels.py +32 -0
- nat/cli/commands/info/list_components.py +129 -0
- nat/cli/commands/info/list_mcp.py +304 -0
- nat/cli/commands/registry/__init__.py +14 -0
- nat/cli/commands/registry/publish.py +88 -0
- nat/cli/commands/registry/pull.py +118 -0
- nat/cli/commands/registry/registry.py +38 -0
- nat/cli/commands/registry/remove.py +108 -0
- nat/cli/commands/registry/search.py +155 -0
- nat/cli/commands/sizing/__init__.py +14 -0
- nat/cli/commands/sizing/calc.py +297 -0
- nat/cli/commands/sizing/sizing.py +27 -0
- nat/cli/commands/start.py +246 -0
- nat/cli/commands/uninstall.py +81 -0
- nat/cli/commands/validate.py +47 -0
- nat/cli/commands/workflow/__init__.py +14 -0
- nat/cli/commands/workflow/templates/__init__.py.j2 +0 -0
- nat/cli/commands/workflow/templates/config.yml.j2 +16 -0
- nat/cli/commands/workflow/templates/pyproject.toml.j2 +22 -0
- nat/cli/commands/workflow/templates/register.py.j2 +5 -0
- nat/cli/commands/workflow/templates/workflow.py.j2 +36 -0
- nat/cli/commands/workflow/workflow.py +37 -0
- nat/cli/commands/workflow/workflow_commands.py +317 -0
- nat/cli/entrypoint.py +135 -0
- nat/cli/main.py +57 -0
- nat/cli/register_workflow.py +488 -0
- nat/cli/type_registry.py +1000 -0
- nat/data_models/__init__.py +14 -0
- nat/data_models/api_server.py +709 -0
- nat/data_models/authentication.py +231 -0
- nat/data_models/common.py +171 -0
- nat/data_models/component.py +58 -0
- nat/data_models/component_ref.py +168 -0
- nat/data_models/config.py +410 -0
- nat/data_models/dataset_handler.py +123 -0
- nat/data_models/discovery_metadata.py +334 -0
- nat/data_models/embedder.py +27 -0
- nat/data_models/evaluate.py +127 -0
- nat/data_models/evaluator.py +26 -0
- nat/data_models/front_end.py +26 -0
- nat/data_models/function.py +30 -0
- nat/data_models/function_dependencies.py +72 -0
- nat/data_models/interactive.py +246 -0
- nat/data_models/intermediate_step.py +302 -0
- nat/data_models/invocation_node.py +38 -0
- nat/data_models/llm.py +27 -0
- nat/data_models/logging.py +26 -0
- nat/data_models/memory.py +27 -0
- nat/data_models/object_store.py +44 -0
- nat/data_models/profiler.py +54 -0
- nat/data_models/registry_handler.py +26 -0
- nat/data_models/retriever.py +30 -0
- nat/data_models/retry_mixin.py +35 -0
- nat/data_models/span.py +190 -0
- nat/data_models/step_adaptor.py +64 -0
- nat/data_models/streaming.py +33 -0
- nat/data_models/swe_bench_model.py +54 -0
- nat/data_models/telemetry_exporter.py +26 -0
- nat/data_models/ttc_strategy.py +30 -0
- nat/embedder/__init__.py +0 -0
- nat/embedder/langchain_client.py +41 -0
- nat/embedder/nim_embedder.py +59 -0
- nat/embedder/openai_embedder.py +43 -0
- nat/embedder/register.py +24 -0
- nat/eval/__init__.py +14 -0
- nat/eval/config.py +60 -0
- nat/eval/dataset_handler/__init__.py +0 -0
- nat/eval/dataset_handler/dataset_downloader.py +106 -0
- nat/eval/dataset_handler/dataset_filter.py +52 -0
- nat/eval/dataset_handler/dataset_handler.py +254 -0
- nat/eval/evaluate.py +510 -0
- nat/eval/evaluator/__init__.py +14 -0
- nat/eval/evaluator/base_evaluator.py +77 -0
- nat/eval/evaluator/evaluator_model.py +45 -0
- nat/eval/intermediate_step_adapter.py +99 -0
- nat/eval/rag_evaluator/__init__.py +0 -0
- nat/eval/rag_evaluator/evaluate.py +178 -0
- nat/eval/rag_evaluator/register.py +143 -0
- nat/eval/register.py +23 -0
- nat/eval/remote_workflow.py +133 -0
- nat/eval/runners/__init__.py +14 -0
- nat/eval/runners/config.py +39 -0
- nat/eval/runners/multi_eval_runner.py +54 -0
- nat/eval/runtime_event_subscriber.py +52 -0
- nat/eval/swe_bench_evaluator/__init__.py +0 -0
- nat/eval/swe_bench_evaluator/evaluate.py +215 -0
- nat/eval/swe_bench_evaluator/register.py +36 -0
- nat/eval/trajectory_evaluator/__init__.py +0 -0
- nat/eval/trajectory_evaluator/evaluate.py +75 -0
- nat/eval/trajectory_evaluator/register.py +40 -0
- nat/eval/tunable_rag_evaluator/__init__.py +0 -0
- nat/eval/tunable_rag_evaluator/evaluate.py +245 -0
- nat/eval/tunable_rag_evaluator/register.py +52 -0
- nat/eval/usage_stats.py +41 -0
- nat/eval/utils/__init__.py +0 -0
- nat/eval/utils/output_uploader.py +140 -0
- nat/eval/utils/tqdm_position_registry.py +40 -0
- nat/eval/utils/weave_eval.py +184 -0
- nat/experimental/__init__.py +0 -0
- nat/experimental/decorators/__init__.py +0 -0
- nat/experimental/decorators/experimental_warning_decorator.py +134 -0
- nat/experimental/test_time_compute/__init__.py +0 -0
- nat/experimental/test_time_compute/editing/__init__.py +0 -0
- nat/experimental/test_time_compute/editing/iterative_plan_refinement_editor.py +147 -0
- nat/experimental/test_time_compute/editing/llm_as_a_judge_editor.py +204 -0
- nat/experimental/test_time_compute/editing/motivation_aware_summarization.py +107 -0
- nat/experimental/test_time_compute/functions/__init__.py +0 -0
- nat/experimental/test_time_compute/functions/execute_score_select_function.py +105 -0
- nat/experimental/test_time_compute/functions/plan_select_execute_function.py +224 -0
- nat/experimental/test_time_compute/functions/ttc_tool_orchestration_function.py +205 -0
- nat/experimental/test_time_compute/functions/ttc_tool_wrapper_function.py +146 -0
- nat/experimental/test_time_compute/models/__init__.py +0 -0
- nat/experimental/test_time_compute/models/editor_config.py +132 -0
- nat/experimental/test_time_compute/models/scoring_config.py +112 -0
- nat/experimental/test_time_compute/models/search_config.py +120 -0
- nat/experimental/test_time_compute/models/selection_config.py +154 -0
- nat/experimental/test_time_compute/models/stage_enums.py +43 -0
- nat/experimental/test_time_compute/models/strategy_base.py +66 -0
- nat/experimental/test_time_compute/models/tool_use_config.py +41 -0
- nat/experimental/test_time_compute/models/ttc_item.py +48 -0
- nat/experimental/test_time_compute/register.py +36 -0
- nat/experimental/test_time_compute/scoring/__init__.py +0 -0
- nat/experimental/test_time_compute/scoring/llm_based_agent_scorer.py +168 -0
- nat/experimental/test_time_compute/scoring/llm_based_plan_scorer.py +168 -0
- nat/experimental/test_time_compute/scoring/motivation_aware_scorer.py +111 -0
- nat/experimental/test_time_compute/search/__init__.py +0 -0
- nat/experimental/test_time_compute/search/multi_llm_planner.py +128 -0
- nat/experimental/test_time_compute/search/multi_query_retrieval_search.py +122 -0
- nat/experimental/test_time_compute/search/single_shot_multi_plan_planner.py +128 -0
- nat/experimental/test_time_compute/selection/__init__.py +0 -0
- nat/experimental/test_time_compute/selection/best_of_n_selector.py +63 -0
- nat/experimental/test_time_compute/selection/llm_based_agent_output_selector.py +131 -0
- nat/experimental/test_time_compute/selection/llm_based_output_merging_selector.py +159 -0
- nat/experimental/test_time_compute/selection/llm_based_plan_selector.py +128 -0
- nat/experimental/test_time_compute/selection/threshold_selector.py +58 -0
- nat/front_ends/__init__.py +14 -0
- nat/front_ends/console/__init__.py +14 -0
- nat/front_ends/console/authentication_flow_handler.py +233 -0
- nat/front_ends/console/console_front_end_config.py +32 -0
- nat/front_ends/console/console_front_end_plugin.py +96 -0
- nat/front_ends/console/register.py +25 -0
- nat/front_ends/cron/__init__.py +14 -0
- nat/front_ends/fastapi/__init__.py +14 -0
- nat/front_ends/fastapi/auth_flow_handlers/__init__.py +0 -0
- nat/front_ends/fastapi/auth_flow_handlers/http_flow_handler.py +27 -0
- nat/front_ends/fastapi/auth_flow_handlers/websocket_flow_handler.py +107 -0
- nat/front_ends/fastapi/fastapi_front_end_config.py +242 -0
- nat/front_ends/fastapi/fastapi_front_end_controller.py +68 -0
- nat/front_ends/fastapi/fastapi_front_end_plugin.py +116 -0
- nat/front_ends/fastapi/fastapi_front_end_plugin_worker.py +1087 -0
- nat/front_ends/fastapi/html_snippets/__init__.py +14 -0
- nat/front_ends/fastapi/html_snippets/auth_code_grant_success.py +35 -0
- nat/front_ends/fastapi/intermediate_steps_subscriber.py +80 -0
- nat/front_ends/fastapi/job_store.py +183 -0
- nat/front_ends/fastapi/main.py +72 -0
- nat/front_ends/fastapi/message_handler.py +309 -0
- nat/front_ends/fastapi/message_validator.py +354 -0
- nat/front_ends/fastapi/register.py +25 -0
- nat/front_ends/fastapi/response_helpers.py +195 -0
- nat/front_ends/fastapi/step_adaptor.py +319 -0
- nat/front_ends/mcp/__init__.py +14 -0
- nat/front_ends/mcp/mcp_front_end_config.py +35 -0
- nat/front_ends/mcp/mcp_front_end_plugin.py +81 -0
- nat/front_ends/mcp/mcp_front_end_plugin_worker.py +143 -0
- nat/front_ends/mcp/register.py +27 -0
- nat/front_ends/mcp/tool_converter.py +242 -0
- nat/front_ends/register.py +22 -0
- nat/front_ends/simple_base/__init__.py +14 -0
- nat/front_ends/simple_base/simple_front_end_plugin_base.py +54 -0
- nat/llm/__init__.py +0 -0
- nat/llm/aws_bedrock_llm.py +57 -0
- nat/llm/nim_llm.py +46 -0
- nat/llm/openai_llm.py +46 -0
- nat/llm/register.py +23 -0
- nat/llm/utils/__init__.py +14 -0
- nat/llm/utils/env_config_value.py +94 -0
- nat/llm/utils/error.py +17 -0
- nat/memory/__init__.py +20 -0
- nat/memory/interfaces.py +183 -0
- nat/memory/models.py +112 -0
- nat/meta/module_to_distro.json +4 -0
- nat/meta/pypi.md +58 -0
- nat/object_store/__init__.py +20 -0
- nat/object_store/in_memory_object_store.py +76 -0
- nat/object_store/interfaces.py +84 -0
- nat/object_store/models.py +36 -0
- nat/object_store/register.py +20 -0
- nat/observability/__init__.py +14 -0
- nat/observability/exporter/__init__.py +14 -0
- nat/observability/exporter/base_exporter.py +449 -0
- nat/observability/exporter/exporter.py +78 -0
- nat/observability/exporter/file_exporter.py +33 -0
- nat/observability/exporter/processing_exporter.py +322 -0
- nat/observability/exporter/raw_exporter.py +52 -0
- nat/observability/exporter/span_exporter.py +288 -0
- nat/observability/exporter_manager.py +335 -0
- nat/observability/mixin/__init__.py +14 -0
- nat/observability/mixin/batch_config_mixin.py +26 -0
- nat/observability/mixin/collector_config_mixin.py +23 -0
- nat/observability/mixin/file_mixin.py +288 -0
- nat/observability/mixin/file_mode.py +23 -0
- nat/observability/mixin/resource_conflict_mixin.py +134 -0
- nat/observability/mixin/serialize_mixin.py +61 -0
- nat/observability/mixin/type_introspection_mixin.py +183 -0
- nat/observability/processor/__init__.py +14 -0
- nat/observability/processor/batching_processor.py +310 -0
- nat/observability/processor/callback_processor.py +42 -0
- nat/observability/processor/intermediate_step_serializer.py +28 -0
- nat/observability/processor/processor.py +71 -0
- nat/observability/register.py +96 -0
- nat/observability/utils/__init__.py +14 -0
- nat/observability/utils/dict_utils.py +236 -0
- nat/observability/utils/time_utils.py +31 -0
- nat/plugins/.namespace +1 -0
- nat/profiler/__init__.py +0 -0
- nat/profiler/calc/__init__.py +14 -0
- nat/profiler/calc/calc_runner.py +627 -0
- nat/profiler/calc/calculations.py +288 -0
- nat/profiler/calc/data_models.py +188 -0
- nat/profiler/calc/plot.py +345 -0
- nat/profiler/callbacks/__init__.py +0 -0
- nat/profiler/callbacks/agno_callback_handler.py +295 -0
- nat/profiler/callbacks/base_callback_class.py +20 -0
- nat/profiler/callbacks/langchain_callback_handler.py +290 -0
- nat/profiler/callbacks/llama_index_callback_handler.py +205 -0
- nat/profiler/callbacks/semantic_kernel_callback_handler.py +238 -0
- nat/profiler/callbacks/token_usage_base_model.py +27 -0
- nat/profiler/data_frame_row.py +51 -0
- nat/profiler/data_models.py +24 -0
- nat/profiler/decorators/__init__.py +0 -0
- nat/profiler/decorators/framework_wrapper.py +131 -0
- nat/profiler/decorators/function_tracking.py +254 -0
- nat/profiler/forecasting/__init__.py +0 -0
- nat/profiler/forecasting/config.py +18 -0
- nat/profiler/forecasting/model_trainer.py +75 -0
- nat/profiler/forecasting/models/__init__.py +22 -0
- nat/profiler/forecasting/models/forecasting_base_model.py +40 -0
- nat/profiler/forecasting/models/linear_model.py +196 -0
- nat/profiler/forecasting/models/random_forest_regressor.py +268 -0
- nat/profiler/inference_metrics_model.py +28 -0
- nat/profiler/inference_optimization/__init__.py +0 -0
- nat/profiler/inference_optimization/bottleneck_analysis/__init__.py +0 -0
- nat/profiler/inference_optimization/bottleneck_analysis/nested_stack_analysis.py +460 -0
- nat/profiler/inference_optimization/bottleneck_analysis/simple_stack_analysis.py +258 -0
- nat/profiler/inference_optimization/data_models.py +386 -0
- nat/profiler/inference_optimization/experimental/__init__.py +0 -0
- nat/profiler/inference_optimization/experimental/concurrency_spike_analysis.py +468 -0
- nat/profiler/inference_optimization/experimental/prefix_span_analysis.py +405 -0
- nat/profiler/inference_optimization/llm_metrics.py +212 -0
- nat/profiler/inference_optimization/prompt_caching.py +163 -0
- nat/profiler/inference_optimization/token_uniqueness.py +107 -0
- nat/profiler/inference_optimization/workflow_runtimes.py +72 -0
- nat/profiler/intermediate_property_adapter.py +102 -0
- nat/profiler/profile_runner.py +473 -0
- nat/profiler/utils.py +184 -0
- nat/registry_handlers/__init__.py +0 -0
- nat/registry_handlers/local/__init__.py +0 -0
- nat/registry_handlers/local/local_handler.py +176 -0
- nat/registry_handlers/local/register_local.py +37 -0
- nat/registry_handlers/metadata_factory.py +60 -0
- nat/registry_handlers/package_utils.py +571 -0
- nat/registry_handlers/pypi/__init__.py +0 -0
- nat/registry_handlers/pypi/pypi_handler.py +251 -0
- nat/registry_handlers/pypi/register_pypi.py +40 -0
- nat/registry_handlers/register.py +21 -0
- nat/registry_handlers/registry_handler_base.py +157 -0
- nat/registry_handlers/rest/__init__.py +0 -0
- nat/registry_handlers/rest/register_rest.py +56 -0
- nat/registry_handlers/rest/rest_handler.py +237 -0
- nat/registry_handlers/schemas/__init__.py +0 -0
- nat/registry_handlers/schemas/headers.py +42 -0
- nat/registry_handlers/schemas/package.py +68 -0
- nat/registry_handlers/schemas/publish.py +68 -0
- nat/registry_handlers/schemas/pull.py +82 -0
- nat/registry_handlers/schemas/remove.py +36 -0
- nat/registry_handlers/schemas/search.py +91 -0
- nat/registry_handlers/schemas/status.py +47 -0
- nat/retriever/__init__.py +0 -0
- nat/retriever/interface.py +41 -0
- nat/retriever/milvus/__init__.py +14 -0
- nat/retriever/milvus/register.py +81 -0
- nat/retriever/milvus/retriever.py +228 -0
- nat/retriever/models.py +77 -0
- nat/retriever/nemo_retriever/__init__.py +14 -0
- nat/retriever/nemo_retriever/register.py +60 -0
- nat/retriever/nemo_retriever/retriever.py +190 -0
- nat/retriever/register.py +22 -0
- nat/runtime/__init__.py +14 -0
- nat/runtime/loader.py +219 -0
- nat/runtime/runner.py +195 -0
- nat/runtime/session.py +162 -0
- nat/runtime/user_metadata.py +130 -0
- nat/settings/__init__.py +0 -0
- nat/settings/global_settings.py +318 -0
- nat/test/.namespace +1 -0
- nat/tool/__init__.py +0 -0
- nat/tool/chat_completion.py +74 -0
- nat/tool/code_execution/README.md +151 -0
- nat/tool/code_execution/__init__.py +0 -0
- nat/tool/code_execution/code_sandbox.py +267 -0
- nat/tool/code_execution/local_sandbox/.gitignore +1 -0
- nat/tool/code_execution/local_sandbox/Dockerfile.sandbox +60 -0
- nat/tool/code_execution/local_sandbox/__init__.py +13 -0
- nat/tool/code_execution/local_sandbox/local_sandbox_server.py +198 -0
- nat/tool/code_execution/local_sandbox/sandbox.requirements.txt +6 -0
- nat/tool/code_execution/local_sandbox/start_local_sandbox.sh +50 -0
- nat/tool/code_execution/register.py +74 -0
- nat/tool/code_execution/test_code_execution_sandbox.py +414 -0
- nat/tool/code_execution/utils.py +100 -0
- nat/tool/datetime_tools.py +42 -0
- nat/tool/document_search.py +141 -0
- nat/tool/github_tools/__init__.py +0 -0
- nat/tool/github_tools/create_github_commit.py +133 -0
- nat/tool/github_tools/create_github_issue.py +87 -0
- nat/tool/github_tools/create_github_pr.py +106 -0
- nat/tool/github_tools/get_github_file.py +106 -0
- nat/tool/github_tools/get_github_issue.py +166 -0
- nat/tool/github_tools/get_github_pr.py +256 -0
- nat/tool/github_tools/update_github_issue.py +100 -0
- nat/tool/mcp/__init__.py +14 -0
- nat/tool/mcp/exceptions.py +142 -0
- nat/tool/mcp/mcp_client.py +255 -0
- nat/tool/mcp/mcp_tool.py +96 -0
- nat/tool/memory_tools/__init__.py +0 -0
- nat/tool/memory_tools/add_memory_tool.py +79 -0
- nat/tool/memory_tools/delete_memory_tool.py +67 -0
- nat/tool/memory_tools/get_memory_tool.py +72 -0
- nat/tool/nvidia_rag.py +95 -0
- nat/tool/register.py +38 -0
- nat/tool/retriever.py +94 -0
- nat/tool/server_tools.py +66 -0
- nat/utils/__init__.py +0 -0
- nat/utils/data_models/__init__.py +0 -0
- nat/utils/data_models/schema_validator.py +58 -0
- nat/utils/debugging_utils.py +43 -0
- nat/utils/dump_distro_mapping.py +32 -0
- nat/utils/exception_handlers/__init__.py +0 -0
- nat/utils/exception_handlers/automatic_retries.py +289 -0
- nat/utils/exception_handlers/mcp.py +211 -0
- nat/utils/exception_handlers/schemas.py +114 -0
- nat/utils/io/__init__.py +0 -0
- nat/utils/io/model_processing.py +28 -0
- nat/utils/io/yaml_tools.py +119 -0
- nat/utils/log_utils.py +37 -0
- nat/utils/metadata_utils.py +74 -0
- nat/utils/optional_imports.py +142 -0
- nat/utils/producer_consumer_queue.py +178 -0
- nat/utils/reactive/__init__.py +0 -0
- nat/utils/reactive/base/__init__.py +0 -0
- nat/utils/reactive/base/observable_base.py +65 -0
- nat/utils/reactive/base/observer_base.py +55 -0
- nat/utils/reactive/base/subject_base.py +79 -0
- nat/utils/reactive/observable.py +59 -0
- nat/utils/reactive/observer.py +76 -0
- nat/utils/reactive/subject.py +131 -0
- nat/utils/reactive/subscription.py +49 -0
- nat/utils/settings/__init__.py +0 -0
- nat/utils/settings/global_settings.py +197 -0
- nat/utils/string_utils.py +38 -0
- nat/utils/type_converter.py +290 -0
- nat/utils/type_utils.py +484 -0
- nat/utils/url_utils.py +27 -0
- nvidia_nat-1.2.0a20250813.dist-info/METADATA +363 -0
- nvidia_nat-1.2.0a20250813.dist-info/RECORD +436 -0
- nvidia_nat-1.2.0a20250813.dist-info/WHEEL +5 -0
- nvidia_nat-1.2.0a20250813.dist-info/entry_points.txt +21 -0
- nvidia_nat-1.2.0a20250813.dist-info/licenses/LICENSE-3rd-party.txt +3686 -0
- nvidia_nat-1.2.0a20250813.dist-info/licenses/LICENSE.md +201 -0
- nvidia_nat-1.2.0a20250813.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import logging
|
|
17
|
+
|
|
18
|
+
from pydantic import Field
|
|
19
|
+
|
|
20
|
+
from nat.builder.builder import Builder
|
|
21
|
+
from nat.cli.register_workflow import register_logging_method
|
|
22
|
+
from nat.cli.register_workflow import register_telemetry_exporter
|
|
23
|
+
from nat.data_models.logging import LoggingBaseConfig
|
|
24
|
+
from nat.data_models.telemetry_exporter import TelemetryExporterBaseConfig
|
|
25
|
+
from nat.observability.mixin.file_mode import FileMode
|
|
26
|
+
|
|
27
|
+
logger = logging.getLogger(__name__)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class FileTelemetryExporterConfig(TelemetryExporterBaseConfig, name="file"):
|
|
31
|
+
"""A telemetry exporter that writes runtime traces to local files with optional rolling."""
|
|
32
|
+
|
|
33
|
+
output_path: str = Field(description="Output path for logs. When rolling is disabled: exact file path. "
|
|
34
|
+
"When rolling is enabled: directory path or file path (directory + base name).")
|
|
35
|
+
project: str = Field(description="Name to affiliate with this application.")
|
|
36
|
+
mode: FileMode = Field(
|
|
37
|
+
default=FileMode.APPEND,
|
|
38
|
+
description="File write mode: 'append' to add to existing file or 'overwrite' to start fresh.")
|
|
39
|
+
enable_rolling: bool = Field(default=False, description="Enable rolling log files based on size limits.")
|
|
40
|
+
max_file_size: int = Field(
|
|
41
|
+
default=10 * 1024 * 1024, # 10MB
|
|
42
|
+
description="Maximum file size in bytes before rolling to a new file.")
|
|
43
|
+
max_files: int = Field(default=5, description="Maximum number of rolled files to keep.")
|
|
44
|
+
cleanup_on_init: bool = Field(default=False, description="Clean up old files during initialization.")
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@register_telemetry_exporter(config_type=FileTelemetryExporterConfig)
|
|
48
|
+
async def file_telemetry_exporter(config: FileTelemetryExporterConfig, builder: Builder): # pylint: disable=W0613
|
|
49
|
+
"""
|
|
50
|
+
Build and return a FileExporter for file-based telemetry export with optional rolling.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
from nat.observability.exporter.file_exporter import FileExporter
|
|
54
|
+
|
|
55
|
+
yield FileExporter(output_path=config.output_path,
|
|
56
|
+
project=config.project,
|
|
57
|
+
mode=config.mode,
|
|
58
|
+
enable_rolling=config.enable_rolling,
|
|
59
|
+
max_file_size=config.max_file_size,
|
|
60
|
+
max_files=config.max_files,
|
|
61
|
+
cleanup_on_init=config.cleanup_on_init)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class ConsoleLoggingMethodConfig(LoggingBaseConfig, name="console"):
|
|
65
|
+
"""A logger to write runtime logs to the console."""
|
|
66
|
+
|
|
67
|
+
level: str = Field(description="The logging level of console logger.")
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@register_logging_method(config_type=ConsoleLoggingMethodConfig)
|
|
71
|
+
async def console_logging_method(config: ConsoleLoggingMethodConfig, builder: Builder): # pylint: disable=W0613
|
|
72
|
+
"""
|
|
73
|
+
Build and return a StreamHandler for console-based logging.
|
|
74
|
+
"""
|
|
75
|
+
level = getattr(logging, config.level.upper(), logging.INFO)
|
|
76
|
+
handler = logging.StreamHandler()
|
|
77
|
+
handler.setLevel(level)
|
|
78
|
+
yield handler
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class FileLoggingMethod(LoggingBaseConfig, name="file"):
|
|
82
|
+
"""A logger to write runtime logs to a file."""
|
|
83
|
+
|
|
84
|
+
path: str = Field(description="The file path to save the logging output.")
|
|
85
|
+
level: str = Field(description="The logging level of file logger.")
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@register_logging_method(config_type=FileLoggingMethod)
|
|
89
|
+
async def file_logging_method(config: FileLoggingMethod, builder: Builder): # pylint: disable=W0613
|
|
90
|
+
"""
|
|
91
|
+
Build and return a FileHandler for file-based logging.
|
|
92
|
+
"""
|
|
93
|
+
level = getattr(logging, config.level.upper(), logging.INFO)
|
|
94
|
+
handler = logging.FileHandler(filename=config.path, mode="a", encoding="utf-8")
|
|
95
|
+
handler.setLevel(level)
|
|
96
|
+
yield handler
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-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.
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-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 asyncio
|
|
17
|
+
import logging
|
|
18
|
+
from collections.abc import AsyncGenerator
|
|
19
|
+
from contextlib import asynccontextmanager
|
|
20
|
+
from typing import Any
|
|
21
|
+
from weakref import WeakKeyDictionary
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class KeyedLock:
|
|
27
|
+
"""
|
|
28
|
+
A lock manager that provides an asyncio-compatible lock for each unique key.
|
|
29
|
+
|
|
30
|
+
This allows for fine-grained locking based on arbitrary keys, so that
|
|
31
|
+
concurrent operations on different keys do not block each other.
|
|
32
|
+
|
|
33
|
+
Attributes:
|
|
34
|
+
_locks (AsyncDictionary): A dictionary to store locks per key.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
def __init__(self):
|
|
38
|
+
"""
|
|
39
|
+
Initialize the KeyedLock with an internal AsyncSafeWeakKeyDictionary to store locks per key.
|
|
40
|
+
"""
|
|
41
|
+
self._locks: AsyncDictionary = AsyncDictionary()
|
|
42
|
+
|
|
43
|
+
@asynccontextmanager
|
|
44
|
+
async def get_lock(self, key: Any) -> AsyncGenerator[None]:
|
|
45
|
+
"""
|
|
46
|
+
Async context manager to acquire a lock for a specific key.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
key (Any): The key to lock on.
|
|
50
|
+
|
|
51
|
+
Yields:
|
|
52
|
+
None: Control is yielded while the lock is held.
|
|
53
|
+
"""
|
|
54
|
+
lock = await self._locks.get(key)
|
|
55
|
+
if lock is None:
|
|
56
|
+
lock = asyncio.Lock()
|
|
57
|
+
await self._locks.set(key, lock)
|
|
58
|
+
async with lock:
|
|
59
|
+
yield
|
|
60
|
+
|
|
61
|
+
async def delete(self, key: Any) -> None:
|
|
62
|
+
"""
|
|
63
|
+
Remove the lock associated with the given key, if it exists.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
key (Any): The key whose lock should be removed.
|
|
67
|
+
"""
|
|
68
|
+
await self._locks.delete(key)
|
|
69
|
+
|
|
70
|
+
async def clear(self) -> None:
|
|
71
|
+
"""
|
|
72
|
+
Remove all locks managed by this KeyedLock instance.
|
|
73
|
+
"""
|
|
74
|
+
await self._locks.clear()
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class AsyncDictionary:
|
|
78
|
+
"""
|
|
79
|
+
An asyncio-safe dictionary.
|
|
80
|
+
|
|
81
|
+
This class wraps a regular dictionary with an asyncio.Lock to ensure
|
|
82
|
+
thread safety for concurrent async operations.
|
|
83
|
+
|
|
84
|
+
Attributes:
|
|
85
|
+
_dict (dict): A dictionary to store the key-value pairs.
|
|
86
|
+
_lock (asyncio.Lock): A lock to synchronize access to the dictionary.
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
def __init__(self):
|
|
90
|
+
"""
|
|
91
|
+
Initialize the AsyncDictionary with a regular dictionary and an asyncio.Lock.
|
|
92
|
+
"""
|
|
93
|
+
self._dict: dict = {}
|
|
94
|
+
self._lock = asyncio.Lock()
|
|
95
|
+
|
|
96
|
+
async def get(self, key: Any, default: Any | None = None) -> Any | None:
|
|
97
|
+
"""
|
|
98
|
+
Get the value associated with the given key, or return default if not found.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
key (Any): The key to look up.
|
|
102
|
+
default (Any | None, optional): The value to return if key is not found. Defaults to None.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Any | None: The value associated with the key, or default.
|
|
106
|
+
"""
|
|
107
|
+
async with self._lock:
|
|
108
|
+
return self._dict.get(key, default)
|
|
109
|
+
|
|
110
|
+
async def keys(self) -> list[Any]:
|
|
111
|
+
"""
|
|
112
|
+
Get a list of all keys currently in the dictionary.
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
list[Any]: A list of keys.
|
|
116
|
+
"""
|
|
117
|
+
async with self._lock:
|
|
118
|
+
return list(self._dict.keys())
|
|
119
|
+
|
|
120
|
+
async def values(self) -> list[Any]:
|
|
121
|
+
"""
|
|
122
|
+
Get a list of all values currently in the dictionary.
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
list[Any]: A list of values.
|
|
126
|
+
"""
|
|
127
|
+
async with self._lock:
|
|
128
|
+
return list(self._dict.values())
|
|
129
|
+
|
|
130
|
+
async def set(self, key: Any, value: Any) -> None:
|
|
131
|
+
"""
|
|
132
|
+
Set the value for the given key, overwriting any existing value.
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
key (Any): The key to set.
|
|
136
|
+
value (Any): The value to associate with the key.
|
|
137
|
+
"""
|
|
138
|
+
async with self._lock:
|
|
139
|
+
self._dict[key] = value
|
|
140
|
+
|
|
141
|
+
async def set_strict(self, key: Any, value: Any) -> None:
|
|
142
|
+
"""
|
|
143
|
+
Set the value for the given key only if the key does not already exist.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
key (Any): The key to set.
|
|
147
|
+
value (Any): The value to associate with the key.
|
|
148
|
+
|
|
149
|
+
Raises:
|
|
150
|
+
ValueError: If the key already exists in the dictionary.
|
|
151
|
+
"""
|
|
152
|
+
async with self._lock:
|
|
153
|
+
if key in self._dict:
|
|
154
|
+
raise ValueError(f"Key '{key}' already exists")
|
|
155
|
+
self._dict[key] = value
|
|
156
|
+
|
|
157
|
+
async def delete(self, key: Any) -> None:
|
|
158
|
+
"""
|
|
159
|
+
Remove the value associated with the given key, if it exists.
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
key (Any): The key to remove.
|
|
163
|
+
"""
|
|
164
|
+
async with self._lock:
|
|
165
|
+
self._dict.pop(key, None)
|
|
166
|
+
|
|
167
|
+
async def delete_strict(self, key: Any) -> None:
|
|
168
|
+
"""
|
|
169
|
+
Remove the value associated with the given key, raising an error if the key does not exist.
|
|
170
|
+
|
|
171
|
+
Args:
|
|
172
|
+
key (Any): The key to remove.
|
|
173
|
+
|
|
174
|
+
Raises:
|
|
175
|
+
ValueError: If the key does not exist in the dictionary.
|
|
176
|
+
"""
|
|
177
|
+
async with self._lock:
|
|
178
|
+
if key not in self._dict:
|
|
179
|
+
raise ValueError(f"Key '{key}' does not exist")
|
|
180
|
+
self._dict.pop(key)
|
|
181
|
+
|
|
182
|
+
async def clear(self) -> None:
|
|
183
|
+
"""
|
|
184
|
+
Remove all items from the dictionary.
|
|
185
|
+
"""
|
|
186
|
+
async with self._lock:
|
|
187
|
+
self._dict.clear()
|
|
188
|
+
|
|
189
|
+
async def items(self) -> dict[Any, Any]:
|
|
190
|
+
"""
|
|
191
|
+
Get a copy of the dictionary's items as a regular dict.
|
|
192
|
+
|
|
193
|
+
Returns:
|
|
194
|
+
dict[Any, Any]: A copy of the dictionary's items.
|
|
195
|
+
"""
|
|
196
|
+
async with self._lock:
|
|
197
|
+
return dict(self._dict) # Return a copy to prevent external modification
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
class AsyncSafeWeakKeyDictionary(AsyncDictionary):
|
|
201
|
+
"""
|
|
202
|
+
An asyncio-safe, weakly-referenced dictionary.
|
|
203
|
+
|
|
204
|
+
This class wraps a WeakKeyDictionary with an asyncio.Lock to ensure
|
|
205
|
+
thread safety for concurrent async operations.
|
|
206
|
+
|
|
207
|
+
Attributes:
|
|
208
|
+
_dict (WeakKeyDictionary): A dictionary to store the key-value pairs.
|
|
209
|
+
_lock (asyncio.Lock): A lock to synchronize access to the dictionary.
|
|
210
|
+
"""
|
|
211
|
+
|
|
212
|
+
def __init__(self):
|
|
213
|
+
"""
|
|
214
|
+
Initialize the AsyncSafeWeakKeyDictionary with a WeakKeyDictionary and an asyncio.Lock.
|
|
215
|
+
"""
|
|
216
|
+
super().__init__()
|
|
217
|
+
self._dict: WeakKeyDictionary = WeakKeyDictionary()
|
|
218
|
+
self._lock = asyncio.Lock()
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def merge_dicts(dict1: dict, dict2: dict) -> dict:
|
|
222
|
+
"""
|
|
223
|
+
Merge two dictionaries, prioritizing non-null values from the first dictionary.
|
|
224
|
+
|
|
225
|
+
Args:
|
|
226
|
+
dict1 (dict): First dictionary (higher priority)
|
|
227
|
+
dict2 (dict): Second dictionary (lower priority)
|
|
228
|
+
|
|
229
|
+
Returns:
|
|
230
|
+
dict: Merged dictionary with non-null values from dict1 taking precedence
|
|
231
|
+
"""
|
|
232
|
+
result = dict2.copy() # Start with a copy of the second dictionary
|
|
233
|
+
for key, value in dict1.items():
|
|
234
|
+
if value is not None: # Only update if value is not None
|
|
235
|
+
result[key] = value
|
|
236
|
+
return result
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import logging
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def ns_timestamp(seconds_float: float) -> int:
|
|
22
|
+
"""
|
|
23
|
+
Convert a float timestamp in seconds to an integer nanosecond timestamp.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
seconds_float (float): The timestamp in seconds (as a float).
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
int: The timestamp in nanoseconds (as an integer).
|
|
30
|
+
"""
|
|
31
|
+
return int(seconds_float * 1e9)
|
nat/plugins/.namespace
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Note: This is a python namespace package and this directory should remain empty. Do NOT add a `__init__.py` file or any other files to this directory. This file is also needed to ensure the directory exists in git.
|
nat/profiler/__init__.py
ADDED
|
File without changes
|
|
@@ -0,0 +1,14 @@
|
|
|
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.
|