nvidia-nat 1.1.0a20251020__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 +265 -0
- nat/agent/dual_node.py +72 -0
- nat/agent/prompt_optimizer/__init__.py +0 -0
- nat/agent/prompt_optimizer/prompt.py +68 -0
- nat/agent/prompt_optimizer/register.py +149 -0
- nat/agent/react_agent/__init__.py +0 -0
- nat/agent/react_agent/agent.py +394 -0
- nat/agent/react_agent/output_parser.py +104 -0
- nat/agent/react_agent/prompt.py +44 -0
- nat/agent/react_agent/register.py +168 -0
- nat/agent/reasoning_agent/__init__.py +0 -0
- nat/agent/reasoning_agent/reasoning_agent.py +227 -0
- nat/agent/register.py +23 -0
- nat/agent/rewoo_agent/__init__.py +0 -0
- nat/agent/rewoo_agent/agent.py +593 -0
- nat/agent/rewoo_agent/prompt.py +107 -0
- nat/agent/rewoo_agent/register.py +175 -0
- nat/agent/tool_calling_agent/__init__.py +0 -0
- nat/agent/tool_calling_agent/agent.py +246 -0
- nat/agent/tool_calling_agent/register.py +129 -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/credential_validator/__init__.py +14 -0
- nat/authentication/credential_validator/bearer_token_validator.py +557 -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 +96 -0
- nat/authentication/oauth2/__init__.py +14 -0
- nat/authentication/oauth2/oauth2_auth_code_flow_provider.py +140 -0
- nat/authentication/oauth2/oauth2_auth_code_flow_provider_config.py +39 -0
- nat/authentication/oauth2/oauth2_resource_server_config.py +124 -0
- nat/authentication/oauth2/register.py +25 -0
- nat/authentication/register.py +20 -0
- nat/builder/__init__.py +0 -0
- nat/builder/builder.py +317 -0
- nat/builder/component_utils.py +320 -0
- nat/builder/context.py +321 -0
- nat/builder/embedder.py +24 -0
- nat/builder/eval_builder.py +166 -0
- nat/builder/evaluator.py +29 -0
- nat/builder/framework_enum.py +25 -0
- nat/builder/front_end.py +73 -0
- nat/builder/function.py +714 -0
- nat/builder/function_base.py +380 -0
- nat/builder/function_info.py +625 -0
- nat/builder/intermediate_step_manager.py +206 -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 +160 -0
- nat/builder/workflow_builder.py +1365 -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 +47 -0
- nat/cli/commands/info/list_channels.py +32 -0
- nat/cli/commands/info/list_components.py +128 -0
- nat/cli/commands/mcp/__init__.py +14 -0
- nat/cli/commands/mcp/mcp.py +986 -0
- nat/cli/commands/object_store/__init__.py +14 -0
- nat/cli/commands/object_store/object_store.py +227 -0
- nat/cli/commands/optimize.py +90 -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 +153 -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 +257 -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 +17 -0
- nat/cli/commands/workflow/templates/pyproject.toml.j2 +25 -0
- nat/cli/commands/workflow/templates/register.py.j2 +4 -0
- nat/cli/commands/workflow/templates/workflow.py.j2 +50 -0
- nat/cli/commands/workflow/workflow.py +37 -0
- nat/cli/commands/workflow/workflow_commands.py +403 -0
- nat/cli/entrypoint.py +141 -0
- nat/cli/main.py +60 -0
- nat/cli/register_workflow.py +522 -0
- nat/cli/type_registry.py +1069 -0
- nat/control_flow/__init__.py +0 -0
- nat/control_flow/register.py +20 -0
- nat/control_flow/router_agent/__init__.py +0 -0
- nat/control_flow/router_agent/agent.py +329 -0
- nat/control_flow/router_agent/prompt.py +48 -0
- nat/control_flow/router_agent/register.py +91 -0
- nat/control_flow/sequential_executor.py +166 -0
- nat/data_models/__init__.py +14 -0
- nat/data_models/agent.py +34 -0
- nat/data_models/api_server.py +843 -0
- nat/data_models/authentication.py +245 -0
- nat/data_models/common.py +171 -0
- nat/data_models/component.py +60 -0
- nat/data_models/component_ref.py +179 -0
- nat/data_models/config.py +434 -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 +130 -0
- nat/data_models/evaluator.py +26 -0
- nat/data_models/front_end.py +26 -0
- nat/data_models/function.py +64 -0
- nat/data_models/function_dependencies.py +80 -0
- nat/data_models/gated_field_mixin.py +242 -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/optimizable.py +119 -0
- nat/data_models/optimizer.py +149 -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 +228 -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/temperature_mixin.py +44 -0
- nat/data_models/thinking_mixin.py +86 -0
- nat/data_models/top_p_mixin.py +44 -0
- nat/data_models/ttc_strategy.py +30 -0
- nat/embedder/__init__.py +0 -0
- nat/embedder/azure_openai_embedder.py +46 -0
- nat/embedder/nim_embedder.py +59 -0
- nat/embedder/openai_embedder.py +42 -0
- nat/embedder/register.py +22 -0
- nat/eval/__init__.py +14 -0
- nat/eval/config.py +62 -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 +431 -0
- nat/eval/evaluate.py +565 -0
- nat/eval/evaluator/__init__.py +14 -0
- nat/eval/evaluator/base_evaluator.py +77 -0
- nat/eval/evaluator/evaluator_model.py +58 -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 +26 -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_evaluator/__init__.py +14 -0
- nat/eval/runtime_evaluator/evaluate.py +123 -0
- nat/eval/runtime_evaluator/register.py +100 -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 +242 -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/eval_trace_ctx.py +89 -0
- nat/eval/utils/output_uploader.py +140 -0
- nat/eval/utils/tqdm_position_registry.py +40 -0
- nat/eval/utils/weave_eval.py +193 -0
- nat/experimental/__init__.py +0 -0
- nat/experimental/decorators/__init__.py +0 -0
- nat/experimental/decorators/experimental_warning_decorator.py +154 -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 +228 -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 +67 -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 +35 -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 +157 -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 +285 -0
- nat/front_ends/console/console_front_end_config.py +32 -0
- nat/front_ends/console/console_front_end_plugin.py +108 -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 +142 -0
- nat/front_ends/fastapi/dask_client_mixin.py +65 -0
- nat/front_ends/fastapi/fastapi_front_end_config.py +272 -0
- nat/front_ends/fastapi/fastapi_front_end_controller.py +68 -0
- nat/front_ends/fastapi/fastapi_front_end_plugin.py +247 -0
- nat/front_ends/fastapi/fastapi_front_end_plugin_worker.py +1257 -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 +602 -0
- nat/front_ends/fastapi/main.py +64 -0
- nat/front_ends/fastapi/message_handler.py +344 -0
- nat/front_ends/fastapi/message_validator.py +351 -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/fastapi/utils.py +57 -0
- nat/front_ends/mcp/__init__.py +14 -0
- nat/front_ends/mcp/introspection_token_verifier.py +73 -0
- nat/front_ends/mcp/mcp_front_end_config.py +90 -0
- nat/front_ends/mcp/mcp_front_end_plugin.py +113 -0
- nat/front_ends/mcp/mcp_front_end_plugin_worker.py +268 -0
- nat/front_ends/mcp/memory_profiler.py +320 -0
- nat/front_ends/mcp/register.py +27 -0
- nat/front_ends/mcp/tool_converter.py +290 -0
- nat/front_ends/register.py +21 -0
- nat/front_ends/simple_base/__init__.py +14 -0
- nat/front_ends/simple_base/simple_front_end_plugin_base.py +56 -0
- nat/llm/__init__.py +0 -0
- nat/llm/aws_bedrock_llm.py +69 -0
- nat/llm/azure_openai_llm.py +57 -0
- nat/llm/litellm_llm.py +69 -0
- nat/llm/nim_llm.py +58 -0
- nat/llm/openai_llm.py +54 -0
- nat/llm/register.py +27 -0
- nat/llm/utils/__init__.py +14 -0
- nat/llm/utils/env_config_value.py +93 -0
- nat/llm/utils/error.py +17 -0
- nat/llm/utils/thinking.py +215 -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 +19 -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 +550 -0
- nat/observability/exporter/raw_exporter.py +52 -0
- nat/observability/exporter/span_exporter.py +308 -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/redaction_config_mixin.py +42 -0
- nat/observability/mixin/resource_conflict_mixin.py +134 -0
- nat/observability/mixin/serialize_mixin.py +61 -0
- nat/observability/mixin/tagging_config_mixin.py +62 -0
- nat/observability/mixin/type_introspection_mixin.py +496 -0
- nat/observability/processor/__init__.py +14 -0
- nat/observability/processor/batching_processor.py +308 -0
- nat/observability/processor/callback_processor.py +42 -0
- nat/observability/processor/falsy_batch_filter_processor.py +55 -0
- nat/observability/processor/intermediate_step_serializer.py +28 -0
- nat/observability/processor/processor.py +74 -0
- nat/observability/processor/processor_factory.py +70 -0
- nat/observability/processor/redaction/__init__.py +24 -0
- nat/observability/processor/redaction/contextual_redaction_processor.py +125 -0
- nat/observability/processor/redaction/contextual_span_redaction_processor.py +66 -0
- nat/observability/processor/redaction/redaction_processor.py +177 -0
- nat/observability/processor/redaction/span_header_redaction_processor.py +92 -0
- nat/observability/processor/span_tagging_processor.py +68 -0
- nat/observability/register.py +114 -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 +626 -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 +297 -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 +180 -0
- nat/profiler/decorators/function_tracking.py +411 -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 +42 -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 +404 -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/parameter_optimization/__init__.py +0 -0
- nat/profiler/parameter_optimization/optimizable_utils.py +93 -0
- nat/profiler/parameter_optimization/optimizer_runtime.py +67 -0
- nat/profiler/parameter_optimization/parameter_optimizer.py +153 -0
- nat/profiler/parameter_optimization/parameter_selection.py +107 -0
- nat/profiler/parameter_optimization/pareto_visualizer.py +380 -0
- nat/profiler/parameter_optimization/prompt_optimizer.py +384 -0
- nat/profiler/parameter_optimization/update_helpers.py +66 -0
- nat/profiler/profile_runner.py +478 -0
- nat/profiler/utils.py +186 -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 +570 -0
- nat/registry_handlers/pypi/__init__.py +0 -0
- nat/registry_handlers/pypi/pypi_handler.py +248 -0
- nat/registry_handlers/pypi/register_pypi.py +40 -0
- nat/registry_handlers/register.py +20 -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 +236 -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 +21 -0
- nat/runtime/__init__.py +14 -0
- nat/runtime/loader.py +220 -0
- nat/runtime/runner.py +292 -0
- nat/runtime/session.py +223 -0
- nat/runtime/user_metadata.py +130 -0
- nat/settings/__init__.py +0 -0
- nat/settings/global_settings.py +329 -0
- nat/test/.namespace +1 -0
- nat/tool/__init__.py +0 -0
- nat/tool/chat_completion.py +77 -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 +82 -0
- nat/tool/document_search.py +141 -0
- nat/tool/github_tools.py +450 -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 +66 -0
- nat/tool/memory_tools/get_memory_tool.py +72 -0
- nat/tool/nvidia_rag.py +95 -0
- nat/tool/register.py +31 -0
- nat/tool/retriever.py +95 -0
- nat/tool/server_tools.py +66 -0
- nat/utils/__init__.py +0 -0
- nat/utils/callable_utils.py +70 -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/decorators.py +210 -0
- nat/utils/dump_distro_mapping.py +32 -0
- nat/utils/exception_handlers/__init__.py +0 -0
- nat/utils/exception_handlers/automatic_retries.py +342 -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_levels.py +25 -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 +195 -0
- nat/utils/string_utils.py +38 -0
- nat/utils/type_converter.py +299 -0
- nat/utils/type_utils.py +488 -0
- nat/utils/url_utils.py +27 -0
- nvidia_nat-1.1.0a20251020.dist-info/METADATA +195 -0
- nvidia_nat-1.1.0a20251020.dist-info/RECORD +480 -0
- nvidia_nat-1.1.0a20251020.dist-info/WHEEL +5 -0
- nvidia_nat-1.1.0a20251020.dist-info/entry_points.txt +22 -0
- nvidia_nat-1.1.0a20251020.dist-info/licenses/LICENSE-3rd-party.txt +5478 -0
- nvidia_nat-1.1.0a20251020.dist-info/licenses/LICENSE.md +201 -0
- nvidia_nat-1.1.0a20251020.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import logging
|
|
17
|
+
|
|
18
|
+
from pydantic import AliasChoices
|
|
19
|
+
from pydantic import Field
|
|
20
|
+
|
|
21
|
+
from nat.builder.builder import Builder
|
|
22
|
+
from nat.builder.framework_enum import LLMFrameworkEnum
|
|
23
|
+
from nat.builder.function_info import FunctionInfo
|
|
24
|
+
from nat.cli.register_workflow import register_function
|
|
25
|
+
from nat.data_models.agent import AgentBaseConfig
|
|
26
|
+
from nat.data_models.api_server import ChatRequest
|
|
27
|
+
from nat.data_models.api_server import ChatRequestOrMessage
|
|
28
|
+
from nat.data_models.api_server import ChatResponse
|
|
29
|
+
from nat.data_models.api_server import Usage
|
|
30
|
+
from nat.data_models.component_ref import FunctionGroupRef
|
|
31
|
+
from nat.data_models.component_ref import FunctionRef
|
|
32
|
+
from nat.data_models.optimizable import OptimizableField
|
|
33
|
+
from nat.data_models.optimizable import OptimizableMixin
|
|
34
|
+
from nat.data_models.optimizable import SearchSpace
|
|
35
|
+
from nat.utils.type_converter import GlobalTypeConverter
|
|
36
|
+
|
|
37
|
+
logger = logging.getLogger(__name__)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class ReActAgentWorkflowConfig(AgentBaseConfig, OptimizableMixin, name="react_agent"):
|
|
41
|
+
"""
|
|
42
|
+
Defines a NAT function that uses a ReAct Agent performs reasoning inbetween tool calls, and utilizes the
|
|
43
|
+
tool names and descriptions to select the optimal tool.
|
|
44
|
+
"""
|
|
45
|
+
description: str = Field(default="ReAct Agent Workflow", description="The description of this functions use.")
|
|
46
|
+
tool_names: list[FunctionRef | FunctionGroupRef] = Field(
|
|
47
|
+
default_factory=list, description="The list of tools to provide to the react agent.")
|
|
48
|
+
retry_agent_response_parsing_errors: bool = Field(
|
|
49
|
+
default=True,
|
|
50
|
+
validation_alias=AliasChoices("retry_agent_response_parsing_errors", "retry_parsing_errors"),
|
|
51
|
+
description="Whether to retry when encountering parsing errors in the agent's response.")
|
|
52
|
+
parse_agent_response_max_retries: int = Field(
|
|
53
|
+
default=1,
|
|
54
|
+
validation_alias=AliasChoices("parse_agent_response_max_retries", "max_retries"),
|
|
55
|
+
description="Maximum number of times the Agent may retry parsing errors. "
|
|
56
|
+
"Prevents the Agent from getting into infinite hallucination loops.")
|
|
57
|
+
tool_call_max_retries: int = Field(default=1, description="The number of retries before raising a tool call error.")
|
|
58
|
+
max_tool_calls: int = Field(default=15,
|
|
59
|
+
validation_alias=AliasChoices("max_tool_calls", "max_iterations"),
|
|
60
|
+
description="Maximum number of tool calls before stopping the agent.")
|
|
61
|
+
pass_tool_call_errors_to_agent: bool = Field(
|
|
62
|
+
default=True,
|
|
63
|
+
description="Whether to pass tool call errors to agent. If False, failed tool calls will raise an exception.")
|
|
64
|
+
include_tool_input_schema_in_tool_description: bool = Field(
|
|
65
|
+
default=True, description="Specify inclusion of tool input schemas in the prompt.")
|
|
66
|
+
normalize_tool_input_quotes: bool = Field(
|
|
67
|
+
default=True,
|
|
68
|
+
description="Whether to replace single quotes with double quotes in the tool input. "
|
|
69
|
+
"This is useful for tools that expect structured json input.")
|
|
70
|
+
system_prompt: str | None = Field(
|
|
71
|
+
default=None,
|
|
72
|
+
description="Provides the SYSTEM_PROMPT to use with the agent") # defaults to SYSTEM_PROMPT in prompt.py
|
|
73
|
+
max_history: int = Field(default=15, description="Maximum number of messages to keep in the conversation history.")
|
|
74
|
+
additional_instructions: str | None = OptimizableField(
|
|
75
|
+
default=None,
|
|
76
|
+
description="Additional instructions to provide to the agent in addition to the base prompt.",
|
|
77
|
+
space=SearchSpace(
|
|
78
|
+
is_prompt=True,
|
|
79
|
+
prompt="No additional instructions.",
|
|
80
|
+
prompt_purpose="Additional instructions to provide to the agent in addition to the base prompt.",
|
|
81
|
+
))
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@register_function(config_type=ReActAgentWorkflowConfig, framework_wrappers=[LLMFrameworkEnum.LANGCHAIN])
|
|
85
|
+
async def react_agent_workflow(config: ReActAgentWorkflowConfig, builder: Builder):
|
|
86
|
+
from langchain.schema import BaseMessage
|
|
87
|
+
from langchain_core.messages import trim_messages
|
|
88
|
+
from langgraph.graph.state import CompiledStateGraph
|
|
89
|
+
|
|
90
|
+
from nat.agent.base import AGENT_LOG_PREFIX
|
|
91
|
+
from nat.agent.react_agent.agent import ReActAgentGraph
|
|
92
|
+
from nat.agent.react_agent.agent import ReActGraphState
|
|
93
|
+
from nat.agent.react_agent.agent import create_react_agent_prompt
|
|
94
|
+
|
|
95
|
+
prompt = create_react_agent_prompt(config)
|
|
96
|
+
|
|
97
|
+
# we can choose an LLM for the ReAct agent in the config file
|
|
98
|
+
llm = await builder.get_llm(config.llm_name, wrapper_type=LLMFrameworkEnum.LANGCHAIN)
|
|
99
|
+
# the agent can run any installed tool, simply install the tool and add it to the config file
|
|
100
|
+
# the sample tool provided can easily be copied or changed
|
|
101
|
+
tools = await builder.get_tools(tool_names=config.tool_names, wrapper_type=LLMFrameworkEnum.LANGCHAIN)
|
|
102
|
+
if not tools:
|
|
103
|
+
raise ValueError(f"No tools specified for ReAct Agent '{config.llm_name}'")
|
|
104
|
+
# configure callbacks, for sending intermediate steps
|
|
105
|
+
# construct the ReAct Agent Graph from the configured llm, prompt, and tools
|
|
106
|
+
graph: CompiledStateGraph = await ReActAgentGraph(
|
|
107
|
+
llm=llm,
|
|
108
|
+
prompt=prompt,
|
|
109
|
+
tools=tools,
|
|
110
|
+
use_tool_schema=config.include_tool_input_schema_in_tool_description,
|
|
111
|
+
detailed_logs=config.verbose,
|
|
112
|
+
log_response_max_chars=config.log_response_max_chars,
|
|
113
|
+
retry_agent_response_parsing_errors=config.retry_agent_response_parsing_errors,
|
|
114
|
+
parse_agent_response_max_retries=config.parse_agent_response_max_retries,
|
|
115
|
+
tool_call_max_retries=config.tool_call_max_retries,
|
|
116
|
+
pass_tool_call_errors_to_agent=config.pass_tool_call_errors_to_agent,
|
|
117
|
+
normalize_tool_input_quotes=config.normalize_tool_input_quotes).build_graph()
|
|
118
|
+
|
|
119
|
+
async def _response_fn(chat_request_or_message: ChatRequestOrMessage) -> ChatResponse | str:
|
|
120
|
+
"""
|
|
121
|
+
Main workflow entry function for the ReAct Agent.
|
|
122
|
+
|
|
123
|
+
This function invokes the ReAct Agent Graph and returns the response.
|
|
124
|
+
|
|
125
|
+
Args:
|
|
126
|
+
chat_request_or_message (ChatRequestOrMessage): The input message to process
|
|
127
|
+
|
|
128
|
+
Returns:
|
|
129
|
+
ChatResponse | str: The response from the agent or error message
|
|
130
|
+
"""
|
|
131
|
+
try:
|
|
132
|
+
message = GlobalTypeConverter.get().convert(chat_request_or_message, to_type=ChatRequest)
|
|
133
|
+
|
|
134
|
+
# initialize the starting state with the user query
|
|
135
|
+
messages: list[BaseMessage] = trim_messages(messages=[m.model_dump() for m in message.messages],
|
|
136
|
+
max_tokens=config.max_history,
|
|
137
|
+
strategy="last",
|
|
138
|
+
token_counter=len,
|
|
139
|
+
start_on="human",
|
|
140
|
+
include_system=True)
|
|
141
|
+
|
|
142
|
+
state = ReActGraphState(messages=messages)
|
|
143
|
+
|
|
144
|
+
# run the ReAct Agent Graph
|
|
145
|
+
state = await graph.ainvoke(state, config={'recursion_limit': (config.max_tool_calls + 1) * 2})
|
|
146
|
+
# setting recursion_limit: 4 allows 1 tool call
|
|
147
|
+
# - allows the ReAct Agent to perform 1 cycle / call 1 single tool,
|
|
148
|
+
# - but stops the agent when it tries to call a tool a second time
|
|
149
|
+
|
|
150
|
+
# get and return the output from the state
|
|
151
|
+
state = ReActGraphState(**state)
|
|
152
|
+
output_message = state.messages[-1]
|
|
153
|
+
content = str(output_message.content)
|
|
154
|
+
|
|
155
|
+
# Create usage statistics for the response
|
|
156
|
+
prompt_tokens = sum(len(str(msg.content).split()) for msg in message.messages)
|
|
157
|
+
completion_tokens = len(content.split()) if content else 0
|
|
158
|
+
total_tokens = prompt_tokens + completion_tokens
|
|
159
|
+
usage = Usage(prompt_tokens=prompt_tokens, completion_tokens=completion_tokens, total_tokens=total_tokens)
|
|
160
|
+
response = ChatResponse.from_string(content, usage=usage)
|
|
161
|
+
if chat_request_or_message.is_string:
|
|
162
|
+
return GlobalTypeConverter.get().convert(response, to_type=str)
|
|
163
|
+
return response
|
|
164
|
+
except Exception as ex:
|
|
165
|
+
logger.error("%s ReAct Agent failed with exception: %s", AGENT_LOG_PREFIX, str(ex))
|
|
166
|
+
raise
|
|
167
|
+
|
|
168
|
+
yield FunctionInfo.from_fn(_response_fn, description=config.description)
|
|
File without changes
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import logging
|
|
17
|
+
import re
|
|
18
|
+
from collections.abc import AsyncGenerator
|
|
19
|
+
|
|
20
|
+
from pydantic import Field
|
|
21
|
+
|
|
22
|
+
from nat.builder.builder import Builder
|
|
23
|
+
from nat.builder.framework_enum import LLMFrameworkEnum
|
|
24
|
+
from nat.builder.function_info import FunctionInfo
|
|
25
|
+
from nat.cli.register_workflow import register_function
|
|
26
|
+
from nat.data_models.agent import AgentBaseConfig
|
|
27
|
+
from nat.data_models.api_server import ChatRequest
|
|
28
|
+
from nat.data_models.component_ref import FunctionRef
|
|
29
|
+
|
|
30
|
+
logger = logging.getLogger(__name__)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class ReasoningFunctionConfig(AgentBaseConfig, name="reasoning_agent"):
|
|
34
|
+
"""
|
|
35
|
+
Defines a NAT function that performs reasoning on the input data.
|
|
36
|
+
Output is passed to the next function in the workflow.
|
|
37
|
+
|
|
38
|
+
Designed to be used with an InterceptingFunction.
|
|
39
|
+
"""
|
|
40
|
+
description: str = Field(default="Reasoning Agent", description="The description of this function's use.")
|
|
41
|
+
augmented_fn: FunctionRef = Field(description="The name of the function to reason on.")
|
|
42
|
+
reasoning_prompt_template: str = Field(
|
|
43
|
+
default=("You are an expert reasoning model task with creating a detailed execution plan"
|
|
44
|
+
" for a system that has the following description:\n\n"
|
|
45
|
+
"**Description:** \n{augmented_function_desc}\n\n"
|
|
46
|
+
"Given the following input and a list of available tools, please provide a detailed step-by-step plan"
|
|
47
|
+
" that an instruction following system can use to address the input. Ensure the plan includes:\n\n"
|
|
48
|
+
"1. Identifying the key components of the input.\n"
|
|
49
|
+
"2. Determining the most suitable tools for each task.\n"
|
|
50
|
+
"3. Outlining the sequence of actions to be taken.\n\n"
|
|
51
|
+
"**Input:** \n{input_text}\n\n"
|
|
52
|
+
"**Tools and description of the tool:** \n{tools}\n\n"
|
|
53
|
+
"An example plan could look like this:\n\n"
|
|
54
|
+
"1. Call tool A with input X\n"
|
|
55
|
+
"2. Call tool B with input Y\n"
|
|
56
|
+
"3. Interpret the output of tool A and B\n"
|
|
57
|
+
"4. Return the final result"
|
|
58
|
+
"\n\n **PLAN:**\n"),
|
|
59
|
+
description="The reasoning model prompt template.")
|
|
60
|
+
|
|
61
|
+
instruction_prompt_template: str = Field(
|
|
62
|
+
default=("Answer the following question based on message history: {input_text}"
|
|
63
|
+
"\n\nHere is a plan for execution that you could use to guide you if you wanted to:"
|
|
64
|
+
"\n\n{reasoning_output}"
|
|
65
|
+
"\n\nNOTE: Remember to follow your guidance on how to format output, etc."
|
|
66
|
+
"\n\n You must respond with the answer to the original question directly to the user."),
|
|
67
|
+
description="The instruction prompt template.")
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@register_function(config_type=ReasoningFunctionConfig, framework_wrappers=[LLMFrameworkEnum.LANGCHAIN])
|
|
71
|
+
async def build_reasoning_function(config: ReasoningFunctionConfig, builder: Builder):
|
|
72
|
+
"""
|
|
73
|
+
Build a ReasoningFunction from the provided config.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
config (ReasoningFunctionConfig): The config for the ReasoningFunction.
|
|
77
|
+
builder (Builder): The Builder instance to use for building the function.
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
ReasoningFunction: The built ReasoningFunction.
|
|
81
|
+
"""
|
|
82
|
+
from langchain_core.language_models import BaseChatModel
|
|
83
|
+
from langchain_core.prompts import PromptTemplate
|
|
84
|
+
|
|
85
|
+
from nat.agent.base import AGENT_LOG_PREFIX
|
|
86
|
+
|
|
87
|
+
def remove_r1_think_tags(text: str):
|
|
88
|
+
pattern = r'(<think>)?.*?</think>\s*(.*)'
|
|
89
|
+
|
|
90
|
+
# Add re.DOTALL flag to make . match newlines
|
|
91
|
+
match = re.match(pattern, text, re.DOTALL)
|
|
92
|
+
|
|
93
|
+
if match:
|
|
94
|
+
return match.group(2)
|
|
95
|
+
|
|
96
|
+
return text
|
|
97
|
+
|
|
98
|
+
# Get the LLM to use for reasoning
|
|
99
|
+
llm: BaseChatModel = await builder.get_llm(config.llm_name, wrapper_type=LLMFrameworkEnum.LANGCHAIN)
|
|
100
|
+
|
|
101
|
+
# Get the augmented function's description
|
|
102
|
+
augmented_function = await builder.get_function(config.augmented_fn)
|
|
103
|
+
|
|
104
|
+
# For now, we rely on runtime checking for type conversion
|
|
105
|
+
|
|
106
|
+
if augmented_function.description and augmented_function.description != "":
|
|
107
|
+
augmented_function_desc = augmented_function.description
|
|
108
|
+
else:
|
|
109
|
+
raise ValueError(f"Function {config.augmented_fn} does not have a description. Cannot augment "
|
|
110
|
+
f"function without a description.")
|
|
111
|
+
|
|
112
|
+
# Get the function dependencies of the augmented function
|
|
113
|
+
function_dependencies = builder.get_function_dependencies(config.augmented_fn)
|
|
114
|
+
function_used_tools = set()
|
|
115
|
+
function_used_tools.update(function_dependencies.functions)
|
|
116
|
+
for function_group in function_dependencies.function_groups:
|
|
117
|
+
function_used_tools.update(builder.get_function_group_dependencies(function_group).functions)
|
|
118
|
+
|
|
119
|
+
tool_names_with_desc: list[tuple[str, str]] = []
|
|
120
|
+
|
|
121
|
+
for tool in function_used_tools:
|
|
122
|
+
tool_impl = await builder.get_function(tool)
|
|
123
|
+
tool_names_with_desc.append((tool, tool_impl.description if hasattr(tool_impl, "description") else ""))
|
|
124
|
+
|
|
125
|
+
# Draft the reasoning prompt for the augmented function
|
|
126
|
+
template = PromptTemplate(template=config.reasoning_prompt_template,
|
|
127
|
+
input_variables=["augmented_function_desc", "input_text", "tools"],
|
|
128
|
+
validate_template=True)
|
|
129
|
+
|
|
130
|
+
downstream_template = PromptTemplate(template=config.instruction_prompt_template,
|
|
131
|
+
input_variables=["input_text", "reasoning_output"],
|
|
132
|
+
validate_template=True)
|
|
133
|
+
|
|
134
|
+
streaming_inner_fn = None
|
|
135
|
+
single_inner_fn = None
|
|
136
|
+
|
|
137
|
+
if augmented_function.has_streaming_output:
|
|
138
|
+
|
|
139
|
+
async def streaming_inner(
|
|
140
|
+
input_message: ChatRequest) -> AsyncGenerator[augmented_function.streaming_output_type]:
|
|
141
|
+
"""
|
|
142
|
+
Perform reasoning on the input text.
|
|
143
|
+
|
|
144
|
+
Args:
|
|
145
|
+
input_message (ChatRequest): The input text to reason on.
|
|
146
|
+
"""
|
|
147
|
+
|
|
148
|
+
input_text = "".join([str(message.model_dump()) + "\n" for message in input_message.messages])
|
|
149
|
+
|
|
150
|
+
prompt = await template.ainvoke(
|
|
151
|
+
input={
|
|
152
|
+
"augmented_function_desc": augmented_function_desc,
|
|
153
|
+
"input_text": input_text,
|
|
154
|
+
"tools": "\n".join([f"- {tool[0]}: {tool[1]}" for tool in tool_names_with_desc])
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
prompt = prompt.to_string()
|
|
158
|
+
|
|
159
|
+
# Get the reasoning output from the LLM
|
|
160
|
+
reasoning_output = ""
|
|
161
|
+
|
|
162
|
+
async for chunk in llm.astream(prompt):
|
|
163
|
+
reasoning_output += chunk.content
|
|
164
|
+
|
|
165
|
+
reasoning_output = remove_r1_think_tags(reasoning_output)
|
|
166
|
+
|
|
167
|
+
output = await downstream_template.ainvoke(input={
|
|
168
|
+
"input_text": input_text, "reasoning_output": reasoning_output
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
output = output.to_string()
|
|
172
|
+
|
|
173
|
+
if config.verbose:
|
|
174
|
+
logger.info("%s Reasoning plan and input to agent: \n\n%s", AGENT_LOG_PREFIX, output)
|
|
175
|
+
|
|
176
|
+
async for chunk in augmented_function.acall_stream(output):
|
|
177
|
+
yield chunk
|
|
178
|
+
|
|
179
|
+
streaming_inner_fn = streaming_inner
|
|
180
|
+
|
|
181
|
+
if augmented_function.has_single_output:
|
|
182
|
+
|
|
183
|
+
async def single_inner(input_message: ChatRequest) -> augmented_function.single_output_type:
|
|
184
|
+
"""
|
|
185
|
+
Perform reasoning on the input text.
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
input_message (ChatRequest): The input text to reason on.
|
|
189
|
+
"""
|
|
190
|
+
|
|
191
|
+
input_text = "".join([str(message.model_dump()) + "\n" for message in input_message.messages])
|
|
192
|
+
|
|
193
|
+
prompt = await template.ainvoke(
|
|
194
|
+
input={
|
|
195
|
+
"augmented_function_desc": augmented_function_desc,
|
|
196
|
+
"input_text": input_text,
|
|
197
|
+
"tools": "\n".join([f"- {tool[0]}: {tool[1]}" for tool in tool_names_with_desc])
|
|
198
|
+
})
|
|
199
|
+
|
|
200
|
+
prompt = prompt.to_string()
|
|
201
|
+
|
|
202
|
+
# Get the reasoning output from the LLM
|
|
203
|
+
reasoning_output = ""
|
|
204
|
+
|
|
205
|
+
async for chunk in llm.astream(prompt):
|
|
206
|
+
reasoning_output += chunk.content
|
|
207
|
+
|
|
208
|
+
reasoning_output = remove_r1_think_tags(reasoning_output)
|
|
209
|
+
|
|
210
|
+
output = await downstream_template.ainvoke(input={
|
|
211
|
+
"input_text": input_text, "reasoning_output": reasoning_output
|
|
212
|
+
})
|
|
213
|
+
|
|
214
|
+
output = output.to_string()
|
|
215
|
+
|
|
216
|
+
if config.verbose:
|
|
217
|
+
logger.info("%s Reasoning plan and input to agent: \n\n%s", AGENT_LOG_PREFIX, output)
|
|
218
|
+
|
|
219
|
+
return await augmented_function.acall_invoke(output)
|
|
220
|
+
|
|
221
|
+
single_inner_fn = single_inner
|
|
222
|
+
|
|
223
|
+
yield FunctionInfo.create(
|
|
224
|
+
single_fn=single_inner_fn,
|
|
225
|
+
stream_fn=streaming_inner_fn,
|
|
226
|
+
description=("Reasoning function that generates a detailed execution plan for a system based on the input."),
|
|
227
|
+
converters=augmented_function.converter_list)
|
nat/agent/register.py
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
# flake8: noqa
|
|
17
|
+
|
|
18
|
+
# Import any workflows which need to be automatically registered here
|
|
19
|
+
from .prompt_optimizer import register as prompt_optimizer
|
|
20
|
+
from .react_agent import register as react_agent
|
|
21
|
+
from .reasoning_agent import reasoning_agent
|
|
22
|
+
from .rewoo_agent import register as rewoo_agent
|
|
23
|
+
from .tool_calling_agent import register as tool_calling_agent
|
|
File without changes
|