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,380 @@
|
|
|
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
|
+
"""Base class for NAT functions providing type handling and schema management.
|
|
16
|
+
|
|
17
|
+
This module contains the FunctionBase abstract base class which provides core functionality
|
|
18
|
+
for NAT functions including type handling via generics, schema management for inputs and outputs,
|
|
19
|
+
and type conversion capabilities.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
import logging
|
|
23
|
+
import typing
|
|
24
|
+
from abc import ABC
|
|
25
|
+
from collections.abc import Callable
|
|
26
|
+
from functools import lru_cache
|
|
27
|
+
from types import NoneType
|
|
28
|
+
|
|
29
|
+
from pydantic import BaseModel
|
|
30
|
+
|
|
31
|
+
from nat.utils.type_converter import TypeConverter
|
|
32
|
+
from nat.utils.type_utils import DecomposedType
|
|
33
|
+
|
|
34
|
+
InputT = typing.TypeVar("InputT")
|
|
35
|
+
StreamingOutputT = typing.TypeVar("StreamingOutputT")
|
|
36
|
+
SingleOutputT = typing.TypeVar("SingleOutputT")
|
|
37
|
+
|
|
38
|
+
logger = logging.getLogger(__name__)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class FunctionBase(typing.Generic[InputT, StreamingOutputT, SingleOutputT], ABC):
|
|
42
|
+
"""
|
|
43
|
+
Abstract base class providing core functionality for NAT functions.
|
|
44
|
+
|
|
45
|
+
This class provides type handling via generics, schema management for inputs and outputs,
|
|
46
|
+
and type conversion capabilities.
|
|
47
|
+
|
|
48
|
+
Parameters
|
|
49
|
+
----------
|
|
50
|
+
InputT : TypeVar
|
|
51
|
+
The input type for the function
|
|
52
|
+
StreamingOutputT : TypeVar
|
|
53
|
+
The output type for streaming results
|
|
54
|
+
SingleOutputT : TypeVar
|
|
55
|
+
The output type for single results
|
|
56
|
+
|
|
57
|
+
Notes
|
|
58
|
+
-----
|
|
59
|
+
FunctionBase is the foundation of the NAT function system, providing:
|
|
60
|
+
- Type handling via generics
|
|
61
|
+
- Schema management for inputs and outputs
|
|
62
|
+
- Type conversion capabilities
|
|
63
|
+
- Abstract interface that concrete function classes must implement
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
def __init__(self,
|
|
67
|
+
*,
|
|
68
|
+
input_schema: type[BaseModel] | None = None,
|
|
69
|
+
streaming_output_schema: type[BaseModel] | type[None] | None = None,
|
|
70
|
+
single_output_schema: type[BaseModel] | type[None] | None = None,
|
|
71
|
+
converters: list[Callable[[typing.Any], typing.Any]] | None = None):
|
|
72
|
+
|
|
73
|
+
converters = converters or []
|
|
74
|
+
|
|
75
|
+
self._converter_list = converters
|
|
76
|
+
|
|
77
|
+
final_input_schema = input_schema or DecomposedType(self.input_type).get_pydantic_schema(converters)
|
|
78
|
+
|
|
79
|
+
assert not issubclass(final_input_schema, NoneType)
|
|
80
|
+
|
|
81
|
+
self._input_schema = final_input_schema
|
|
82
|
+
|
|
83
|
+
if streaming_output_schema is not None:
|
|
84
|
+
self._streaming_output_schema = streaming_output_schema
|
|
85
|
+
else:
|
|
86
|
+
self._streaming_output_schema = DecomposedType(self.streaming_output_type).get_pydantic_schema(converters)
|
|
87
|
+
|
|
88
|
+
if single_output_schema is not None:
|
|
89
|
+
self._single_output_schema = single_output_schema
|
|
90
|
+
else:
|
|
91
|
+
self._single_output_schema = DecomposedType(self.single_output_type).get_pydantic_schema(converters)
|
|
92
|
+
|
|
93
|
+
self._converter: TypeConverter = TypeConverter(converters)
|
|
94
|
+
|
|
95
|
+
@property
|
|
96
|
+
@lru_cache
|
|
97
|
+
def input_type(self) -> type[InputT]:
|
|
98
|
+
"""
|
|
99
|
+
Get the input type of the function. The input type is determined by the generic parameters of the class.
|
|
100
|
+
|
|
101
|
+
For example, if a function is defined as `def my_function(input: list[int]) -> str`, the `input_type` is
|
|
102
|
+
`list[int]`.
|
|
103
|
+
|
|
104
|
+
Returns
|
|
105
|
+
-------
|
|
106
|
+
type[InputT]
|
|
107
|
+
The input type specified in the generic parameters
|
|
108
|
+
|
|
109
|
+
Raises
|
|
110
|
+
------
|
|
111
|
+
ValueError
|
|
112
|
+
If the input type cannot be determined from the class definition
|
|
113
|
+
"""
|
|
114
|
+
for base_cls in self.__class__.__orig_bases__: # pylint: disable=no-member # type: ignore
|
|
115
|
+
|
|
116
|
+
base_cls_args = typing.get_args(base_cls)
|
|
117
|
+
|
|
118
|
+
if len(base_cls_args) == 3:
|
|
119
|
+
return base_cls_args[0]
|
|
120
|
+
|
|
121
|
+
raise ValueError("Could not find input schema")
|
|
122
|
+
|
|
123
|
+
@property
|
|
124
|
+
@lru_cache
|
|
125
|
+
def input_class(self) -> type:
|
|
126
|
+
"""
|
|
127
|
+
Get the python class of the input type. This is the class that can be used to check if a value is an instance of
|
|
128
|
+
the input type. It removes any generic or annotation information from the input type.
|
|
129
|
+
|
|
130
|
+
For example, if a function is defined as `def my_function(input: list[int]) -> str`, the `input_class` is
|
|
131
|
+
`list`.
|
|
132
|
+
|
|
133
|
+
Returns
|
|
134
|
+
-------
|
|
135
|
+
type
|
|
136
|
+
The python type of the input type
|
|
137
|
+
"""
|
|
138
|
+
|
|
139
|
+
input_origin = typing.get_origin(self.input_type)
|
|
140
|
+
|
|
141
|
+
if (input_origin is None):
|
|
142
|
+
return self.input_type
|
|
143
|
+
|
|
144
|
+
return input_origin
|
|
145
|
+
|
|
146
|
+
@property
|
|
147
|
+
@lru_cache
|
|
148
|
+
def input_schema(self) -> type[BaseModel]:
|
|
149
|
+
"""
|
|
150
|
+
Get the Pydantic model schema for validating inputs. The schema must be pydantic models. This allows for
|
|
151
|
+
type validation and coercion, and documenting schema properties of the input value. If the input type is
|
|
152
|
+
already a pydantic model, it will be returned as is.
|
|
153
|
+
|
|
154
|
+
For example, if a function is defined as `def my_function(input: list[int]) -> str`, the `input_schema` is::
|
|
155
|
+
|
|
156
|
+
class InputSchema(BaseModel):
|
|
157
|
+
input: list[int]
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
Returns
|
|
161
|
+
-------
|
|
162
|
+
type[BaseModel]
|
|
163
|
+
The Pydantic model class for input validation
|
|
164
|
+
"""
|
|
165
|
+
return self._input_schema
|
|
166
|
+
|
|
167
|
+
@property
|
|
168
|
+
def converter_list(self) -> list[Callable[[typing.Any], typing.Any]]:
|
|
169
|
+
"""
|
|
170
|
+
Get the list of type converters used by this function.
|
|
171
|
+
|
|
172
|
+
Returns
|
|
173
|
+
-------
|
|
174
|
+
list[Callable[[typing.Any], typing.Any]]
|
|
175
|
+
List of converter functions that transform input types
|
|
176
|
+
"""
|
|
177
|
+
return self._converter_list
|
|
178
|
+
|
|
179
|
+
@property
|
|
180
|
+
@lru_cache
|
|
181
|
+
def streaming_output_type(self) -> type[StreamingOutputT]:
|
|
182
|
+
"""
|
|
183
|
+
Get the streaming output type of the function. The streaming output type is determined by the generic parameters
|
|
184
|
+
of the class.
|
|
185
|
+
|
|
186
|
+
For example, if a function is defined as `def my_function(input: int) -> AsyncGenerator[dict[str, Any]]`,
|
|
187
|
+
the `streaming_output_type` is `dict[str, Any]`.
|
|
188
|
+
|
|
189
|
+
Returns
|
|
190
|
+
-------
|
|
191
|
+
type[StreamingOutputT]
|
|
192
|
+
The streaming output type specified in the generic parameters
|
|
193
|
+
|
|
194
|
+
Raises
|
|
195
|
+
------
|
|
196
|
+
ValueError
|
|
197
|
+
If the streaming output type cannot be determined from the class definition
|
|
198
|
+
"""
|
|
199
|
+
for base_cls in self.__class__.__orig_bases__: # pylint: disable=no-member # type: ignore
|
|
200
|
+
|
|
201
|
+
base_cls_args = typing.get_args(base_cls)
|
|
202
|
+
|
|
203
|
+
if len(base_cls_args) == 3:
|
|
204
|
+
return base_cls_args[1]
|
|
205
|
+
|
|
206
|
+
raise ValueError("Could not find output schema")
|
|
207
|
+
|
|
208
|
+
@property
|
|
209
|
+
@lru_cache
|
|
210
|
+
def streaming_output_class(self) -> type:
|
|
211
|
+
"""
|
|
212
|
+
Get the python class of the output type. This is the class that can be used to check if a value is an instance
|
|
213
|
+
of the output type. It removes any generic or annotation information from the output type.
|
|
214
|
+
|
|
215
|
+
For example, if a function is defined as `def my_function(input: int) -> AsyncGenerator[dict[str, Any]]`,
|
|
216
|
+
the `streaming_output_class` is `dict`.
|
|
217
|
+
|
|
218
|
+
Returns
|
|
219
|
+
-------
|
|
220
|
+
type
|
|
221
|
+
The python type of the output type
|
|
222
|
+
"""
|
|
223
|
+
|
|
224
|
+
output_origin = typing.get_origin(self.streaming_output_type)
|
|
225
|
+
|
|
226
|
+
if (output_origin is None):
|
|
227
|
+
return self.streaming_output_type
|
|
228
|
+
|
|
229
|
+
return output_origin
|
|
230
|
+
|
|
231
|
+
@property
|
|
232
|
+
@lru_cache
|
|
233
|
+
def streaming_output_schema(self) -> type[BaseModel] | type[None]:
|
|
234
|
+
"""
|
|
235
|
+
Get the Pydantic model schema for validating streaming outputs. The schema must be pydantic models. This allows
|
|
236
|
+
for type validation and coercion, and documenting schema properties of the output value. If the output type is
|
|
237
|
+
already a pydantic model, it will be returned as is.
|
|
238
|
+
|
|
239
|
+
For example, if a function is defined as `def my_function(input: int) -> AsyncGenerator[dict[str, Any]]`,
|
|
240
|
+
the `streaming_output_schema` is::
|
|
241
|
+
|
|
242
|
+
class StreamingOutputSchema(BaseModel):
|
|
243
|
+
value: dict[str, Any]
|
|
244
|
+
|
|
245
|
+
Returns
|
|
246
|
+
-------
|
|
247
|
+
type[BaseModel] | type[None]
|
|
248
|
+
The Pydantic model class for streaming output validation, or NoneType if no streaming output.
|
|
249
|
+
"""
|
|
250
|
+
return self._streaming_output_schema
|
|
251
|
+
|
|
252
|
+
@property
|
|
253
|
+
@lru_cache
|
|
254
|
+
def single_output_type(self) -> type[SingleOutputT]:
|
|
255
|
+
"""
|
|
256
|
+
Get the single output type of the function. The single output type is determined by the generic parameters
|
|
257
|
+
of the class. Returns NoneType if no single output is supported.
|
|
258
|
+
|
|
259
|
+
For example, if a function is defined as `def my_function(input: int) -> list[str]`, the `single_output_type` is
|
|
260
|
+
`list[str]`.
|
|
261
|
+
|
|
262
|
+
Returns
|
|
263
|
+
-------
|
|
264
|
+
type[SingleOutputT]
|
|
265
|
+
The single output type specified in the generic parameters
|
|
266
|
+
|
|
267
|
+
Raises
|
|
268
|
+
------
|
|
269
|
+
ValueError
|
|
270
|
+
If the single output type cannot be determined from the class definition
|
|
271
|
+
"""
|
|
272
|
+
for base_cls in self.__class__.__orig_bases__: # pylint: disable=no-member # type: ignore
|
|
273
|
+
|
|
274
|
+
base_cls_args = typing.get_args(base_cls)
|
|
275
|
+
|
|
276
|
+
if len(base_cls_args) == 3:
|
|
277
|
+
return base_cls_args[2]
|
|
278
|
+
|
|
279
|
+
raise ValueError("Could not find output schema")
|
|
280
|
+
|
|
281
|
+
@property
|
|
282
|
+
@lru_cache
|
|
283
|
+
def single_output_class(self) -> type:
|
|
284
|
+
"""
|
|
285
|
+
Get the python class of the output type. This is the class that can be used to check if a value is an instance
|
|
286
|
+
of the output type. It removes any generic or annotation information from the output type.
|
|
287
|
+
|
|
288
|
+
For example, if a function is defined as `def my_function(input: int) -> list[str]`, the `single_output_class`
|
|
289
|
+
is `list`.
|
|
290
|
+
|
|
291
|
+
Returns
|
|
292
|
+
-------
|
|
293
|
+
type
|
|
294
|
+
The python type of the output type
|
|
295
|
+
"""
|
|
296
|
+
|
|
297
|
+
output_origin = typing.get_origin(self.single_output_type)
|
|
298
|
+
|
|
299
|
+
if (output_origin is None):
|
|
300
|
+
return self.single_output_type
|
|
301
|
+
|
|
302
|
+
return output_origin
|
|
303
|
+
|
|
304
|
+
@property
|
|
305
|
+
@lru_cache
|
|
306
|
+
def single_output_schema(self) -> type[BaseModel] | type[None]:
|
|
307
|
+
"""
|
|
308
|
+
Get the Pydantic model schema for validating single outputs. The schema must be pydantic models. This allows for
|
|
309
|
+
type validation and coercion, and documenting schema properties of the output value. If the output type is
|
|
310
|
+
already a pydantic model, it will be returned as is.
|
|
311
|
+
|
|
312
|
+
For example, if a function is defined as `def my_function(input: int) -> list[str]`, the `single_output_schema`
|
|
313
|
+
is::
|
|
314
|
+
|
|
315
|
+
class SingleOutputSchema(BaseModel):
|
|
316
|
+
value: list[str]
|
|
317
|
+
|
|
318
|
+
Returns
|
|
319
|
+
-------
|
|
320
|
+
type[BaseModel] | type[None]
|
|
321
|
+
The Pydantic model class for single output validation, or None if no single output
|
|
322
|
+
"""
|
|
323
|
+
return self._single_output_schema
|
|
324
|
+
|
|
325
|
+
@property
|
|
326
|
+
def has_streaming_output(self) -> bool:
|
|
327
|
+
"""
|
|
328
|
+
Check if this function supports streaming output.
|
|
329
|
+
|
|
330
|
+
Returns
|
|
331
|
+
-------
|
|
332
|
+
bool
|
|
333
|
+
True if the function supports streaming output, False otherwise
|
|
334
|
+
"""
|
|
335
|
+
# Override in derived classes if this needs to return False. Assumption is, if not overridden, it has streaming
|
|
336
|
+
# output because the ABC has it.
|
|
337
|
+
return True
|
|
338
|
+
|
|
339
|
+
@property
|
|
340
|
+
def has_single_output(self) -> bool:
|
|
341
|
+
"""
|
|
342
|
+
Check if this function supports single output.
|
|
343
|
+
|
|
344
|
+
Returns
|
|
345
|
+
-------
|
|
346
|
+
bool
|
|
347
|
+
True if the function supports single output, False otherwise
|
|
348
|
+
"""
|
|
349
|
+
# Override in derived classes if this needs to return False. Assumption is, if not overridden, it has single
|
|
350
|
+
# output because the ABC has it.
|
|
351
|
+
return True
|
|
352
|
+
|
|
353
|
+
def _convert_input(self, value: typing.Any) -> InputT:
|
|
354
|
+
if (isinstance(value, self.input_class)):
|
|
355
|
+
return value
|
|
356
|
+
|
|
357
|
+
# No converter, try to convert to the input schema
|
|
358
|
+
if (isinstance(value, dict)):
|
|
359
|
+
value = self.input_schema.model_validate(value)
|
|
360
|
+
|
|
361
|
+
if (self.input_type == self.input_schema):
|
|
362
|
+
return value
|
|
363
|
+
|
|
364
|
+
if (isinstance(value, self.input_schema)):
|
|
365
|
+
|
|
366
|
+
# Get the first value from the schema object
|
|
367
|
+
first_key = next(iter(self.input_schema.model_fields.keys()))
|
|
368
|
+
|
|
369
|
+
return getattr(value, first_key)
|
|
370
|
+
|
|
371
|
+
# If the value is None bypass conversion to avoid raising an error.
|
|
372
|
+
if value is None:
|
|
373
|
+
return value
|
|
374
|
+
|
|
375
|
+
# Fallback to the converter
|
|
376
|
+
try:
|
|
377
|
+
return self._converter.convert(value, to_type=self.input_class)
|
|
378
|
+
except ValueError as e:
|
|
379
|
+
# Input parsing should yield a TypeError instead of a ValueError
|
|
380
|
+
raise TypeError from e
|