nvidia-nat 1.4.0a20251120__py3-none-any.whl → 1.4.0a20260113__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 +1 -1
- nat/{front_ends/mcp → agent/auto_memory_wrapper}/__init__.py +1 -1
- nat/agent/auto_memory_wrapper/agent.py +278 -0
- nat/agent/auto_memory_wrapper/register.py +227 -0
- nat/agent/auto_memory_wrapper/state.py +30 -0
- nat/agent/base.py +1 -1
- nat/agent/dual_node.py +1 -1
- nat/agent/prompt_optimizer/prompt.py +1 -1
- nat/agent/prompt_optimizer/register.py +1 -1
- nat/agent/react_agent/agent.py +16 -9
- nat/agent/react_agent/output_parser.py +2 -2
- nat/agent/react_agent/prompt.py +3 -2
- nat/agent/react_agent/register.py +2 -2
- nat/agent/react_agent/register_per_user_agent.py +104 -0
- nat/agent/reasoning_agent/reasoning_agent.py +1 -1
- nat/agent/register.py +3 -1
- nat/agent/responses_api_agent/__init__.py +1 -1
- nat/agent/responses_api_agent/register.py +1 -1
- nat/agent/rewoo_agent/agent.py +9 -4
- nat/agent/rewoo_agent/prompt.py +1 -1
- nat/agent/rewoo_agent/register.py +1 -1
- nat/agent/tool_calling_agent/agent.py +5 -4
- nat/agent/tool_calling_agent/register.py +1 -1
- nat/authentication/__init__.py +1 -1
- nat/authentication/api_key/__init__.py +1 -1
- nat/authentication/api_key/api_key_auth_provider.py +1 -1
- nat/authentication/api_key/api_key_auth_provider_config.py +22 -7
- nat/authentication/api_key/register.py +1 -1
- nat/authentication/credential_validator/__init__.py +1 -1
- nat/authentication/credential_validator/bearer_token_validator.py +1 -1
- nat/authentication/exceptions/__init__.py +1 -1
- nat/authentication/exceptions/api_key_exceptions.py +1 -1
- nat/authentication/http_basic_auth/http_basic_auth_provider.py +1 -1
- nat/authentication/http_basic_auth/register.py +1 -1
- nat/authentication/interfaces.py +1 -1
- nat/authentication/oauth2/__init__.py +1 -1
- nat/authentication/oauth2/oauth2_auth_code_flow_provider.py +1 -1
- nat/authentication/oauth2/oauth2_auth_code_flow_provider_config.py +1 -1
- nat/authentication/oauth2/oauth2_resource_server_config.py +1 -1
- nat/authentication/oauth2/register.py +1 -1
- nat/authentication/register.py +1 -1
- nat/builder/builder.py +511 -1
- nat/builder/child_builder.py +385 -0
- nat/builder/component_utils.py +28 -4
- nat/builder/context.py +17 -1
- nat/builder/embedder.py +1 -1
- nat/builder/eval_builder.py +19 -7
- nat/builder/evaluator.py +1 -1
- nat/builder/framework_enum.py +2 -1
- nat/builder/front_end.py +1 -1
- nat/builder/function.py +40 -3
- nat/builder/function_base.py +1 -1
- nat/builder/function_info.py +1 -1
- nat/builder/intermediate_step_manager.py +1 -1
- nat/builder/llm.py +1 -1
- nat/builder/per_user_workflow_builder.py +843 -0
- nat/builder/retriever.py +1 -1
- nat/builder/sync_builder.py +571 -0
- nat/builder/user_interaction_manager.py +1 -1
- nat/builder/workflow.py +1 -1
- nat/builder/workflow_builder.py +536 -424
- nat/cli/__init__.py +1 -1
- nat/cli/cli_utils/config_override.py +1 -1
- nat/cli/cli_utils/validation.py +32 -1
- nat/cli/commands/configure/channel/add.py +1 -1
- nat/cli/commands/configure/channel/channel.py +1 -1
- nat/cli/commands/configure/channel/remove.py +1 -1
- nat/cli/commands/configure/channel/update.py +1 -1
- nat/cli/commands/configure/configure.py +1 -1
- nat/cli/commands/evaluate.py +87 -13
- nat/cli/commands/finetune.py +132 -0
- nat/cli/commands/info/__init__.py +1 -1
- nat/cli/commands/info/info.py +1 -1
- nat/cli/commands/info/list_channels.py +1 -1
- nat/cli/commands/info/list_components.py +1 -1
- nat/cli/commands/object_store/__init__.py +1 -1
- nat/cli/commands/object_store/object_store.py +1 -1
- nat/cli/commands/optimize.py +1 -1
- nat/cli/commands/{mcp → red_teaming}/__init__.py +1 -1
- nat/cli/commands/red_teaming/red_teaming.py +138 -0
- nat/cli/commands/red_teaming/red_teaming_utils.py +73 -0
- nat/cli/commands/registry/__init__.py +1 -1
- nat/cli/commands/registry/publish.py +1 -1
- nat/cli/commands/registry/pull.py +1 -1
- nat/cli/commands/registry/registry.py +1 -1
- nat/cli/commands/registry/remove.py +1 -1
- nat/cli/commands/registry/search.py +1 -1
- nat/cli/commands/sizing/__init__.py +1 -1
- nat/cli/commands/sizing/calc.py +1 -1
- nat/cli/commands/sizing/sizing.py +1 -1
- nat/cli/commands/start.py +1 -1
- nat/cli/commands/uninstall.py +1 -1
- nat/cli/commands/validate.py +1 -1
- nat/cli/commands/workflow/__init__.py +1 -1
- nat/cli/commands/workflow/workflow.py +1 -1
- nat/cli/commands/workflow/workflow_commands.py +3 -2
- nat/cli/entrypoint.py +15 -37
- nat/cli/main.py +2 -2
- nat/cli/plugin_loader.py +69 -0
- nat/cli/register_workflow.py +183 -5
- nat/cli/type_registry.py +169 -3
- nat/control_flow/register.py +1 -1
- nat/control_flow/router_agent/agent.py +1 -1
- nat/control_flow/router_agent/prompt.py +1 -1
- nat/control_flow/router_agent/register.py +1 -1
- nat/control_flow/sequential_executor.py +28 -7
- nat/data_models/__init__.py +1 -1
- nat/data_models/agent.py +1 -1
- nat/data_models/api_server.py +38 -3
- nat/data_models/authentication.py +1 -1
- nat/data_models/common.py +1 -1
- nat/data_models/component.py +7 -1
- nat/data_models/component_ref.py +34 -1
- nat/data_models/config.py +62 -1
- nat/data_models/dataset_handler.py +15 -2
- nat/data_models/discovery_metadata.py +1 -1
- nat/data_models/embedder.py +1 -1
- nat/data_models/evaluate.py +6 -1
- nat/data_models/evaluator.py +1 -1
- nat/data_models/finetuning.py +260 -0
- nat/data_models/front_end.py +1 -1
- nat/data_models/function.py +1 -1
- nat/data_models/function_dependencies.py +1 -1
- nat/data_models/gated_field_mixin.py +1 -1
- nat/data_models/interactive.py +1 -1
- nat/data_models/intermediate_step.py +29 -2
- nat/data_models/invocation_node.py +1 -1
- nat/data_models/llm.py +1 -1
- nat/data_models/logging.py +1 -1
- nat/data_models/memory.py +1 -1
- nat/data_models/middleware.py +3 -1
- nat/data_models/object_store.py +1 -1
- nat/data_models/openai_mcp.py +1 -1
- nat/data_models/optimizable.py +1 -1
- nat/data_models/optimizer.py +1 -1
- nat/data_models/profiler.py +1 -1
- nat/data_models/registry_handler.py +1 -1
- nat/data_models/retriever.py +1 -1
- nat/data_models/retry_mixin.py +1 -1
- nat/data_models/runtime_enum.py +1 -1
- nat/data_models/span.py +1 -1
- nat/data_models/step_adaptor.py +1 -1
- nat/data_models/streaming.py +1 -1
- nat/data_models/swe_bench_model.py +1 -1
- nat/data_models/telemetry_exporter.py +1 -1
- nat/data_models/thinking_mixin.py +1 -1
- nat/data_models/ttc_strategy.py +1 -1
- nat/embedder/azure_openai_embedder.py +1 -1
- nat/embedder/nim_embedder.py +1 -1
- nat/embedder/openai_embedder.py +1 -1
- nat/embedder/register.py +1 -1
- nat/eval/__init__.py +1 -1
- nat/eval/config.py +8 -1
- nat/eval/dataset_handler/dataset_downloader.py +1 -1
- nat/eval/dataset_handler/dataset_filter.py +1 -1
- nat/eval/dataset_handler/dataset_handler.py +4 -2
- nat/eval/evaluate.py +217 -80
- nat/eval/evaluator/__init__.py +1 -1
- nat/eval/evaluator/base_evaluator.py +2 -2
- nat/eval/evaluator/evaluator_model.py +3 -2
- nat/eval/intermediate_step_adapter.py +1 -1
- nat/eval/llm_validator.py +336 -0
- nat/eval/rag_evaluator/evaluate.py +17 -10
- nat/eval/rag_evaluator/register.py +1 -1
- nat/eval/red_teaming_evaluator/__init__.py +14 -0
- nat/eval/red_teaming_evaluator/data_models.py +66 -0
- nat/eval/red_teaming_evaluator/evaluate.py +327 -0
- nat/eval/red_teaming_evaluator/filter_conditions.py +75 -0
- nat/eval/red_teaming_evaluator/register.py +55 -0
- nat/eval/register.py +2 -1
- nat/eval/remote_workflow.py +1 -1
- nat/eval/runners/__init__.py +1 -1
- nat/eval/runners/config.py +1 -1
- nat/eval/runners/multi_eval_runner.py +1 -1
- nat/eval/runners/red_teaming_runner/__init__.py +24 -0
- nat/eval/runners/red_teaming_runner/config.py +282 -0
- nat/eval/runners/red_teaming_runner/report_utils.py +707 -0
- nat/eval/runners/red_teaming_runner/runner.py +867 -0
- nat/eval/runtime_evaluator/__init__.py +1 -1
- nat/eval/runtime_evaluator/evaluate.py +1 -1
- nat/eval/runtime_evaluator/register.py +1 -1
- nat/eval/runtime_event_subscriber.py +1 -1
- nat/eval/swe_bench_evaluator/evaluate.py +1 -1
- nat/eval/swe_bench_evaluator/register.py +1 -1
- nat/eval/trajectory_evaluator/evaluate.py +2 -2
- nat/eval/trajectory_evaluator/register.py +1 -1
- nat/eval/tunable_rag_evaluator/evaluate.py +5 -5
- nat/eval/tunable_rag_evaluator/register.py +1 -1
- nat/eval/usage_stats.py +1 -1
- nat/eval/utils/eval_trace_ctx.py +1 -1
- nat/eval/utils/output_uploader.py +1 -1
- nat/eval/utils/tqdm_position_registry.py +1 -1
- nat/eval/utils/weave_eval.py +1 -1
- nat/experimental/decorators/experimental_warning_decorator.py +1 -1
- nat/experimental/test_time_compute/editing/iterative_plan_refinement_editor.py +1 -1
- nat/experimental/test_time_compute/editing/llm_as_a_judge_editor.py +1 -1
- nat/experimental/test_time_compute/editing/motivation_aware_summarization.py +1 -1
- nat/experimental/test_time_compute/functions/execute_score_select_function.py +1 -1
- nat/experimental/test_time_compute/functions/multi_llm_judge_function.py +88 -0
- nat/experimental/test_time_compute/functions/plan_select_execute_function.py +1 -1
- nat/experimental/test_time_compute/functions/ttc_tool_orchestration_function.py +1 -1
- nat/experimental/test_time_compute/functions/ttc_tool_wrapper_function.py +1 -1
- nat/experimental/test_time_compute/models/editor_config.py +1 -1
- nat/experimental/test_time_compute/models/scoring_config.py +1 -1
- nat/experimental/test_time_compute/models/search_config.py +20 -2
- nat/experimental/test_time_compute/models/selection_config.py +33 -2
- nat/experimental/test_time_compute/models/stage_enums.py +1 -1
- nat/experimental/test_time_compute/models/strategy_base.py +1 -1
- nat/experimental/test_time_compute/models/tool_use_config.py +1 -1
- nat/experimental/test_time_compute/models/ttc_item.py +1 -1
- nat/experimental/test_time_compute/register.py +4 -1
- nat/experimental/test_time_compute/scoring/llm_based_agent_scorer.py +1 -1
- nat/experimental/test_time_compute/scoring/llm_based_plan_scorer.py +1 -1
- nat/experimental/test_time_compute/scoring/motivation_aware_scorer.py +1 -1
- nat/experimental/test_time_compute/search/multi_llm_generation.py +115 -0
- nat/experimental/test_time_compute/search/multi_llm_planner.py +1 -1
- nat/experimental/test_time_compute/search/multi_query_retrieval_search.py +1 -1
- nat/experimental/test_time_compute/search/single_shot_multi_plan_planner.py +1 -1
- nat/experimental/test_time_compute/selection/best_of_n_selector.py +1 -1
- nat/experimental/test_time_compute/selection/llm_based_agent_output_selector.py +1 -1
- nat/experimental/test_time_compute/selection/llm_based_output_merging_selector.py +1 -1
- nat/experimental/test_time_compute/selection/llm_based_plan_selector.py +1 -1
- nat/experimental/test_time_compute/selection/llm_judge_selection.py +127 -0
- nat/experimental/test_time_compute/selection/threshold_selector.py +1 -1
- nat/finetuning/__init__.py +24 -0
- nat/finetuning/finetuning_runtime.py +143 -0
- nat/finetuning/interfaces/__init__.py +24 -0
- nat/finetuning/interfaces/finetuning_runner.py +261 -0
- nat/finetuning/interfaces/trainer_adapter.py +103 -0
- nat/finetuning/interfaces/trajectory_builder.py +115 -0
- nat/finetuning/utils/__init__.py +15 -0
- nat/finetuning/utils/parsers/__init__.py +15 -0
- nat/finetuning/utils/parsers/adk_parser.py +141 -0
- nat/finetuning/utils/parsers/base_parser.py +238 -0
- nat/finetuning/utils/parsers/common.py +91 -0
- nat/finetuning/utils/parsers/langchain_parser.py +267 -0
- nat/finetuning/utils/parsers/llama_index_parser.py +218 -0
- nat/front_ends/__init__.py +1 -1
- nat/front_ends/console/__init__.py +1 -1
- nat/front_ends/console/authentication_flow_handler.py +1 -1
- nat/front_ends/console/console_front_end_config.py +4 -1
- nat/front_ends/console/console_front_end_plugin.py +5 -4
- nat/front_ends/console/register.py +1 -1
- nat/front_ends/cron/__init__.py +1 -1
- nat/front_ends/fastapi/__init__.py +1 -1
- nat/front_ends/fastapi/async_job.py +128 -0
- nat/front_ends/fastapi/auth_flow_handlers/http_flow_handler.py +1 -1
- nat/front_ends/fastapi/auth_flow_handlers/websocket_flow_handler.py +13 -9
- nat/front_ends/fastapi/dask_client_mixin.py +1 -1
- nat/front_ends/fastapi/fastapi_front_end_config.py +1 -1
- nat/front_ends/fastapi/fastapi_front_end_controller.py +1 -1
- nat/front_ends/fastapi/fastapi_front_end_plugin.py +25 -30
- nat/front_ends/fastapi/fastapi_front_end_plugin_worker.py +195 -60
- nat/front_ends/fastapi/html_snippets/__init__.py +1 -1
- nat/front_ends/fastapi/html_snippets/auth_code_grant_success.py +1 -1
- nat/front_ends/fastapi/intermediate_steps_subscriber.py +12 -1
- nat/front_ends/fastapi/job_store.py +23 -11
- nat/front_ends/fastapi/main.py +1 -1
- nat/front_ends/fastapi/message_handler.py +27 -4
- nat/front_ends/fastapi/message_validator.py +54 -2
- nat/front_ends/fastapi/register.py +1 -1
- nat/front_ends/fastapi/response_helpers.py +16 -15
- nat/front_ends/fastapi/step_adaptor.py +1 -1
- nat/front_ends/fastapi/utils.py +1 -1
- nat/front_ends/register.py +1 -2
- nat/front_ends/simple_base/__init__.py +1 -1
- nat/front_ends/simple_base/simple_front_end_plugin_base.py +6 -4
- nat/llm/aws_bedrock_llm.py +1 -1
- nat/llm/azure_openai_llm.py +10 -1
- nat/llm/dynamo_llm.py +363 -0
- nat/llm/huggingface_llm.py +177 -0
- nat/llm/litellm_llm.py +1 -1
- nat/llm/nim_llm.py +1 -1
- nat/llm/openai_llm.py +1 -1
- nat/llm/register.py +3 -1
- nat/llm/utils/__init__.py +1 -1
- nat/llm/utils/env_config_value.py +1 -1
- nat/llm/utils/error.py +1 -1
- nat/llm/utils/thinking.py +1 -1
- nat/memory/__init__.py +1 -1
- nat/memory/interfaces.py +1 -1
- nat/memory/models.py +1 -1
- nat/meta/pypi.md +1 -1
- nat/middleware/__init__.py +5 -5
- nat/middleware/cache/__init__.py +14 -0
- nat/middleware/{cache_middleware.py → cache/cache_middleware.py} +39 -42
- nat/middleware/cache/cache_middleware_config.py +44 -0
- nat/middleware/cache/register.py +33 -0
- nat/middleware/defense/__init__.py +14 -0
- nat/middleware/defense/defense_middleware.py +362 -0
- nat/middleware/defense/defense_middleware_content_guard.py +455 -0
- nat/middleware/defense/defense_middleware_data_models.py +91 -0
- nat/middleware/defense/defense_middleware_output_verifier.py +440 -0
- nat/middleware/defense/defense_middleware_pii.py +356 -0
- nat/middleware/defense/register.py +82 -0
- nat/middleware/dynamic/__init__.py +14 -0
- nat/middleware/dynamic/dynamic_function_middleware.py +962 -0
- nat/middleware/dynamic/dynamic_middleware_config.py +132 -0
- nat/middleware/dynamic/register.py +34 -0
- nat/middleware/function_middleware.py +236 -52
- nat/middleware/logging/__init__.py +14 -0
- nat/middleware/logging/logging_middleware.py +67 -0
- nat/middleware/logging/logging_middleware_config.py +28 -0
- nat/middleware/logging/register.py +33 -0
- nat/middleware/middleware.py +142 -28
- nat/middleware/red_teaming/__init__.py +14 -0
- nat/middleware/red_teaming/red_teaming_middleware.py +344 -0
- nat/middleware/red_teaming/red_teaming_middleware_config.py +112 -0
- nat/middleware/red_teaming/register.py +47 -0
- nat/middleware/register.py +7 -20
- nat/middleware/utils/__init__.py +14 -0
- nat/middleware/utils/workflow_inventory.py +155 -0
- nat/object_store/__init__.py +1 -1
- nat/object_store/in_memory_object_store.py +1 -1
- nat/object_store/interfaces.py +1 -1
- nat/object_store/models.py +1 -1
- nat/object_store/register.py +1 -1
- nat/observability/__init__.py +1 -1
- nat/observability/exporter/__init__.py +1 -1
- nat/observability/exporter/base_exporter.py +1 -1
- nat/observability/exporter/exporter.py +1 -1
- nat/observability/exporter/file_exporter.py +1 -1
- nat/observability/exporter/processing_exporter.py +1 -1
- nat/observability/exporter/raw_exporter.py +1 -1
- nat/observability/exporter/span_exporter.py +7 -1
- nat/observability/exporter_manager.py +1 -1
- nat/observability/mixin/__init__.py +1 -1
- nat/observability/mixin/batch_config_mixin.py +1 -1
- nat/observability/mixin/collector_config_mixin.py +1 -1
- nat/observability/mixin/file_mixin.py +1 -1
- nat/observability/mixin/file_mode.py +1 -1
- nat/observability/mixin/redaction_config_mixin.py +1 -1
- nat/observability/mixin/resource_conflict_mixin.py +1 -1
- nat/observability/mixin/serialize_mixin.py +1 -1
- nat/observability/mixin/tagging_config_mixin.py +1 -1
- nat/observability/mixin/type_introspection_mixin.py +1 -1
- nat/observability/processor/__init__.py +1 -1
- nat/observability/processor/batching_processor.py +1 -1
- nat/observability/processor/callback_processor.py +1 -1
- nat/observability/processor/falsy_batch_filter_processor.py +1 -1
- nat/observability/processor/intermediate_step_serializer.py +1 -1
- nat/observability/processor/processor.py +1 -1
- nat/observability/processor/processor_factory.py +1 -1
- nat/observability/processor/redaction/__init__.py +1 -1
- nat/observability/processor/redaction/contextual_redaction_processor.py +1 -1
- nat/observability/processor/redaction/contextual_span_redaction_processor.py +1 -1
- nat/observability/processor/redaction/redaction_processor.py +1 -1
- nat/observability/processor/redaction/span_header_redaction_processor.py +1 -1
- nat/observability/processor/span_tagging_processor.py +1 -1
- nat/observability/register.py +1 -1
- nat/observability/utils/__init__.py +1 -1
- nat/observability/utils/dict_utils.py +1 -1
- nat/observability/utils/time_utils.py +1 -1
- nat/profiler/calc/__init__.py +1 -1
- nat/profiler/calc/calc_runner.py +3 -3
- nat/profiler/calc/calculations.py +1 -1
- nat/profiler/calc/data_models.py +1 -1
- nat/profiler/calc/plot.py +30 -3
- nat/profiler/callbacks/agno_callback_handler.py +1 -1
- nat/profiler/callbacks/base_callback_class.py +1 -1
- nat/profiler/callbacks/langchain_callback_handler.py +33 -3
- nat/profiler/callbacks/llama_index_callback_handler.py +13 -10
- nat/profiler/callbacks/semantic_kernel_callback_handler.py +1 -1
- nat/profiler/callbacks/token_usage_base_model.py +1 -1
- nat/profiler/data_frame_row.py +1 -1
- nat/profiler/data_models.py +1 -1
- nat/profiler/decorators/framework_wrapper.py +16 -1
- nat/profiler/decorators/function_tracking.py +1 -1
- nat/profiler/forecasting/config.py +1 -1
- nat/profiler/forecasting/model_trainer.py +1 -1
- nat/profiler/forecasting/models/__init__.py +1 -1
- nat/profiler/forecasting/models/forecasting_base_model.py +1 -1
- nat/profiler/forecasting/models/linear_model.py +1 -1
- nat/profiler/forecasting/models/random_forest_regressor.py +1 -1
- nat/profiler/inference_metrics_model.py +1 -1
- nat/profiler/inference_optimization/bottleneck_analysis/nested_stack_analysis.py +1 -1
- nat/profiler/inference_optimization/bottleneck_analysis/simple_stack_analysis.py +1 -1
- nat/profiler/inference_optimization/data_models.py +1 -1
- nat/profiler/inference_optimization/experimental/concurrency_spike_analysis.py +1 -1
- nat/profiler/inference_optimization/experimental/prefix_span_analysis.py +1 -1
- nat/profiler/inference_optimization/llm_metrics.py +1 -1
- nat/profiler/inference_optimization/prompt_caching.py +1 -1
- nat/profiler/inference_optimization/token_uniqueness.py +1 -1
- nat/profiler/inference_optimization/workflow_runtimes.py +1 -1
- nat/profiler/intermediate_property_adapter.py +1 -1
- nat/profiler/parameter_optimization/optimizable_utils.py +1 -1
- nat/profiler/parameter_optimization/optimizer_runtime.py +1 -1
- nat/profiler/parameter_optimization/parameter_optimizer.py +1 -1
- nat/profiler/parameter_optimization/parameter_selection.py +1 -1
- nat/profiler/parameter_optimization/pareto_visualizer.py +1 -1
- nat/profiler/parameter_optimization/prompt_optimizer.py +1 -1
- nat/profiler/parameter_optimization/update_helpers.py +1 -1
- nat/profiler/profile_runner.py +1 -1
- nat/profiler/utils.py +1 -1
- nat/registry_handlers/local/local_handler.py +1 -1
- nat/registry_handlers/local/register_local.py +1 -1
- nat/registry_handlers/metadata_factory.py +1 -1
- nat/registry_handlers/package_utils.py +1 -1
- nat/registry_handlers/pypi/pypi_handler.py +1 -1
- nat/registry_handlers/pypi/register_pypi.py +1 -1
- nat/registry_handlers/register.py +1 -1
- nat/registry_handlers/registry_handler_base.py +1 -1
- nat/registry_handlers/rest/register_rest.py +1 -1
- nat/registry_handlers/rest/rest_handler.py +1 -1
- nat/registry_handlers/schemas/headers.py +1 -1
- nat/registry_handlers/schemas/package.py +1 -1
- nat/registry_handlers/schemas/publish.py +1 -1
- nat/registry_handlers/schemas/pull.py +1 -1
- nat/registry_handlers/schemas/remove.py +1 -1
- nat/registry_handlers/schemas/search.py +1 -1
- nat/registry_handlers/schemas/status.py +1 -1
- nat/retriever/interface.py +1 -1
- nat/retriever/milvus/__init__.py +1 -1
- nat/retriever/milvus/register.py +1 -1
- nat/retriever/milvus/retriever.py +1 -1
- nat/retriever/models.py +1 -1
- nat/retriever/nemo_retriever/__init__.py +1 -1
- nat/retriever/nemo_retriever/register.py +1 -1
- nat/retriever/nemo_retriever/retriever.py +5 -5
- nat/retriever/register.py +1 -1
- nat/runtime/__init__.py +1 -1
- nat/runtime/loader.py +10 -3
- nat/runtime/metrics.py +180 -0
- nat/runtime/runner.py +1 -5
- nat/runtime/session.py +451 -32
- nat/runtime/user_metadata.py +1 -1
- nat/settings/global_settings.py +1 -1
- nat/tool/chat_completion.py +1 -1
- nat/tool/code_execution/README.md +1 -1
- nat/tool/code_execution/code_sandbox.py +1 -1
- nat/tool/code_execution/local_sandbox/Dockerfile.sandbox +1 -1
- nat/tool/code_execution/local_sandbox/__init__.py +1 -1
- nat/tool/code_execution/local_sandbox/local_sandbox_server.py +1 -1
- nat/tool/code_execution/local_sandbox/start_local_sandbox.sh +1 -1
- nat/tool/code_execution/register.py +1 -1
- nat/tool/code_execution/utils.py +1 -1
- nat/tool/datetime_tools.py +1 -1
- nat/tool/document_search.py +1 -1
- nat/tool/github_tools.py +1 -1
- nat/tool/memory_tools/add_memory_tool.py +1 -1
- nat/tool/memory_tools/delete_memory_tool.py +1 -1
- nat/tool/memory_tools/get_memory_tool.py +1 -1
- nat/tool/nvidia_rag.py +2 -2
- nat/tool/register.py +1 -1
- nat/tool/retriever.py +1 -1
- nat/tool/server_tools.py +1 -1
- nat/utils/__init__.py +8 -5
- nat/utils/callable_utils.py +1 -1
- nat/utils/data_models/schema_validator.py +1 -1
- nat/utils/debugging_utils.py +1 -1
- nat/utils/decorators.py +1 -1
- nat/utils/dump_distro_mapping.py +1 -1
- nat/utils/exception_handlers/automatic_retries.py +3 -3
- nat/utils/exception_handlers/schemas.py +1 -1
- nat/utils/io/model_processing.py +1 -1
- nat/utils/io/supress_logs.py +33 -0
- nat/utils/io/yaml_tools.py +1 -1
- nat/utils/log_levels.py +1 -1
- nat/utils/log_utils.py +13 -1
- nat/utils/metadata_utils.py +1 -1
- nat/utils/optional_imports.py +1 -1
- nat/utils/producer_consumer_queue.py +1 -1
- nat/utils/reactive/base/observable_base.py +1 -1
- nat/utils/reactive/base/observer_base.py +1 -1
- nat/utils/reactive/base/subject_base.py +1 -1
- nat/utils/reactive/observable.py +1 -1
- nat/utils/reactive/observer.py +1 -1
- nat/utils/reactive/subject.py +1 -1
- nat/utils/reactive/subscription.py +1 -1
- nat/utils/responses_api.py +1 -1
- nat/utils/settings/global_settings.py +1 -1
- nat/utils/string_utils.py +1 -1
- nat/utils/type_converter.py +18 -5
- nat/utils/type_utils.py +1 -1
- nat/utils/url_utils.py +1 -1
- {nvidia_nat-1.4.0a20251120.dist-info → nvidia_nat-1.4.0a20260113.dist-info}/METADATA +39 -14
- nvidia_nat-1.4.0a20260113.dist-info/RECORD +547 -0
- nvidia_nat-1.4.0a20260113.dist-info/entry_points.txt +38 -0
- nat/cli/commands/mcp/mcp.py +0 -986
- nat/front_ends/mcp/introspection_token_verifier.py +0 -73
- nat/front_ends/mcp/mcp_front_end_config.py +0 -109
- nat/front_ends/mcp/mcp_front_end_plugin.py +0 -155
- nat/front_ends/mcp/mcp_front_end_plugin_worker.py +0 -388
- nat/front_ends/mcp/memory_profiler.py +0 -320
- nat/front_ends/mcp/register.py +0 -27
- nat/front_ends/mcp/tool_converter.py +0 -321
- nvidia_nat-1.4.0a20251120.dist-info/RECORD +0 -488
- nvidia_nat-1.4.0a20251120.dist-info/entry_points.txt +0 -23
- {nvidia_nat-1.4.0a20251120.dist-info → nvidia_nat-1.4.0a20260113.dist-info}/WHEEL +0 -0
- {nvidia_nat-1.4.0a20251120.dist-info → nvidia_nat-1.4.0a20260113.dist-info}/licenses/LICENSE-3rd-party.txt +0 -0
- {nvidia_nat-1.4.0a20251120.dist-info → nvidia_nat-1.4.0a20260113.dist-info}/licenses/LICENSE.md +0 -0
- {nvidia_nat-1.4.0a20251120.dist-info → nvidia_nat-1.4.0a20260113.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2026, 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
|
+
The functions in this module are intentionally written to be submitted as Dask tasks, as such they are self-contained.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import asyncio
|
|
20
|
+
import logging
|
|
21
|
+
import typing
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _configure_logging(configure_logging: bool, log_level: int) -> logging.Logger:
|
|
25
|
+
from nat.utils.log_utils import setup_logging
|
|
26
|
+
if configure_logging:
|
|
27
|
+
setup_logging(log_level)
|
|
28
|
+
|
|
29
|
+
return logging.getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
async def run_generation(configure_logging: bool,
|
|
33
|
+
log_level: int,
|
|
34
|
+
scheduler_address: str,
|
|
35
|
+
db_url: str,
|
|
36
|
+
config_file_path: str,
|
|
37
|
+
job_id: str,
|
|
38
|
+
payload: typing.Any):
|
|
39
|
+
"""
|
|
40
|
+
Background async task to run the workflow.
|
|
41
|
+
|
|
42
|
+
Parameters
|
|
43
|
+
----------
|
|
44
|
+
configure_logging : bool
|
|
45
|
+
Whether to configure logging.
|
|
46
|
+
log_level : int
|
|
47
|
+
The log level to use when `configure_logging` is `True`, ignored otherwise.
|
|
48
|
+
scheduler_address : str
|
|
49
|
+
The Dask scheduler address.
|
|
50
|
+
db_url : str
|
|
51
|
+
The database URL for the job store.
|
|
52
|
+
config_file_path : str
|
|
53
|
+
The path to the workflow configuration file.
|
|
54
|
+
job_id : str
|
|
55
|
+
The job ID.
|
|
56
|
+
payload : typing.Any
|
|
57
|
+
The input payload for the workflow.
|
|
58
|
+
"""
|
|
59
|
+
from nat.front_ends.fastapi.job_store import JobStatus
|
|
60
|
+
from nat.front_ends.fastapi.job_store import JobStore
|
|
61
|
+
from nat.front_ends.fastapi.response_helpers import generate_single_response
|
|
62
|
+
from nat.runtime.loader import load_workflow
|
|
63
|
+
|
|
64
|
+
logger = _configure_logging(configure_logging, log_level)
|
|
65
|
+
|
|
66
|
+
job_store = None
|
|
67
|
+
try:
|
|
68
|
+
job_store = JobStore(scheduler_address=scheduler_address, db_url=db_url)
|
|
69
|
+
await job_store.update_status(job_id, JobStatus.RUNNING)
|
|
70
|
+
async with load_workflow(config_file_path) as local_session_manager:
|
|
71
|
+
async with local_session_manager.session() as session:
|
|
72
|
+
result = await generate_single_response(payload,
|
|
73
|
+
session,
|
|
74
|
+
result_type=session.workflow.single_output_schema)
|
|
75
|
+
|
|
76
|
+
await job_store.update_status(job_id, JobStatus.SUCCESS, output=result)
|
|
77
|
+
except asyncio.CancelledError:
|
|
78
|
+
logger.info("Async job %s cancelled", job_id)
|
|
79
|
+
if job_store is not None:
|
|
80
|
+
await job_store.update_status(job_id, JobStatus.INTERRUPTED, error="cancelled")
|
|
81
|
+
except Exception as e:
|
|
82
|
+
logger.exception("Error in async job %s", job_id)
|
|
83
|
+
if job_store is not None:
|
|
84
|
+
await job_store.update_status(job_id, JobStatus.FAILURE, error=str(e))
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
async def periodic_cleanup(*,
|
|
88
|
+
scheduler_address: str,
|
|
89
|
+
db_url: str,
|
|
90
|
+
sleep_time_sec: int = 300,
|
|
91
|
+
configure_logging: bool = True,
|
|
92
|
+
log_level: int = logging.INFO):
|
|
93
|
+
"""
|
|
94
|
+
Dask task to periodically clean up expired jobs from the job store. This task is intended to be submitted only
|
|
95
|
+
once to the Dask cluster and run indefinitely.
|
|
96
|
+
|
|
97
|
+
Parameters
|
|
98
|
+
----------
|
|
99
|
+
scheduler_address : str
|
|
100
|
+
The Dask scheduler address.
|
|
101
|
+
db_url : str
|
|
102
|
+
The database URL for the job store.
|
|
103
|
+
sleep_time_sec : int
|
|
104
|
+
The sleep time between cleanup operations in seconds.
|
|
105
|
+
configure_logging : bool
|
|
106
|
+
Whether to configure logging.
|
|
107
|
+
log_level : int
|
|
108
|
+
The log level to use when `configure_logging` is `True`, ignored otherwise.
|
|
109
|
+
"""
|
|
110
|
+
from nat.front_ends.fastapi.job_store import JobStore
|
|
111
|
+
|
|
112
|
+
logger = _configure_logging(configure_logging, log_level)
|
|
113
|
+
|
|
114
|
+
job_store = None
|
|
115
|
+
|
|
116
|
+
logger.info("Starting periodic cleanup of expired jobs every %d seconds", sleep_time_sec)
|
|
117
|
+
while True:
|
|
118
|
+
await asyncio.sleep(sleep_time_sec)
|
|
119
|
+
|
|
120
|
+
try:
|
|
121
|
+
if job_store is None:
|
|
122
|
+
job_store = JobStore(scheduler_address=scheduler_address, db_url=db_url)
|
|
123
|
+
|
|
124
|
+
num_expired = await job_store.cleanup_expired_jobs()
|
|
125
|
+
logger.info("Expired jobs cleaned up: %d", num_expired)
|
|
126
|
+
except: # noqa: E722
|
|
127
|
+
logger.exception("Error during job cleanup")
|
|
128
|
+
job_store = None # Reset job store to attempt re-creation on next iteration
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
2
|
# SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
#
|
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
2
|
# SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
#
|
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -49,14 +49,18 @@ class WebSocketAuthenticationFlowHandler(FlowHandlerBase):
|
|
|
49
49
|
def __init__(self,
|
|
50
50
|
add_flow_cb: Callable[[str, FlowState], Awaitable[None]],
|
|
51
51
|
remove_flow_cb: Callable[[str], Awaitable[None]],
|
|
52
|
-
web_socket_message_handler: WebSocketMessageHandler
|
|
52
|
+
web_socket_message_handler: WebSocketMessageHandler,
|
|
53
|
+
auth_timeout_seconds: float = 300.0):
|
|
53
54
|
|
|
54
55
|
self._add_flow_cb: Callable[[str, FlowState], Awaitable[None]] = add_flow_cb
|
|
55
56
|
self._remove_flow_cb: Callable[[str], Awaitable[None]] = remove_flow_cb
|
|
56
57
|
self._web_socket_message_handler: WebSocketMessageHandler = web_socket_message_handler
|
|
58
|
+
self._auth_timeout_seconds: float = auth_timeout_seconds
|
|
57
59
|
|
|
58
|
-
async def authenticate(
|
|
59
|
-
|
|
60
|
+
async def authenticate(
|
|
61
|
+
self,
|
|
62
|
+
config: OAuth2AuthCodeFlowProviderConfig, # type: ignore[override]
|
|
63
|
+
method: AuthFlowType) -> AuthenticatedContext:
|
|
60
64
|
if method == AuthFlowType.OAUTH2_AUTHORIZATION_CODE:
|
|
61
65
|
return await self._handle_oauth2_auth_code_flow(config)
|
|
62
66
|
|
|
@@ -65,7 +69,7 @@ class WebSocketAuthenticationFlowHandler(FlowHandlerBase):
|
|
|
65
69
|
def create_oauth_client(self, config: OAuth2AuthCodeFlowProviderConfig) -> AsyncOAuth2Client:
|
|
66
70
|
try:
|
|
67
71
|
return AsyncOAuth2Client(client_id=config.client_id,
|
|
68
|
-
client_secret=config.client_secret,
|
|
72
|
+
client_secret=config.client_secret.get_secret_value(),
|
|
69
73
|
redirect_uri=config.redirect_uri,
|
|
70
74
|
scope=" ".join(config.scopes) if config.scopes else None,
|
|
71
75
|
token_endpoint=config.token_url,
|
|
@@ -80,8 +84,8 @@ class WebSocketAuthenticationFlowHandler(FlowHandlerBase):
|
|
|
80
84
|
client: AsyncOAuth2Client,
|
|
81
85
|
config: OAuth2AuthCodeFlowProviderConfig,
|
|
82
86
|
state: str,
|
|
83
|
-
verifier: str = None,
|
|
84
|
-
challenge: str = None) -> str:
|
|
87
|
+
verifier: str | None = None,
|
|
88
|
+
challenge: str | None = None) -> str:
|
|
85
89
|
"""
|
|
86
90
|
Create OAuth authorization URL with proper error handling.
|
|
87
91
|
|
|
@@ -129,9 +133,9 @@ class WebSocketAuthenticationFlowHandler(FlowHandlerBase):
|
|
|
129
133
|
await self._web_socket_message_handler.create_websocket_message(_HumanPromptOAuthConsent(text=authorization_url)
|
|
130
134
|
)
|
|
131
135
|
try:
|
|
132
|
-
token = await asyncio.wait_for(flow_state.future, timeout=
|
|
136
|
+
token = await asyncio.wait_for(flow_state.future, timeout=self._auth_timeout_seconds)
|
|
133
137
|
except TimeoutError as exc:
|
|
134
|
-
raise RuntimeError("Authentication flow timed out after
|
|
138
|
+
raise RuntimeError(f"Authentication flow timed out after {self._auth_timeout_seconds} seconds.") from exc
|
|
135
139
|
finally:
|
|
136
140
|
|
|
137
141
|
await self._remove_flow_cb(state)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
2
|
# SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
#
|
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
2
|
# SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
#
|
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
2
|
# SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
#
|
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
2
|
# SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
#
|
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
|
-
import
|
|
16
|
+
import copy
|
|
17
17
|
import logging
|
|
18
18
|
import os
|
|
19
19
|
import sys
|
|
@@ -21,6 +21,7 @@ import tempfile
|
|
|
21
21
|
import typing
|
|
22
22
|
|
|
23
23
|
from nat.builder.front_end import FrontEndBase
|
|
24
|
+
from nat.front_ends.fastapi.async_job import periodic_cleanup
|
|
24
25
|
from nat.front_ends.fastapi.dask_client_mixin import DaskClientMixin
|
|
25
26
|
from nat.front_ends.fastapi.fastapi_front_end_config import FastApiFrontEndConfig
|
|
26
27
|
from nat.front_ends.fastapi.fastapi_front_end_plugin_worker import FastApiFrontEndPluginWorkerBase
|
|
@@ -28,6 +29,7 @@ from nat.front_ends.fastapi.main import get_app
|
|
|
28
29
|
from nat.front_ends.fastapi.utils import get_class_name
|
|
29
30
|
from nat.utils.io.yaml_tools import yaml_dump
|
|
30
31
|
from nat.utils.log_levels import LOG_LEVELS
|
|
32
|
+
from nat.utils.log_utils import LOG_DATE_FORMAT
|
|
31
33
|
|
|
32
34
|
if (typing.TYPE_CHECKING):
|
|
33
35
|
from nat.data_models.config import Config
|
|
@@ -44,6 +46,7 @@ class FastApiFrontEndPlugin(DaskClientMixin, FrontEndBase[FastApiFrontEndConfig]
|
|
|
44
46
|
self._cluster = None
|
|
45
47
|
self._periodic_cleanup_future = None
|
|
46
48
|
self._scheduler_address = None
|
|
49
|
+
self._use_dask_threads = False
|
|
47
50
|
|
|
48
51
|
def get_worker_class(self) -> type[FastApiFrontEndPluginWorkerBase]:
|
|
49
52
|
from nat.front_ends.fastapi.fastapi_front_end_plugin_worker import FastApiFrontEndPluginWorker
|
|
@@ -60,34 +63,15 @@ class FastApiFrontEndPlugin(DaskClientMixin, FrontEndBase[FastApiFrontEndConfig]
|
|
|
60
63
|
|
|
61
64
|
return get_class_name(worker_class)
|
|
62
65
|
|
|
63
|
-
@staticmethod
|
|
64
|
-
async def _periodic_cleanup(scheduler_address: str,
|
|
65
|
-
db_url: str,
|
|
66
|
-
sleep_time_sec: int = 300,
|
|
67
|
-
log_level: int = logging.INFO):
|
|
68
|
-
from nat.front_ends.fastapi.job_store import JobStore
|
|
69
|
-
|
|
70
|
-
job_store = JobStore(scheduler_address=scheduler_address, db_url=db_url)
|
|
71
|
-
|
|
72
|
-
logging.basicConfig(level=log_level)
|
|
73
|
-
logger.info("Starting periodic cleanup of expired jobs every %d seconds", sleep_time_sec)
|
|
74
|
-
while True:
|
|
75
|
-
await asyncio.sleep(sleep_time_sec)
|
|
76
|
-
|
|
77
|
-
try:
|
|
78
|
-
await job_store.cleanup_expired_jobs()
|
|
79
|
-
logger.debug("Expired jobs cleaned up")
|
|
80
|
-
except: # noqa: E722
|
|
81
|
-
logger.exception("Error during job cleanup")
|
|
82
|
-
|
|
83
66
|
async def _submit_cleanup_task(self, scheduler_address: str, db_url: str, log_level: int = logging.INFO):
|
|
84
67
|
"""Submit a cleanup task to the cluster to remove the job after expiry."""
|
|
85
|
-
logger.
|
|
68
|
+
logger.info("Submitting periodic cleanup task to Dask cluster at %s", scheduler_address)
|
|
86
69
|
async with self.client(self._scheduler_address) as client:
|
|
87
|
-
self._periodic_cleanup_future = client.submit(
|
|
70
|
+
self._periodic_cleanup_future = client.submit(periodic_cleanup,
|
|
88
71
|
scheduler_address=self._scheduler_address,
|
|
89
72
|
db_url=db_url,
|
|
90
|
-
log_level=log_level
|
|
73
|
+
log_level=log_level,
|
|
74
|
+
configure_logging=not self._use_dask_threads)
|
|
91
75
|
|
|
92
76
|
@staticmethod
|
|
93
77
|
def _setup_worker():
|
|
@@ -99,6 +83,7 @@ class FastApiFrontEndPlugin(DaskClientMixin, FrontEndBase[FastApiFrontEndConfig]
|
|
|
99
83
|
os.setsid()
|
|
100
84
|
|
|
101
85
|
async def run(self):
|
|
86
|
+
log_level = logger.getEffectiveLevel()
|
|
102
87
|
|
|
103
88
|
# Write the entire config to a temporary file
|
|
104
89
|
with tempfile.NamedTemporaryFile(mode="w", prefix="nat_config", suffix=".yml", delete=False) as config_file:
|
|
@@ -120,17 +105,17 @@ class FastApiFrontEndPlugin(DaskClientMixin, FrontEndBase[FastApiFrontEndConfig]
|
|
|
120
105
|
|
|
121
106
|
from dask.distributed import LocalCluster
|
|
122
107
|
|
|
123
|
-
|
|
108
|
+
self._use_dask_threads = self.front_end_config.dask_workers == 'threads'
|
|
124
109
|
|
|
125
110
|
# set n_workers to max_running_async_jobs + 1 to allow for one worker to handle the cleanup task
|
|
126
|
-
self._cluster = LocalCluster(processes=not
|
|
111
|
+
self._cluster = LocalCluster(processes=not self._use_dask_threads,
|
|
127
112
|
silence_logs=dask_log_level,
|
|
128
113
|
protocol="tcp",
|
|
129
114
|
n_workers=self.front_end_config.max_running_async_jobs + 1)
|
|
130
115
|
|
|
131
116
|
self._scheduler_address = self._cluster.scheduler.address
|
|
132
117
|
|
|
133
|
-
if not
|
|
118
|
+
if not self._use_dask_threads and sys.platform != "win32":
|
|
134
119
|
with self.blocking_client(self._scheduler_address) as client:
|
|
135
120
|
# Client.run submits a function to be run on each worker
|
|
136
121
|
client.run(self._setup_worker)
|
|
@@ -156,13 +141,15 @@ class FastApiFrontEndPlugin(DaskClientMixin, FrontEndBase[FastApiFrontEndConfig]
|
|
|
156
141
|
db_url = str(db_engine.url)
|
|
157
142
|
await self._submit_cleanup_task(scheduler_address=self._scheduler_address,
|
|
158
143
|
db_url=db_url,
|
|
159
|
-
log_level=
|
|
144
|
+
log_level=log_level)
|
|
160
145
|
|
|
161
146
|
# Set environment variabls such that the worker subprocesses will know how to connect to dask and to
|
|
162
147
|
# the database
|
|
163
148
|
os.environ.update({
|
|
164
149
|
"NAT_DASK_SCHEDULER_ADDRESS": self._scheduler_address,
|
|
165
150
|
"NAT_JOB_STORE_DB_URL": db_url,
|
|
151
|
+
"NAT_USE_DASK_THREADS": str(int(self._use_dask_threads)),
|
|
152
|
+
"NAT_FASTAPI_LOG_LEVEL": str(log_level),
|
|
166
153
|
})
|
|
167
154
|
|
|
168
155
|
# Write to YAML file
|
|
@@ -194,6 +181,12 @@ class FastApiFrontEndPlugin(DaskClientMixin, FrontEndBase[FastApiFrontEndConfig]
|
|
|
194
181
|
# For non-macOS platforms
|
|
195
182
|
event_loop_policy = "auto"
|
|
196
183
|
|
|
184
|
+
# Start with the default uvicorn logging config, but override with our desired format
|
|
185
|
+
log_config = copy.deepcopy(uvicorn.config.LOGGING_CONFIG)
|
|
186
|
+
for formatter in log_config.get("formatters", {}).values():
|
|
187
|
+
formatter["fmt"] = f"%(asctime)s - {formatter['fmt']}"
|
|
188
|
+
formatter["datefmt"] = LOG_DATE_FORMAT
|
|
189
|
+
|
|
197
190
|
uvicorn.run("nat.front_ends.fastapi.main:get_app",
|
|
198
191
|
host=self.front_end_config.host,
|
|
199
192
|
port=self.front_end_config.port,
|
|
@@ -201,7 +194,9 @@ class FastApiFrontEndPlugin(DaskClientMixin, FrontEndBase[FastApiFrontEndConfig]
|
|
|
201
194
|
reload=self.front_end_config.reload,
|
|
202
195
|
factory=True,
|
|
203
196
|
reload_excludes=reload_excludes,
|
|
204
|
-
loop=event_loop_policy
|
|
197
|
+
loop=event_loop_policy,
|
|
198
|
+
log_level=log_level,
|
|
199
|
+
log_config=log_config)
|
|
205
200
|
|
|
206
201
|
else:
|
|
207
202
|
app = get_app()
|