nvidia-nat 1.2.0rc5__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/agent/__init__.py +0 -0
- aiq/agent/base.py +239 -0
- aiq/agent/dual_node.py +67 -0
- aiq/agent/react_agent/__init__.py +0 -0
- aiq/agent/react_agent/agent.py +355 -0
- aiq/agent/react_agent/output_parser.py +104 -0
- aiq/agent/react_agent/prompt.py +41 -0
- aiq/agent/react_agent/register.py +149 -0
- aiq/agent/reasoning_agent/__init__.py +0 -0
- aiq/agent/reasoning_agent/reasoning_agent.py +225 -0
- aiq/agent/register.py +23 -0
- aiq/agent/rewoo_agent/__init__.py +0 -0
- aiq/agent/rewoo_agent/agent.py +411 -0
- aiq/agent/rewoo_agent/prompt.py +108 -0
- aiq/agent/rewoo_agent/register.py +158 -0
- aiq/agent/tool_calling_agent/__init__.py +0 -0
- aiq/agent/tool_calling_agent/agent.py +119 -0
- aiq/agent/tool_calling_agent/register.py +106 -0
- aiq/authentication/__init__.py +14 -0
- aiq/authentication/api_key/__init__.py +14 -0
- aiq/authentication/api_key/api_key_auth_provider.py +96 -0
- aiq/authentication/api_key/api_key_auth_provider_config.py +124 -0
- aiq/authentication/api_key/register.py +26 -0
- aiq/authentication/exceptions/__init__.py +14 -0
- aiq/authentication/exceptions/api_key_exceptions.py +38 -0
- aiq/authentication/http_basic_auth/__init__.py +0 -0
- aiq/authentication/http_basic_auth/http_basic_auth_provider.py +81 -0
- aiq/authentication/http_basic_auth/register.py +30 -0
- aiq/authentication/interfaces.py +93 -0
- aiq/authentication/oauth2/__init__.py +14 -0
- aiq/authentication/oauth2/oauth2_auth_code_flow_provider.py +107 -0
- aiq/authentication/oauth2/oauth2_auth_code_flow_provider_config.py +39 -0
- aiq/authentication/oauth2/register.py +25 -0
- aiq/authentication/register.py +21 -0
- aiq/builder/__init__.py +0 -0
- aiq/builder/builder.py +285 -0
- aiq/builder/component_utils.py +316 -0
- aiq/builder/context.py +264 -0
- aiq/builder/embedder.py +24 -0
- aiq/builder/eval_builder.py +161 -0
- aiq/builder/evaluator.py +29 -0
- aiq/builder/framework_enum.py +24 -0
- aiq/builder/front_end.py +73 -0
- aiq/builder/function.py +344 -0
- aiq/builder/function_base.py +380 -0
- aiq/builder/function_info.py +627 -0
- aiq/builder/intermediate_step_manager.py +174 -0
- aiq/builder/llm.py +25 -0
- aiq/builder/retriever.py +25 -0
- aiq/builder/user_interaction_manager.py +74 -0
- aiq/builder/workflow.py +148 -0
- aiq/builder/workflow_builder.py +1117 -0
- aiq/cli/__init__.py +14 -0
- aiq/cli/cli_utils/__init__.py +0 -0
- aiq/cli/cli_utils/config_override.py +231 -0
- aiq/cli/cli_utils/validation.py +37 -0
- aiq/cli/commands/__init__.py +0 -0
- aiq/cli/commands/configure/__init__.py +0 -0
- aiq/cli/commands/configure/channel/__init__.py +0 -0
- aiq/cli/commands/configure/channel/add.py +28 -0
- aiq/cli/commands/configure/channel/channel.py +36 -0
- aiq/cli/commands/configure/channel/remove.py +30 -0
- aiq/cli/commands/configure/channel/update.py +30 -0
- aiq/cli/commands/configure/configure.py +33 -0
- aiq/cli/commands/evaluate.py +139 -0
- aiq/cli/commands/info/__init__.py +14 -0
- aiq/cli/commands/info/info.py +39 -0
- aiq/cli/commands/info/list_channels.py +32 -0
- aiq/cli/commands/info/list_components.py +129 -0
- aiq/cli/commands/info/list_mcp.py +213 -0
- aiq/cli/commands/registry/__init__.py +14 -0
- aiq/cli/commands/registry/publish.py +88 -0
- aiq/cli/commands/registry/pull.py +118 -0
- aiq/cli/commands/registry/registry.py +38 -0
- aiq/cli/commands/registry/remove.py +108 -0
- aiq/cli/commands/registry/search.py +155 -0
- aiq/cli/commands/sizing/__init__.py +14 -0
- aiq/cli/commands/sizing/calc.py +297 -0
- aiq/cli/commands/sizing/sizing.py +27 -0
- aiq/cli/commands/start.py +246 -0
- aiq/cli/commands/uninstall.py +81 -0
- aiq/cli/commands/validate.py +47 -0
- aiq/cli/commands/workflow/__init__.py +14 -0
- aiq/cli/commands/workflow/templates/__init__.py.j2 +0 -0
- aiq/cli/commands/workflow/templates/config.yml.j2 +16 -0
- aiq/cli/commands/workflow/templates/pyproject.toml.j2 +22 -0
- aiq/cli/commands/workflow/templates/register.py.j2 +5 -0
- aiq/cli/commands/workflow/templates/workflow.py.j2 +36 -0
- aiq/cli/commands/workflow/workflow.py +37 -0
- aiq/cli/commands/workflow/workflow_commands.py +313 -0
- aiq/cli/entrypoint.py +135 -0
- aiq/cli/main.py +44 -0
- aiq/cli/register_workflow.py +488 -0
- aiq/cli/type_registry.py +1000 -0
- aiq/data_models/__init__.py +14 -0
- aiq/data_models/api_server.py +694 -0
- aiq/data_models/authentication.py +231 -0
- aiq/data_models/common.py +171 -0
- aiq/data_models/component.py +54 -0
- aiq/data_models/component_ref.py +168 -0
- aiq/data_models/config.py +406 -0
- aiq/data_models/dataset_handler.py +123 -0
- aiq/data_models/discovery_metadata.py +335 -0
- aiq/data_models/embedder.py +27 -0
- aiq/data_models/evaluate.py +127 -0
- aiq/data_models/evaluator.py +26 -0
- aiq/data_models/front_end.py +26 -0
- aiq/data_models/function.py +30 -0
- aiq/data_models/function_dependencies.py +72 -0
- aiq/data_models/interactive.py +246 -0
- aiq/data_models/intermediate_step.py +302 -0
- aiq/data_models/invocation_node.py +38 -0
- aiq/data_models/llm.py +27 -0
- aiq/data_models/logging.py +26 -0
- aiq/data_models/memory.py +27 -0
- aiq/data_models/object_store.py +44 -0
- aiq/data_models/profiler.py +54 -0
- aiq/data_models/registry_handler.py +26 -0
- aiq/data_models/retriever.py +30 -0
- aiq/data_models/retry_mixin.py +35 -0
- aiq/data_models/span.py +187 -0
- aiq/data_models/step_adaptor.py +64 -0
- aiq/data_models/streaming.py +33 -0
- aiq/data_models/swe_bench_model.py +54 -0
- aiq/data_models/telemetry_exporter.py +26 -0
- aiq/data_models/ttc_strategy.py +30 -0
- aiq/embedder/__init__.py +0 -0
- aiq/embedder/langchain_client.py +41 -0
- aiq/embedder/nim_embedder.py +59 -0
- aiq/embedder/openai_embedder.py +43 -0
- aiq/embedder/register.py +24 -0
- aiq/eval/__init__.py +14 -0
- aiq/eval/config.py +60 -0
- aiq/eval/dataset_handler/__init__.py +0 -0
- aiq/eval/dataset_handler/dataset_downloader.py +106 -0
- aiq/eval/dataset_handler/dataset_filter.py +52 -0
- aiq/eval/dataset_handler/dataset_handler.py +254 -0
- aiq/eval/evaluate.py +506 -0
- aiq/eval/evaluator/__init__.py +14 -0
- aiq/eval/evaluator/base_evaluator.py +73 -0
- aiq/eval/evaluator/evaluator_model.py +45 -0
- aiq/eval/intermediate_step_adapter.py +99 -0
- aiq/eval/rag_evaluator/__init__.py +0 -0
- aiq/eval/rag_evaluator/evaluate.py +178 -0
- aiq/eval/rag_evaluator/register.py +143 -0
- aiq/eval/register.py +23 -0
- aiq/eval/remote_workflow.py +133 -0
- aiq/eval/runners/__init__.py +14 -0
- aiq/eval/runners/config.py +39 -0
- aiq/eval/runners/multi_eval_runner.py +54 -0
- aiq/eval/runtime_event_subscriber.py +52 -0
- aiq/eval/swe_bench_evaluator/__init__.py +0 -0
- aiq/eval/swe_bench_evaluator/evaluate.py +215 -0
- aiq/eval/swe_bench_evaluator/register.py +36 -0
- aiq/eval/trajectory_evaluator/__init__.py +0 -0
- aiq/eval/trajectory_evaluator/evaluate.py +75 -0
- aiq/eval/trajectory_evaluator/register.py +40 -0
- aiq/eval/tunable_rag_evaluator/__init__.py +0 -0
- aiq/eval/tunable_rag_evaluator/evaluate.py +245 -0
- aiq/eval/tunable_rag_evaluator/register.py +52 -0
- aiq/eval/usage_stats.py +41 -0
- aiq/eval/utils/__init__.py +0 -0
- aiq/eval/utils/output_uploader.py +140 -0
- aiq/eval/utils/tqdm_position_registry.py +40 -0
- aiq/eval/utils/weave_eval.py +184 -0
- aiq/experimental/__init__.py +0 -0
- aiq/experimental/decorators/__init__.py +0 -0
- aiq/experimental/decorators/experimental_warning_decorator.py +130 -0
- aiq/experimental/test_time_compute/__init__.py +0 -0
- aiq/experimental/test_time_compute/editing/__init__.py +0 -0
- aiq/experimental/test_time_compute/editing/iterative_plan_refinement_editor.py +147 -0
- aiq/experimental/test_time_compute/editing/llm_as_a_judge_editor.py +204 -0
- aiq/experimental/test_time_compute/editing/motivation_aware_summarization.py +107 -0
- aiq/experimental/test_time_compute/functions/__init__.py +0 -0
- aiq/experimental/test_time_compute/functions/execute_score_select_function.py +105 -0
- aiq/experimental/test_time_compute/functions/its_tool_orchestration_function.py +205 -0
- aiq/experimental/test_time_compute/functions/its_tool_wrapper_function.py +146 -0
- aiq/experimental/test_time_compute/functions/plan_select_execute_function.py +224 -0
- aiq/experimental/test_time_compute/models/__init__.py +0 -0
- aiq/experimental/test_time_compute/models/editor_config.py +132 -0
- aiq/experimental/test_time_compute/models/scoring_config.py +112 -0
- aiq/experimental/test_time_compute/models/search_config.py +120 -0
- aiq/experimental/test_time_compute/models/selection_config.py +154 -0
- aiq/experimental/test_time_compute/models/stage_enums.py +43 -0
- aiq/experimental/test_time_compute/models/strategy_base.py +66 -0
- aiq/experimental/test_time_compute/models/tool_use_config.py +41 -0
- aiq/experimental/test_time_compute/models/ttc_item.py +48 -0
- aiq/experimental/test_time_compute/register.py +36 -0
- aiq/experimental/test_time_compute/scoring/__init__.py +0 -0
- aiq/experimental/test_time_compute/scoring/llm_based_agent_scorer.py +168 -0
- aiq/experimental/test_time_compute/scoring/llm_based_plan_scorer.py +168 -0
- aiq/experimental/test_time_compute/scoring/motivation_aware_scorer.py +111 -0
- aiq/experimental/test_time_compute/search/__init__.py +0 -0
- aiq/experimental/test_time_compute/search/multi_llm_planner.py +128 -0
- aiq/experimental/test_time_compute/search/multi_query_retrieval_search.py +122 -0
- aiq/experimental/test_time_compute/search/single_shot_multi_plan_planner.py +128 -0
- aiq/experimental/test_time_compute/selection/__init__.py +0 -0
- aiq/experimental/test_time_compute/selection/best_of_n_selector.py +63 -0
- aiq/experimental/test_time_compute/selection/llm_based_agent_output_selector.py +131 -0
- aiq/experimental/test_time_compute/selection/llm_based_output_merging_selector.py +159 -0
- aiq/experimental/test_time_compute/selection/llm_based_plan_selector.py +128 -0
- aiq/experimental/test_time_compute/selection/threshold_selector.py +58 -0
- aiq/front_ends/__init__.py +14 -0
- aiq/front_ends/console/__init__.py +14 -0
- aiq/front_ends/console/authentication_flow_handler.py +233 -0
- aiq/front_ends/console/console_front_end_config.py +32 -0
- aiq/front_ends/console/console_front_end_plugin.py +96 -0
- aiq/front_ends/console/register.py +25 -0
- aiq/front_ends/cron/__init__.py +14 -0
- aiq/front_ends/fastapi/__init__.py +14 -0
- aiq/front_ends/fastapi/auth_flow_handlers/__init__.py +0 -0
- aiq/front_ends/fastapi/auth_flow_handlers/http_flow_handler.py +27 -0
- aiq/front_ends/fastapi/auth_flow_handlers/websocket_flow_handler.py +107 -0
- aiq/front_ends/fastapi/fastapi_front_end_config.py +234 -0
- aiq/front_ends/fastapi/fastapi_front_end_controller.py +68 -0
- aiq/front_ends/fastapi/fastapi_front_end_plugin.py +116 -0
- aiq/front_ends/fastapi/fastapi_front_end_plugin_worker.py +1092 -0
- aiq/front_ends/fastapi/html_snippets/__init__.py +14 -0
- aiq/front_ends/fastapi/html_snippets/auth_code_grant_success.py +35 -0
- aiq/front_ends/fastapi/intermediate_steps_subscriber.py +80 -0
- aiq/front_ends/fastapi/job_store.py +183 -0
- aiq/front_ends/fastapi/main.py +72 -0
- aiq/front_ends/fastapi/message_handler.py +298 -0
- aiq/front_ends/fastapi/message_validator.py +345 -0
- aiq/front_ends/fastapi/register.py +25 -0
- aiq/front_ends/fastapi/response_helpers.py +195 -0
- aiq/front_ends/fastapi/step_adaptor.py +321 -0
- aiq/front_ends/mcp/__init__.py +14 -0
- aiq/front_ends/mcp/mcp_front_end_config.py +32 -0
- aiq/front_ends/mcp/mcp_front_end_plugin.py +93 -0
- aiq/front_ends/mcp/register.py +27 -0
- aiq/front_ends/mcp/tool_converter.py +242 -0
- aiq/front_ends/register.py +22 -0
- aiq/front_ends/simple_base/__init__.py +14 -0
- aiq/front_ends/simple_base/simple_front_end_plugin_base.py +54 -0
- aiq/llm/__init__.py +0 -0
- aiq/llm/aws_bedrock_llm.py +57 -0
- aiq/llm/nim_llm.py +46 -0
- aiq/llm/openai_llm.py +46 -0
- aiq/llm/register.py +23 -0
- aiq/llm/utils/__init__.py +14 -0
- aiq/llm/utils/env_config_value.py +94 -0
- aiq/llm/utils/error.py +17 -0
- aiq/memory/__init__.py +20 -0
- aiq/memory/interfaces.py +183 -0
- aiq/memory/models.py +112 -0
- aiq/meta/module_to_distro.json +3 -0
- aiq/meta/pypi.md +58 -0
- aiq/object_store/__init__.py +20 -0
- aiq/object_store/in_memory_object_store.py +76 -0
- aiq/object_store/interfaces.py +84 -0
- aiq/object_store/models.py +36 -0
- aiq/object_store/register.py +20 -0
- aiq/observability/__init__.py +14 -0
- aiq/observability/exporter/__init__.py +14 -0
- aiq/observability/exporter/base_exporter.py +449 -0
- aiq/observability/exporter/exporter.py +78 -0
- aiq/observability/exporter/file_exporter.py +33 -0
- aiq/observability/exporter/processing_exporter.py +322 -0
- aiq/observability/exporter/raw_exporter.py +52 -0
- aiq/observability/exporter/span_exporter.py +265 -0
- aiq/observability/exporter_manager.py +335 -0
- aiq/observability/mixin/__init__.py +14 -0
- aiq/observability/mixin/batch_config_mixin.py +26 -0
- aiq/observability/mixin/collector_config_mixin.py +23 -0
- aiq/observability/mixin/file_mixin.py +288 -0
- aiq/observability/mixin/file_mode.py +23 -0
- aiq/observability/mixin/resource_conflict_mixin.py +134 -0
- aiq/observability/mixin/serialize_mixin.py +61 -0
- aiq/observability/mixin/type_introspection_mixin.py +183 -0
- aiq/observability/processor/__init__.py +14 -0
- aiq/observability/processor/batching_processor.py +310 -0
- aiq/observability/processor/callback_processor.py +42 -0
- aiq/observability/processor/intermediate_step_serializer.py +28 -0
- aiq/observability/processor/processor.py +71 -0
- aiq/observability/register.py +96 -0
- aiq/observability/utils/__init__.py +14 -0
- aiq/observability/utils/dict_utils.py +236 -0
- aiq/observability/utils/time_utils.py +31 -0
- aiq/plugins/.namespace +1 -0
- aiq/profiler/__init__.py +0 -0
- aiq/profiler/calc/__init__.py +14 -0
- aiq/profiler/calc/calc_runner.py +627 -0
- aiq/profiler/calc/calculations.py +288 -0
- aiq/profiler/calc/data_models.py +188 -0
- aiq/profiler/calc/plot.py +345 -0
- aiq/profiler/callbacks/__init__.py +0 -0
- aiq/profiler/callbacks/agno_callback_handler.py +295 -0
- aiq/profiler/callbacks/base_callback_class.py +20 -0
- aiq/profiler/callbacks/langchain_callback_handler.py +290 -0
- aiq/profiler/callbacks/llama_index_callback_handler.py +205 -0
- aiq/profiler/callbacks/semantic_kernel_callback_handler.py +238 -0
- aiq/profiler/callbacks/token_usage_base_model.py +27 -0
- aiq/profiler/data_frame_row.py +51 -0
- aiq/profiler/data_models.py +24 -0
- aiq/profiler/decorators/__init__.py +0 -0
- aiq/profiler/decorators/framework_wrapper.py +131 -0
- aiq/profiler/decorators/function_tracking.py +254 -0
- aiq/profiler/forecasting/__init__.py +0 -0
- aiq/profiler/forecasting/config.py +18 -0
- aiq/profiler/forecasting/model_trainer.py +75 -0
- aiq/profiler/forecasting/models/__init__.py +22 -0
- aiq/profiler/forecasting/models/forecasting_base_model.py +40 -0
- aiq/profiler/forecasting/models/linear_model.py +196 -0
- aiq/profiler/forecasting/models/random_forest_regressor.py +268 -0
- aiq/profiler/inference_metrics_model.py +28 -0
- aiq/profiler/inference_optimization/__init__.py +0 -0
- aiq/profiler/inference_optimization/bottleneck_analysis/__init__.py +0 -0
- aiq/profiler/inference_optimization/bottleneck_analysis/nested_stack_analysis.py +460 -0
- aiq/profiler/inference_optimization/bottleneck_analysis/simple_stack_analysis.py +258 -0
- aiq/profiler/inference_optimization/data_models.py +386 -0
- aiq/profiler/inference_optimization/experimental/__init__.py +0 -0
- aiq/profiler/inference_optimization/experimental/concurrency_spike_analysis.py +468 -0
- aiq/profiler/inference_optimization/experimental/prefix_span_analysis.py +405 -0
- aiq/profiler/inference_optimization/llm_metrics.py +212 -0
- aiq/profiler/inference_optimization/prompt_caching.py +163 -0
- aiq/profiler/inference_optimization/token_uniqueness.py +107 -0
- aiq/profiler/inference_optimization/workflow_runtimes.py +72 -0
- aiq/profiler/intermediate_property_adapter.py +102 -0
- aiq/profiler/profile_runner.py +473 -0
- aiq/profiler/utils.py +184 -0
- aiq/registry_handlers/__init__.py +0 -0
- aiq/registry_handlers/local/__init__.py +0 -0
- aiq/registry_handlers/local/local_handler.py +176 -0
- aiq/registry_handlers/local/register_local.py +37 -0
- aiq/registry_handlers/metadata_factory.py +60 -0
- aiq/registry_handlers/package_utils.py +567 -0
- aiq/registry_handlers/pypi/__init__.py +0 -0
- aiq/registry_handlers/pypi/pypi_handler.py +251 -0
- aiq/registry_handlers/pypi/register_pypi.py +40 -0
- aiq/registry_handlers/register.py +21 -0
- aiq/registry_handlers/registry_handler_base.py +157 -0
- aiq/registry_handlers/rest/__init__.py +0 -0
- aiq/registry_handlers/rest/register_rest.py +56 -0
- aiq/registry_handlers/rest/rest_handler.py +237 -0
- aiq/registry_handlers/schemas/__init__.py +0 -0
- aiq/registry_handlers/schemas/headers.py +42 -0
- aiq/registry_handlers/schemas/package.py +68 -0
- aiq/registry_handlers/schemas/publish.py +63 -0
- aiq/registry_handlers/schemas/pull.py +82 -0
- aiq/registry_handlers/schemas/remove.py +36 -0
- aiq/registry_handlers/schemas/search.py +91 -0
- aiq/registry_handlers/schemas/status.py +47 -0
- aiq/retriever/__init__.py +0 -0
- aiq/retriever/interface.py +37 -0
- aiq/retriever/milvus/__init__.py +14 -0
- aiq/retriever/milvus/register.py +81 -0
- aiq/retriever/milvus/retriever.py +228 -0
- aiq/retriever/models.py +74 -0
- aiq/retriever/nemo_retriever/__init__.py +14 -0
- aiq/retriever/nemo_retriever/register.py +60 -0
- aiq/retriever/nemo_retriever/retriever.py +190 -0
- aiq/retriever/register.py +22 -0
- aiq/runtime/__init__.py +14 -0
- aiq/runtime/loader.py +215 -0
- aiq/runtime/runner.py +190 -0
- aiq/runtime/session.py +158 -0
- aiq/runtime/user_metadata.py +130 -0
- aiq/settings/__init__.py +0 -0
- aiq/settings/global_settings.py +318 -0
- aiq/test/.namespace +1 -0
- aiq/tool/__init__.py +0 -0
- aiq/tool/chat_completion.py +74 -0
- aiq/tool/code_execution/README.md +151 -0
- aiq/tool/code_execution/__init__.py +0 -0
- aiq/tool/code_execution/code_sandbox.py +267 -0
- aiq/tool/code_execution/local_sandbox/.gitignore +1 -0
- aiq/tool/code_execution/local_sandbox/Dockerfile.sandbox +60 -0
- aiq/tool/code_execution/local_sandbox/__init__.py +13 -0
- aiq/tool/code_execution/local_sandbox/local_sandbox_server.py +198 -0
- aiq/tool/code_execution/local_sandbox/sandbox.requirements.txt +6 -0
- aiq/tool/code_execution/local_sandbox/start_local_sandbox.sh +50 -0
- aiq/tool/code_execution/register.py +74 -0
- aiq/tool/code_execution/test_code_execution_sandbox.py +414 -0
- aiq/tool/code_execution/utils.py +100 -0
- aiq/tool/datetime_tools.py +42 -0
- aiq/tool/document_search.py +141 -0
- aiq/tool/github_tools/__init__.py +0 -0
- aiq/tool/github_tools/create_github_commit.py +133 -0
- aiq/tool/github_tools/create_github_issue.py +87 -0
- aiq/tool/github_tools/create_github_pr.py +106 -0
- aiq/tool/github_tools/get_github_file.py +106 -0
- aiq/tool/github_tools/get_github_issue.py +166 -0
- aiq/tool/github_tools/get_github_pr.py +256 -0
- aiq/tool/github_tools/update_github_issue.py +100 -0
- aiq/tool/mcp/__init__.py +14 -0
- aiq/tool/mcp/exceptions.py +142 -0
- aiq/tool/mcp/mcp_client.py +255 -0
- aiq/tool/mcp/mcp_tool.py +96 -0
- aiq/tool/memory_tools/__init__.py +0 -0
- aiq/tool/memory_tools/add_memory_tool.py +79 -0
- aiq/tool/memory_tools/delete_memory_tool.py +67 -0
- aiq/tool/memory_tools/get_memory_tool.py +72 -0
- aiq/tool/nvidia_rag.py +95 -0
- aiq/tool/register.py +38 -0
- aiq/tool/retriever.py +89 -0
- aiq/tool/server_tools.py +66 -0
- aiq/utils/__init__.py +0 -0
- aiq/utils/data_models/__init__.py +0 -0
- aiq/utils/data_models/schema_validator.py +58 -0
- aiq/utils/debugging_utils.py +43 -0
- aiq/utils/dump_distro_mapping.py +32 -0
- aiq/utils/exception_handlers/__init__.py +0 -0
- aiq/utils/exception_handlers/automatic_retries.py +289 -0
- aiq/utils/exception_handlers/mcp.py +211 -0
- aiq/utils/exception_handlers/schemas.py +114 -0
- aiq/utils/io/__init__.py +0 -0
- aiq/utils/io/model_processing.py +28 -0
- aiq/utils/io/yaml_tools.py +119 -0
- aiq/utils/log_utils.py +37 -0
- aiq/utils/metadata_utils.py +74 -0
- aiq/utils/optional_imports.py +142 -0
- aiq/utils/producer_consumer_queue.py +178 -0
- aiq/utils/reactive/__init__.py +0 -0
- aiq/utils/reactive/base/__init__.py +0 -0
- aiq/utils/reactive/base/observable_base.py +65 -0
- aiq/utils/reactive/base/observer_base.py +55 -0
- aiq/utils/reactive/base/subject_base.py +79 -0
- aiq/utils/reactive/observable.py +59 -0
- aiq/utils/reactive/observer.py +76 -0
- aiq/utils/reactive/subject.py +131 -0
- aiq/utils/reactive/subscription.py +49 -0
- aiq/utils/settings/__init__.py +0 -0
- aiq/utils/settings/global_settings.py +197 -0
- aiq/utils/string_utils.py +38 -0
- aiq/utils/type_converter.py +290 -0
- aiq/utils/type_utils.py +484 -0
- aiq/utils/url_utils.py +27 -0
- nvidia_nat-1.2.0rc5.dist-info/METADATA +363 -0
- nvidia_nat-1.2.0rc5.dist-info/RECORD +435 -0
- nvidia_nat-1.2.0rc5.dist-info/WHEEL +5 -0
- nvidia_nat-1.2.0rc5.dist-info/entry_points.txt +20 -0
- nvidia_nat-1.2.0rc5.dist-info/licenses/LICENSE-3rd-party.txt +3686 -0
- nvidia_nat-1.2.0rc5.dist-info/licenses/LICENSE.md +201 -0
- nvidia_nat-1.2.0rc5.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,231 @@
|
|
|
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
|
+
from datetime import datetime
|
|
18
|
+
from datetime import timezone
|
|
19
|
+
from enum import Enum
|
|
20
|
+
|
|
21
|
+
import httpx
|
|
22
|
+
from pydantic import BaseModel
|
|
23
|
+
from pydantic import ConfigDict
|
|
24
|
+
from pydantic import Field
|
|
25
|
+
from pydantic import SecretStr
|
|
26
|
+
|
|
27
|
+
from aiq.data_models.common import BaseModelRegistryTag
|
|
28
|
+
from aiq.data_models.common import TypedBaseModel
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class AuthProviderBaseConfig(TypedBaseModel, BaseModelRegistryTag):
|
|
32
|
+
"""
|
|
33
|
+
Base configuration for authentication providers.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
# Default, forbid extra fields to prevent unexpected behavior or miss typed options
|
|
37
|
+
model_config = ConfigDict(extra="forbid")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
AuthProviderBaseConfigT = typing.TypeVar("AuthProviderBaseConfigT", bound=AuthProviderBaseConfig)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class CredentialLocation(str, Enum):
|
|
44
|
+
"""
|
|
45
|
+
Enum representing the location of credentials in an HTTP request.
|
|
46
|
+
"""
|
|
47
|
+
HEADER = "header"
|
|
48
|
+
QUERY = "query"
|
|
49
|
+
COOKIE = "cookie"
|
|
50
|
+
BODY = "body"
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class AuthFlowType(str, Enum):
|
|
54
|
+
"""
|
|
55
|
+
Enum representing different types of authentication flows.
|
|
56
|
+
"""
|
|
57
|
+
API_KEY = "api_key"
|
|
58
|
+
OAUTH2_CLIENT_CREDENTIALS = "oauth2_client_credentials"
|
|
59
|
+
OAUTH2_AUTHORIZATION_CODE = "oauth2_auth_code_flow"
|
|
60
|
+
OAUTH2_PASSWORD = "oauth2_password"
|
|
61
|
+
OAUTH2_DEVICE_CODE = "oauth2_device_code"
|
|
62
|
+
HTTP_BASIC = "http_basic"
|
|
63
|
+
NONE = "none"
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class AuthenticatedContext(BaseModel):
|
|
67
|
+
"""
|
|
68
|
+
Represents an authenticated context for making requests.
|
|
69
|
+
"""
|
|
70
|
+
model_config = ConfigDict(extra="forbid", arbitrary_types_allowed=True)
|
|
71
|
+
headers: dict[str, str] | httpx.Headers | None = Field(default=None,
|
|
72
|
+
description="HTTP headers used for authentication.")
|
|
73
|
+
query_params: dict[str, str] | httpx.QueryParams | None = Field(
|
|
74
|
+
default=None, description="Query parameters used for authentication.")
|
|
75
|
+
cookies: dict[str, str] | httpx.Cookies | None = Field(default=None, description="Cookies used for authentication.")
|
|
76
|
+
body: dict[str, str] | None = Field(default=None, description="Authenticated Body value, if applicable.")
|
|
77
|
+
metadata: dict[str, typing.Any] | None = Field(default=None, description="Additional metadata for the request.")
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class HeaderAuthScheme(str, Enum):
|
|
81
|
+
"""
|
|
82
|
+
Enum representing different header authentication schemes.
|
|
83
|
+
"""
|
|
84
|
+
BEARER = "Bearer"
|
|
85
|
+
X_API_KEY = "X-API-Key"
|
|
86
|
+
BASIC = "Basic"
|
|
87
|
+
CUSTOM = "Custom"
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class HTTPMethod(str, Enum):
|
|
91
|
+
"""
|
|
92
|
+
Enum representing HTTP methods used in requests.
|
|
93
|
+
"""
|
|
94
|
+
GET = "GET"
|
|
95
|
+
POST = "POST"
|
|
96
|
+
PUT = "PUT"
|
|
97
|
+
DELETE = "DELETE"
|
|
98
|
+
PATCH = "PATCH"
|
|
99
|
+
HEAD = "HEAD"
|
|
100
|
+
OPTIONS = "OPTIONS"
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class CredentialKind(str, Enum):
|
|
104
|
+
"""
|
|
105
|
+
Enum representing different kinds of credentials used for authentication.
|
|
106
|
+
"""
|
|
107
|
+
HEADER = "header"
|
|
108
|
+
QUERY = "query"
|
|
109
|
+
COOKIE = "cookie"
|
|
110
|
+
BASIC = "basic_auth"
|
|
111
|
+
BEARER = "bearer_token"
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class _CredBase(BaseModel):
|
|
115
|
+
"""
|
|
116
|
+
Base class for credentials used in authentication.
|
|
117
|
+
"""
|
|
118
|
+
kind: CredentialKind
|
|
119
|
+
model_config = ConfigDict(extra="forbid")
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class HeaderCred(_CredBase):
|
|
123
|
+
"""
|
|
124
|
+
Represents a credential that is sent in the HTTP header.
|
|
125
|
+
"""
|
|
126
|
+
kind: typing.Literal[CredentialKind.HEADER] = CredentialKind.HEADER
|
|
127
|
+
name: str
|
|
128
|
+
value: SecretStr
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
class QueryCred(_CredBase):
|
|
132
|
+
"""
|
|
133
|
+
Represents a credential that is sent as a query parameter in the URL.
|
|
134
|
+
"""
|
|
135
|
+
kind: typing.Literal[CredentialKind.QUERY] = CredentialKind.QUERY
|
|
136
|
+
name: str
|
|
137
|
+
value: SecretStr
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
class CookieCred(_CredBase):
|
|
141
|
+
"""
|
|
142
|
+
Represents a credential that is sent as a cookie in the HTTP request.
|
|
143
|
+
"""
|
|
144
|
+
kind: typing.Literal[CredentialKind.COOKIE] = CredentialKind.COOKIE
|
|
145
|
+
name: str
|
|
146
|
+
value: SecretStr
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
class BasicAuthCred(_CredBase):
|
|
150
|
+
"""
|
|
151
|
+
Represents credentials for HTTP Basic Authentication.
|
|
152
|
+
"""
|
|
153
|
+
kind: typing.Literal[CredentialKind.BASIC] = CredentialKind.BASIC
|
|
154
|
+
username: SecretStr
|
|
155
|
+
password: SecretStr
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
class BearerTokenCred(_CredBase):
|
|
159
|
+
"""
|
|
160
|
+
Represents a credential for Bearer Token Authentication.
|
|
161
|
+
"""
|
|
162
|
+
kind: typing.Literal[CredentialKind.BEARER] = CredentialKind.BEARER
|
|
163
|
+
token: SecretStr
|
|
164
|
+
scheme: str = "Bearer"
|
|
165
|
+
header_name: str = "Authorization"
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
Credential = typing.Annotated[
|
|
169
|
+
typing.Union[
|
|
170
|
+
HeaderCred,
|
|
171
|
+
QueryCred,
|
|
172
|
+
CookieCred,
|
|
173
|
+
BasicAuthCred,
|
|
174
|
+
BearerTokenCred,
|
|
175
|
+
],
|
|
176
|
+
Field(discriminator="kind"),
|
|
177
|
+
]
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class AuthResult(BaseModel):
|
|
181
|
+
"""
|
|
182
|
+
Represents the result of an authentication process.
|
|
183
|
+
"""
|
|
184
|
+
credentials: list[Credential] = Field(default_factory=list,
|
|
185
|
+
description="List of credentials used for authentication.")
|
|
186
|
+
token_expires_at: datetime | None = Field(default=None, description="Expiration time of the token, if applicable.")
|
|
187
|
+
raw: dict[str, typing.Any] = Field(default_factory=dict,
|
|
188
|
+
description="Raw response data from the authentication process.")
|
|
189
|
+
|
|
190
|
+
model_config = ConfigDict(extra="forbid")
|
|
191
|
+
|
|
192
|
+
def is_expired(self) -> bool:
|
|
193
|
+
"""
|
|
194
|
+
Checks if the authentication token has expired.
|
|
195
|
+
"""
|
|
196
|
+
return bool(self.token_expires_at and datetime.now(timezone.utc) >= self.token_expires_at)
|
|
197
|
+
|
|
198
|
+
def as_requests_kwargs(self) -> dict[str, typing.Any]:
|
|
199
|
+
"""
|
|
200
|
+
Converts the authentication credentials into a format suitable for use with the `httpx` library.
|
|
201
|
+
"""
|
|
202
|
+
kw: dict[str, typing.Any] = {"headers": {}, "params": {}, "cookies": {}}
|
|
203
|
+
|
|
204
|
+
for cred in self.credentials:
|
|
205
|
+
match cred:
|
|
206
|
+
case HeaderCred():
|
|
207
|
+
kw["headers"][cred.name] = cred.value.get_secret_value()
|
|
208
|
+
case QueryCred():
|
|
209
|
+
kw["params"][cred.name] = cred.value.get_secret_value()
|
|
210
|
+
case CookieCred():
|
|
211
|
+
kw["cookies"][cred.name] = cred.value.get_secret_value()
|
|
212
|
+
case BearerTokenCred():
|
|
213
|
+
kw["headers"][cred.header_name] = (f"{cred.scheme} {cred.token.get_secret_value()}")
|
|
214
|
+
case BasicAuthCred():
|
|
215
|
+
kw["auth"] = (
|
|
216
|
+
cred.username.get_secret_value(),
|
|
217
|
+
cred.password.get_secret_value(),
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
return kw
|
|
221
|
+
|
|
222
|
+
def attach(self, target_kwargs: dict[str, typing.Any]) -> None:
|
|
223
|
+
"""
|
|
224
|
+
Attaches the authentication credentials to the target request kwargs.
|
|
225
|
+
"""
|
|
226
|
+
merged = self.as_requests_kwargs()
|
|
227
|
+
for k, v in merged.items():
|
|
228
|
+
if isinstance(v, dict):
|
|
229
|
+
target_kwargs.setdefault(k, {}).update(v)
|
|
230
|
+
else:
|
|
231
|
+
target_kwargs[k] = v
|
|
@@ -0,0 +1,171 @@
|
|
|
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 inspect
|
|
17
|
+
import sys
|
|
18
|
+
import typing
|
|
19
|
+
from hashlib import sha512
|
|
20
|
+
|
|
21
|
+
from pydantic import AliasChoices
|
|
22
|
+
from pydantic import BaseModel
|
|
23
|
+
from pydantic import Field
|
|
24
|
+
from pydantic.json_schema import GenerateJsonSchema
|
|
25
|
+
from pydantic.json_schema import JsonSchemaMode
|
|
26
|
+
|
|
27
|
+
_LT = typing.TypeVar("_LT")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class HashableBaseModel(BaseModel):
|
|
31
|
+
"""
|
|
32
|
+
Subclass of a Pydantic BaseModel that is hashable. Use in objects that need to be hashed for caching purposes.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
def __hash__(self):
|
|
36
|
+
return int.from_bytes(bytes=sha512(f"{self.__class__.__qualname__}::{self.model_dump_json()}".encode(
|
|
37
|
+
'utf-8', errors='ignore')).digest(),
|
|
38
|
+
byteorder=sys.byteorder)
|
|
39
|
+
|
|
40
|
+
def __lt__(self, other):
|
|
41
|
+
return self.__hash__() < other.__hash__()
|
|
42
|
+
|
|
43
|
+
def __eq__(self, other):
|
|
44
|
+
return self.__hash__() == other.__hash__()
|
|
45
|
+
|
|
46
|
+
def __ne__(self, other):
|
|
47
|
+
return self.__hash__() != other.__hash__()
|
|
48
|
+
|
|
49
|
+
def __gt__(self, other):
|
|
50
|
+
return self.__hash__() > other.__hash__()
|
|
51
|
+
|
|
52
|
+
@classmethod
|
|
53
|
+
def generate_json_schema(cls) -> dict[str, typing.Any]:
|
|
54
|
+
return cls.model_json_schema()
|
|
55
|
+
|
|
56
|
+
@classmethod
|
|
57
|
+
def write_json_schema(cls, schema_path: str) -> None:
|
|
58
|
+
|
|
59
|
+
import json
|
|
60
|
+
|
|
61
|
+
schema = cls.generate_json_schema()
|
|
62
|
+
|
|
63
|
+
with open(schema_path, "w", encoding="utf-8") as f:
|
|
64
|
+
json.dump(schema, f, indent=2)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def subclass_depth(cls: type) -> int:
|
|
68
|
+
"""
|
|
69
|
+
Compute a class' subclass depth.
|
|
70
|
+
"""
|
|
71
|
+
depth = 0
|
|
72
|
+
while (cls is not object and cls.__base__ is not None):
|
|
73
|
+
cls = cls.__base__ # type: ignore
|
|
74
|
+
depth += 1
|
|
75
|
+
return depth
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _get_origin_or_base(cls: type) -> type:
|
|
79
|
+
"""
|
|
80
|
+
Get the origin of a type or the base class if it is not a generic.
|
|
81
|
+
"""
|
|
82
|
+
origin = typing.get_origin(cls)
|
|
83
|
+
if origin is None:
|
|
84
|
+
return cls
|
|
85
|
+
return origin
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class BaseModelRegistryTag:
|
|
89
|
+
|
|
90
|
+
pass
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class TypedBaseModel(BaseModel):
|
|
94
|
+
"""
|
|
95
|
+
Subclass of Pydantic BaseModel that allows for specifying the object type. Use in Pydantic discriminated unions.
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
type: str = Field(default="unknown",
|
|
99
|
+
init=False,
|
|
100
|
+
serialization_alias="_type",
|
|
101
|
+
validation_alias=AliasChoices('type', '_type'),
|
|
102
|
+
description="The type of the object",
|
|
103
|
+
title="Type",
|
|
104
|
+
repr=False)
|
|
105
|
+
|
|
106
|
+
full_type: typing.ClassVar[str]
|
|
107
|
+
_typed_model_name: typing.ClassVar[str | None] = None
|
|
108
|
+
|
|
109
|
+
def __init_subclass__(cls, name: str | None = None):
|
|
110
|
+
super().__init_subclass__()
|
|
111
|
+
|
|
112
|
+
if (name is not None):
|
|
113
|
+
module = inspect.getmodule(cls)
|
|
114
|
+
|
|
115
|
+
assert module is not None, f"Module not found for class {cls} when registering {name}"
|
|
116
|
+
package_name: str | None = module.__package__
|
|
117
|
+
|
|
118
|
+
# If the package name is not set, then we use the module name. Must have some namespace which will be unique
|
|
119
|
+
if (not package_name):
|
|
120
|
+
package_name = module.__name__
|
|
121
|
+
|
|
122
|
+
full_name = f"{package_name}/{name}"
|
|
123
|
+
|
|
124
|
+
# Store the type name as a class attribute - no field manipulation needed!
|
|
125
|
+
cls._typed_model_name = name # type: ignore
|
|
126
|
+
cls.full_type = full_name
|
|
127
|
+
|
|
128
|
+
def model_post_init(self, __context):
|
|
129
|
+
"""Set the type field to the correct value after instance creation."""
|
|
130
|
+
if hasattr(self.__class__, '_typed_model_name') and self.__class__._typed_model_name is not None:
|
|
131
|
+
object.__setattr__(self, 'type', self.__class__._typed_model_name)
|
|
132
|
+
# If no type name is set, the field retains its default "unknown" value
|
|
133
|
+
|
|
134
|
+
@classmethod
|
|
135
|
+
def model_json_schema(cls,
|
|
136
|
+
by_alias: bool = True,
|
|
137
|
+
ref_template: str = '#/$defs/{model}',
|
|
138
|
+
schema_generator: "type[GenerateJsonSchema]" = GenerateJsonSchema,
|
|
139
|
+
mode: JsonSchemaMode = 'validation') -> dict:
|
|
140
|
+
"""Override to provide correct default for type field in schema."""
|
|
141
|
+
schema = super().model_json_schema(by_alias=by_alias,
|
|
142
|
+
ref_template=ref_template,
|
|
143
|
+
schema_generator=schema_generator,
|
|
144
|
+
mode=mode)
|
|
145
|
+
|
|
146
|
+
# Fix the type field default to show the actual component type instead of "unknown"
|
|
147
|
+
if ('properties' in schema and 'type' in schema['properties'] and hasattr(cls, '_typed_model_name')
|
|
148
|
+
and cls._typed_model_name is not None):
|
|
149
|
+
schema['properties']['type']['default'] = cls._typed_model_name
|
|
150
|
+
|
|
151
|
+
return schema
|
|
152
|
+
|
|
153
|
+
@classmethod
|
|
154
|
+
def static_type(cls):
|
|
155
|
+
return getattr(cls, '_typed_model_name')
|
|
156
|
+
|
|
157
|
+
@classmethod
|
|
158
|
+
def static_full_type(cls):
|
|
159
|
+
return cls.full_type
|
|
160
|
+
|
|
161
|
+
@staticmethod
|
|
162
|
+
def discriminator(v: typing.Any) -> str | None:
|
|
163
|
+
# If its serialized, then we use the alias
|
|
164
|
+
if isinstance(v, dict):
|
|
165
|
+
return v.get("_type", v.get("type"))
|
|
166
|
+
|
|
167
|
+
# Otherwise we use the property
|
|
168
|
+
return getattr(v, "type")
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
TypedBaseModelT = typing.TypeVar("TypedBaseModelT", bound=TypedBaseModel)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import logging
|
|
17
|
+
from enum import StrEnum
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class AIQComponentEnum(StrEnum):
|
|
23
|
+
# Keep sorted!!!
|
|
24
|
+
AUTHENTICATION_PROVIDER = "auth_provider"
|
|
25
|
+
EMBEDDER_CLIENT = "embedder_client"
|
|
26
|
+
EMBEDDER_PROVIDER = "embedder_provider"
|
|
27
|
+
EVALUATOR = "evaluator"
|
|
28
|
+
FRONT_END = "front_end"
|
|
29
|
+
FUNCTION = "function"
|
|
30
|
+
TTC_STRATEGY = "ttc_strategy"
|
|
31
|
+
LLM_CLIENT = "llm_client"
|
|
32
|
+
LLM_PROVIDER = "llm_provider"
|
|
33
|
+
LOGGING = "logging"
|
|
34
|
+
MEMORY = "memory"
|
|
35
|
+
OBJECT_STORE = "object_store"
|
|
36
|
+
PACKAGE = "package"
|
|
37
|
+
REGISTRY_HANDLER = "registry_handler"
|
|
38
|
+
RETRIEVER_CLIENT = "retriever_client"
|
|
39
|
+
RETRIEVER_PROVIDER = "retriever_provider"
|
|
40
|
+
TOOL_WRAPPER = "tool_wrapper"
|
|
41
|
+
TRACING = "tracing"
|
|
42
|
+
UNDEFINED = "undefined"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class ComponentGroup(StrEnum):
|
|
46
|
+
# Keep sorted!!!
|
|
47
|
+
AUTHENTICATION = "authentication"
|
|
48
|
+
EMBEDDERS = "embedders"
|
|
49
|
+
FUNCTIONS = "functions"
|
|
50
|
+
TTC_STRATEGIES = "ttc_strategies"
|
|
51
|
+
LLMS = "llms"
|
|
52
|
+
MEMORY = "memory"
|
|
53
|
+
OBJECT_STORES = "object_stores"
|
|
54
|
+
RETRIEVERS = "retrievers"
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import typing
|
|
17
|
+
from abc import ABC
|
|
18
|
+
from abc import abstractmethod
|
|
19
|
+
|
|
20
|
+
from pydantic_core import CoreSchema
|
|
21
|
+
from pydantic_core import core_schema
|
|
22
|
+
|
|
23
|
+
from aiq.data_models.common import HashableBaseModel
|
|
24
|
+
from aiq.data_models.component import ComponentGroup
|
|
25
|
+
from aiq.utils.type_utils import override
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def generate_instance_id(input_object: typing.Any) -> str:
|
|
29
|
+
"""Generates a unique identifier for a python object derived from its python unique id.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
input_object (typing.Any): The input object to receive a unique identifier.
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
str: Unique identifier.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
return str(id(input_object))
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class ComponentRefNode(HashableBaseModel):
|
|
42
|
+
"""A node type for component runtime instances reference names in a networkx digraph.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
ref_name (ComponentRef): The name of the component runtime instance.
|
|
46
|
+
component_group (ComponentGroup): The component group in an AIQ Toolkit configuration object.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
ref_name: "ComponentRef"
|
|
50
|
+
component_group: ComponentGroup
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class ComponentRef(str, ABC):
|
|
54
|
+
"""
|
|
55
|
+
Abstract class used for the interface to derive ComponentRef objects.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
def __new__(cls, value: "ComponentRef | str"):
|
|
59
|
+
# Sublcassing str skips abstractmethod enforcement.
|
|
60
|
+
if len(cls.__abstractmethods__ - set(cls.__dict__)):
|
|
61
|
+
abstract_methods = ", ".join([f"'{method}'" for method in cls.__abstractmethods__])
|
|
62
|
+
raise TypeError(f"Can't instantiate abstract class {cls.__name__} "
|
|
63
|
+
f"without an implementation for abstract method(s) {abstract_methods}")
|
|
64
|
+
|
|
65
|
+
return super().__new__(cls, value)
|
|
66
|
+
|
|
67
|
+
@property
|
|
68
|
+
@abstractmethod
|
|
69
|
+
def component_group(self) -> ComponentGroup:
|
|
70
|
+
"""Provides the component group this ComponentRef object represents.
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
ComponentGroup: A component group of the AIQ Toolkit configuration object
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
pass
|
|
77
|
+
|
|
78
|
+
@classmethod
|
|
79
|
+
def __get_pydantic_core_schema__(cls, source_type, handler, **kwargs) -> CoreSchema:
|
|
80
|
+
return core_schema.no_info_plain_validator_function(cls)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class EmbedderRef(ComponentRef):
|
|
84
|
+
"""
|
|
85
|
+
A reference to an embedder in an AIQ Toolkit configuration object.
|
|
86
|
+
"""
|
|
87
|
+
|
|
88
|
+
@property
|
|
89
|
+
@override
|
|
90
|
+
def component_group(self):
|
|
91
|
+
return ComponentGroup.EMBEDDERS
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class FunctionRef(ComponentRef):
|
|
95
|
+
"""
|
|
96
|
+
A reference to a function in an AIQ Toolkit configuration object.
|
|
97
|
+
"""
|
|
98
|
+
|
|
99
|
+
@property
|
|
100
|
+
@override
|
|
101
|
+
def component_group(self):
|
|
102
|
+
return ComponentGroup.FUNCTIONS
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class LLMRef(ComponentRef):
|
|
106
|
+
"""
|
|
107
|
+
A reference to an LLM in an AIQ Toolkit configuration object.
|
|
108
|
+
"""
|
|
109
|
+
|
|
110
|
+
@property
|
|
111
|
+
@override
|
|
112
|
+
def component_group(self):
|
|
113
|
+
return ComponentGroup.LLMS
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class MemoryRef(ComponentRef):
|
|
117
|
+
"""
|
|
118
|
+
A reference to a memory in an AIQ Toolkit configuration object.
|
|
119
|
+
"""
|
|
120
|
+
|
|
121
|
+
@property
|
|
122
|
+
@override
|
|
123
|
+
def component_group(self):
|
|
124
|
+
return ComponentGroup.MEMORY
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class ObjectStoreRef(ComponentRef):
|
|
128
|
+
"""
|
|
129
|
+
A reference to an object store in an AIQ toolkit configuration object.
|
|
130
|
+
"""
|
|
131
|
+
|
|
132
|
+
@property
|
|
133
|
+
@override
|
|
134
|
+
def component_group(self):
|
|
135
|
+
return ComponentGroup.OBJECT_STORES
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class RetrieverRef(ComponentRef):
|
|
139
|
+
"""
|
|
140
|
+
A reference to a retriever in an AIQ Toolkit configuration object.
|
|
141
|
+
"""
|
|
142
|
+
|
|
143
|
+
@property
|
|
144
|
+
@override
|
|
145
|
+
def component_group(self):
|
|
146
|
+
return ComponentGroup.RETRIEVERS
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
class AuthenticationRef(ComponentRef):
|
|
150
|
+
"""
|
|
151
|
+
A reference to an API Authentication Provider in an AIQ Toolkit configuration object.
|
|
152
|
+
"""
|
|
153
|
+
|
|
154
|
+
@property
|
|
155
|
+
@override
|
|
156
|
+
def component_group(self):
|
|
157
|
+
return ComponentGroup.AUTHENTICATION
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
class TTCStrategyRef(ComponentRef):
|
|
161
|
+
"""
|
|
162
|
+
A reference to an TTC strategy in an NeMo Agent Toolkit configuration object.
|
|
163
|
+
"""
|
|
164
|
+
|
|
165
|
+
@property
|
|
166
|
+
@override
|
|
167
|
+
def component_group(self):
|
|
168
|
+
return ComponentGroup.TTC_STRATEGIES
|