nvidia-nat 1.2.0__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 +66 -0
- nat/agent/__init__.py +0 -0
- nat/agent/base.py +256 -0
- nat/agent/dual_node.py +67 -0
- nat/agent/react_agent/__init__.py +0 -0
- nat/agent/react_agent/agent.py +363 -0
- nat/agent/react_agent/output_parser.py +104 -0
- nat/agent/react_agent/prompt.py +44 -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 +415 -0
- nat/agent/rewoo_agent/prompt.py +110 -0
- nat/agent/rewoo_agent/register.py +157 -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 +34 -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 +37 -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 +36 -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 +716 -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 +169 -0
- nat/data_models/discovery_metadata.py +305 -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/nim_embedder.py +59 -0
- nat/embedder/openai_embedder.py +43 -0
- nat/embedder/register.py +22 -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 +367 -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 +241 -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 +320 -0
- nat/front_ends/fastapi/message_validator.py +352 -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 +36 -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 +241 -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/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 +38 -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 +197 -0
- nat/profiler/forecasting/models/random_forest_regressor.py +269 -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 +220 -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.0.dist-info/METADATA +365 -0
- nvidia_nat-1.2.0.dist-info/RECORD +435 -0
- nvidia_nat-1.2.0.dist-info/WHEEL +5 -0
- nvidia_nat-1.2.0.dist-info/entry_points.txt +21 -0
- nvidia_nat-1.2.0.dist-info/licenses/LICENSE-3rd-party.txt +5478 -0
- nvidia_nat-1.2.0.dist-info/licenses/LICENSE.md +201 -0
- nvidia_nat-1.2.0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
from enum import StrEnum
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class FileMode(StrEnum):
|
|
20
|
+
"""File write modes for FileExportMixin."""
|
|
21
|
+
|
|
22
|
+
APPEND = "append"
|
|
23
|
+
OVERWRITE = "overwrite"
|
|
@@ -0,0 +1,134 @@
|
|
|
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
|
+
import weakref
|
|
18
|
+
from abc import ABC
|
|
19
|
+
from abc import abstractmethod
|
|
20
|
+
from typing import Any
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ResourceConflictError(ValueError):
|
|
26
|
+
"""Raised when multiple exporter instances would conflict over the same resource."""
|
|
27
|
+
pass
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ResourceConflictMixin(ABC):
|
|
31
|
+
"""Abstract mixin for detecting resource conflicts between exporter instances.
|
|
32
|
+
|
|
33
|
+
This mixin provides a framework for exporters to detect when multiple instances
|
|
34
|
+
would conflict over the same resources (files, database tables, API endpoints, etc.).
|
|
35
|
+
Each concrete implementation defines what constitutes a resource conflict for that
|
|
36
|
+
exporter type.
|
|
37
|
+
|
|
38
|
+
The mixin maintains class-level registries using weakrefs for automatic cleanup
|
|
39
|
+
when instances are garbage collected.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
# Each subclass gets its own registry - prevents cross-contamination
|
|
43
|
+
_registries: dict[type, dict[str, weakref.ref]] = {}
|
|
44
|
+
|
|
45
|
+
def __init__(self, *args, **kwargs):
|
|
46
|
+
super().__init__(*args, **kwargs)
|
|
47
|
+
# Register this instance's resources and check for conflicts
|
|
48
|
+
self._register_resources()
|
|
49
|
+
|
|
50
|
+
@abstractmethod
|
|
51
|
+
def _get_resource_identifiers(self) -> dict[str, Any]:
|
|
52
|
+
"""Return dict of resource_type -> identifier that this instance will use.
|
|
53
|
+
|
|
54
|
+
Examples:
|
|
55
|
+
Files: {"file_path": "/logs/app.log", "cleanup_pattern": "app_*.log"}
|
|
56
|
+
Phoenix: {"project_endpoint": "my_project@http://localhost:6006"}
|
|
57
|
+
Database: {"table_name": "events", "connection": "postgresql://..."}
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
dict[str, Any]: Dict mapping resource type names to unique identifiers for those resources.
|
|
61
|
+
"""
|
|
62
|
+
pass
|
|
63
|
+
|
|
64
|
+
@abstractmethod
|
|
65
|
+
def _format_conflict_error(self, resource_type: str, identifier: Any, existing_instance: Any) -> str:
|
|
66
|
+
"""Format a user-friendly error message for a resource conflict.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
resource_type (str): The type of resource that conflicts (e.g., "file_path", "project_endpoint")
|
|
70
|
+
identifier (Any): The identifier for this resource
|
|
71
|
+
existing_instance (Any): The existing instance that conflicts with this one
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
A clear error message explaining the conflict and how to resolve it.
|
|
75
|
+
"""
|
|
76
|
+
pass
|
|
77
|
+
|
|
78
|
+
def _register_resources(self):
|
|
79
|
+
"""Register this instance's resources and check for conflicts.
|
|
80
|
+
|
|
81
|
+
Raises:
|
|
82
|
+
ResourceConflictError: If any resource conflicts with an existing instance.
|
|
83
|
+
"""
|
|
84
|
+
# Get our class-specific registry
|
|
85
|
+
cls = type(self)
|
|
86
|
+
if cls not in self._registries:
|
|
87
|
+
self._registries[cls] = {}
|
|
88
|
+
registry = self._registries[cls]
|
|
89
|
+
|
|
90
|
+
# Clean up dead references first
|
|
91
|
+
self._cleanup_dead_references(registry)
|
|
92
|
+
|
|
93
|
+
# Check each resource for conflicts
|
|
94
|
+
resources = self._get_resource_identifiers()
|
|
95
|
+
for resource_type, identifier in resources.items():
|
|
96
|
+
resource_key = f"{resource_type}:{identifier}"
|
|
97
|
+
|
|
98
|
+
# Check for existing instance using this resource
|
|
99
|
+
if resource_key in registry:
|
|
100
|
+
existing_ref = registry[resource_key]
|
|
101
|
+
existing_instance = existing_ref()
|
|
102
|
+
if existing_instance is not None:
|
|
103
|
+
error_msg = self._format_conflict_error(resource_type, identifier, existing_instance)
|
|
104
|
+
raise ResourceConflictError(error_msg)
|
|
105
|
+
|
|
106
|
+
# Register this instance for this resource
|
|
107
|
+
registry[resource_key] = weakref.ref(self, lambda ref, key=resource_key: registry.pop(key, None))
|
|
108
|
+
|
|
109
|
+
logger.debug("Registered %d resources for %s", len(resources), self.__class__.__name__)
|
|
110
|
+
|
|
111
|
+
def _cleanup_dead_references(self, registry: dict[str, weakref.ref]):
|
|
112
|
+
"""Remove dead weakref entries from the registry.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
registry (dict[str, weakref.ref]): The registry to clean up.
|
|
116
|
+
"""
|
|
117
|
+
dead_keys = [key for key, ref in registry.items() if ref() is None]
|
|
118
|
+
for key in dead_keys:
|
|
119
|
+
registry.pop(key, None)
|
|
120
|
+
|
|
121
|
+
@classmethod
|
|
122
|
+
def get_active_resource_count(cls) -> int:
|
|
123
|
+
"""Get the number of active resources registered for this class.
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
int: Number of active resource registrations.
|
|
127
|
+
"""
|
|
128
|
+
if cls not in cls._registries:
|
|
129
|
+
return 0
|
|
130
|
+
|
|
131
|
+
registry = cls._registries[cls]
|
|
132
|
+
# Clean up and count live references
|
|
133
|
+
live_count = sum(1 for ref in registry.values() if ref() is not None)
|
|
134
|
+
return live_count
|
|
@@ -0,0 +1,61 @@
|
|
|
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 json
|
|
17
|
+
from typing import Any
|
|
18
|
+
|
|
19
|
+
from pydantic import BaseModel
|
|
20
|
+
from pydantic import TypeAdapter
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class SerializeMixin:
|
|
24
|
+
|
|
25
|
+
def _process_streaming_output(self, input_value: Any) -> Any:
|
|
26
|
+
"""
|
|
27
|
+
Serialize a list of values to a JSON string.
|
|
28
|
+
"""
|
|
29
|
+
if isinstance(input_value, BaseModel):
|
|
30
|
+
return json.loads(TypeAdapter(type(input_value)).dump_json(input_value).decode('utf-8'))
|
|
31
|
+
if isinstance(input_value, dict):
|
|
32
|
+
return input_value
|
|
33
|
+
return input_value
|
|
34
|
+
|
|
35
|
+
def _serialize_payload(self, input_value: Any) -> tuple[str, bool]:
|
|
36
|
+
"""
|
|
37
|
+
Serialize the input value to a string. Returns a tuple with the serialized value and a boolean indicating if the
|
|
38
|
+
serialization is JSON or a string.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
input_value (Any): The input value to serialize.
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
tuple[str, bool]: A tuple with the serialized value and a boolean indicating if the serialization is
|
|
45
|
+
JSON or a string.
|
|
46
|
+
"""
|
|
47
|
+
try:
|
|
48
|
+
if isinstance(input_value, BaseModel):
|
|
49
|
+
return TypeAdapter(type(input_value)).dump_json(input_value).decode('utf-8'), True
|
|
50
|
+
if isinstance(input_value, dict):
|
|
51
|
+
return json.dumps(input_value), True
|
|
52
|
+
if isinstance(input_value, list):
|
|
53
|
+
serialized_list = []
|
|
54
|
+
for value in input_value:
|
|
55
|
+
serialized_value = self._process_streaming_output(value)
|
|
56
|
+
serialized_list.append(serialized_value)
|
|
57
|
+
return json.dumps(serialized_list), True
|
|
58
|
+
return str(input_value), False
|
|
59
|
+
except Exception:
|
|
60
|
+
# Fallback to string representation if we can't serialize using pydantic
|
|
61
|
+
return str(input_value), False
|
|
@@ -0,0 +1,183 @@
|
|
|
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
|
+
from functools import lru_cache
|
|
17
|
+
from typing import Any
|
|
18
|
+
from typing import get_args
|
|
19
|
+
from typing import get_origin
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class TypeIntrospectionMixin:
|
|
23
|
+
"""Mixin class providing type introspection capabilities for generic classes.
|
|
24
|
+
|
|
25
|
+
This mixin extracts type information from generic class definitions,
|
|
26
|
+
allowing classes to determine their InputT and OutputT types at runtime.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def _find_generic_types(self) -> tuple[type[Any], type[Any]] | None:
|
|
30
|
+
"""
|
|
31
|
+
Recursively search through the inheritance hierarchy to find generic type parameters.
|
|
32
|
+
|
|
33
|
+
This method handles cases where a class inherits from a generic parent class,
|
|
34
|
+
resolving the concrete types through the inheritance chain.
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
tuple[type[Any], type[Any]] | None: (input_type, output_type) if found, None otherwise
|
|
38
|
+
"""
|
|
39
|
+
# First, try to find types directly in this class's __orig_bases__
|
|
40
|
+
for base_cls in getattr(self.__class__, '__orig_bases__', []):
|
|
41
|
+
base_cls_args = get_args(base_cls)
|
|
42
|
+
|
|
43
|
+
# Direct case: MyClass[InputT, OutputT]
|
|
44
|
+
if len(base_cls_args) >= 2:
|
|
45
|
+
return base_cls_args[0], base_cls_args[1]
|
|
46
|
+
|
|
47
|
+
# Indirect case: MyClass[SomeGeneric[ConcreteType]]
|
|
48
|
+
# Need to resolve the generic parent's types
|
|
49
|
+
if len(base_cls_args) == 1:
|
|
50
|
+
base_origin = get_origin(base_cls)
|
|
51
|
+
if base_origin and hasattr(base_origin, '__orig_bases__'):
|
|
52
|
+
# Look at the parent's generic definition
|
|
53
|
+
for parent_base in getattr(base_origin, '__orig_bases__', []):
|
|
54
|
+
parent_args = get_args(parent_base)
|
|
55
|
+
if len(parent_args) >= 2:
|
|
56
|
+
# Found the pattern: ParentClass[T, list[T]]
|
|
57
|
+
# Substitute T with our concrete type
|
|
58
|
+
concrete_type = base_cls_args[0]
|
|
59
|
+
input_type = self._substitute_type_var(parent_args[0], concrete_type)
|
|
60
|
+
output_type = self._substitute_type_var(parent_args[1], concrete_type)
|
|
61
|
+
return input_type, output_type
|
|
62
|
+
|
|
63
|
+
return None
|
|
64
|
+
|
|
65
|
+
def _substitute_type_var(self, type_expr: Any, concrete_type: type) -> type[Any]:
|
|
66
|
+
"""
|
|
67
|
+
Substitute TypeVar in a type expression with a concrete type.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
type_expr: The type expression potentially containing TypeVars
|
|
71
|
+
concrete_type: The concrete type to substitute
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
The type expression with TypeVars substituted
|
|
75
|
+
"""
|
|
76
|
+
from typing import TypeVar
|
|
77
|
+
|
|
78
|
+
# If it's a TypeVar, substitute it
|
|
79
|
+
if isinstance(type_expr, TypeVar):
|
|
80
|
+
return concrete_type
|
|
81
|
+
|
|
82
|
+
# If it's a generic type like list[T], substitute the args
|
|
83
|
+
origin = get_origin(type_expr)
|
|
84
|
+
args = get_args(type_expr)
|
|
85
|
+
|
|
86
|
+
if origin and args:
|
|
87
|
+
# Recursively substitute in the arguments
|
|
88
|
+
new_args = tuple(self._substitute_type_var(arg, concrete_type) for arg in args)
|
|
89
|
+
# Reconstruct the generic type
|
|
90
|
+
return origin[new_args]
|
|
91
|
+
|
|
92
|
+
# Otherwise, return as-is
|
|
93
|
+
return type_expr
|
|
94
|
+
|
|
95
|
+
@property
|
|
96
|
+
@lru_cache
|
|
97
|
+
def input_type(self) -> type[Any]:
|
|
98
|
+
"""
|
|
99
|
+
Get the input type of the class. The input type is determined by the generic parameters of the class.
|
|
100
|
+
|
|
101
|
+
For example, if a class is defined as `MyClass[list[int], str]`, the `input_type` is `list[int]`.
|
|
102
|
+
|
|
103
|
+
Returns
|
|
104
|
+
-------
|
|
105
|
+
type[Any]
|
|
106
|
+
The input type specified in the generic parameters
|
|
107
|
+
|
|
108
|
+
Raises
|
|
109
|
+
------
|
|
110
|
+
ValueError
|
|
111
|
+
If the input type cannot be determined from the class definition
|
|
112
|
+
"""
|
|
113
|
+
types = self._find_generic_types()
|
|
114
|
+
if types:
|
|
115
|
+
return types[0]
|
|
116
|
+
|
|
117
|
+
raise ValueError(f"Could not find input type for {self.__class__.__name__}")
|
|
118
|
+
|
|
119
|
+
@property
|
|
120
|
+
@lru_cache
|
|
121
|
+
def output_type(self) -> type[Any]:
|
|
122
|
+
"""
|
|
123
|
+
Get the output type of the class. The output type is determined by the generic parameters of the class.
|
|
124
|
+
|
|
125
|
+
For example, if a class is defined as `MyClass[list[int], str]`, the `output_type` is `str`.
|
|
126
|
+
|
|
127
|
+
Returns
|
|
128
|
+
-------
|
|
129
|
+
type[Any]
|
|
130
|
+
The output type specified in the generic parameters
|
|
131
|
+
|
|
132
|
+
Raises
|
|
133
|
+
------
|
|
134
|
+
ValueError
|
|
135
|
+
If the output type cannot be determined from the class definition
|
|
136
|
+
"""
|
|
137
|
+
types = self._find_generic_types()
|
|
138
|
+
if types:
|
|
139
|
+
return types[1]
|
|
140
|
+
|
|
141
|
+
raise ValueError(f"Could not find output type for {self.__class__.__name__}")
|
|
142
|
+
|
|
143
|
+
@property
|
|
144
|
+
@lru_cache
|
|
145
|
+
def input_class(self) -> type:
|
|
146
|
+
"""
|
|
147
|
+
Get the python class of the input type. This is the class that can be used to check if a value is an
|
|
148
|
+
instance of the input type. It removes any generic or annotation information from the input type.
|
|
149
|
+
|
|
150
|
+
For example, if the input type is `list[int]`, the `input_class` is `list`.
|
|
151
|
+
|
|
152
|
+
Returns
|
|
153
|
+
-------
|
|
154
|
+
type
|
|
155
|
+
The python type of the input type
|
|
156
|
+
"""
|
|
157
|
+
input_origin = get_origin(self.input_type)
|
|
158
|
+
|
|
159
|
+
if input_origin is None:
|
|
160
|
+
return self.input_type
|
|
161
|
+
|
|
162
|
+
return input_origin
|
|
163
|
+
|
|
164
|
+
@property
|
|
165
|
+
@lru_cache
|
|
166
|
+
def output_class(self) -> type:
|
|
167
|
+
"""
|
|
168
|
+
Get the python class of the output type. This is the class that can be used to check if a value is an
|
|
169
|
+
instance of the output type. It removes any generic or annotation information from the output type.
|
|
170
|
+
|
|
171
|
+
For example, if the output type is `list[int]`, the `output_class` is `list`.
|
|
172
|
+
|
|
173
|
+
Returns
|
|
174
|
+
-------
|
|
175
|
+
type
|
|
176
|
+
The python type of the output type
|
|
177
|
+
"""
|
|
178
|
+
output_origin = get_origin(self.output_type)
|
|
179
|
+
|
|
180
|
+
if output_origin is None:
|
|
181
|
+
return self.output_type
|
|
182
|
+
|
|
183
|
+
return output_origin
|
|
@@ -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.
|