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,242 @@
|
|
|
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 dataclasses import dataclass
|
|
18
|
+
from re import Pattern
|
|
19
|
+
|
|
20
|
+
from pydantic import model_validator
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass
|
|
24
|
+
class GatedFieldMixinConfig:
|
|
25
|
+
"""Configuration for a gated field mixin."""
|
|
26
|
+
|
|
27
|
+
field_name: str
|
|
28
|
+
default_if_supported: object | None
|
|
29
|
+
unsupported: Sequence[Pattern[str]] | None
|
|
30
|
+
supported: Sequence[Pattern[str]] | None
|
|
31
|
+
keys: Sequence[str]
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class GatedFieldMixin:
|
|
35
|
+
"""
|
|
36
|
+
A mixin that gates a field based on specified keys.
|
|
37
|
+
|
|
38
|
+
This should be used to automatically validate a field based on a given key.
|
|
39
|
+
|
|
40
|
+
Parameters
|
|
41
|
+
----------
|
|
42
|
+
field_name: `str`
|
|
43
|
+
The name of the field.
|
|
44
|
+
default_if_supported: `object | None`
|
|
45
|
+
The default value of the field if it is supported for the key.
|
|
46
|
+
keys: `Sequence[str]`
|
|
47
|
+
A sequence of keys that are used to validate the field.
|
|
48
|
+
unsupported: `Sequence[Pattern[str]] | None`
|
|
49
|
+
A sequence of regex patterns that match the key names NOT supported for the field.
|
|
50
|
+
Defaults to None.
|
|
51
|
+
supported: `Sequence[Pattern[str]] | None`
|
|
52
|
+
A sequence of regex patterns that match the key names supported for the field.
|
|
53
|
+
Defaults to None.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
def __init_subclass__(
|
|
57
|
+
cls,
|
|
58
|
+
field_name: str | None = None,
|
|
59
|
+
default_if_supported: object | None = None,
|
|
60
|
+
keys: Sequence[str] | None = None,
|
|
61
|
+
unsupported: Sequence[Pattern[str]] | None = None,
|
|
62
|
+
supported: Sequence[Pattern[str]] | None = None,
|
|
63
|
+
) -> None:
|
|
64
|
+
"""Store the class variables for the field and define the gated field validator."""
|
|
65
|
+
super().__init_subclass__()
|
|
66
|
+
|
|
67
|
+
# Check if this class directly inherits from GatedFieldMixin
|
|
68
|
+
has_gated_field_mixin = GatedFieldMixin in cls.__bases__
|
|
69
|
+
|
|
70
|
+
if has_gated_field_mixin:
|
|
71
|
+
if keys is None:
|
|
72
|
+
raise ValueError("keys must be provided when subclassing GatedFieldMixin")
|
|
73
|
+
if field_name is None:
|
|
74
|
+
raise ValueError("field_name must be provided when subclassing GatedFieldMixin")
|
|
75
|
+
|
|
76
|
+
cls._setup_direct_mixin(field_name, default_if_supported, unsupported, supported, keys)
|
|
77
|
+
|
|
78
|
+
# Always try to collect mixins and create validators for multiple inheritance
|
|
79
|
+
# This handles both direct inheritance and deep inheritance chains
|
|
80
|
+
all_mixins = cls._collect_all_mixin_configs()
|
|
81
|
+
if all_mixins:
|
|
82
|
+
cls._create_combined_validator(all_mixins)
|
|
83
|
+
|
|
84
|
+
@classmethod
|
|
85
|
+
def _setup_direct_mixin(
|
|
86
|
+
cls,
|
|
87
|
+
field_name: str,
|
|
88
|
+
default_if_supported: object | None,
|
|
89
|
+
unsupported: Sequence[Pattern[str]] | None,
|
|
90
|
+
supported: Sequence[Pattern[str]] | None,
|
|
91
|
+
keys: Sequence[str],
|
|
92
|
+
) -> None:
|
|
93
|
+
"""Set up a class that directly inherits from GatedFieldMixin."""
|
|
94
|
+
cls._validate_mixin_parameters(unsupported, supported, keys)
|
|
95
|
+
|
|
96
|
+
# Create and store validator
|
|
97
|
+
validator = cls._create_gated_field_validator(field_name, default_if_supported, unsupported, supported, keys)
|
|
98
|
+
validator_name = f"_gated_field_validator_{field_name}"
|
|
99
|
+
setattr(cls, validator_name, validator)
|
|
100
|
+
|
|
101
|
+
# Store mixin info for multiple inheritance
|
|
102
|
+
if not hasattr(cls, "_gated_field_mixins"):
|
|
103
|
+
cls._gated_field_mixins = []
|
|
104
|
+
|
|
105
|
+
cls._gated_field_mixins.append(
|
|
106
|
+
GatedFieldMixinConfig(
|
|
107
|
+
field_name,
|
|
108
|
+
default_if_supported,
|
|
109
|
+
unsupported,
|
|
110
|
+
supported,
|
|
111
|
+
keys,
|
|
112
|
+
))
|
|
113
|
+
|
|
114
|
+
@classmethod
|
|
115
|
+
def _validate_mixin_parameters(
|
|
116
|
+
cls,
|
|
117
|
+
unsupported: Sequence[Pattern[str]] | None,
|
|
118
|
+
supported: Sequence[Pattern[str]] | None,
|
|
119
|
+
keys: Sequence[str],
|
|
120
|
+
) -> None:
|
|
121
|
+
"""Validate that all required parameters are provided."""
|
|
122
|
+
if unsupported is None and supported is None:
|
|
123
|
+
raise ValueError("Either unsupported or supported must be provided")
|
|
124
|
+
if unsupported is not None and supported is not None:
|
|
125
|
+
raise ValueError("Only one of unsupported or supported must be provided")
|
|
126
|
+
if len(keys) == 0:
|
|
127
|
+
raise ValueError("keys must be provided and non-empty when subclassing GatedFieldMixin")
|
|
128
|
+
|
|
129
|
+
@classmethod
|
|
130
|
+
def _create_gated_field_validator(
|
|
131
|
+
cls,
|
|
132
|
+
field_name: str,
|
|
133
|
+
default_if_supported: object | None,
|
|
134
|
+
unsupported: Sequence[Pattern[str]] | None,
|
|
135
|
+
supported: Sequence[Pattern[str]] | None,
|
|
136
|
+
keys: Sequence[str],
|
|
137
|
+
):
|
|
138
|
+
"""Create the model validator function."""
|
|
139
|
+
|
|
140
|
+
@model_validator(mode="after")
|
|
141
|
+
def gated_field_validator(self):
|
|
142
|
+
"""Validate the gated field."""
|
|
143
|
+
current_value = getattr(self, field_name, None)
|
|
144
|
+
is_supported = cls._check_field_support(self, unsupported, supported, keys)
|
|
145
|
+
if not is_supported:
|
|
146
|
+
if current_value is not None:
|
|
147
|
+
blocking_key = cls._find_blocking_key(self, unsupported, supported, keys)
|
|
148
|
+
value = getattr(self, blocking_key, "<unknown>")
|
|
149
|
+
raise ValueError(f"{field_name} is not supported for {blocking_key}: {value}")
|
|
150
|
+
elif current_value is None:
|
|
151
|
+
setattr(self, field_name, default_if_supported)
|
|
152
|
+
return self
|
|
153
|
+
|
|
154
|
+
return gated_field_validator
|
|
155
|
+
|
|
156
|
+
@classmethod
|
|
157
|
+
def _check_field_support(
|
|
158
|
+
cls,
|
|
159
|
+
instance: object,
|
|
160
|
+
unsupported: Sequence[Pattern[str]] | None,
|
|
161
|
+
supported: Sequence[Pattern[str]] | None,
|
|
162
|
+
keys: Sequence[str],
|
|
163
|
+
) -> bool:
|
|
164
|
+
"""Check if a specific field is supported based on its configuration and keys."""
|
|
165
|
+
seen = False
|
|
166
|
+
for key in keys:
|
|
167
|
+
if not hasattr(instance, key):
|
|
168
|
+
continue
|
|
169
|
+
seen = True
|
|
170
|
+
value = str(getattr(instance, key))
|
|
171
|
+
if supported is not None:
|
|
172
|
+
if any(p.search(value) for p in supported):
|
|
173
|
+
return True
|
|
174
|
+
elif unsupported is not None:
|
|
175
|
+
if any(p.search(value) for p in unsupported):
|
|
176
|
+
return False
|
|
177
|
+
return True if not seen else (unsupported is not None)
|
|
178
|
+
|
|
179
|
+
@classmethod
|
|
180
|
+
def _find_blocking_key(
|
|
181
|
+
cls,
|
|
182
|
+
instance: object,
|
|
183
|
+
unsupported: Sequence[Pattern[str]] | None,
|
|
184
|
+
supported: Sequence[Pattern[str]] | None,
|
|
185
|
+
keys: Sequence[str],
|
|
186
|
+
) -> str:
|
|
187
|
+
"""Find which key is blocking the field."""
|
|
188
|
+
for key in keys:
|
|
189
|
+
if not hasattr(instance, key):
|
|
190
|
+
continue
|
|
191
|
+
value = str(getattr(instance, key))
|
|
192
|
+
if supported is not None:
|
|
193
|
+
if not any(p.search(value) for p in supported):
|
|
194
|
+
return key
|
|
195
|
+
elif unsupported is not None:
|
|
196
|
+
if any(p.search(value) for p in unsupported):
|
|
197
|
+
return key
|
|
198
|
+
|
|
199
|
+
return "<unknown>"
|
|
200
|
+
|
|
201
|
+
@classmethod
|
|
202
|
+
def _collect_all_mixin_configs(cls) -> list[GatedFieldMixinConfig]:
|
|
203
|
+
"""Collect all mixin configurations from base classes."""
|
|
204
|
+
all_mixins = []
|
|
205
|
+
for base in cls.__bases__:
|
|
206
|
+
if hasattr(base, "_gated_field_mixins"):
|
|
207
|
+
all_mixins.extend(base._gated_field_mixins)
|
|
208
|
+
return all_mixins
|
|
209
|
+
|
|
210
|
+
@classmethod
|
|
211
|
+
def _create_combined_validator(cls, all_mixins: list[GatedFieldMixinConfig]) -> None:
|
|
212
|
+
"""Create a combined validator that handles all fields."""
|
|
213
|
+
|
|
214
|
+
@model_validator(mode="after")
|
|
215
|
+
def combined_gated_field_validator(self):
|
|
216
|
+
"""Validate all gated fields."""
|
|
217
|
+
for mixin_config in all_mixins:
|
|
218
|
+
field_name_local = mixin_config.field_name
|
|
219
|
+
current_value = getattr(self, field_name_local, None)
|
|
220
|
+
if not self._check_field_support_instance(mixin_config):
|
|
221
|
+
if current_value is not None:
|
|
222
|
+
blocking_key = self._find_blocking_key_instance(mixin_config)
|
|
223
|
+
value = getattr(self, blocking_key, "<unknown>")
|
|
224
|
+
raise ValueError(f"{field_name_local} is not supported for {blocking_key}: {value}")
|
|
225
|
+
elif current_value is None:
|
|
226
|
+
setattr(self, field_name_local, mixin_config.default_if_supported)
|
|
227
|
+
|
|
228
|
+
return self
|
|
229
|
+
|
|
230
|
+
cls._combined_gated_field_validator = combined_gated_field_validator
|
|
231
|
+
|
|
232
|
+
# Add helper methods
|
|
233
|
+
def _check_field_support_instance(self, mixin_config: GatedFieldMixinConfig) -> bool:
|
|
234
|
+
"""Check if a specific field is supported based on its configuration and keys."""
|
|
235
|
+
return cls._check_field_support(self, mixin_config.unsupported, mixin_config.supported, mixin_config.keys)
|
|
236
|
+
|
|
237
|
+
def _find_blocking_key_instance(self, mixin_config: GatedFieldMixinConfig) -> str:
|
|
238
|
+
"""Find which key is blocking the field."""
|
|
239
|
+
return cls._find_blocking_key(self, mixin_config.unsupported, mixin_config.supported, mixin_config.keys)
|
|
240
|
+
|
|
241
|
+
cls._check_field_support_instance = _check_field_support_instance
|
|
242
|
+
cls._find_blocking_key_instance = _find_blocking_key_instance
|
|
@@ -0,0 +1,246 @@
|
|
|
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 re
|
|
17
|
+
import typing
|
|
18
|
+
from enum import Enum
|
|
19
|
+
|
|
20
|
+
from pydantic import BaseModel
|
|
21
|
+
from pydantic import Discriminator
|
|
22
|
+
from pydantic import Field
|
|
23
|
+
from pydantic import field_validator
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class HumanPromptModelType(str, Enum):
|
|
27
|
+
"""
|
|
28
|
+
Represents the type of an interaction model.
|
|
29
|
+
"""
|
|
30
|
+
TEXT = "text"
|
|
31
|
+
NOTIFICATION = "notification"
|
|
32
|
+
BINARY_CHOICE = "binary_choice"
|
|
33
|
+
RADIO = "radio"
|
|
34
|
+
CHECKBOX = "checkbox"
|
|
35
|
+
DROPDOWN = "dropdown"
|
|
36
|
+
OAUTH_CONSENT = "oauth_consent"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class BinaryChoiceOptionsType(str, Enum):
|
|
40
|
+
"""
|
|
41
|
+
Represents the types of system interaction binary choice content
|
|
42
|
+
"""
|
|
43
|
+
CONTINUE = "continue"
|
|
44
|
+
CANCEL = "cancel"
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class MultipleChoiceOptionType(str, Enum):
|
|
48
|
+
"""
|
|
49
|
+
Represents the types of system interaction multiple choice content
|
|
50
|
+
"""
|
|
51
|
+
EMAIL = "email"
|
|
52
|
+
SMS = "sms"
|
|
53
|
+
PUSH = "push"
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class BinaryHumanPromptOption(BaseModel):
|
|
57
|
+
"""
|
|
58
|
+
Represents a choice for a binary interaction.
|
|
59
|
+
"""
|
|
60
|
+
id: str = Field(default="default", description="The ID of the choice.")
|
|
61
|
+
label: str = Field(default="default", description="Label of the choice")
|
|
62
|
+
value: typing.Any = Field(default="default", description="The value of the choice.")
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class MultipleChoiceOption(BaseModel):
|
|
66
|
+
id: str = Field(default="default", description="The ID of the choice.")
|
|
67
|
+
label: str = Field(default="default", description="The label for the multiple choice interaction.")
|
|
68
|
+
value: str = Field(default="default", description="The value for the multiple choice interaction.")
|
|
69
|
+
description: str = Field(default="default", description="The description for the multiple choice interaction.")
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class HumanResponseText(BaseModel):
|
|
73
|
+
"""
|
|
74
|
+
Represents a text response to an interaction.
|
|
75
|
+
"""
|
|
76
|
+
type: typing.Literal[HumanPromptModelType.TEXT] = HumanPromptModelType.TEXT
|
|
77
|
+
text: str = Field(description="The text of the response.")
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class HumanResponseNotification(BaseModel):
|
|
81
|
+
"""
|
|
82
|
+
Represents a notification response to an interaction.
|
|
83
|
+
"""
|
|
84
|
+
type: typing.Literal[HumanPromptModelType.NOTIFICATION] = HumanPromptModelType.NOTIFICATION
|
|
85
|
+
text: str = Field(default="Notification acknowledgement.", description="Default notification response text.")
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class HumanResponseBinary(BaseModel):
|
|
89
|
+
"""
|
|
90
|
+
Represents a binary response to an interaction.
|
|
91
|
+
"""
|
|
92
|
+
type: typing.Literal[HumanPromptModelType.BINARY_CHOICE] = HumanPromptModelType.BINARY_CHOICE
|
|
93
|
+
selected_option: BinaryHumanPromptOption = Field(description="The selected binary response.")
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class HumanResponseRadio(BaseModel):
|
|
97
|
+
"""
|
|
98
|
+
Represents a multiple choice radio response to an interaction.
|
|
99
|
+
"""
|
|
100
|
+
type: typing.Literal[HumanPromptModelType.RADIO] = HumanPromptModelType.RADIO
|
|
101
|
+
selected_option: MultipleChoiceOption = Field(description="The selected multiple choice radio response.")
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class HumanResponseCheckbox(BaseModel):
|
|
105
|
+
"""
|
|
106
|
+
Represents a multiple choice checkbox response to an interaction.
|
|
107
|
+
"""
|
|
108
|
+
type: typing.Literal[HumanPromptModelType.CHECKBOX] = HumanPromptModelType.CHECKBOX
|
|
109
|
+
selected_option: MultipleChoiceOption = Field(description="The selected multiple choice checkbox response.")
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class HumanResponseDropdown(BaseModel):
|
|
113
|
+
"""
|
|
114
|
+
Represents a multiple choice dropdown response to an interaction.
|
|
115
|
+
"""
|
|
116
|
+
type: typing.Literal[HumanPromptModelType.DROPDOWN] = HumanPromptModelType.DROPDOWN
|
|
117
|
+
selected_option: MultipleChoiceOption = Field(description="The selected multiple choice dropdown response.")
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
HumanResponse = typing.Annotated[HumanResponseText | HumanResponseBinary | HumanResponseNotification
|
|
121
|
+
| HumanResponseRadio | HumanResponseCheckbox
|
|
122
|
+
| HumanResponseDropdown,
|
|
123
|
+
Discriminator("type")]
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class HumanPromptBase(BaseModel):
|
|
127
|
+
"""
|
|
128
|
+
Base interaction model to derive from
|
|
129
|
+
"""
|
|
130
|
+
text: str = Field(description="Text prompt that will be displayed to the user.")
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class HumanPromptText(HumanPromptBase):
|
|
134
|
+
"""
|
|
135
|
+
Represents a text interaction.
|
|
136
|
+
"""
|
|
137
|
+
input_type: typing.Literal[HumanPromptModelType.TEXT] = HumanPromptModelType.TEXT
|
|
138
|
+
placeholder: str | None = Field(description="The placeholder for the text.")
|
|
139
|
+
required: bool = Field(default=True, description="Whether the interaction is required.")
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
class HumanPromptNotification(HumanPromptBase):
|
|
143
|
+
"""
|
|
144
|
+
Represents a notification interaction.
|
|
145
|
+
"""
|
|
146
|
+
input_type: typing.Literal[HumanPromptModelType.NOTIFICATION] = HumanPromptModelType.NOTIFICATION
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
class _HumanPromptOAuthConsent(HumanPromptBase):
|
|
150
|
+
"""
|
|
151
|
+
Represents an OAuth consent prompt interaction used to notify the UI to open the authentication page for completing
|
|
152
|
+
the consent flow.
|
|
153
|
+
"""
|
|
154
|
+
input_type: typing.Literal[HumanPromptModelType.OAUTH_CONSENT] = HumanPromptModelType.OAUTH_CONSENT
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
class HumanPromptBinary(HumanPromptBase):
|
|
158
|
+
"""
|
|
159
|
+
Represents a binary interaction.
|
|
160
|
+
"""
|
|
161
|
+
input_type: typing.Literal[HumanPromptModelType.BINARY_CHOICE] = HumanPromptModelType.BINARY_CHOICE
|
|
162
|
+
options: list[BinaryHumanPromptOption] = Field(description="The options for the binary interaction.")
|
|
163
|
+
|
|
164
|
+
# Field validator to make sure len(options) == 2
|
|
165
|
+
@field_validator("options", mode="before")
|
|
166
|
+
@classmethod
|
|
167
|
+
def validate_options(cls, options):
|
|
168
|
+
if len(options) != 2:
|
|
169
|
+
raise ValueError("Binary interactions must have exactly two options.")
|
|
170
|
+
return options
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
class HumanPromptMultipleChoiceBase(HumanPromptBase):
|
|
174
|
+
"""
|
|
175
|
+
Represents a multiple choice interaction.
|
|
176
|
+
"""
|
|
177
|
+
options: list[MultipleChoiceOption] = Field(description="The options for the multiple choice interaction.")
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class HumanPromptRadio(HumanPromptMultipleChoiceBase):
|
|
181
|
+
"""
|
|
182
|
+
Represents a radio interaction.
|
|
183
|
+
"""
|
|
184
|
+
input_type: typing.Literal[HumanPromptModelType.RADIO] = HumanPromptModelType.RADIO
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
class HumanPromptCheckbox(HumanPromptMultipleChoiceBase):
|
|
188
|
+
"""
|
|
189
|
+
Represents a checkbox interaction.
|
|
190
|
+
"""
|
|
191
|
+
input_type: typing.Literal[HumanPromptModelType.CHECKBOX] = HumanPromptModelType.CHECKBOX
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
class HumanPromptDropdown(HumanPromptMultipleChoiceBase):
|
|
195
|
+
"""
|
|
196
|
+
Represents a dropdown interaction.
|
|
197
|
+
"""
|
|
198
|
+
input_type: typing.Literal[HumanPromptModelType.DROPDOWN] = HumanPromptModelType.DROPDOWN
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
HumanPrompt = typing.Annotated[HumanPromptText | HumanPromptNotification | HumanPromptBinary | HumanPromptRadio
|
|
202
|
+
| HumanPromptCheckbox | HumanPromptDropdown | _HumanPromptOAuthConsent,
|
|
203
|
+
Discriminator("input_type")]
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
class InteractionStatus(str, Enum):
|
|
207
|
+
"""
|
|
208
|
+
Represents the status of an interaction.
|
|
209
|
+
"""
|
|
210
|
+
PENDING = "pending"
|
|
211
|
+
IN_PROGRESS = "in_progress"
|
|
212
|
+
COMPLETED = "completed"
|
|
213
|
+
FAILED = "failed"
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
class InteractionBase(BaseModel):
|
|
217
|
+
"""
|
|
218
|
+
Represents a system-human interaction.
|
|
219
|
+
"""
|
|
220
|
+
id: str = Field(description="The ID of the interaction.")
|
|
221
|
+
type: str = Field(default="system_human_interaction", description="The type of the interaction.")
|
|
222
|
+
thread_id: str | None = Field(description="The thread ID of the interaction.", default=None)
|
|
223
|
+
parent_id: str | None = Field(description="The parent ID of the interaction.", default=None)
|
|
224
|
+
status: InteractionStatus = Field(description="The status of the interaction.", default=InteractionStatus.PENDING)
|
|
225
|
+
timestamp: str = Field(description="The timestamp of the interaction.")
|
|
226
|
+
|
|
227
|
+
@field_validator("timestamp", mode="before")
|
|
228
|
+
@classmethod
|
|
229
|
+
def validate_timestamp(cls, timestamp):
|
|
230
|
+
if not re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z", timestamp):
|
|
231
|
+
raise ValueError("Timestamp must be in the format 2025-01-13T10:00:03Z")
|
|
232
|
+
return timestamp
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
class InteractionPrompt(InteractionBase):
|
|
236
|
+
"""
|
|
237
|
+
Represents a system-human interaction with a prompt.
|
|
238
|
+
"""
|
|
239
|
+
content: HumanPrompt = Field(description="The content of the interaction.")
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
class InteractionResponse(InteractionBase):
|
|
243
|
+
"""
|
|
244
|
+
Represents a system-human interaction with a response.
|
|
245
|
+
"""
|
|
246
|
+
content: HumanResponse = Field(description="The content of the interaction.")
|