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
nat/llm/openai_llm.py
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-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
|
+
from pydantic import AliasChoices
|
|
17
|
+
from pydantic import ConfigDict
|
|
18
|
+
from pydantic import Field
|
|
19
|
+
|
|
20
|
+
from nat.builder.builder import Builder
|
|
21
|
+
from nat.builder.llm import LLMProviderInfo
|
|
22
|
+
from nat.cli.register_workflow import register_llm_provider
|
|
23
|
+
from nat.data_models.llm import LLMBaseConfig
|
|
24
|
+
from nat.data_models.optimizable import OptimizableMixin
|
|
25
|
+
from nat.data_models.retry_mixin import RetryMixin
|
|
26
|
+
from nat.data_models.temperature_mixin import TemperatureMixin
|
|
27
|
+
from nat.data_models.thinking_mixin import ThinkingMixin
|
|
28
|
+
from nat.data_models.top_p_mixin import TopPMixin
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class OpenAIModelConfig(LLMBaseConfig,
|
|
32
|
+
RetryMixin,
|
|
33
|
+
OptimizableMixin,
|
|
34
|
+
TemperatureMixin,
|
|
35
|
+
TopPMixin,
|
|
36
|
+
ThinkingMixin,
|
|
37
|
+
name="openai"):
|
|
38
|
+
"""An OpenAI LLM provider to be used with an LLM client."""
|
|
39
|
+
|
|
40
|
+
model_config = ConfigDict(protected_namespaces=(), extra="allow")
|
|
41
|
+
|
|
42
|
+
api_key: str | None = Field(default=None, description="OpenAI API key to interact with hosted model.")
|
|
43
|
+
base_url: str | None = Field(default=None, description="Base url to the hosted model.")
|
|
44
|
+
model_name: str = Field(validation_alias=AliasChoices("model_name", "model"),
|
|
45
|
+
serialization_alias="model",
|
|
46
|
+
description="The OpenAI hosted model name.")
|
|
47
|
+
seed: int | None = Field(default=None, description="Random seed to set for generation.")
|
|
48
|
+
max_retries: int = Field(default=10, description="The max number of retries for the request.")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@register_llm_provider(config_type=OpenAIModelConfig)
|
|
52
|
+
async def openai_llm(config: OpenAIModelConfig, _builder: Builder):
|
|
53
|
+
|
|
54
|
+
yield LLMProviderInfo(config=config, description="An OpenAI model for use with an LLM client.")
|
nat/llm/register.py
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-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
|
+
# isort:skip_file
|
|
18
|
+
"""Register LLM providers via import side effects.
|
|
19
|
+
|
|
20
|
+
This module is imported by the NeMo Agent Toolkit runtime to ensure providers are registered and discoverable.
|
|
21
|
+
"""
|
|
22
|
+
# Import any providers which need to be automatically registered here
|
|
23
|
+
from . import aws_bedrock_llm
|
|
24
|
+
from . import azure_openai_llm
|
|
25
|
+
from . import litellm_llm
|
|
26
|
+
from . import nim_llm
|
|
27
|
+
from . import openai_llm
|
|
@@ -0,0 +1,14 @@
|
|
|
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.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-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 os
|
|
17
|
+
from abc import ABC
|
|
18
|
+
from enum import Enum
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class EnvConfigValueSource(Enum):
|
|
22
|
+
ENV_DEFAULT = 1
|
|
23
|
+
CONSTRUCTOR = 2
|
|
24
|
+
ENV_OVERRIDE = 3
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class EnvConfigValue(ABC):
|
|
28
|
+
"""
|
|
29
|
+
A wrapper for a string used as a configuration value which can be loaded from the system environment or injected via
|
|
30
|
+
the constructor. This class should be subclassed and the class fields `_ENV_KEY` and `_ENV_KEY_OVERRIDE` can be set
|
|
31
|
+
to enable environment-loading functionality. Convienience properties are available to check from where the value was
|
|
32
|
+
loaded.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
_ENV_KEY: str | None = None
|
|
36
|
+
_ENV_KEY_OVERRIDE: str | None = None
|
|
37
|
+
_ALLOW_NONE: bool = False
|
|
38
|
+
|
|
39
|
+
def __init__(self, value: str | None = None, use_env: bool = True):
|
|
40
|
+
"""
|
|
41
|
+
Parameters
|
|
42
|
+
----------
|
|
43
|
+
value : str, optional
|
|
44
|
+
The value to be contained in the EnvConfigValue. If the value is `None`, an attempt will be made to load it
|
|
45
|
+
from the environment using `_ENV_KEY`. if the `_ENV_KEY_OVERRIDE` field is not `None`, an attempt will be
|
|
46
|
+
made to load that environment variable in place of the passed-in value.
|
|
47
|
+
use_env : bool
|
|
48
|
+
If False, all environment-loading logic will be bypassed and the passed-in value will be used as-is.
|
|
49
|
+
defaults to True.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
self._source = EnvConfigValueSource.CONSTRUCTOR
|
|
53
|
+
|
|
54
|
+
if use_env:
|
|
55
|
+
if value is None and self.__class__._ENV_KEY is not None:
|
|
56
|
+
value = os.environ.get(self.__class__._ENV_KEY, None)
|
|
57
|
+
self._source = EnvConfigValueSource.ENV_DEFAULT
|
|
58
|
+
|
|
59
|
+
if self.__class__._ENV_KEY_OVERRIDE is not None and self.__class__._ENV_KEY_OVERRIDE in os.environ:
|
|
60
|
+
value = os.environ[self.__class__._ENV_KEY_OVERRIDE]
|
|
61
|
+
self._source = EnvConfigValueSource.ENV_OVERRIDE
|
|
62
|
+
|
|
63
|
+
if not self.__class__._ALLOW_NONE and value is None:
|
|
64
|
+
|
|
65
|
+
message = ("value must not be None, but provided value was None and no environment-based default or "
|
|
66
|
+
"override was found.")
|
|
67
|
+
|
|
68
|
+
if self.__class__._ENV_KEY is None:
|
|
69
|
+
raise ValueError(message)
|
|
70
|
+
|
|
71
|
+
raise ValueError(
|
|
72
|
+
f"{message} Try passing a value to the constructor, or setting the `{self.__class__._ENV_KEY}` "
|
|
73
|
+
"environment variable.")
|
|
74
|
+
|
|
75
|
+
elif not self.__class__._ALLOW_NONE and value is None:
|
|
76
|
+
raise ValueError("value must not be none")
|
|
77
|
+
|
|
78
|
+
assert isinstance(value, str) or value is None
|
|
79
|
+
|
|
80
|
+
self._value = value
|
|
81
|
+
self._use_env = use_env
|
|
82
|
+
|
|
83
|
+
@property
|
|
84
|
+
def source(self) -> EnvConfigValueSource:
|
|
85
|
+
return self._source
|
|
86
|
+
|
|
87
|
+
@property
|
|
88
|
+
def use_env(self) -> bool:
|
|
89
|
+
return self._use_env
|
|
90
|
+
|
|
91
|
+
@property
|
|
92
|
+
def value(self) -> str | None:
|
|
93
|
+
return self._value
|
nat/llm/utils/error.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-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_ERROR_MESSAGE = (
|
|
17
|
+
"{package} not found. Install it and other additional dependencies by running the following command:\n")
|
|
@@ -0,0 +1,215 @@
|
|
|
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 functools
|
|
17
|
+
import inspect
|
|
18
|
+
import logging
|
|
19
|
+
import types
|
|
20
|
+
from abc import abstractmethod
|
|
21
|
+
from collections.abc import AsyncGenerator
|
|
22
|
+
from collections.abc import Callable
|
|
23
|
+
from collections.abc import Iterable
|
|
24
|
+
from dataclasses import dataclass
|
|
25
|
+
from typing import Any
|
|
26
|
+
from typing import TypeVar
|
|
27
|
+
|
|
28
|
+
ModelType = TypeVar("ModelType")
|
|
29
|
+
MessagesType = TypeVar("MessagesType")
|
|
30
|
+
|
|
31
|
+
logger = logging.getLogger(__name__)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class FunctionArgumentWrapper:
|
|
35
|
+
"""
|
|
36
|
+
Wrapper for the arguments and keyword arguments of a function.
|
|
37
|
+
|
|
38
|
+
The arguments and keyword arguments are stored in the args and kwargs attributes, respectively.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
def __init__(self, *args: Any, **kwargs: Any):
|
|
42
|
+
"""
|
|
43
|
+
Initialize the FunctionArgumentWrapper.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
args: The arguments to the function.
|
|
47
|
+
kwargs: The keyword arguments to the function.
|
|
48
|
+
"""
|
|
49
|
+
self.args = args
|
|
50
|
+
self.kwargs = kwargs
|
|
51
|
+
|
|
52
|
+
def __repr__(self) -> str:
|
|
53
|
+
return f"FunctionArgumentWrapper(args={self.args}, kwargs={self.kwargs})"
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@dataclass
|
|
57
|
+
class BaseThinkingInjector:
|
|
58
|
+
"""
|
|
59
|
+
Base class for thinking injectors.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
system_prompt: The system prompt to inject.
|
|
63
|
+
function_names: The function names to inject the system prompt into.
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
system_prompt: str
|
|
67
|
+
function_names: list[str]
|
|
68
|
+
|
|
69
|
+
@abstractmethod
|
|
70
|
+
def inject(self, *args, **kwargs) -> FunctionArgumentWrapper:
|
|
71
|
+
"""
|
|
72
|
+
Inject the system prompt into the arguments.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
args: The arguments to inject the system prompt into.
|
|
76
|
+
kwargs: The keyword arguments to inject the system prompt into.
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
FunctionArgumentWrapper: An object that contains the transformed args and kwargs.
|
|
80
|
+
"""
|
|
81
|
+
pass
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _make_thinking_decorator(injector: BaseThinkingInjector):
|
|
85
|
+
|
|
86
|
+
def decorate(fn: Callable[..., Any]) -> Callable[..., Any]:
|
|
87
|
+
|
|
88
|
+
async def _call_async(obj: object, *call_args, **call_kwargs) -> Any:
|
|
89
|
+
new_args = injector.inject(*call_args, **call_kwargs)
|
|
90
|
+
return await fn(obj, *new_args.args, **new_args.kwargs)
|
|
91
|
+
|
|
92
|
+
async def _agen(obj: object, *call_args, **call_kwargs) -> AsyncGenerator[Any, None]:
|
|
93
|
+
new_args = injector.inject(*call_args, **call_kwargs)
|
|
94
|
+
async for item in fn(obj, *new_args.args, **new_args.kwargs):
|
|
95
|
+
yield item
|
|
96
|
+
|
|
97
|
+
def _gen(obj: object, *call_args, **call_kwargs) -> Iterable[Any]:
|
|
98
|
+
new_args = injector.inject(*call_args, **call_kwargs)
|
|
99
|
+
yield from fn(obj, *new_args.args, **new_args.kwargs)
|
|
100
|
+
return
|
|
101
|
+
|
|
102
|
+
def _sync(obj: object, *call_args, **call_kwargs) -> Any:
|
|
103
|
+
new_args = injector.inject(*call_args, **call_kwargs)
|
|
104
|
+
return fn(obj, *new_args.args, **new_args.kwargs)
|
|
105
|
+
|
|
106
|
+
# Decide which wrapper to return
|
|
107
|
+
if inspect.iscoroutinefunction(fn):
|
|
108
|
+
wrapper = _call_async
|
|
109
|
+
elif inspect.isasyncgenfunction(fn):
|
|
110
|
+
wrapper = _agen
|
|
111
|
+
elif inspect.isgeneratorfunction(fn):
|
|
112
|
+
wrapper = _gen
|
|
113
|
+
else:
|
|
114
|
+
wrapper = _sync
|
|
115
|
+
|
|
116
|
+
return functools.wraps(fn)(wrapper)
|
|
117
|
+
|
|
118
|
+
return decorate
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def patch_with_thinking(obj: ModelType, injector: BaseThinkingInjector) -> ModelType:
|
|
122
|
+
"""
|
|
123
|
+
Patch the given object with a decorator that injects a system prompt into the supplied messages.
|
|
124
|
+
There is an assumption that the first non-object argument is the messages.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
obj: The object to patch.
|
|
128
|
+
injector: The injector to use.
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
The patched object.
|
|
132
|
+
|
|
133
|
+
Examples:
|
|
134
|
+
>>> from nat.llm.utils.thinking import BaseThinkingInjector
|
|
135
|
+
>>> from nat.llm.utils.thinking import FunctionArgumentWrapper
|
|
136
|
+
>>> from nat.llm.utils.thinking import patch_with_thinking
|
|
137
|
+
>>>
|
|
138
|
+
>>> class MockClass:
|
|
139
|
+
... def sync_method(self, *args, **kwargs):
|
|
140
|
+
... return (args, kwargs)
|
|
141
|
+
...
|
|
142
|
+
>>> mock_obj_1 = MockClass()
|
|
143
|
+
>>> class AddThinking(BaseThinkingInjector):
|
|
144
|
+
... def inject(self, x: str, *args, **kwargs) -> FunctionArgumentWrapper:
|
|
145
|
+
... return FunctionArgumentWrapper(("thinking " + x), *args, **kwargs)
|
|
146
|
+
>>>
|
|
147
|
+
>>> patched_obj = patch_with_thinking(mock_obj_1, AddThinking(
|
|
148
|
+
... system_prompt="thinking",
|
|
149
|
+
... function_names=["sync_method"],
|
|
150
|
+
... ))
|
|
151
|
+
>>> patched_obj.sync_method("test", 1, 2, 3, foo="bar")
|
|
152
|
+
(('thinking test', 1, 2, 3), {'foo': 'bar'})
|
|
153
|
+
>>>
|
|
154
|
+
>>> mock_obj_2 = MockClass()
|
|
155
|
+
>>> class AddThinkingWithArgs(BaseThinkingInjector):
|
|
156
|
+
... def inject(self, *args, **kwargs) -> FunctionArgumentWrapper:
|
|
157
|
+
... return FunctionArgumentWrapper("thinking", *args, **kwargs)
|
|
158
|
+
>>>
|
|
159
|
+
>>> patched_obj = patch_with_thinking(mock_obj_2, AddThinkingWithArgs(
|
|
160
|
+
... system_prompt="thinking",
|
|
161
|
+
... function_names=["sync_method"],
|
|
162
|
+
... ))
|
|
163
|
+
>>> patched_obj.sync_method("test", 1, 2, 3, foo="bar")
|
|
164
|
+
(('thinking', 'test', 1, 2, 3), {'foo': 'bar'})
|
|
165
|
+
>>>
|
|
166
|
+
>>> mock_obj_3 = MockClass()
|
|
167
|
+
>>> class AddThinkingWithKwargs(BaseThinkingInjector):
|
|
168
|
+
... def inject(self, *args, **kwargs) -> FunctionArgumentWrapper:
|
|
169
|
+
... return FunctionArgumentWrapper(*args, thinking=True, **kwargs)
|
|
170
|
+
>>>
|
|
171
|
+
>>> patched_obj = patch_with_thinking(mock_obj_3, AddThinkingWithKwargs(
|
|
172
|
+
... system_prompt="thinking",
|
|
173
|
+
... function_names=["sync_method"],
|
|
174
|
+
... ))
|
|
175
|
+
>>> patched_obj.sync_method("test", 1, 2, 3, foo="bar")
|
|
176
|
+
(('test', 1, 2, 3), {'thinking': True, 'foo': 'bar'})
|
|
177
|
+
"""
|
|
178
|
+
|
|
179
|
+
decorator = _make_thinking_decorator(injector)
|
|
180
|
+
|
|
181
|
+
cls = obj if inspect.isclass(obj) else type(obj)
|
|
182
|
+
cls_name = getattr(cls, "__name__", str(cls))
|
|
183
|
+
|
|
184
|
+
for name, _ in inspect.getmembers(cls, callable):
|
|
185
|
+
if name not in injector.function_names:
|
|
186
|
+
continue
|
|
187
|
+
|
|
188
|
+
descriptor = inspect.getattr_static(cls, name)
|
|
189
|
+
original = descriptor.__func__ if isinstance(descriptor, types.MethodType) else descriptor
|
|
190
|
+
wrapped = decorator(original)
|
|
191
|
+
|
|
192
|
+
try: # instance‑level first
|
|
193
|
+
if not inspect.isclass(obj):
|
|
194
|
+
object.__setattr__(obj, name, types.MethodType(wrapped, obj))
|
|
195
|
+
continue
|
|
196
|
+
except Exception as exc:
|
|
197
|
+
logger.info(
|
|
198
|
+
"Instance‑level patch failed for %s.%s (%s); "
|
|
199
|
+
"falling back to class‑level patch.",
|
|
200
|
+
cls_name,
|
|
201
|
+
name,
|
|
202
|
+
exc,
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
try: # class‑level fallback
|
|
206
|
+
setattr(cls, name, wrapped)
|
|
207
|
+
except Exception as exc:
|
|
208
|
+
logger.info(
|
|
209
|
+
"Cannot patch method %s.%s with thinking: %s",
|
|
210
|
+
cls_name,
|
|
211
|
+
name,
|
|
212
|
+
exc,
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
return obj
|
nat/memory/__init__.py
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-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
|
+
NAT Memory Module
|
|
17
|
+
|
|
18
|
+
This package provides foundational classes and interfaces
|
|
19
|
+
for managing text-based memory in NAT's LLM-based agents.
|
|
20
|
+
"""
|
nat/memory/interfaces.py
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-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
|
+
from abc import ABC
|
|
17
|
+
from abc import abstractmethod
|
|
18
|
+
from collections.abc import Callable
|
|
19
|
+
|
|
20
|
+
from .models import MemoryItem
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class MemoryEditor(ABC):
|
|
24
|
+
"""
|
|
25
|
+
Abstract interface for editing and
|
|
26
|
+
retrieving memory items.
|
|
27
|
+
|
|
28
|
+
A MemoryEditor is responsible for adding, searching, and
|
|
29
|
+
removing MemoryItems.
|
|
30
|
+
|
|
31
|
+
Implementations may integrate with
|
|
32
|
+
vector stores or other indexing backends.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
@abstractmethod
|
|
36
|
+
async def add_items(self, items: list[MemoryItem]) -> None:
|
|
37
|
+
"""
|
|
38
|
+
Insert multiple MemoryItems into the memory.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
items (list[MemoryItem]): The items to be added.
|
|
42
|
+
"""
|
|
43
|
+
raise NotImplementedError
|
|
44
|
+
|
|
45
|
+
@abstractmethod
|
|
46
|
+
async def search(self, query: str, top_k: int = 5, **kwargs) -> list[MemoryItem]:
|
|
47
|
+
"""
|
|
48
|
+
Retrieve items relevant to the given query.
|
|
49
|
+
Relevance criteria depend on implementation.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
query (str): The query string to match.
|
|
53
|
+
top_k (int): Maximum number of items to return.
|
|
54
|
+
kwargs (dict): Keyword arguments to pass to the search method.
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
list[MemoryItem]: The most relevant MemoryItems.
|
|
58
|
+
"""
|
|
59
|
+
raise NotImplementedError
|
|
60
|
+
|
|
61
|
+
@abstractmethod
|
|
62
|
+
async def remove_items(self, **kwargs) -> None:
|
|
63
|
+
"""
|
|
64
|
+
Remove items. Additional parameters
|
|
65
|
+
needed for deletion can be specified in keyword arguments.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
kwargs (dict): Keyword arguments to pass to the remove-items method.
|
|
69
|
+
"""
|
|
70
|
+
raise NotImplementedError
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class MemoryIOBase(ABC):
|
|
74
|
+
"""
|
|
75
|
+
Base abstract class for I/O operations
|
|
76
|
+
on memory, providing a common interface for
|
|
77
|
+
|
|
78
|
+
MemoryReader and MemoryWriter to interact
|
|
79
|
+
with a MemoryEditor.
|
|
80
|
+
|
|
81
|
+
Concrete subclasses should hold a
|
|
82
|
+
reference to a MemoryEditor instance.
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
def __init__(self, editor: MemoryEditor) -> None:
|
|
86
|
+
self._editor = editor
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class MemoryReader(MemoryIOBase):
|
|
90
|
+
"""
|
|
91
|
+
Responsible for retrieving MemoryItems
|
|
92
|
+
from the MemoryEditor based on context or queries.
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
@abstractmethod
|
|
96
|
+
async def retrieve(self, context: str, top_k: int = 5) -> list[MemoryItem]:
|
|
97
|
+
"""
|
|
98
|
+
Retrieve a subset of
|
|
99
|
+
MemoryItems relevant to the provided context.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
context (str): A string representing
|
|
103
|
+
the current user context or query.
|
|
104
|
+
top_k (int): Maximum number of items to return.
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
list[MemoryItem]: Relevant MemoryItems.
|
|
108
|
+
"""
|
|
109
|
+
raise NotImplementedError
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class MemoryWriter(MemoryIOBase):
|
|
113
|
+
"""
|
|
114
|
+
Responsible for converting new observations
|
|
115
|
+
(textual inputs) into MemoryItems andstoring
|
|
116
|
+
them via the MemoryEditor.
|
|
117
|
+
"""
|
|
118
|
+
|
|
119
|
+
@abstractmethod
|
|
120
|
+
async def write(self, observation: str, context: str | None = None) -> list[MemoryItem]:
|
|
121
|
+
"""
|
|
122
|
+
Process the given observation and store the resulting MemoryItems.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
observation (str): The new textual input to record.
|
|
126
|
+
context (Optional[str]): Additional
|
|
127
|
+
context that might influence how the observation is stored.
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
list[MemoryItem]: The newly created MemoryItems.
|
|
131
|
+
"""
|
|
132
|
+
raise NotImplementedError
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
class MemoryManager(ABC):
|
|
136
|
+
"""
|
|
137
|
+
Manages the lifecycle of the stored
|
|
138
|
+
memory by applying policies such as summarization,
|
|
139
|
+
reflection, forgetting, and mergingn
|
|
140
|
+
to ensure long-term coherence and relevance.
|
|
141
|
+
"""
|
|
142
|
+
|
|
143
|
+
@abstractmethod
|
|
144
|
+
async def summarize(self) -> None:
|
|
145
|
+
"""
|
|
146
|
+
Summarize long or numerous MemoryItems into a more compact form.
|
|
147
|
+
This may remove the original items and store a new summary item.
|
|
148
|
+
"""
|
|
149
|
+
raise NotImplementedError
|
|
150
|
+
|
|
151
|
+
@abstractmethod
|
|
152
|
+
async def reflect(self) -> None:
|
|
153
|
+
"""
|
|
154
|
+
Generate higher-level insights or
|
|
155
|
+
abstractions from existing MemoryItems.
|
|
156
|
+
This may call out to an LLM or other
|
|
157
|
+
logic to produce conceptual memory.
|
|
158
|
+
"""
|
|
159
|
+
raise NotImplementedError
|
|
160
|
+
|
|
161
|
+
@abstractmethod
|
|
162
|
+
async def forget(self, criteria: Callable[[MemoryItem], bool]) -> None:
|
|
163
|
+
"""
|
|
164
|
+
Remove MemoryItems that are no
|
|
165
|
+
longer relevant or have low importance.
|
|
166
|
+
|
|
167
|
+
Args:
|
|
168
|
+
criteria (Callable[[MemoryItem], bool]): A function that
|
|
169
|
+
returns True for items to forget.
|
|
170
|
+
"""
|
|
171
|
+
raise NotImplementedError
|
|
172
|
+
|
|
173
|
+
@abstractmethod
|
|
174
|
+
async def merge(self, criteria: Callable[[MemoryItem, MemoryItem], bool]) -> None:
|
|
175
|
+
"""
|
|
176
|
+
Merge similar or redundant MemoryItems
|
|
177
|
+
into a smaller set of more concise items.
|
|
178
|
+
|
|
179
|
+
Args:
|
|
180
|
+
criteria (Callable[[MemoryItem, MemoryItem], bool]): A function
|
|
181
|
+
that determines which items can be merged.
|
|
182
|
+
"""
|
|
183
|
+
raise NotImplementedError
|