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,302 @@
|
|
|
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 time
|
|
17
|
+
import typing
|
|
18
|
+
import uuid
|
|
19
|
+
from enum import Enum
|
|
20
|
+
from typing import Literal
|
|
21
|
+
|
|
22
|
+
from pydantic import BaseModel
|
|
23
|
+
from pydantic import ConfigDict
|
|
24
|
+
from pydantic import Field
|
|
25
|
+
from pydantic import model_validator
|
|
26
|
+
|
|
27
|
+
from nat.builder.framework_enum import LLMFrameworkEnum
|
|
28
|
+
from nat.data_models.invocation_node import InvocationNode
|
|
29
|
+
from nat.profiler.callbacks.token_usage_base_model import TokenUsageBaseModel
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class IntermediateStepCategory(str, Enum):
|
|
33
|
+
LLM = "LLM"
|
|
34
|
+
TOOL = "TOOL"
|
|
35
|
+
WORKFLOW = "WORKFLOW"
|
|
36
|
+
TASK = "TASK"
|
|
37
|
+
FUNCTION = "FUNCTION"
|
|
38
|
+
CUSTOM = "CUSTOM"
|
|
39
|
+
SPAN = "SPAN"
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class IntermediateStepType(str, Enum):
|
|
43
|
+
LLM_START = "LLM_START"
|
|
44
|
+
LLM_END = "LLM_END"
|
|
45
|
+
LLM_NEW_TOKEN = "LLM_NEW_TOKEN"
|
|
46
|
+
TOOL_START = "TOOL_START"
|
|
47
|
+
TOOL_END = "TOOL_END"
|
|
48
|
+
WORKFLOW_START = "WORKFLOW_START"
|
|
49
|
+
WORKFLOW_END = "WORKFLOW_END"
|
|
50
|
+
TASK_START = "TASK_START"
|
|
51
|
+
TASK_END = "TASK_END"
|
|
52
|
+
FUNCTION_START = "FUNCTION_START"
|
|
53
|
+
FUNCTION_END = "FUNCTION_END"
|
|
54
|
+
CUSTOM_START = "CUSTOM_START"
|
|
55
|
+
CUSTOM_END = "CUSTOM_END"
|
|
56
|
+
SPAN_START = "SPAN_START"
|
|
57
|
+
SPAN_CHUNK = "SPAN_CHUNK"
|
|
58
|
+
SPAN_END = "SPAN_END"
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class IntermediateStepState(str, Enum):
|
|
62
|
+
START = "START"
|
|
63
|
+
CHUNK = "CHUNK"
|
|
64
|
+
END = "END"
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class StreamEventData(BaseModel):
|
|
68
|
+
"""
|
|
69
|
+
StreamEventData is a data model that represents the data field in an streaming event.
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
# Allow extra fields in the model_config to support derived models
|
|
73
|
+
model_config = ConfigDict(extra="allow")
|
|
74
|
+
|
|
75
|
+
input: typing.Any | None = None
|
|
76
|
+
output: typing.Any | None = None
|
|
77
|
+
chunk: typing.Any | None = None
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class UsageInfo(BaseModel):
|
|
81
|
+
token_usage: TokenUsageBaseModel = TokenUsageBaseModel()
|
|
82
|
+
num_llm_calls: int = 0
|
|
83
|
+
seconds_between_calls: int = 0
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class ToolParameters(BaseModel):
|
|
87
|
+
properties: dict[str, typing.Any] = Field(..., description="The properties of the function parameters.")
|
|
88
|
+
required: list[str] = Field(default_factory=list, description="The required properties of the function parameters.")
|
|
89
|
+
type_: Literal["object"] = Field(default="object", description="The type of the function parameters.", alias="type")
|
|
90
|
+
additionalProperties: bool = Field(default=False,
|
|
91
|
+
description="Enable function parameters allow additional properties.")
|
|
92
|
+
strict: bool = Field(default=True, description="Ensure function calls reliably adhere to the function schema.")
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class ToolDetails(BaseModel):
|
|
96
|
+
name: str = Field(..., description="The name of the function.")
|
|
97
|
+
description: str = Field(..., description="The description of the function.")
|
|
98
|
+
parameters: ToolParameters = Field(..., description="The parameters of the function.")
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class ToolSchema(BaseModel):
|
|
102
|
+
type: Literal["function"] = Field(..., description="The type of the tool.")
|
|
103
|
+
function: ToolDetails = Field(..., description="The function details.")
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class TraceMetadata(BaseModel):
|
|
107
|
+
chat_responses: typing.Any | None = None
|
|
108
|
+
chat_inputs: typing.Any | None = None
|
|
109
|
+
tool_inputs: typing.Any | None = None
|
|
110
|
+
tool_outputs: typing.Any | None = None
|
|
111
|
+
tool_info: typing.Any | None = None
|
|
112
|
+
span_inputs: typing.Any | None = None
|
|
113
|
+
span_outputs: typing.Any | None = None
|
|
114
|
+
provided_metadata: typing.Any | None = None
|
|
115
|
+
tools_schema: list[ToolSchema] = Field(default_factory=list,
|
|
116
|
+
description="The schema of tools used in a tool calling request.")
|
|
117
|
+
|
|
118
|
+
# Allow extra fields in the model_config to support derived models
|
|
119
|
+
model_config = ConfigDict(extra="allow")
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class IntermediateStepPayload(BaseModel):
|
|
123
|
+
"""
|
|
124
|
+
IntermediateStep is a data model that represents an intermediate step in the NAT. Intermediate steps are
|
|
125
|
+
captured while a request is running and can be used to show progress or to evaluate the path a workflow took to get
|
|
126
|
+
a response.
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
# Allow extra fields in the model_config to support derived models
|
|
130
|
+
model_config = ConfigDict(extra="allow")
|
|
131
|
+
|
|
132
|
+
event_type: IntermediateStepType
|
|
133
|
+
# Create an event timestamp field with the default being a lambda that returns the current time
|
|
134
|
+
event_timestamp: float = Field(default_factory=lambda: time.time())
|
|
135
|
+
span_event_timestamp: float | None = None # Used for tracking the start time of a task if this is end
|
|
136
|
+
framework: LLMFrameworkEnum | None = None
|
|
137
|
+
name: str | None = None
|
|
138
|
+
tags: list[str] | None = None
|
|
139
|
+
metadata: dict[str, typing.Any] | TraceMetadata | None = None
|
|
140
|
+
data: StreamEventData | None = None
|
|
141
|
+
usage_info: UsageInfo | None = None
|
|
142
|
+
UUID: str = Field(default_factory=lambda: str(uuid.uuid4()))
|
|
143
|
+
|
|
144
|
+
@property
|
|
145
|
+
def event_category(self) -> IntermediateStepCategory:
|
|
146
|
+
match self.event_type:
|
|
147
|
+
case IntermediateStepType.LLM_START:
|
|
148
|
+
return IntermediateStepCategory.LLM
|
|
149
|
+
case IntermediateStepType.LLM_END:
|
|
150
|
+
return IntermediateStepCategory.LLM
|
|
151
|
+
case IntermediateStepType.LLM_NEW_TOKEN:
|
|
152
|
+
return IntermediateStepCategory.LLM
|
|
153
|
+
case IntermediateStepType.TOOL_START:
|
|
154
|
+
return IntermediateStepCategory.TOOL
|
|
155
|
+
case IntermediateStepType.TOOL_END:
|
|
156
|
+
return IntermediateStepCategory.TOOL
|
|
157
|
+
case IntermediateStepType.WORKFLOW_START:
|
|
158
|
+
return IntermediateStepCategory.WORKFLOW
|
|
159
|
+
case IntermediateStepType.WORKFLOW_END:
|
|
160
|
+
return IntermediateStepCategory.WORKFLOW
|
|
161
|
+
case IntermediateStepType.TASK_START:
|
|
162
|
+
return IntermediateStepCategory.TASK
|
|
163
|
+
case IntermediateStepType.TASK_END:
|
|
164
|
+
return IntermediateStepCategory.TASK
|
|
165
|
+
case IntermediateStepType.FUNCTION_START:
|
|
166
|
+
return IntermediateStepCategory.FUNCTION
|
|
167
|
+
case IntermediateStepType.FUNCTION_END:
|
|
168
|
+
return IntermediateStepCategory.FUNCTION
|
|
169
|
+
case IntermediateStepType.CUSTOM_START:
|
|
170
|
+
return IntermediateStepCategory.CUSTOM
|
|
171
|
+
case IntermediateStepType.CUSTOM_END:
|
|
172
|
+
return IntermediateStepCategory.CUSTOM
|
|
173
|
+
case IntermediateStepType.SPAN_START:
|
|
174
|
+
return IntermediateStepCategory.SPAN
|
|
175
|
+
case IntermediateStepType.SPAN_CHUNK:
|
|
176
|
+
return IntermediateStepCategory.SPAN
|
|
177
|
+
case IntermediateStepType.SPAN_END:
|
|
178
|
+
return IntermediateStepCategory.SPAN
|
|
179
|
+
case _:
|
|
180
|
+
raise ValueError(f"Unknown event type: {self.event_type}")
|
|
181
|
+
|
|
182
|
+
@property
|
|
183
|
+
def event_state(self) -> IntermediateStepState:
|
|
184
|
+
match self.event_type:
|
|
185
|
+
case IntermediateStepType.LLM_START:
|
|
186
|
+
return IntermediateStepState.START
|
|
187
|
+
case IntermediateStepType.LLM_END:
|
|
188
|
+
return IntermediateStepState.END
|
|
189
|
+
case IntermediateStepType.LLM_NEW_TOKEN:
|
|
190
|
+
return IntermediateStepState.CHUNK
|
|
191
|
+
case IntermediateStepType.TOOL_START:
|
|
192
|
+
return IntermediateStepState.START
|
|
193
|
+
case IntermediateStepType.TOOL_END:
|
|
194
|
+
return IntermediateStepState.END
|
|
195
|
+
case IntermediateStepType.WORKFLOW_START:
|
|
196
|
+
return IntermediateStepState.START
|
|
197
|
+
case IntermediateStepType.WORKFLOW_END:
|
|
198
|
+
return IntermediateStepState.END
|
|
199
|
+
case IntermediateStepType.TASK_START:
|
|
200
|
+
return IntermediateStepState.START
|
|
201
|
+
case IntermediateStepType.TASK_END:
|
|
202
|
+
return IntermediateStepState.END
|
|
203
|
+
case IntermediateStepType.FUNCTION_START:
|
|
204
|
+
return IntermediateStepState.START
|
|
205
|
+
case IntermediateStepType.FUNCTION_END:
|
|
206
|
+
return IntermediateStepState.END
|
|
207
|
+
case IntermediateStepType.CUSTOM_START:
|
|
208
|
+
return IntermediateStepState.START
|
|
209
|
+
case IntermediateStepType.CUSTOM_END:
|
|
210
|
+
return IntermediateStepState.END
|
|
211
|
+
case IntermediateStepType.SPAN_START:
|
|
212
|
+
return IntermediateStepState.START
|
|
213
|
+
case IntermediateStepType.SPAN_CHUNK:
|
|
214
|
+
return IntermediateStepState.CHUNK
|
|
215
|
+
case IntermediateStepType.SPAN_END:
|
|
216
|
+
return IntermediateStepState.END
|
|
217
|
+
case _:
|
|
218
|
+
raise ValueError(f"Unknown event type: {self.event_type}")
|
|
219
|
+
|
|
220
|
+
@model_validator(mode="after")
|
|
221
|
+
def check_span_event_timestamp(self) -> "IntermediateStepPayload":
|
|
222
|
+
if self.event_state != IntermediateStepState.END and self.span_event_timestamp is not None:
|
|
223
|
+
raise ValueError("span_event_timestamp can only be provided for events with an END state")
|
|
224
|
+
return self
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
class IntermediateStep(BaseModel):
|
|
228
|
+
"""
|
|
229
|
+
IntermediateStep is a data model that represents an intermediate step in the NAT. Intermediate steps are
|
|
230
|
+
captured while a request is running and can be used to show progress or to evaluate the path a workflow took to get
|
|
231
|
+
a response.
|
|
232
|
+
"""
|
|
233
|
+
|
|
234
|
+
# Allow extra fields in the model_config to support derived models
|
|
235
|
+
model_config = ConfigDict(extra="forbid")
|
|
236
|
+
|
|
237
|
+
parent_id: str
|
|
238
|
+
"""
|
|
239
|
+
The parent step ID for the current step. The parent ID is the ID of the last START step which has a different UUID
|
|
240
|
+
than the current step. This value is different from the function_ancestry.parent_id value which tracks the last
|
|
241
|
+
parent FUNCTION step. For the first START step, the parent_id is 'root'.
|
|
242
|
+
"""
|
|
243
|
+
|
|
244
|
+
function_ancestry: InvocationNode
|
|
245
|
+
"""
|
|
246
|
+
The function ancestry for the current step showing the current NAT function that was being executed when the step
|
|
247
|
+
was created.
|
|
248
|
+
"""
|
|
249
|
+
|
|
250
|
+
payload: IntermediateStepPayload
|
|
251
|
+
"""
|
|
252
|
+
The payload for the current step.
|
|
253
|
+
"""
|
|
254
|
+
|
|
255
|
+
# ===== Payload Properties =====
|
|
256
|
+
@property
|
|
257
|
+
def event_type(self) -> IntermediateStepType:
|
|
258
|
+
return self.payload.event_type
|
|
259
|
+
|
|
260
|
+
@property
|
|
261
|
+
def event_timestamp(self) -> float:
|
|
262
|
+
return self.payload.event_timestamp
|
|
263
|
+
|
|
264
|
+
@property
|
|
265
|
+
def span_event_timestamp(self) -> float | None:
|
|
266
|
+
return self.payload.span_event_timestamp
|
|
267
|
+
|
|
268
|
+
@property
|
|
269
|
+
def framework(self) -> LLMFrameworkEnum | None:
|
|
270
|
+
return self.payload.framework
|
|
271
|
+
|
|
272
|
+
@property
|
|
273
|
+
def name(self) -> str | None:
|
|
274
|
+
return self.payload.name
|
|
275
|
+
|
|
276
|
+
@property
|
|
277
|
+
def tags(self) -> list[str] | None:
|
|
278
|
+
return self.payload.tags
|
|
279
|
+
|
|
280
|
+
@property
|
|
281
|
+
def metadata(self) -> dict[str, typing.Any] | TraceMetadata | None:
|
|
282
|
+
return self.payload.metadata
|
|
283
|
+
|
|
284
|
+
@property
|
|
285
|
+
def data(self) -> StreamEventData | None:
|
|
286
|
+
return self.payload.data
|
|
287
|
+
|
|
288
|
+
@property
|
|
289
|
+
def usage_info(self) -> UsageInfo | None:
|
|
290
|
+
return self.payload.usage_info
|
|
291
|
+
|
|
292
|
+
@property
|
|
293
|
+
def UUID(self) -> str:
|
|
294
|
+
return self.payload.UUID
|
|
295
|
+
|
|
296
|
+
@property
|
|
297
|
+
def event_category(self) -> IntermediateStepCategory:
|
|
298
|
+
return self.payload.event_category
|
|
299
|
+
|
|
300
|
+
@property
|
|
301
|
+
def event_state(self) -> IntermediateStepState:
|
|
302
|
+
return self.payload.event_state
|
|
@@ -0,0 +1,38 @@
|
|
|
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
|
+
from pydantic import BaseModel
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class InvocationNode(BaseModel):
|
|
20
|
+
"""
|
|
21
|
+
Represents a node in an invocation call graph.
|
|
22
|
+
|
|
23
|
+
The InvocationNode class encapsulates the details of a specific function
|
|
24
|
+
invocation within a call graph. It stores the unique identifier of the
|
|
25
|
+
invocation, the function name, and optional details about the parent
|
|
26
|
+
node (if any). This class is useful for tracing the execution flow
|
|
27
|
+
in a system or application.
|
|
28
|
+
|
|
29
|
+
Attributes:
|
|
30
|
+
function_id (str): Unique identifier for the function invocation.
|
|
31
|
+
function_name (str): Name of the function invoked.
|
|
32
|
+
parent_id (str | None): Unique identifier of the parent invocation, if applicable. Defaults to None.
|
|
33
|
+
parent_name (str | None): Name of the parent function invoked, if applicable. Defaults to None.
|
|
34
|
+
"""
|
|
35
|
+
function_id: str
|
|
36
|
+
function_name: str
|
|
37
|
+
parent_id: str | None = None
|
|
38
|
+
parent_name: str | None = None
|
nat/data_models/llm.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
|
+
import typing
|
|
17
|
+
|
|
18
|
+
from .common import BaseModelRegistryTag
|
|
19
|
+
from .common import TypedBaseModel
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class LLMBaseConfig(TypedBaseModel, BaseModelRegistryTag):
|
|
23
|
+
"""Base configuration for LLM providers."""
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
LLMBaseConfigT = typing.TypeVar("LLMBaseConfigT", bound=LLMBaseConfig)
|
|
@@ -0,0 +1,26 @@
|
|
|
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 typing
|
|
17
|
+
|
|
18
|
+
from .common import BaseModelRegistryTag
|
|
19
|
+
from .common import TypedBaseModel
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class LoggingBaseConfig(TypedBaseModel, BaseModelRegistryTag):
|
|
23
|
+
pass
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
LoggingMethodConfigT = typing.TypeVar("LoggingMethodConfigT", bound=LoggingBaseConfig)
|
|
@@ -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
|
+
import typing
|
|
17
|
+
|
|
18
|
+
from .common import BaseModelRegistryTag
|
|
19
|
+
from .common import TypedBaseModel
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class MemoryBaseConfig(TypedBaseModel, BaseModelRegistryTag):
|
|
23
|
+
""" The base level config object for a memory object. Memories provide an interface for storing and retrieving. """
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
MemoryBaseConfigT = typing.TypeVar("MemoryBaseConfigT", bound=MemoryBaseConfig)
|
|
@@ -0,0 +1,44 @@
|
|
|
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 typing
|
|
17
|
+
|
|
18
|
+
from .common import BaseModelRegistryTag
|
|
19
|
+
from .common import TypedBaseModel
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class ObjectStoreBaseConfig(TypedBaseModel, BaseModelRegistryTag):
|
|
23
|
+
pass
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
ObjectStoreBaseConfigT = typing.TypeVar("ObjectStoreBaseConfigT", bound=ObjectStoreBaseConfig)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class KeyAlreadyExistsError(Exception):
|
|
30
|
+
|
|
31
|
+
def __init__(self, key: str, additional_message: str | None = None):
|
|
32
|
+
parts = [f"Key already exists: {key}."]
|
|
33
|
+
if additional_message:
|
|
34
|
+
parts.append(additional_message)
|
|
35
|
+
super().__init__(" ".join(parts))
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class NoSuchKeyError(Exception):
|
|
39
|
+
|
|
40
|
+
def __init__(self, key: str, additional_message: str | None = None):
|
|
41
|
+
parts = [f"No object found with key: {key}."]
|
|
42
|
+
if additional_message:
|
|
43
|
+
parts.append(additional_message)
|
|
44
|
+
super().__init__(" ".join(parts))
|
|
@@ -0,0 +1,119 @@
|
|
|
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
|
+
from collections.abc import Sequence
|
|
17
|
+
from typing import Any
|
|
18
|
+
from typing import Generic
|
|
19
|
+
from typing import TypeVar
|
|
20
|
+
|
|
21
|
+
from optuna import Trial
|
|
22
|
+
from pydantic import BaseModel
|
|
23
|
+
from pydantic import ConfigDict
|
|
24
|
+
from pydantic import Field
|
|
25
|
+
from pydantic import model_validator
|
|
26
|
+
|
|
27
|
+
T = TypeVar("T", int, float, bool, str)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# --------------------------------------------------------------------- #
|
|
31
|
+
# 1. Hyper‑parameter metadata container #
|
|
32
|
+
# --------------------------------------------------------------------- #
|
|
33
|
+
class SearchSpace(BaseModel, Generic[T]):
|
|
34
|
+
values: Sequence[T] | None = None
|
|
35
|
+
low: T | None = None
|
|
36
|
+
high: T | None = None
|
|
37
|
+
log: bool = False # log scale
|
|
38
|
+
step: float | None = None
|
|
39
|
+
is_prompt: bool = False
|
|
40
|
+
prompt: str | None = None # prompt to optimize
|
|
41
|
+
prompt_purpose: str | None = None # purpose of the prompt
|
|
42
|
+
|
|
43
|
+
model_config = ConfigDict(protected_namespaces=(), extra="forbid")
|
|
44
|
+
|
|
45
|
+
@model_validator(mode="after")
|
|
46
|
+
def validate_search_space_parameters(self):
|
|
47
|
+
"""Validate that either values is provided, or both high and low."""
|
|
48
|
+
if self.values is not None:
|
|
49
|
+
# If values is provided, we don't need high/low
|
|
50
|
+
if self.high is not None or self.low is not None:
|
|
51
|
+
raise ValueError("SearchSpace 'values' is mutually exclusive with 'high' and 'low'")
|
|
52
|
+
return self
|
|
53
|
+
|
|
54
|
+
return self
|
|
55
|
+
|
|
56
|
+
# Helper for Optuna Trials
|
|
57
|
+
def suggest(self, trial: Trial, name: str):
|
|
58
|
+
if self.is_prompt:
|
|
59
|
+
raise ValueError("Prompt optimization not currently supported using Optuna. "
|
|
60
|
+
"Use the genetic algorithm implementation instead.")
|
|
61
|
+
if self.values is not None:
|
|
62
|
+
return trial.suggest_categorical(name, self.values)
|
|
63
|
+
if isinstance(self.low, int):
|
|
64
|
+
return trial.suggest_int(name, self.low, self.high, log=self.log, step=self.step)
|
|
65
|
+
return trial.suggest_float(name, self.low, self.high, log=self.log, step=self.step)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def OptimizableField(
|
|
69
|
+
default: Any,
|
|
70
|
+
*,
|
|
71
|
+
space: SearchSpace | None = None,
|
|
72
|
+
merge_conflict: str = "overwrite",
|
|
73
|
+
**fld_kw,
|
|
74
|
+
):
|
|
75
|
+
# 1. Pull out any user‑supplied extras (must be a dict)
|
|
76
|
+
user_extra = fld_kw.pop("json_schema_extra", None) or {}
|
|
77
|
+
if not isinstance(user_extra, dict):
|
|
78
|
+
raise TypeError("`json_schema_extra` must be a mapping.")
|
|
79
|
+
|
|
80
|
+
# 2. If the space is a prompt, ensure a concrete base prompt exists
|
|
81
|
+
if space is not None and getattr(space, "is_prompt", False):
|
|
82
|
+
if getattr(space, "prompt", None) is None:
|
|
83
|
+
if default is None:
|
|
84
|
+
raise ValueError("Prompt-optimized fields require a base prompt: provide a "
|
|
85
|
+
"non-None field default or set space.prompt.")
|
|
86
|
+
# Default prompt not provided in space; fall back to the field's default
|
|
87
|
+
space.prompt = default
|
|
88
|
+
|
|
89
|
+
# 3. Prepare our own metadata
|
|
90
|
+
ours = {"optimizable": True}
|
|
91
|
+
if space is not None:
|
|
92
|
+
ours["search_space"] = space
|
|
93
|
+
|
|
94
|
+
# 4. Merge with user extras according to merge_conflict policy
|
|
95
|
+
intersect = ours.keys() & user_extra.keys()
|
|
96
|
+
if intersect:
|
|
97
|
+
if merge_conflict == "error":
|
|
98
|
+
raise ValueError("`json_schema_extra` already contains reserved key(s): "
|
|
99
|
+
f"{', '.join(intersect)}")
|
|
100
|
+
if merge_conflict == "keep":
|
|
101
|
+
# remove the ones the user already set so we don't overwrite them
|
|
102
|
+
ours = {k: v for k, v in ours.items() if k not in intersect}
|
|
103
|
+
|
|
104
|
+
merged_extra = {**user_extra, **ours} # ours wins if 'overwrite'
|
|
105
|
+
|
|
106
|
+
# 5. Return a normal Pydantic Field with merged extras
|
|
107
|
+
return Field(default, json_schema_extra=merged_extra, **fld_kw)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class OptimizableMixin(BaseModel):
|
|
111
|
+
optimizable_params: list[str] = Field(default_factory=list,
|
|
112
|
+
description="List of parameters that can be optimized.",
|
|
113
|
+
exclude=True)
|
|
114
|
+
|
|
115
|
+
search_space: dict[str, SearchSpace] = Field(
|
|
116
|
+
default_factory=dict,
|
|
117
|
+
description="Optional search space overrides for optimizable parameters.",
|
|
118
|
+
exclude=True,
|
|
119
|
+
)
|