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,268 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import logging
|
|
17
|
+
|
|
18
|
+
import numpy as np
|
|
19
|
+
|
|
20
|
+
from aiq.profiler.forecasting.models.forecasting_base_model import ForecastingBaseModel
|
|
21
|
+
from aiq.profiler.intermediate_property_adapter import IntermediatePropertyAdaptor
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class RandomForestModel(ForecastingBaseModel):
|
|
27
|
+
"""
|
|
28
|
+
A random forest regressor that predicts n_step token usage and call latency.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def __init__(self):
|
|
32
|
+
super().__init__()
|
|
33
|
+
|
|
34
|
+
try:
|
|
35
|
+
from sklearn.ensemble import RandomForestRegressor
|
|
36
|
+
except ImportError:
|
|
37
|
+
logger.error("scikit-learn is not installed. Please install scikit-learn to use the RandomForest "
|
|
38
|
+
"profiling model or install `aiq[profiler]` to install all necessary profiling packages.")
|
|
39
|
+
|
|
40
|
+
raise
|
|
41
|
+
|
|
42
|
+
self.model = RandomForestRegressor(n_estimators=3, max_depth=2)
|
|
43
|
+
self.matrix_length = None
|
|
44
|
+
|
|
45
|
+
def fit(self, raw_stats: list[list[IntermediatePropertyAdaptor]]):
|
|
46
|
+
"""
|
|
47
|
+
X: shape (N, M) # M = matrix_length * 4
|
|
48
|
+
y: shape (N, 4)
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
x_flat, y_flat = self._prep_for_model_training(raw_stats)
|
|
52
|
+
|
|
53
|
+
# 3) Fit
|
|
54
|
+
self.model.fit(x_flat, y_flat)
|
|
55
|
+
|
|
56
|
+
def predict(self, raw_stats: list[list[IntermediatePropertyAdaptor]]) -> np.ndarray:
|
|
57
|
+
"""
|
|
58
|
+
Predict using the fitted linear model.
|
|
59
|
+
Returns shape (N, 4)
|
|
60
|
+
"""
|
|
61
|
+
x = self._prep_single(raw_stats)
|
|
62
|
+
return self.model.predict(x)
|
|
63
|
+
|
|
64
|
+
def _prep_single(self, raw_stats: list[list[IntermediatePropertyAdaptor]]) -> np.ndarray:
|
|
65
|
+
|
|
66
|
+
arr, _ = self._extract_token_usage_meta(raw_stats)
|
|
67
|
+
arr = arr[0]
|
|
68
|
+
|
|
69
|
+
assert self.matrix_length is not None, "Model has not been trained yet."
|
|
70
|
+
|
|
71
|
+
n = self.matrix_length
|
|
72
|
+
|
|
73
|
+
if arr.shape[1] != 3:
|
|
74
|
+
raise ValueError("The input array must have exactly 3 columns.")
|
|
75
|
+
|
|
76
|
+
t = arr.shape[0]
|
|
77
|
+
|
|
78
|
+
# 1) Slice or pad to get the latest n rows
|
|
79
|
+
if t >= n:
|
|
80
|
+
x_mat = arr[-n:].copy()
|
|
81
|
+
else:
|
|
82
|
+
pad_size = n - t
|
|
83
|
+
pad_block = np.zeros((pad_size, 3), dtype=arr.dtype)
|
|
84
|
+
x_mat = np.vstack([pad_block, arr])
|
|
85
|
+
|
|
86
|
+
# 2) Zero out the output_prompt_tokens in the last row (index 2)
|
|
87
|
+
x_mat[-1, 2] = 0
|
|
88
|
+
|
|
89
|
+
return x_mat
|
|
90
|
+
|
|
91
|
+
def _prep_for_model_training(self, raw_stats: list[list[IntermediatePropertyAdaptor]]):
|
|
92
|
+
|
|
93
|
+
raw_matrices, matrix_length = self._extract_token_usage_meta(raw_stats)
|
|
94
|
+
|
|
95
|
+
self.matrix_length = matrix_length
|
|
96
|
+
|
|
97
|
+
samples = self._preprocess_for_forecasting(raw_matrices, matrix_length, matrix_length)
|
|
98
|
+
|
|
99
|
+
x_list = []
|
|
100
|
+
y_list = []
|
|
101
|
+
for (x_mat, y_mat) in samples:
|
|
102
|
+
x_list.append(x_mat)
|
|
103
|
+
y_list.append(y_mat)
|
|
104
|
+
|
|
105
|
+
# 2) Flatten features
|
|
106
|
+
x_flat, y_flat = self._flatten_features(x_list, y_list)
|
|
107
|
+
|
|
108
|
+
return x_flat, y_flat
|
|
109
|
+
|
|
110
|
+
def _preprocess_for_forecasting(
|
|
111
|
+
self,
|
|
112
|
+
arrays: list[np.ndarray],
|
|
113
|
+
n: int = 3,
|
|
114
|
+
k: int = 3,
|
|
115
|
+
) -> list[tuple[np.ndarray, np.ndarray]]:
|
|
116
|
+
"""
|
|
117
|
+
Preprocess a list of arrays where each array has shape (T, 3),
|
|
118
|
+
with columns:
|
|
119
|
+
|
|
120
|
+
0: seconds_since_last_llm_call
|
|
121
|
+
1: input_prompt_tokens
|
|
122
|
+
2: output_prompt_tokens
|
|
123
|
+
|
|
124
|
+
For each row 'i' in each array, produce:
|
|
125
|
+
X: shape (n, 3)
|
|
126
|
+
-> The previous n calls up to row i (padded if needed).
|
|
127
|
+
For row i itself, set output_prompt_tokens=0
|
|
128
|
+
(simulate unknown current output).
|
|
129
|
+
Y: shape (k, 3)
|
|
130
|
+
-> The next k calls after row i (padded if needed).
|
|
131
|
+
|
|
132
|
+
Parameters
|
|
133
|
+
----------
|
|
134
|
+
arrays : list of np.ndarray
|
|
135
|
+
Each array is shape (T, 3).
|
|
136
|
+
n : int
|
|
137
|
+
Number of past calls to include for the input context (window size).
|
|
138
|
+
k : int
|
|
139
|
+
Number of future calls to include in the label (forecast horizon).
|
|
140
|
+
|
|
141
|
+
Returns
|
|
142
|
+
-------
|
|
143
|
+
samples : list of (X, Y) tuples
|
|
144
|
+
Each X has shape (n, 3), each Y has shape (k, 3).
|
|
145
|
+
"""
|
|
146
|
+
|
|
147
|
+
samples = []
|
|
148
|
+
|
|
149
|
+
for arr in arrays:
|
|
150
|
+
t = arr.shape[0]
|
|
151
|
+
|
|
152
|
+
# Safety check (optional)
|
|
153
|
+
if arr.shape[1] != 3:
|
|
154
|
+
raise ValueError("Each array must have exactly 3 columns.")
|
|
155
|
+
|
|
156
|
+
for i in range(t):
|
|
157
|
+
# --- 1) Build X: the context window for rows [i-n+1 .. i] ---
|
|
158
|
+
|
|
159
|
+
# The 'start_idx' is the first row in the n-window
|
|
160
|
+
start_idx = i - n + 1
|
|
161
|
+
if start_idx < 0:
|
|
162
|
+
# we need padding at the top
|
|
163
|
+
pad_size = -start_idx
|
|
164
|
+
# create a zero block for that portion
|
|
165
|
+
pad_block = np.zeros((pad_size, 3), dtype=arr.dtype)
|
|
166
|
+
# portion of the real data we actually have
|
|
167
|
+
real_block = arr[:i + 1, :].copy() # up to row i inclusive
|
|
168
|
+
|
|
169
|
+
# Concatenate
|
|
170
|
+
x_mat = np.vstack([pad_block, real_block])
|
|
171
|
+
else:
|
|
172
|
+
# we have enough rows, just slice
|
|
173
|
+
x_mat = arr[start_idx:i + 1, :].copy()
|
|
174
|
+
|
|
175
|
+
# Now X_mat is shape (<= n, 3). If it's < n, we've padded.
|
|
176
|
+
# If it's exactly n, fine. If it's bigger (shouldn't be), we slice again:
|
|
177
|
+
if x_mat.shape[0] > n:
|
|
178
|
+
x_mat = x_mat[-n:, :]
|
|
179
|
+
|
|
180
|
+
# For the "current" row in X_mat (the last row in that slice),
|
|
181
|
+
# we zero-out the output_prompt_tokens column:
|
|
182
|
+
# This simulates "unknown" output for the current call.
|
|
183
|
+
x_mat[-1, 2] = 0
|
|
184
|
+
|
|
185
|
+
# If it's still shorter than n, do final padding from the top:
|
|
186
|
+
if x_mat.shape[0] < n:
|
|
187
|
+
missing = n - x_mat.shape[0]
|
|
188
|
+
pad_block2 = np.zeros((missing, 3), dtype=arr.dtype)
|
|
189
|
+
x_mat = np.vstack([pad_block2, x_mat])
|
|
190
|
+
|
|
191
|
+
# Ensure shape is exactly (n, 3)
|
|
192
|
+
assert x_mat.shape == (n, 3), f"Expected (n,3), got {x_mat.shape}"
|
|
193
|
+
|
|
194
|
+
# --- 2) Build Y: the next k calls i+1 .. i+k ---
|
|
195
|
+
end_idx = i + k
|
|
196
|
+
if end_idx > t - 1:
|
|
197
|
+
# if we go beyond the last row, we pad
|
|
198
|
+
real_portion = arr[i + 1:t, :].copy() # might be empty if i == T-1
|
|
199
|
+
pad_needed = k - real_portion.shape[0]
|
|
200
|
+
if pad_needed > 0:
|
|
201
|
+
pad_block = np.zeros((pad_needed, 3), dtype=arr.dtype)
|
|
202
|
+
y_mat = np.vstack([real_portion, pad_block])
|
|
203
|
+
else:
|
|
204
|
+
y_mat = real_portion
|
|
205
|
+
else:
|
|
206
|
+
# we have enough future rows
|
|
207
|
+
y_mat = arr[i + 1:i + 1 + k, :].copy()
|
|
208
|
+
|
|
209
|
+
# Ensure shape is exactly (k, 3)
|
|
210
|
+
assert y_mat.shape == (k, 3), f"Expected (k,3), got {y_mat.shape}"
|
|
211
|
+
|
|
212
|
+
# 3) Collect the (X, Y) pair
|
|
213
|
+
samples.append((x_mat, y_mat))
|
|
214
|
+
|
|
215
|
+
return samples
|
|
216
|
+
|
|
217
|
+
def _extract_token_usage_meta(self, all_requests_data: list[list[IntermediatePropertyAdaptor]]):
|
|
218
|
+
|
|
219
|
+
import math
|
|
220
|
+
|
|
221
|
+
all_run_data = []
|
|
222
|
+
call_stack_sizes = []
|
|
223
|
+
seconds_between_call_map = {}
|
|
224
|
+
|
|
225
|
+
for usage_stats in all_requests_data:
|
|
226
|
+
run_data = []
|
|
227
|
+
for stat in usage_stats:
|
|
228
|
+
if stat.event_type.value == "LLM_START":
|
|
229
|
+
seconds_between_call_map[stat.UUID] = stat.seconds_between_calls
|
|
230
|
+
|
|
231
|
+
if stat.event_type.value == "LLM_END":
|
|
232
|
+
step_data = [
|
|
233
|
+
seconds_between_call_map[stat.UUID],
|
|
234
|
+
stat.token_usage.prompt_tokens,
|
|
235
|
+
stat.token_usage.completion_tokens
|
|
236
|
+
]
|
|
237
|
+
|
|
238
|
+
run_data.append(step_data)
|
|
239
|
+
|
|
240
|
+
all_run_data.append(run_data)
|
|
241
|
+
call_stack_sizes.append(len(run_data))
|
|
242
|
+
|
|
243
|
+
all_run_data = [np.array(run) for run in all_run_data]
|
|
244
|
+
recommended_matrix_length = math.ceil(sum(call_stack_sizes) / len(call_stack_sizes))
|
|
245
|
+
|
|
246
|
+
return all_run_data, recommended_matrix_length
|
|
247
|
+
|
|
248
|
+
def _flatten_features(self, x_list, y_list):
|
|
249
|
+
"""
|
|
250
|
+
X_list: list of arrays, each of shape (matrix_length, 4)
|
|
251
|
+
y_list: list of arrays, each of shape (1, 4)
|
|
252
|
+
|
|
253
|
+
Returns:
|
|
254
|
+
X_flat: np.array of shape (N, matrix_length*4)
|
|
255
|
+
y_flat: np.array of shape (N, 4)
|
|
256
|
+
"""
|
|
257
|
+
flattened_x = []
|
|
258
|
+
flattened_y = []
|
|
259
|
+
|
|
260
|
+
for x_mat, y_mat in zip(x_list, y_list):
|
|
261
|
+
x_1d = x_mat.flatten() # shape -> (matrix_length*4,)
|
|
262
|
+
y_1d = y_mat.flatten() # shape -> (4,)
|
|
263
|
+
flattened_x.append(x_1d)
|
|
264
|
+
flattened_y.append(y_1d)
|
|
265
|
+
|
|
266
|
+
x_flat = np.array(flattened_x)
|
|
267
|
+
y_flat = np.array(flattened_y)
|
|
268
|
+
return x_flat, y_flat
|
|
@@ -0,0 +1,28 @@
|
|
|
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
|
+
from pydantic import Field
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class InferenceMetricsModel(BaseModel):
|
|
21
|
+
n: int = Field(default=0, description="Number of samples")
|
|
22
|
+
mean: float = Field(default=0, description="Mean of the samples")
|
|
23
|
+
ninetieth_interval: tuple[float, float] = Field(default=(0, 0), description="90% confidence interval")
|
|
24
|
+
ninety_fifth_interval: tuple[float, float] = Field(default=(0, 0), description="95% confidence interval")
|
|
25
|
+
ninety_ninth_interval: tuple[float, float] = Field(default=(0, 0), description="99% confidence interval")
|
|
26
|
+
p90: float = Field(default=0, description="90th percentile of the samples")
|
|
27
|
+
p95: float = Field(default=0, description="95th percentile of the samples")
|
|
28
|
+
p99: float = Field(default=0, description="99th percentile of the samples")
|
|
File without changes
|
|
File without changes
|