nvidia-nat 1.4.0a20251112__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 +563 -1
- nat/builder/child_builder.py +385 -0
- nat/builder/component_utils.py +34 -4
- nat/builder/context.py +34 -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 +3 -1
- nat/builder/front_end.py +1 -1
- nat/builder/function.py +113 -5
- 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 +5 -3
- nat/builder/workflow_builder.py +619 -378
- 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 +233 -5
- nat/cli/type_registry.py +237 -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 +9 -1
- nat/data_models/component_ref.py +45 -1
- nat/data_models/config.py +78 -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 +15 -2
- 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 +37 -0
- 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 +26 -0
- 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 +226 -81
- 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 +23 -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 +318 -59
- 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 +35 -0
- nat/middleware/cache/__init__.py +14 -0
- nat/middleware/cache/cache_middleware.py +253 -0
- 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 +370 -0
- 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 +298 -0
- 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 +22 -0
- 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 +32 -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 +12 -4
- nat/retriever/milvus/retriever.py +103 -41
- 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 +13 -6
- nat/runtime/session.py +458 -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 +2 -2
- 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.0a20251112.dist-info → nvidia_nat-1.4.0a20260113.dist-info}/METADATA +46 -15
- 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 -151
- nat/front_ends/mcp/mcp_front_end_plugin_worker.py +0 -362
- 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.0a20251112.dist-info/RECORD +0 -481
- nvidia_nat-1.4.0a20251112.dist-info/entry_points.txt +0 -22
- {nvidia_nat-1.4.0a20251112.dist-info → nvidia_nat-1.4.0a20260113.dist-info}/WHEEL +0 -0
- {nvidia_nat-1.4.0a20251112.dist-info → nvidia_nat-1.4.0a20260113.dist-info}/licenses/LICENSE-3rd-party.txt +0 -0
- {nvidia_nat-1.4.0a20251112.dist-info → nvidia_nat-1.4.0a20260113.dist-info}/licenses/LICENSE.md +0 -0
- {nvidia_nat-1.4.0a20251112.dist-info → nvidia_nat-1.4.0a20260113.dist-info}/top_level.txt +0 -0
|
@@ -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");
|
|
@@ -208,13 +208,14 @@ class JobStore(DaskClientMixin):
|
|
|
208
208
|
AsyncSession
|
|
209
209
|
An active SQLAlchemy async session with an open transaction.
|
|
210
210
|
"""
|
|
211
|
-
|
|
212
|
-
async with
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
211
|
+
try:
|
|
212
|
+
async with self._session() as session:
|
|
213
|
+
async with session.begin():
|
|
214
|
+
yield session
|
|
215
|
+
finally:
|
|
216
|
+
# Removes the current task key from the session registry, preventing
|
|
217
|
+
# potential memory leaks
|
|
218
|
+
await self._session.remove()
|
|
218
219
|
|
|
219
220
|
def ensure_job_id(self, job_id: str | None) -> str:
|
|
220
221
|
"""
|
|
@@ -502,13 +503,14 @@ class JobStore(DaskClientMixin):
|
|
|
502
503
|
|
|
503
504
|
return updated_at + timedelta(seconds=job.expiry_seconds)
|
|
504
505
|
|
|
505
|
-
async def cleanup_expired_jobs(self):
|
|
506
|
+
async def cleanup_expired_jobs(self) -> int:
|
|
506
507
|
"""
|
|
507
508
|
Cleanup expired jobs, keeping the most recent one.
|
|
508
509
|
|
|
509
510
|
Updated_at is used instead of created_at to determine the most recent job. This is because jobs may not be
|
|
510
511
|
processed in the order they are created.
|
|
511
512
|
"""
|
|
513
|
+
logger.info("Starting cleanup of expired jobs")
|
|
512
514
|
now = datetime.now(UTC)
|
|
513
515
|
|
|
514
516
|
stmt = select(JobInfo).where(
|
|
@@ -536,9 +538,11 @@ class JobStore(DaskClientMixin):
|
|
|
536
538
|
elif os.path.isdir(job.output_path):
|
|
537
539
|
shutil.rmtree(job.output_path)
|
|
538
540
|
|
|
539
|
-
|
|
541
|
+
num_expired = len(expired_ids)
|
|
542
|
+
if num_expired > 0:
|
|
540
543
|
successfully_expired = []
|
|
541
544
|
for job_id in expired_ids:
|
|
545
|
+
var = None
|
|
542
546
|
try:
|
|
543
547
|
var = Variable(name=job_id, client=client)
|
|
544
548
|
try:
|
|
@@ -549,14 +553,22 @@ class JobStore(DaskClientMixin):
|
|
|
549
553
|
except TimeoutError:
|
|
550
554
|
pass
|
|
551
555
|
|
|
552
|
-
var.delete()
|
|
553
556
|
successfully_expired.append(job_id)
|
|
554
557
|
except Exception:
|
|
555
558
|
logger.exception("Failed to expire %s", job_id)
|
|
556
559
|
|
|
560
|
+
finally:
|
|
561
|
+
if var is not None:
|
|
562
|
+
try:
|
|
563
|
+
var.delete()
|
|
564
|
+
except Exception:
|
|
565
|
+
logger.exception("Failed to delete variable %s", job_id)
|
|
566
|
+
|
|
557
567
|
await session.execute(
|
|
558
568
|
update(JobInfo).where(JobInfo.job_id.in_(successfully_expired)).values(is_expired=True))
|
|
559
569
|
|
|
570
|
+
return num_expired
|
|
571
|
+
|
|
560
572
|
|
|
561
573
|
def get_db_engine(db_url: str | None = None, echo: bool = False, use_async: bool = True) -> "Engine | AsyncEngine":
|
|
562
574
|
"""
|
nat/front_ends/fastapi/main.py
CHANGED
|
@@ -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) 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");
|
|
@@ -30,6 +30,7 @@ from nat.data_models.api_server import ChatResponse
|
|
|
30
30
|
from nat.data_models.api_server import ChatResponseChunk
|
|
31
31
|
from nat.data_models.api_server import Error
|
|
32
32
|
from nat.data_models.api_server import ErrorTypes
|
|
33
|
+
from nat.data_models.api_server import ResponseObservabilityTrace
|
|
33
34
|
from nat.data_models.api_server import ResponsePayloadOutput
|
|
34
35
|
from nat.data_models.api_server import ResponseSerializable
|
|
35
36
|
from nat.data_models.api_server import SystemResponseContent
|
|
@@ -38,6 +39,7 @@ from nat.data_models.api_server import UserMessageContentRoleType
|
|
|
38
39
|
from nat.data_models.api_server import UserMessages
|
|
39
40
|
from nat.data_models.api_server import WebSocketMessageStatus
|
|
40
41
|
from nat.data_models.api_server import WebSocketMessageType
|
|
42
|
+
from nat.data_models.api_server import WebSocketObservabilityTraceMessage
|
|
41
43
|
from nat.data_models.api_server import WebSocketSystemInteractionMessage
|
|
42
44
|
from nat.data_models.api_server import WebSocketSystemIntermediateStepMessage
|
|
43
45
|
from nat.data_models.api_server import WebSocketSystemResponseTokenMessage
|
|
@@ -69,14 +71,15 @@ class WebSocketMessageHandler:
|
|
|
69
71
|
self._conversation_id: str | None = None
|
|
70
72
|
self._workflow_schema_type: str | None = None
|
|
71
73
|
self._user_interaction_response: asyncio.Future[TextContent] | None = None
|
|
74
|
+
self._pending_observability_trace: ResponseObservabilityTrace | None = None
|
|
72
75
|
|
|
73
76
|
self._flow_handler: FlowHandlerBase | None = None
|
|
74
77
|
|
|
75
78
|
self._schema_output_mapping: dict[str, type[BaseModel] | type[None]] = {
|
|
76
|
-
WorkflowSchemaType.GENERATE: self._session_manager.
|
|
79
|
+
WorkflowSchemaType.GENERATE: self._session_manager.get_workflow_single_output_schema(),
|
|
77
80
|
WorkflowSchemaType.CHAT: ChatResponse,
|
|
78
81
|
WorkflowSchemaType.CHAT_STREAM: ChatResponseChunk,
|
|
79
|
-
WorkflowSchemaType.GENERATE_STREAM: self._session_manager.
|
|
82
|
+
WorkflowSchemaType.GENERATE_STREAM: self._session_manager.get_workflow_streaming_output_schema(),
|
|
80
83
|
}
|
|
81
84
|
|
|
82
85
|
def set_flow_handler(self, flow_handler: FlowHandlerBase) -> None:
|
|
@@ -175,6 +178,7 @@ class WebSocketMessageHandler:
|
|
|
175
178
|
self._message_parent_id = user_message_as_validated_type.id
|
|
176
179
|
self._workflow_schema_type = user_message_as_validated_type.schema_type
|
|
177
180
|
self._conversation_id = user_message_as_validated_type.conversation_id
|
|
181
|
+
self._pending_observability_trace = None
|
|
178
182
|
|
|
179
183
|
message_content: typing.Any = await self._process_websocket_user_message(user_message_as_validated_type)
|
|
180
184
|
|
|
@@ -250,6 +254,13 @@ class WebSocketMessageHandler:
|
|
|
250
254
|
content=content,
|
|
251
255
|
status=status)
|
|
252
256
|
|
|
257
|
+
elif issubclass(message_schema, WebSocketObservabilityTraceMessage):
|
|
258
|
+
message = await self._message_validator.create_observability_trace_message(
|
|
259
|
+
message_id=message_id,
|
|
260
|
+
parent_id=self._message_parent_id,
|
|
261
|
+
conversation_id=self._conversation_id,
|
|
262
|
+
content=content)
|
|
263
|
+
|
|
253
264
|
elif isinstance(content, Error):
|
|
254
265
|
raise ValidationError(f"Invalid input data creating websocket message. {data_model.model_dump_json()}")
|
|
255
266
|
|
|
@@ -327,12 +338,18 @@ class WebSocketMessageHandler:
|
|
|
327
338
|
user_authentication_callback=auth_callback) as session:
|
|
328
339
|
|
|
329
340
|
async for value in generate_streaming_response(payload,
|
|
330
|
-
|
|
341
|
+
session=session,
|
|
331
342
|
streaming=True,
|
|
332
343
|
step_adaptor=self._step_adaptor,
|
|
333
344
|
result_type=result_type,
|
|
334
345
|
output_type=output_type):
|
|
335
346
|
|
|
347
|
+
# Store observability trace to send after completion message
|
|
348
|
+
if isinstance(value, ResponseObservabilityTrace):
|
|
349
|
+
if self._pending_observability_trace is None:
|
|
350
|
+
self._pending_observability_trace = value
|
|
351
|
+
continue
|
|
352
|
+
|
|
336
353
|
if not isinstance(value, ResponseSerializable):
|
|
337
354
|
value = ResponsePayloadOutput(payload=value)
|
|
338
355
|
|
|
@@ -342,3 +359,9 @@ class WebSocketMessageHandler:
|
|
|
342
359
|
await self.create_websocket_message(data_model=SystemResponseContent(),
|
|
343
360
|
message_type=WebSocketMessageType.RESPONSE_MESSAGE,
|
|
344
361
|
status=WebSocketMessageStatus.COMPLETE)
|
|
362
|
+
|
|
363
|
+
# Send observability trace after completion message
|
|
364
|
+
if self._pending_observability_trace is not None:
|
|
365
|
+
await self.create_websocket_message(data_model=self._pending_observability_trace,
|
|
366
|
+
message_type=WebSocketMessageType.OBSERVABILITY_TRACE_MESSAGE)
|
|
367
|
+
self._pending_observability_trace = None
|
|
@@ -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");
|
|
@@ -27,13 +27,16 @@ from nat.data_models.api_server import ChatResponse
|
|
|
27
27
|
from nat.data_models.api_server import ChatResponseChunk
|
|
28
28
|
from nat.data_models.api_server import Error
|
|
29
29
|
from nat.data_models.api_server import ErrorTypes
|
|
30
|
+
from nat.data_models.api_server import ObservabilityTraceContent
|
|
30
31
|
from nat.data_models.api_server import ResponseIntermediateStep
|
|
32
|
+
from nat.data_models.api_server import ResponseObservabilityTrace
|
|
31
33
|
from nat.data_models.api_server import ResponsePayloadOutput
|
|
32
34
|
from nat.data_models.api_server import SystemIntermediateStepContent
|
|
33
35
|
from nat.data_models.api_server import SystemResponseContent
|
|
34
36
|
from nat.data_models.api_server import TextContent
|
|
35
37
|
from nat.data_models.api_server import WebSocketMessageStatus
|
|
36
38
|
from nat.data_models.api_server import WebSocketMessageType
|
|
39
|
+
from nat.data_models.api_server import WebSocketObservabilityTraceMessage
|
|
37
40
|
from nat.data_models.api_server import WebSocketSystemInteractionMessage
|
|
38
41
|
from nat.data_models.api_server import WebSocketSystemIntermediateStepMessage
|
|
39
42
|
from nat.data_models.api_server import WebSocketSystemResponseTokenMessage
|
|
@@ -67,11 +70,24 @@ class MessageValidator:
|
|
|
67
70
|
WebSocketMessageType.INTERMEDIATE_STEP_MESSAGE: WebSocketSystemIntermediateStepMessage,
|
|
68
71
|
WebSocketMessageType.SYSTEM_INTERACTION_MESSAGE: WebSocketSystemInteractionMessage,
|
|
69
72
|
WebSocketMessageType.USER_INTERACTION_MESSAGE: WebSocketUserInteractionResponseMessage,
|
|
70
|
-
WebSocketMessageType.
|
|
73
|
+
WebSocketMessageType.OBSERVABILITY_TRACE_MESSAGE: WebSocketObservabilityTraceMessage,
|
|
74
|
+
WebSocketMessageType.ERROR_MESSAGE: Error,
|
|
71
75
|
}
|
|
72
76
|
|
|
73
77
|
self._message_parent_id: str = "default_id"
|
|
74
78
|
|
|
79
|
+
def _get_observability_trace_id_from_context(self) -> str | None:
|
|
80
|
+
"""
|
|
81
|
+
Retrieves observability_trace_id from Context
|
|
82
|
+
|
|
83
|
+
:return: observability_trace_id if available, None otherwise.
|
|
84
|
+
"""
|
|
85
|
+
try:
|
|
86
|
+
from nat.builder.context import Context
|
|
87
|
+
return Context.get().observability_trace_id
|
|
88
|
+
except (ImportError, AttributeError, KeyError):
|
|
89
|
+
return None
|
|
90
|
+
|
|
75
91
|
async def validate_message(self, message: dict[str, Any]) -> BaseModel:
|
|
76
92
|
"""
|
|
77
93
|
Validates an incoming WebSocket message against its expected schema.
|
|
@@ -147,6 +163,9 @@ class MessageValidator:
|
|
|
147
163
|
elif (isinstance(data_model, ResponseIntermediateStep)):
|
|
148
164
|
validated_message_content = SystemIntermediateStepContent(name=data_model.name,
|
|
149
165
|
payload=data_model.payload)
|
|
166
|
+
elif (isinstance(data_model, ResponseObservabilityTrace)):
|
|
167
|
+
validated_message_content = ObservabilityTraceContent(
|
|
168
|
+
observability_trace_id=data_model.observability_trace_id)
|
|
150
169
|
elif (isinstance(data_model, HumanPromptBase)):
|
|
151
170
|
validated_message_content = data_model
|
|
152
171
|
elif (isinstance(data_model, SystemResponseContent)):
|
|
@@ -212,6 +231,9 @@ class MessageValidator:
|
|
|
212
231
|
elif (isinstance(data_model, ResponseIntermediateStep)):
|
|
213
232
|
validated_message_type = WebSocketMessageType.INTERMEDIATE_STEP_MESSAGE
|
|
214
233
|
|
|
234
|
+
elif (isinstance(data_model, ResponseObservabilityTrace)):
|
|
235
|
+
validated_message_type = WebSocketMessageType.OBSERVABILITY_TRACE_MESSAGE
|
|
236
|
+
|
|
215
237
|
elif (isinstance(data_model, HumanPromptBase)):
|
|
216
238
|
validated_message_type = WebSocketMessageType.SYSTEM_INTERACTION_MESSAGE
|
|
217
239
|
else:
|
|
@@ -349,3 +371,33 @@ class MessageValidator:
|
|
|
349
371
|
except Exception as e:
|
|
350
372
|
logger.exception("Error creating system interaction message: %s", str(e))
|
|
351
373
|
return None
|
|
374
|
+
|
|
375
|
+
async def create_observability_trace_message(
|
|
376
|
+
self,
|
|
377
|
+
*,
|
|
378
|
+
message_id: str | None = str(uuid.uuid4()),
|
|
379
|
+
parent_id: str = "default",
|
|
380
|
+
conversation_id: str | None = None,
|
|
381
|
+
content: ObservabilityTraceContent,
|
|
382
|
+
timestamp: str = str(datetime.datetime.now(datetime.UTC))
|
|
383
|
+
) -> WebSocketObservabilityTraceMessage | None:
|
|
384
|
+
"""
|
|
385
|
+
Creates an observability trace message.
|
|
386
|
+
|
|
387
|
+
:param message_id: Unique identifier for the message (default: generated UUID).
|
|
388
|
+
:param parent_id: ID of the user message that spawned child messages.
|
|
389
|
+
:param conversation_id: ID of the conversation this message belongs to (default: None).
|
|
390
|
+
:param content: Message content.
|
|
391
|
+
:param timestamp: Timestamp of the message (default: current UTC time).
|
|
392
|
+
:return: A WebSocketObservabilityTraceMessage instance.
|
|
393
|
+
"""
|
|
394
|
+
try:
|
|
395
|
+
return WebSocketObservabilityTraceMessage(id=message_id,
|
|
396
|
+
parent_id=parent_id,
|
|
397
|
+
conversation_id=conversation_id,
|
|
398
|
+
content=content,
|
|
399
|
+
timestamp=timestamp)
|
|
400
|
+
|
|
401
|
+
except Exception as e:
|
|
402
|
+
logger.exception("Error creating observability trace message: %s", str(e))
|
|
403
|
+
return None
|
|
@@ -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");
|
|
@@ -23,20 +23,20 @@ from nat.data_models.api_server import ResponseSerializable
|
|
|
23
23
|
from nat.data_models.step_adaptor import StepAdaptorConfig
|
|
24
24
|
from nat.front_ends.fastapi.intermediate_steps_subscriber import pull_intermediate
|
|
25
25
|
from nat.front_ends.fastapi.step_adaptor import StepAdaptor
|
|
26
|
-
from nat.runtime.session import
|
|
26
|
+
from nat.runtime.session import Session
|
|
27
27
|
from nat.utils.producer_consumer_queue import AsyncIOProducerConsumerQueue
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
async def generate_streaming_response_as_str(payload: typing.Any,
|
|
31
31
|
*,
|
|
32
|
-
|
|
32
|
+
session: Session,
|
|
33
33
|
streaming: bool,
|
|
34
34
|
step_adaptor: StepAdaptor = StepAdaptor(StepAdaptorConfig()),
|
|
35
35
|
result_type: type | None = None,
|
|
36
36
|
output_type: type | None = None) -> AsyncGenerator[str]:
|
|
37
37
|
|
|
38
38
|
async for item in generate_streaming_response(payload,
|
|
39
|
-
|
|
39
|
+
session=session,
|
|
40
40
|
streaming=streaming,
|
|
41
41
|
step_adaptor=step_adaptor,
|
|
42
42
|
result_type=result_type,
|
|
@@ -51,13 +51,13 @@ async def generate_streaming_response_as_str(payload: typing.Any,
|
|
|
51
51
|
|
|
52
52
|
async def generate_streaming_response(payload: typing.Any,
|
|
53
53
|
*,
|
|
54
|
-
|
|
54
|
+
session: Session,
|
|
55
55
|
streaming: bool,
|
|
56
56
|
step_adaptor: StepAdaptor = StepAdaptor(StepAdaptorConfig()),
|
|
57
57
|
result_type: type | None = None,
|
|
58
58
|
output_type: type | None = None) -> AsyncGenerator[ResponseSerializable]:
|
|
59
59
|
|
|
60
|
-
async with
|
|
60
|
+
async with session.run(payload) as runner:
|
|
61
61
|
|
|
62
62
|
q: AsyncIOProducerConsumerQueue[ResponseSerializable] = AsyncIOProducerConsumerQueue()
|
|
63
63
|
|
|
@@ -65,7 +65,7 @@ async def generate_streaming_response(payload: typing.Any,
|
|
|
65
65
|
intermediate_complete = await pull_intermediate(q, step_adaptor)
|
|
66
66
|
|
|
67
67
|
async def pull_result():
|
|
68
|
-
if
|
|
68
|
+
if session.workflow.has_streaming_output and streaming:
|
|
69
69
|
async for chunk in runner.result_stream(to_type=output_type):
|
|
70
70
|
await q.put(chunk)
|
|
71
71
|
else:
|
|
@@ -107,19 +107,20 @@ async def generate_streaming_response(payload: typing.Any,
|
|
|
107
107
|
|
|
108
108
|
async def generate_single_response(
|
|
109
109
|
payload: typing.Any,
|
|
110
|
-
|
|
110
|
+
session: Session,
|
|
111
111
|
result_type: type | None = None,
|
|
112
112
|
) -> typing.Any:
|
|
113
|
-
|
|
113
|
+
|
|
114
|
+
if not session.workflow.has_single_output:
|
|
114
115
|
raise ValueError("Cannot get a single output value for streaming workflows")
|
|
115
116
|
|
|
116
|
-
async with
|
|
117
|
+
async with session.run(payload) as runner:
|
|
117
118
|
return await runner.result(to_type=result_type)
|
|
118
119
|
|
|
119
120
|
|
|
120
121
|
async def generate_streaming_response_full(payload: typing.Any,
|
|
121
122
|
*,
|
|
122
|
-
|
|
123
|
+
session: Session,
|
|
123
124
|
streaming: bool,
|
|
124
125
|
result_type: type | None = None,
|
|
125
126
|
output_type: type | None = None,
|
|
@@ -137,14 +138,14 @@ async def generate_streaming_response_full(payload: typing.Any,
|
|
|
137
138
|
else:
|
|
138
139
|
allowed_types = set(filter_steps.split(','))
|
|
139
140
|
|
|
140
|
-
async with
|
|
141
|
+
async with session.run(payload) as runner:
|
|
141
142
|
q: AsyncIOProducerConsumerQueue[ResponseSerializable] = AsyncIOProducerConsumerQueue()
|
|
142
143
|
|
|
143
144
|
# Start the intermediate stream without step adaptor
|
|
144
145
|
intermediate_complete = await pull_intermediate(q, None)
|
|
145
146
|
|
|
146
147
|
async def pull_result():
|
|
147
|
-
if
|
|
148
|
+
if session.workflow.has_streaming_output and streaming:
|
|
148
149
|
async for chunk in runner.result_stream(to_type=output_type):
|
|
149
150
|
await q.put(chunk)
|
|
150
151
|
else:
|
|
@@ -174,7 +175,7 @@ async def generate_streaming_response_full(payload: typing.Any,
|
|
|
174
175
|
|
|
175
176
|
async def generate_streaming_response_full_as_str(payload: typing.Any,
|
|
176
177
|
*,
|
|
177
|
-
|
|
178
|
+
session: Session,
|
|
178
179
|
streaming: bool,
|
|
179
180
|
result_type: type | None = None,
|
|
180
181
|
output_type: type | None = None,
|
|
@@ -183,7 +184,7 @@ async def generate_streaming_response_full_as_str(payload: typing.Any,
|
|
|
183
184
|
Similar to generate_streaming_response but converts the response to a string format.
|
|
184
185
|
"""
|
|
185
186
|
async for item in generate_streaming_response_full(payload,
|
|
186
|
-
|
|
187
|
+
session=session,
|
|
187
188
|
streaming=streaming,
|
|
188
189
|
result_type=result_type,
|
|
189
190
|
output_type=output_type,
|
|
@@ -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");
|
nat/front_ends/fastapi/utils.py
CHANGED
|
@@ -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");
|
nat/front_ends/register.py
CHANGED
|
@@ -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");
|
|
@@ -18,4 +18,3 @@
|
|
|
18
18
|
|
|
19
19
|
from .console import register as console_register
|
|
20
20
|
from .fastapi import register as fastapi_register
|
|
21
|
-
from .mcp import register as mcp_register
|
|
@@ -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) 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");
|
|
@@ -47,9 +47,11 @@ class SimpleFrontEndPluginBase(FrontEndBase[FrontEndConfigT], ABC):
|
|
|
47
47
|
|
|
48
48
|
click.echo(stream.getvalue())
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
session_manager = await SessionManager.create(config=self.full_config, shared_builder=builder)
|
|
51
|
+
try:
|
|
52
|
+
await self.run_workflow(session_manager)
|
|
53
|
+
finally:
|
|
54
|
+
await session_manager.shutdown()
|
|
53
55
|
|
|
54
56
|
@abstractmethod
|
|
55
57
|
async def run_workflow(self, session_manager: SessionManager):
|
nat/llm/aws_bedrock_llm.py
CHANGED
|
@@ -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");
|
nat/llm/azure_openai_llm.py
CHANGED
|
@@ -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");
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
from pydantic import AliasChoices
|
|
17
17
|
from pydantic import ConfigDict
|
|
18
18
|
from pydantic import Field
|
|
19
|
+
from pydantic import computed_field
|
|
19
20
|
|
|
20
21
|
from nat.builder.builder import Builder
|
|
21
22
|
from nat.builder.llm import LLMProviderInfo
|
|
@@ -59,6 +60,14 @@ class AzureOpenAIModelConfig(
|
|
|
59
60
|
description="Top-p for distribution sampling.",
|
|
60
61
|
space=SearchSpace(high=1.0, low=0.5, step=0.1))
|
|
61
62
|
|
|
63
|
+
@computed_field
|
|
64
|
+
@property
|
|
65
|
+
def model_name(self) -> str:
|
|
66
|
+
"""
|
|
67
|
+
Returns the model name for compatibility with other parts of the code base which expect a model_name attribute.
|
|
68
|
+
"""
|
|
69
|
+
return self.azure_deployment
|
|
70
|
+
|
|
62
71
|
|
|
63
72
|
@register_llm_provider(config_type=AzureOpenAIModelConfig)
|
|
64
73
|
async def azure_openai_llm(config: AzureOpenAIModelConfig, _builder: Builder):
|