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,205 @@
|
|
|
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 asyncio
|
|
17
|
+
import logging
|
|
18
|
+
|
|
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.component_ref import FunctionRef
|
|
26
|
+
from nat.data_models.component_ref import TTCStrategyRef
|
|
27
|
+
from nat.data_models.function import FunctionBaseConfig
|
|
28
|
+
from nat.experimental.test_time_compute.models.stage_enums import PipelineTypeEnum
|
|
29
|
+
from nat.experimental.test_time_compute.models.stage_enums import StageTypeEnum
|
|
30
|
+
from nat.experimental.test_time_compute.models.tool_use_config import ToolUseInputSchema
|
|
31
|
+
from nat.experimental.test_time_compute.models.tool_use_config import ToolUselist
|
|
32
|
+
from nat.experimental.test_time_compute.models.ttc_item import TTCItem
|
|
33
|
+
|
|
34
|
+
logger = logging.getLogger(__name__)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class TTCToolOrchestrationFunctionConfig(FunctionBaseConfig, name="ttc_tool_orchestration"):
|
|
38
|
+
"""
|
|
39
|
+
Configuration for the TTCToolOrchestrationFunction, which is used to orchestrate multiple functions.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
augmented_fns: list[FunctionRef] = Field(
|
|
43
|
+
description="list of FunctionRefs for the functions to be orchestrated. Must be wrapped in `ttc_tool_wrapper`.")
|
|
44
|
+
|
|
45
|
+
search_strategy: TTCStrategyRef | None = Field(
|
|
46
|
+
description="The TTC search strategy to use for orchestrating invocation of the functions."
|
|
47
|
+
" If None, no search will be performed.",
|
|
48
|
+
default=None,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
editing_strategy: TTCStrategyRef | None = Field(
|
|
52
|
+
default=None,
|
|
53
|
+
description="The TTC editing strategy to use for orchestrating invocation of the functions. "
|
|
54
|
+
"If None, no editing will be performed.",
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
scoring_strategy: TTCStrategyRef | None = Field(
|
|
58
|
+
default=None,
|
|
59
|
+
description="The TTC scoring strategy to use for orchestrating invocation of the functions. "
|
|
60
|
+
"If None, no scoring will be performed.",
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
selection_strategy: TTCStrategyRef = Field(
|
|
64
|
+
description="The TTC selection strategy to use for orchestrating invocation of the functions.")
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@register_function(config_type=TTCToolOrchestrationFunctionConfig, framework_wrappers=[LLMFrameworkEnum.LANGCHAIN])
|
|
68
|
+
async def register_ttc_tool_orchestration_function(
|
|
69
|
+
config: TTCToolOrchestrationFunctionConfig,
|
|
70
|
+
builder: Builder,
|
|
71
|
+
):
|
|
72
|
+
"""
|
|
73
|
+
Registers an TTC-based orchestration function that:
|
|
74
|
+
1. Instantiates all relevant strategies (search, editing, scoring, selection).
|
|
75
|
+
2. Accepts a ToolUselist, converts each item to an TTCItem, optionally runs search/editing.
|
|
76
|
+
3. Calls the correct augmented_fn per item using name=tool name.
|
|
77
|
+
4. If configured, runs scoring and selection on the result.
|
|
78
|
+
5. Returns a new ToolUselist with each output set.
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
# 1) Gather references to all augmented (wrapped) functions
|
|
82
|
+
function_map = {}
|
|
83
|
+
for fn_ref in config.augmented_fns:
|
|
84
|
+
# Retrieve the actual function from the builder
|
|
85
|
+
fn_obj = await builder.get_function(fn_ref)
|
|
86
|
+
function_map[fn_ref] = fn_obj
|
|
87
|
+
|
|
88
|
+
# 2) Instantiate search, editing, scoring, selection strategies (if any)
|
|
89
|
+
search = None
|
|
90
|
+
if config.search_strategy is not None:
|
|
91
|
+
search = await builder.get_ttc_strategy(
|
|
92
|
+
strategy_name=config.search_strategy,
|
|
93
|
+
pipeline_type=PipelineTypeEnum.TOOL_USE,
|
|
94
|
+
stage_type=StageTypeEnum.SEARCH,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
editing = None
|
|
98
|
+
if config.editing_strategy is not None:
|
|
99
|
+
editing = await builder.get_ttc_strategy(
|
|
100
|
+
strategy_name=config.editing_strategy,
|
|
101
|
+
pipeline_type=PipelineTypeEnum.TOOL_USE,
|
|
102
|
+
stage_type=StageTypeEnum.EDITING,
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
scoring = None
|
|
106
|
+
if config.scoring_strategy is not None:
|
|
107
|
+
scoring = await builder.get_ttc_strategy(
|
|
108
|
+
strategy_name=config.scoring_strategy,
|
|
109
|
+
pipeline_type=PipelineTypeEnum.TOOL_USE,
|
|
110
|
+
stage_type=StageTypeEnum.SCORING,
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
selection = await builder.get_ttc_strategy(
|
|
114
|
+
strategy_name=config.selection_strategy,
|
|
115
|
+
pipeline_type=PipelineTypeEnum.TOOL_USE,
|
|
116
|
+
stage_type=StageTypeEnum.SELECTION,
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
fn_description = ("\n".join(f"- **{fn_ref}**: {function_map[fn_ref].description or 'No description provided.'}"
|
|
120
|
+
for fn_ref in config.augmented_fns))
|
|
121
|
+
|
|
122
|
+
# 3) Create the inner function to handle single (non-streaming) calls.
|
|
123
|
+
async def single_inner(tool_list: ToolUselist) -> ToolUselist:
|
|
124
|
+
"""
|
|
125
|
+
Orchestrates multiple tool usages, optionally using search/editing/scoring/selection steps.
|
|
126
|
+
"""
|
|
127
|
+
# Convert each ToolUseInputSchema to TTCItem
|
|
128
|
+
ttc_items = []
|
|
129
|
+
for t in tool_list.tools:
|
|
130
|
+
item = TTCItem(
|
|
131
|
+
input=t.task_description, # The user "task"
|
|
132
|
+
output=None,
|
|
133
|
+
name=t.tool_name, # The "tool name"
|
|
134
|
+
metadata=t.motivation, # The "justification"
|
|
135
|
+
)
|
|
136
|
+
ttc_items.append(item)
|
|
137
|
+
|
|
138
|
+
# Run search strategy if present
|
|
139
|
+
if search is not None:
|
|
140
|
+
ttc_items = await search.ainvoke(ttc_items)
|
|
141
|
+
|
|
142
|
+
logger.info("TTC orchestration function: %d items after search", len(ttc_items))
|
|
143
|
+
|
|
144
|
+
# Invoke the correct augmented function for each item concurrently
|
|
145
|
+
# Helper coroutine to invoke a tool function and capture result or error
|
|
146
|
+
async def _invoke_tool(item: TTCItem, fn):
|
|
147
|
+
try:
|
|
148
|
+
result = await fn.acall_invoke(item.output)
|
|
149
|
+
return item, result, None
|
|
150
|
+
except Exception as e:
|
|
151
|
+
logger.exception(f"Error invoking function '{item.name}': {e}")
|
|
152
|
+
return item, None, str(e)
|
|
153
|
+
|
|
154
|
+
tasks = []
|
|
155
|
+
for item in ttc_items:
|
|
156
|
+
if item.name not in function_map:
|
|
157
|
+
logger.error(f"Function '{item.name}' not found in function map.", exc_info=True)
|
|
158
|
+
item.output = f"Error: Function '{item.name}' not found in function map. Check your input"
|
|
159
|
+
else:
|
|
160
|
+
fn = function_map[item.name]
|
|
161
|
+
tasks.append(_invoke_tool(item, fn))
|
|
162
|
+
|
|
163
|
+
# Await all tasks and assign outputs
|
|
164
|
+
if tasks:
|
|
165
|
+
results = await asyncio.gather(*tasks)
|
|
166
|
+
for item, result, error in results:
|
|
167
|
+
if error:
|
|
168
|
+
item.output = f"Error invoking function '{item.name}': {error}"
|
|
169
|
+
else:
|
|
170
|
+
item.output = result
|
|
171
|
+
|
|
172
|
+
if editing:
|
|
173
|
+
ttc_items = await editing.ainvoke(ttc_items)
|
|
174
|
+
|
|
175
|
+
# Run scoring strategy if present
|
|
176
|
+
if scoring is not None:
|
|
177
|
+
ttc_items = await scoring.ainvoke(ttc_items)
|
|
178
|
+
|
|
179
|
+
# Run selection strategy
|
|
180
|
+
if selection is not None:
|
|
181
|
+
ttc_items = await selection.ainvoke(ttc_items)
|
|
182
|
+
|
|
183
|
+
logger.info("TTC orchestration function: %d items after selection", len(ttc_items))
|
|
184
|
+
|
|
185
|
+
# Convert final results from TTCItems back to a ToolUselist
|
|
186
|
+
final_list = ToolUselist(tools=[])
|
|
187
|
+
for item in ttc_items:
|
|
188
|
+
# Compose a new ToolUseInputSchema with final output
|
|
189
|
+
new_tool = ToolUseInputSchema(
|
|
190
|
+
tool_name=item.name,
|
|
191
|
+
task_description=str(item.input),
|
|
192
|
+
motivation=item.metadata if item.metadata else None,
|
|
193
|
+
output=str(item.output) if item.output is not None else None,
|
|
194
|
+
)
|
|
195
|
+
final_list.tools.append(new_tool)
|
|
196
|
+
|
|
197
|
+
return final_list
|
|
198
|
+
|
|
199
|
+
# 4) Return the function info (only a single_fn is needed; no streaming)
|
|
200
|
+
yield FunctionInfo.create(
|
|
201
|
+
single_fn=single_inner,
|
|
202
|
+
stream_fn=None, # No streaming required
|
|
203
|
+
input_schema=ToolUselist,
|
|
204
|
+
single_output_schema=ToolUselist,
|
|
205
|
+
description=fn_description)
|
|
@@ -0,0 +1,146 @@
|
|
|
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 BaseModel
|
|
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 import Function
|
|
24
|
+
from nat.builder.function_info import FunctionInfo
|
|
25
|
+
from nat.cli.register_workflow import register_function
|
|
26
|
+
from nat.data_models.component_ref import FunctionRef
|
|
27
|
+
from nat.data_models.component_ref import LLMRef
|
|
28
|
+
from nat.data_models.function import FunctionBaseConfig
|
|
29
|
+
from nat.utils.string_utils import convert_to_str
|
|
30
|
+
|
|
31
|
+
logger = logging.getLogger(__name__)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class TTCToolWrapperFunctionConfig(FunctionBaseConfig, name="ttc_tool_wrapper"):
|
|
35
|
+
"""
|
|
36
|
+
Configuration for the TTCToolWrapperFunction, which is used to wrap a function that will be executed
|
|
37
|
+
in the inference time scaling pipeline.
|
|
38
|
+
|
|
39
|
+
This function is responsible for turning an 'objective' or description for the tool into tool input.
|
|
40
|
+
|
|
41
|
+
NOTE: Only supports LLMs with structured output.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
augmented_fn: FunctionRef = Field(description="The name of the function to reason on.")
|
|
45
|
+
|
|
46
|
+
input_llm: LLMRef = Field(description="The LLM that will generate input to the function.")
|
|
47
|
+
verbose: bool = Field(default=False, description="Whether to log detailed information.")
|
|
48
|
+
|
|
49
|
+
downstream_template: str = Field(
|
|
50
|
+
description="The template for the input LLM to generate structured input to the function.",
|
|
51
|
+
default=("You are highly sophisticated generalist AI assistant. Your objective is to act as a"
|
|
52
|
+
" conduit between a user's task for a function and the function itself. You will be given a general "
|
|
53
|
+
"description of the task, or pseudo input for a function. You will also be provided with description "
|
|
54
|
+
"of the function, its input schema, and the output schema. Your task is to generate structured input "
|
|
55
|
+
"to the function based on the description of the task and the function's input schema. If you do not "
|
|
56
|
+
"have enough information to generate structured input, you should respond with 'NOT ENOUGH "
|
|
57
|
+
"INFORMATION'. \n\n The description of the function is: {function_description}\n\n"
|
|
58
|
+
"The input schema of the function is: {input_schema}\n\n"
|
|
59
|
+
"The output schema of the function is: {output_schema}\n\n"
|
|
60
|
+
"The description of the task is: {task_description}\n\n"
|
|
61
|
+
"The structured input to the function is: "))
|
|
62
|
+
|
|
63
|
+
tool_description: str | None = Field(description="The description of the tool to be used for the function.",
|
|
64
|
+
default=None)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@register_function(config_type=TTCToolWrapperFunctionConfig, framework_wrappers=[LLMFrameworkEnum.LANGCHAIN])
|
|
68
|
+
async def register_ttc_tool_wrapper_function(
|
|
69
|
+
config: TTCToolWrapperFunctionConfig,
|
|
70
|
+
builder: Builder,
|
|
71
|
+
):
|
|
72
|
+
"""
|
|
73
|
+
Register the TTCToolWrapperFunction with the provided builder and configuration.
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
try:
|
|
77
|
+
from langchain_core.language_models import BaseChatModel
|
|
78
|
+
from langchain_core.prompts import PromptTemplate
|
|
79
|
+
except ImportError:
|
|
80
|
+
raise ImportError("langchain-core is not installed. Please install it to use SingleShotMultiPlanPlanner.\n"
|
|
81
|
+
"This error can be resolved by installing nvidia-nat-langchain.")
|
|
82
|
+
|
|
83
|
+
augmented_function: Function = await builder.get_function(config.augmented_fn)
|
|
84
|
+
input_llm: BaseChatModel = await builder.get_llm(config.input_llm, wrapper_type=LLMFrameworkEnum.LANGCHAIN)
|
|
85
|
+
|
|
86
|
+
if not augmented_function.has_single_output:
|
|
87
|
+
raise ValueError("TTCToolWrapperFunction only supports functions with a single output.")
|
|
88
|
+
|
|
89
|
+
if not augmented_function.has_single_output:
|
|
90
|
+
raise ValueError("TTCToolWrapperFunction only supports functions with a single output.")
|
|
91
|
+
|
|
92
|
+
if augmented_function.description and augmented_function.description != "":
|
|
93
|
+
augmented_function_desc = augmented_function.description
|
|
94
|
+
else:
|
|
95
|
+
if not config.tool_description:
|
|
96
|
+
raise ValueError(f"Function {config.augmented_fn} does not have a description. Cannot augment "
|
|
97
|
+
f"function without a description and without a tool description.")
|
|
98
|
+
|
|
99
|
+
augmented_function_desc = config.tool_description
|
|
100
|
+
|
|
101
|
+
fn_input_schema: type[BaseModel] = augmented_function.input_schema
|
|
102
|
+
fn_output_schema: type[BaseModel] | type[None] = augmented_function.single_output_schema
|
|
103
|
+
|
|
104
|
+
runnable_llm = input_llm.with_structured_output(schema=fn_input_schema)
|
|
105
|
+
|
|
106
|
+
template = PromptTemplate(
|
|
107
|
+
template=config.downstream_template,
|
|
108
|
+
input_variables=["function_description", "input_schema", "output_schema", "task_description"],
|
|
109
|
+
validate_template=True)
|
|
110
|
+
|
|
111
|
+
function_description = (f"\nDescription: {augmented_function_desc}\n" +
|
|
112
|
+
"\n Input should be a thorough description with all relevant information on what "
|
|
113
|
+
f"the tool should do. The tool requires information about "
|
|
114
|
+
f"{fn_input_schema.model_fields}")
|
|
115
|
+
|
|
116
|
+
async def single_inner(input_message: str) -> fn_output_schema:
|
|
117
|
+
"""
|
|
118
|
+
Inner function to handle the streaming output of the TTCToolWrapperFunction.
|
|
119
|
+
It generates structured input for the augmented function based on the input message.
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
prompt = await template.ainvoke(
|
|
123
|
+
input={
|
|
124
|
+
"function_description": augmented_function_desc,
|
|
125
|
+
"input_schema": fn_input_schema,
|
|
126
|
+
"output_schema": fn_output_schema,
|
|
127
|
+
"task_description": input_message
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
prompt = prompt.to_string()
|
|
131
|
+
|
|
132
|
+
if config.verbose:
|
|
133
|
+
logger.info("TTCToolWrapperFunction: Generated prompt: %s", prompt)
|
|
134
|
+
|
|
135
|
+
llm_parsed = await runnable_llm.ainvoke(prompt)
|
|
136
|
+
|
|
137
|
+
if not llm_parsed:
|
|
138
|
+
logger.warning("TTCToolWrapperFunction: LLM parsing error")
|
|
139
|
+
return "Not enough information"
|
|
140
|
+
|
|
141
|
+
# Call the augmented function with the structured input
|
|
142
|
+
result = await augmented_function.acall_invoke(llm_parsed)
|
|
143
|
+
|
|
144
|
+
return result
|
|
145
|
+
|
|
146
|
+
yield FunctionInfo.from_fn(fn=single_inner, description=function_description, converters=[convert_to_str])
|
|
File without changes
|
|
@@ -0,0 +1,132 @@
|
|
|
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 typing
|
|
17
|
+
|
|
18
|
+
from pydantic import Field
|
|
19
|
+
from pydantic import model_validator
|
|
20
|
+
|
|
21
|
+
from nat.data_models.component_ref import LLMRef
|
|
22
|
+
from nat.data_models.ttc_strategy import TTCStrategyBaseConfig
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class LLMAsAJudgeEditorConfig(TTCStrategyBaseConfig, name="llm_as_a_judge_editor"):
|
|
26
|
+
"""
|
|
27
|
+
Configuration for the LLMAsAJudgeEditor.
|
|
28
|
+
"""
|
|
29
|
+
num_feedback: int = Field(default=10,
|
|
30
|
+
description="Number of feedback items to generate for each plan during editing. "
|
|
31
|
+
"This can help in refining the plans based on feedback.")
|
|
32
|
+
|
|
33
|
+
# If strategy is provided, LLM must be
|
|
34
|
+
editing_llm: LLMRef | typing.Any | None = Field(
|
|
35
|
+
default=None,
|
|
36
|
+
description="The LLM to use for editing the plans. This can be a callable or an instance of an LLM client.")
|
|
37
|
+
|
|
38
|
+
# If strategy is LLM_AS_A_JUDGE, ensure that the feedback_llm is provided.
|
|
39
|
+
feedback_llm: LLMRef | typing.Any | None = Field(default=None,
|
|
40
|
+
description="The LLM to use for generating feedback on the plans."
|
|
41
|
+
" This can be a callable or an instance of an LLM client.")
|
|
42
|
+
|
|
43
|
+
editor_template: str = Field(default=(
|
|
44
|
+
"You are an expert at improving execution plans. You will be given a plan and feedback on that plan."
|
|
45
|
+
" Your task is to create an improved version of the plan that addresses the feedback "
|
|
46
|
+
"while maintaining its strengths.\n\n"
|
|
47
|
+
"Here is the context:\n\n"
|
|
48
|
+
"{context}\n\n"
|
|
49
|
+
"**Input:** \n{original_prompt}\n\n"
|
|
50
|
+
"**Original Plan:**\n{plan}\n\n"
|
|
51
|
+
"**Feedback on the Plan:**\n{feedback}\n\n"
|
|
52
|
+
"Please provide an improved version of the plan that addresses"
|
|
53
|
+
" the feedback points. Maintain the same structure and "
|
|
54
|
+
"step-by-step format, but enhance the content. Do not include explanations of your changes, just provide the "
|
|
55
|
+
"improved plan directly:\n\n"
|
|
56
|
+
"Begin the final improve plan with 'EDITED PLAN:'"),
|
|
57
|
+
description="The template to use for editing the planning items based on feedback.")
|
|
58
|
+
|
|
59
|
+
feedback_template: str = Field(
|
|
60
|
+
default=("You are an expert at evaluating execution plans. You will be given a plan and "
|
|
61
|
+
"need to provide {num_feedback} "
|
|
62
|
+
"specific points of feedback about its strengths and weaknesses.\n\n"
|
|
63
|
+
"Your feedback should cover aspects like:\n"
|
|
64
|
+
"- Comprehensiveness of the plan\n"
|
|
65
|
+
"- Logical flow and sequencing\n"
|
|
66
|
+
"- Appropriate use of available tools\n"
|
|
67
|
+
"- Potential edge cases or failure points\n"
|
|
68
|
+
"- Efficiency and optimization opportunities\n\n"
|
|
69
|
+
"Here is the context and plan to evaluate:\n\n"
|
|
70
|
+
"{context}\n\n"
|
|
71
|
+
"**Objective:** \n{original_prompt}\n\n"
|
|
72
|
+
"**Plan to Evaluate:**\n{plan}\n\n"
|
|
73
|
+
"Please provide exactly {num_feedback} numbered points of feedback, including "
|
|
74
|
+
"both strengths and areas for improvement. Begin the feedback with 'FEEDBACK:' and provide"
|
|
75
|
+
"{num_feedback} specific feedback points."),
|
|
76
|
+
description="The template to use for generating feedback for each planning item.")
|
|
77
|
+
|
|
78
|
+
@model_validator(mode="before")
|
|
79
|
+
def validate_strategies(cls, values: dict[str, typing.Any]) -> dict[str, typing.Any]:
|
|
80
|
+
|
|
81
|
+
if values.get('editing_llm') is None:
|
|
82
|
+
raise ValueError('editing_llm must be provided when editing_strategy is set.')
|
|
83
|
+
# If editing strategy is LLM_AS_A_JUDGE, feedback_llm must also be provided
|
|
84
|
+
if (values.get('feedback_llm') is None):
|
|
85
|
+
raise ValueError('feedback_llm must be provided when editing_strategy is LLM_AS_A_JUDGE.')
|
|
86
|
+
|
|
87
|
+
return values
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class IterativePlanRefinementConfig(TTCStrategyBaseConfig, name="iterative_plan_refinement"):
|
|
91
|
+
"""Configuration for an 'iterative plan refinement' strategy."""
|
|
92
|
+
editor_llm: LLMRef | typing.Any | None = Field(
|
|
93
|
+
default=None, description="The LLM to use for generating and refining the plan across multiple iterations.")
|
|
94
|
+
num_iterations: int = Field(default=3, description="How many refinement steps to perform.")
|
|
95
|
+
refinement_template: str = Field(
|
|
96
|
+
default=("You have the current plan:\n{current_plan}\n\n"
|
|
97
|
+
"The plan was generated to achieve the following objective:\n{original_prompt}\n\n"
|
|
98
|
+
"Using an agent system with the following description:\n{context}\n\n"
|
|
99
|
+
"Refine or improve it to achieve the objective better."
|
|
100
|
+
"Output the updated plan, beginning with:\nEDITED PLAN:\n"),
|
|
101
|
+
description="Prompt used in each iteration to refine the plan.")
|
|
102
|
+
|
|
103
|
+
@model_validator(mode="before")
|
|
104
|
+
def validate_iterative_strategies(cls, values: dict) -> dict:
|
|
105
|
+
if not values.get('editor_llm'):
|
|
106
|
+
raise ValueError('planning_llm must be provided for iterative plan refinement.')
|
|
107
|
+
if values.get('num_iterations', 0) < 1:
|
|
108
|
+
raise ValueError('num_iterations must be >= 1 for iterative plan refinement.')
|
|
109
|
+
return values
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class MotivationAwareSummarizationConfig(TTCStrategyBaseConfig, name="motivation_aware_editing"):
|
|
113
|
+
"""
|
|
114
|
+
Configuration for the MotivationAwareSummarization strategy.
|
|
115
|
+
"""
|
|
116
|
+
editor_llm: LLMRef | typing.Any | None = Field(
|
|
117
|
+
default=None,
|
|
118
|
+
description="The LLM to use for editing the plans. This can be a callable or an instance of an LLM client.")
|
|
119
|
+
|
|
120
|
+
editor_template: str = Field(
|
|
121
|
+
default=("You are an expert at summarizing key information from relevant documents based on an input task"
|
|
122
|
+
"and motivation. Given a task and motivation, and documents, your task is to create a concise "
|
|
123
|
+
"a summarized response to the task and motivation grounded in the documents .\n\n"
|
|
124
|
+
"Here is the task:\n\n"
|
|
125
|
+
"{task}\n\n"
|
|
126
|
+
"Here is the motivation:\n\n"
|
|
127
|
+
"{motivation}\n\n"
|
|
128
|
+
"and here are the documents:\n\n"
|
|
129
|
+
"{output}\n\n"
|
|
130
|
+
"Please respond with a concise summary that addresses the task and motivation, in at most one"
|
|
131
|
+
"or two sentences. Do not include any other output except the summary. "),
|
|
132
|
+
description="The template to use for summarizing documents.")
|
|
@@ -0,0 +1,112 @@
|
|
|
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 typing
|
|
17
|
+
|
|
18
|
+
from pydantic import Field
|
|
19
|
+
from pydantic import model_validator
|
|
20
|
+
|
|
21
|
+
from nat.data_models.component_ref import LLMRef
|
|
22
|
+
from nat.data_models.ttc_strategy import TTCStrategyBaseConfig
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class LLMBasedPlanScoringConfig(TTCStrategyBaseConfig, name="llm_based_plan_scoring"):
|
|
26
|
+
"""
|
|
27
|
+
Configuration for LLMBasedScoring.
|
|
28
|
+
"""
|
|
29
|
+
scoring_llm: LLMRef | typing.Any | None = Field(
|
|
30
|
+
default=None,
|
|
31
|
+
description="The LLM to use for scoring the plans. This can be a callable or an instance of an LLM client.")
|
|
32
|
+
|
|
33
|
+
scoring_template: str = Field(
|
|
34
|
+
default=("You are an expert reasoning model tasked with scoring the following execution plan based on its"
|
|
35
|
+
"quality and relevance to the provided input to an agent system.\n\n"
|
|
36
|
+
"The agent system's role is:\n{context}\n\n"
|
|
37
|
+
"It has been tasked with achieving the following goal: \n{original_prompt}\n\n"
|
|
38
|
+
"The following plan has been generated to achieve this goal:\n\n{plan}\n\n"
|
|
39
|
+
"Score the plan on a scale from 1 to 10, where 10 is the best. "
|
|
40
|
+
"Return the final score as a floating point number preceded by `FINAL SCORE:` without any "
|
|
41
|
+
"other text before or after it\n"),
|
|
42
|
+
description="The template to use for scoring the plans.")
|
|
43
|
+
|
|
44
|
+
@model_validator(mode="before")
|
|
45
|
+
def validate_strategies(cls, values: dict[str, typing.Any]) -> dict[str, typing.Any]:
|
|
46
|
+
"""
|
|
47
|
+
Ensure that the scoring_llm is provided when using LLMBasedScoring.
|
|
48
|
+
"""
|
|
49
|
+
if values.get('scoring_llm') is None:
|
|
50
|
+
raise ValueError('scoring_llm must be provided when scorer_type is set to LLM_BASED_SCORING.')
|
|
51
|
+
|
|
52
|
+
return values
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class LLMBasedAgentScoringConfig(TTCStrategyBaseConfig, name="llm_based_agent_scoring"):
|
|
56
|
+
"""
|
|
57
|
+
Configuration for LLMBasedScoring.
|
|
58
|
+
"""
|
|
59
|
+
scoring_llm: LLMRef | typing.Any | None = Field(
|
|
60
|
+
default=None,
|
|
61
|
+
description="The LLM to use for scoring the plans. This can be a callable or an instance of an LLM client.")
|
|
62
|
+
|
|
63
|
+
scoring_template: str = Field(
|
|
64
|
+
description="Prompt template to use for scoring the function output",
|
|
65
|
+
default=("You are an expert reasoning model tasked with scoring the following "
|
|
66
|
+
"result of an agent system based on its input and objective. Judge"
|
|
67
|
+
" the quality and relevance of the answer to score it.\n\n"
|
|
68
|
+
"The agent system's objective is:\n{objective}\n\n"
|
|
69
|
+
"It has been tasked with achieving the following goal: \n{input}\n\n"
|
|
70
|
+
"The following output has been generated by the agent:\n\n{output}\n\n"
|
|
71
|
+
"Score the result on a scale from 1 to 10, where 10 is the best. "
|
|
72
|
+
"Return the final score as a floating point number preceded by `FINAL SCORE:` without any "
|
|
73
|
+
"other text before or after it\n"),
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
@model_validator(mode="before")
|
|
77
|
+
def validate_strategies(cls, values: dict[str, typing.Any]) -> dict[str, typing.Any]:
|
|
78
|
+
"""
|
|
79
|
+
Ensure that the scoring_llm is provided when using LLMBasedScoring.
|
|
80
|
+
"""
|
|
81
|
+
if values.get('scoring_llm') is None:
|
|
82
|
+
raise ValueError('scoring_llm must be provided when scorer_type is set to LLM_BASED_SCORING.')
|
|
83
|
+
|
|
84
|
+
return values
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class MotivationAwareScoringConfig(TTCStrategyBaseConfig, name="motivation_aware_scoring"):
|
|
88
|
+
"""
|
|
89
|
+
Configuration for a scoring strategy that considers both the original input (task)
|
|
90
|
+
and the motivation (from metadata) along with the current output.
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
scoring_llm: LLMRef | None = Field(
|
|
94
|
+
default=None, description="The LLM used to evaluate how well the output addresses the task plus motivation.")
|
|
95
|
+
|
|
96
|
+
scoring_template: str = Field(
|
|
97
|
+
default=("You are an expert at assessing the quality of an output in relation to its task and motivation.\n"
|
|
98
|
+
"Task: {task}\n"
|
|
99
|
+
"Motivation: {motivation}\n"
|
|
100
|
+
"Output: {output}\n"
|
|
101
|
+
"On a scale from 1 to 10 (10 being the best), how well does this output fulfill "
|
|
102
|
+
"the original task in the context "
|
|
103
|
+
"of the provided motivation? Note that the task might answer one part of a bigger question "
|
|
104
|
+
"which should count as a satisfactory response and should not receive a lower score.\n"
|
|
105
|
+
"Return the final score as a floating point number preceded by 'FINAL SCORE:'."),
|
|
106
|
+
description="The prompt template used to evaluate and score the output.")
|
|
107
|
+
|
|
108
|
+
@model_validator(mode="before")
|
|
109
|
+
def validate_scoring_llm(cls, values):
|
|
110
|
+
if values.get('scoring_llm') is None:
|
|
111
|
+
raise ValueError("A scoring_llm must be provided for motivation_aware_scoring.")
|
|
112
|
+
return values
|