nvidia-nat 1.2.0__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 +256 -0
- nat/agent/dual_node.py +67 -0
- nat/agent/react_agent/__init__.py +0 -0
- nat/agent/react_agent/agent.py +363 -0
- nat/agent/react_agent/output_parser.py +104 -0
- nat/agent/react_agent/prompt.py +44 -0
- nat/agent/react_agent/register.py +149 -0
- nat/agent/reasoning_agent/__init__.py +0 -0
- nat/agent/reasoning_agent/reasoning_agent.py +225 -0
- nat/agent/register.py +23 -0
- nat/agent/rewoo_agent/__init__.py +0 -0
- nat/agent/rewoo_agent/agent.py +415 -0
- nat/agent/rewoo_agent/prompt.py +110 -0
- nat/agent/rewoo_agent/register.py +157 -0
- nat/agent/tool_calling_agent/__init__.py +0 -0
- nat/agent/tool_calling_agent/agent.py +119 -0
- nat/agent/tool_calling_agent/register.py +106 -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/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 +93 -0
- nat/authentication/oauth2/__init__.py +14 -0
- nat/authentication/oauth2/oauth2_auth_code_flow_provider.py +107 -0
- nat/authentication/oauth2/oauth2_auth_code_flow_provider_config.py +39 -0
- nat/authentication/oauth2/register.py +25 -0
- nat/authentication/register.py +21 -0
- nat/builder/__init__.py +0 -0
- nat/builder/builder.py +285 -0
- nat/builder/component_utils.py +316 -0
- nat/builder/context.py +270 -0
- nat/builder/embedder.py +24 -0
- nat/builder/eval_builder.py +161 -0
- nat/builder/evaluator.py +29 -0
- nat/builder/framework_enum.py +24 -0
- nat/builder/front_end.py +73 -0
- nat/builder/function.py +344 -0
- nat/builder/function_base.py +380 -0
- nat/builder/function_info.py +627 -0
- nat/builder/intermediate_step_manager.py +174 -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 +148 -0
- nat/builder/workflow_builder.py +1117 -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 +37 -0
- nat/cli/commands/info/list_channels.py +32 -0
- nat/cli/commands/info/list_components.py +129 -0
- nat/cli/commands/info/list_mcp.py +304 -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 +155 -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 +246 -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 +16 -0
- nat/cli/commands/workflow/templates/pyproject.toml.j2 +22 -0
- nat/cli/commands/workflow/templates/register.py.j2 +5 -0
- nat/cli/commands/workflow/templates/workflow.py.j2 +36 -0
- nat/cli/commands/workflow/workflow.py +37 -0
- nat/cli/commands/workflow/workflow_commands.py +317 -0
- nat/cli/entrypoint.py +135 -0
- nat/cli/main.py +57 -0
- nat/cli/register_workflow.py +488 -0
- nat/cli/type_registry.py +1000 -0
- nat/data_models/__init__.py +14 -0
- nat/data_models/api_server.py +716 -0
- nat/data_models/authentication.py +231 -0
- nat/data_models/common.py +171 -0
- nat/data_models/component.py +58 -0
- nat/data_models/component_ref.py +168 -0
- nat/data_models/config.py +410 -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 +127 -0
- nat/data_models/evaluator.py +26 -0
- nat/data_models/front_end.py +26 -0
- nat/data_models/function.py +30 -0
- nat/data_models/function_dependencies.py +72 -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/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 +190 -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/ttc_strategy.py +30 -0
- nat/embedder/__init__.py +0 -0
- nat/embedder/nim_embedder.py +59 -0
- nat/embedder/openai_embedder.py +43 -0
- nat/embedder/register.py +22 -0
- nat/eval/__init__.py +14 -0
- nat/eval/config.py +60 -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 +367 -0
- nat/eval/evaluate.py +510 -0
- nat/eval/evaluator/__init__.py +14 -0
- nat/eval/evaluator/base_evaluator.py +77 -0
- nat/eval/evaluator/evaluator_model.py +45 -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 +23 -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_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 +245 -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/output_uploader.py +140 -0
- nat/eval/utils/tqdm_position_registry.py +40 -0
- nat/eval/utils/weave_eval.py +184 -0
- nat/experimental/__init__.py +0 -0
- nat/experimental/decorators/__init__.py +0 -0
- nat/experimental/decorators/experimental_warning_decorator.py +134 -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 +224 -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 +66 -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 +36 -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 +159 -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 +233 -0
- nat/front_ends/console/console_front_end_config.py +32 -0
- nat/front_ends/console/console_front_end_plugin.py +96 -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 +107 -0
- nat/front_ends/fastapi/fastapi_front_end_config.py +241 -0
- nat/front_ends/fastapi/fastapi_front_end_controller.py +68 -0
- nat/front_ends/fastapi/fastapi_front_end_plugin.py +116 -0
- nat/front_ends/fastapi/fastapi_front_end_plugin_worker.py +1087 -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 +183 -0
- nat/front_ends/fastapi/main.py +72 -0
- nat/front_ends/fastapi/message_handler.py +320 -0
- nat/front_ends/fastapi/message_validator.py +352 -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/mcp/__init__.py +14 -0
- nat/front_ends/mcp/mcp_front_end_config.py +36 -0
- nat/front_ends/mcp/mcp_front_end_plugin.py +81 -0
- nat/front_ends/mcp/mcp_front_end_plugin_worker.py +143 -0
- nat/front_ends/mcp/register.py +27 -0
- nat/front_ends/mcp/tool_converter.py +241 -0
- nat/front_ends/register.py +22 -0
- nat/front_ends/simple_base/__init__.py +14 -0
- nat/front_ends/simple_base/simple_front_end_plugin_base.py +54 -0
- nat/llm/__init__.py +0 -0
- nat/llm/aws_bedrock_llm.py +57 -0
- nat/llm/nim_llm.py +46 -0
- nat/llm/openai_llm.py +46 -0
- nat/llm/register.py +23 -0
- nat/llm/utils/__init__.py +14 -0
- nat/llm/utils/env_config_value.py +94 -0
- nat/llm/utils/error.py +17 -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 +20 -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 +322 -0
- nat/observability/exporter/raw_exporter.py +52 -0
- nat/observability/exporter/span_exporter.py +288 -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/resource_conflict_mixin.py +134 -0
- nat/observability/mixin/serialize_mixin.py +61 -0
- nat/observability/mixin/type_introspection_mixin.py +183 -0
- nat/observability/processor/__init__.py +14 -0
- nat/observability/processor/batching_processor.py +310 -0
- nat/observability/processor/callback_processor.py +42 -0
- nat/observability/processor/intermediate_step_serializer.py +28 -0
- nat/observability/processor/processor.py +71 -0
- nat/observability/register.py +96 -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 +627 -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 +290 -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 +131 -0
- nat/profiler/decorators/function_tracking.py +254 -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 +40 -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 +405 -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/profile_runner.py +473 -0
- nat/profiler/utils.py +184 -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 +571 -0
- nat/registry_handlers/pypi/__init__.py +0 -0
- nat/registry_handlers/pypi/pypi_handler.py +251 -0
- nat/registry_handlers/pypi/register_pypi.py +40 -0
- nat/registry_handlers/register.py +21 -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 +237 -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 +22 -0
- nat/runtime/__init__.py +14 -0
- nat/runtime/loader.py +220 -0
- nat/runtime/runner.py +195 -0
- nat/runtime/session.py +162 -0
- nat/runtime/user_metadata.py +130 -0
- nat/settings/__init__.py +0 -0
- nat/settings/global_settings.py +318 -0
- nat/test/.namespace +1 -0
- nat/tool/__init__.py +0 -0
- nat/tool/chat_completion.py +74 -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 +42 -0
- nat/tool/document_search.py +141 -0
- nat/tool/github_tools/__init__.py +0 -0
- nat/tool/github_tools/create_github_commit.py +133 -0
- nat/tool/github_tools/create_github_issue.py +87 -0
- nat/tool/github_tools/create_github_pr.py +106 -0
- nat/tool/github_tools/get_github_file.py +106 -0
- nat/tool/github_tools/get_github_issue.py +166 -0
- nat/tool/github_tools/get_github_pr.py +256 -0
- nat/tool/github_tools/update_github_issue.py +100 -0
- nat/tool/mcp/__init__.py +14 -0
- nat/tool/mcp/exceptions.py +142 -0
- nat/tool/mcp/mcp_client.py +255 -0
- nat/tool/mcp/mcp_tool.py +96 -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 +67 -0
- nat/tool/memory_tools/get_memory_tool.py +72 -0
- nat/tool/nvidia_rag.py +95 -0
- nat/tool/register.py +38 -0
- nat/tool/retriever.py +94 -0
- nat/tool/server_tools.py +66 -0
- nat/utils/__init__.py +0 -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/dump_distro_mapping.py +32 -0
- nat/utils/exception_handlers/__init__.py +0 -0
- nat/utils/exception_handlers/automatic_retries.py +289 -0
- nat/utils/exception_handlers/mcp.py +211 -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_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 +197 -0
- nat/utils/string_utils.py +38 -0
- nat/utils/type_converter.py +290 -0
- nat/utils/type_utils.py +484 -0
- nat/utils/url_utils.py +27 -0
- nvidia_nat-1.2.0.dist-info/METADATA +365 -0
- nvidia_nat-1.2.0.dist-info/RECORD +435 -0
- nvidia_nat-1.2.0.dist-info/WHEEL +5 -0
- nvidia_nat-1.2.0.dist-info/entry_points.txt +21 -0
- nvidia_nat-1.2.0.dist-info/licenses/LICENSE-3rd-party.txt +5478 -0
- nvidia_nat-1.2.0.dist-info/licenses/LICENSE.md +201 -0
- nvidia_nat-1.2.0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,238 @@
|
|
|
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 copy
|
|
17
|
+
import logging
|
|
18
|
+
import threading
|
|
19
|
+
import time
|
|
20
|
+
from collections.abc import Callable
|
|
21
|
+
from typing import Any
|
|
22
|
+
from uuid import uuid4
|
|
23
|
+
|
|
24
|
+
import semantic_kernel
|
|
25
|
+
from pydantic import BaseModel
|
|
26
|
+
from pydantic import Field
|
|
27
|
+
from semantic_kernel.connectors.ai.open_ai.services.open_ai_chat_completion_base import OpenAIChatCompletionBase
|
|
28
|
+
|
|
29
|
+
from nat.builder.context import Context
|
|
30
|
+
from nat.builder.framework_enum import LLMFrameworkEnum
|
|
31
|
+
from nat.data_models.intermediate_step import IntermediateStepPayload
|
|
32
|
+
from nat.data_models.intermediate_step import IntermediateStepType
|
|
33
|
+
from nat.data_models.intermediate_step import StreamEventData
|
|
34
|
+
from nat.data_models.intermediate_step import TraceMetadata
|
|
35
|
+
from nat.data_models.intermediate_step import UsageInfo
|
|
36
|
+
from nat.profiler.callbacks.base_callback_class import BaseProfilerCallback
|
|
37
|
+
from nat.profiler.callbacks.token_usage_base_model import TokenUsageBaseModel
|
|
38
|
+
|
|
39
|
+
logger = logging.getLogger(__name__)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class SemanticKernelPatchMethod(BaseModel):
|
|
43
|
+
"""
|
|
44
|
+
Stores the module and function to patch in Semantic Kernel.
|
|
45
|
+
"""
|
|
46
|
+
module: Any = Field(..., description="The module to patch")
|
|
47
|
+
function: str = Field(..., description="The function to patch")
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class SemanticKernelProfilerHandler(BaseProfilerCallback):
|
|
51
|
+
"""
|
|
52
|
+
A callback manager/handler for Msft Semantic Kernel that intercepts calls to:
|
|
53
|
+
|
|
54
|
+
- Chat Completions Endpoints
|
|
55
|
+
- Tool calls
|
|
56
|
+
|
|
57
|
+
to collect usage statistics (tokens, inputs, outputs, time intervals, etc.)
|
|
58
|
+
and store them in NAT's usage_stats queue for subsequent analysis.
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
def __init__(self, workflow_llms: dict) -> None:
|
|
62
|
+
super().__init__()
|
|
63
|
+
self._lock = threading.Lock()
|
|
64
|
+
self.last_call_ts = time.time()
|
|
65
|
+
self.step_manager = Context.get().intermediate_step_manager
|
|
66
|
+
self._builder_llms = workflow_llms
|
|
67
|
+
|
|
68
|
+
# Original references to SK methods
|
|
69
|
+
self._original_tool_call = None
|
|
70
|
+
|
|
71
|
+
# Store a mapping of current SK methods we support patching for
|
|
72
|
+
self._patch_methods = {
|
|
73
|
+
"openai_streaming":
|
|
74
|
+
SemanticKernelPatchMethod(module=OpenAIChatCompletionBase,
|
|
75
|
+
function="_inner_get_streaming_chat_message_contents"),
|
|
76
|
+
"openai_non_streaming":
|
|
77
|
+
SemanticKernelPatchMethod(module=OpenAIChatCompletionBase, function="_inner_get_chat_message_contents")
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
def instrument(self) -> None:
|
|
81
|
+
"""
|
|
82
|
+
Monkey-patch the relevant Semantic Kernel methods with usage-stat collection logic.
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
functions_to_patch = []
|
|
86
|
+
|
|
87
|
+
# Gather the appropriate modules/functions based on your builder config
|
|
88
|
+
for llm in self._builder_llms:
|
|
89
|
+
if self._builder_llms[llm].provider_type == 'openai': # pylint: disable=consider-using-in
|
|
90
|
+
functions_to_patch.extend(["openai_non_streaming", "openai_streaming"])
|
|
91
|
+
|
|
92
|
+
# Grab original reference for the tool call
|
|
93
|
+
self._original_tool_call = getattr(semantic_kernel.Kernel, "invoke_function_call", None)
|
|
94
|
+
|
|
95
|
+
# Now do direct monkey-patching: replace each function with a closure
|
|
96
|
+
for method in functions_to_patch:
|
|
97
|
+
patch_method = self._patch_methods[method]
|
|
98
|
+
setattr(patch_method.module,
|
|
99
|
+
patch_method.function,
|
|
100
|
+
self._build_llm_call_patch(getattr(patch_method.module, patch_method.function)))
|
|
101
|
+
|
|
102
|
+
if self._original_tool_call:
|
|
103
|
+
patched_tool_call = self._build_tool_call_patch(self._original_tool_call)
|
|
104
|
+
setattr(semantic_kernel.Kernel, "invoke_function_call", patched_tool_call)
|
|
105
|
+
|
|
106
|
+
logger.debug("SemanticKernelProfilerHandler instrumentation applied successfully.")
|
|
107
|
+
|
|
108
|
+
def _build_llm_call_patch(self, original_func: Callable[..., Any]) -> Callable[..., Any]:
|
|
109
|
+
"""
|
|
110
|
+
Returns an async monkey-patch that wraps the original chat-completion method.
|
|
111
|
+
Replicates the usage collection from _llm_call_wrapper.
|
|
112
|
+
"""
|
|
113
|
+
|
|
114
|
+
async def patched_llm_call(sk_self, *args, **kwargs) -> Any:
|
|
115
|
+
now = time.time()
|
|
116
|
+
seconds_between_calls = int(now - self.last_call_ts)
|
|
117
|
+
uuid = str(uuid4())
|
|
118
|
+
|
|
119
|
+
# Build the input stats
|
|
120
|
+
if args:
|
|
121
|
+
chat_input = [copy.deepcopy(args[0].model_dump())]
|
|
122
|
+
else:
|
|
123
|
+
# if no args, fallback on kwargs["chat_history"]
|
|
124
|
+
chat_input = [kwargs["chat_history"].model_dump()]
|
|
125
|
+
|
|
126
|
+
model_name = sk_self.ai_model_id
|
|
127
|
+
|
|
128
|
+
model_input = ""
|
|
129
|
+
try:
|
|
130
|
+
for message in chat_input[0]["messages"]:
|
|
131
|
+
for item in message["items"]:
|
|
132
|
+
if "text" in item:
|
|
133
|
+
model_input += item["text"]
|
|
134
|
+
except Exception as e:
|
|
135
|
+
logger.exception("Error in getting model input: %s", e, exc_info=True)
|
|
136
|
+
|
|
137
|
+
input_stats = IntermediateStepPayload(event_type=IntermediateStepType.LLM_START,
|
|
138
|
+
framework=LLMFrameworkEnum.SEMANTIC_KERNEL,
|
|
139
|
+
name=model_name,
|
|
140
|
+
UUID=uuid,
|
|
141
|
+
data=StreamEventData(input=model_input),
|
|
142
|
+
metadata=TraceMetadata(chat_inputs=copy.deepcopy(chat_input)),
|
|
143
|
+
usage_info=UsageInfo(token_usage=TokenUsageBaseModel(),
|
|
144
|
+
num_llm_calls=1,
|
|
145
|
+
seconds_between_calls=seconds_between_calls))
|
|
146
|
+
|
|
147
|
+
self.step_manager.push_intermediate_step(input_stats)
|
|
148
|
+
|
|
149
|
+
# Call the original method
|
|
150
|
+
output = await original_func(sk_self, *args, **kwargs)
|
|
151
|
+
|
|
152
|
+
model_output = output[0].content
|
|
153
|
+
now = time.time()
|
|
154
|
+
# Build the output stats
|
|
155
|
+
output_stats = IntermediateStepPayload(
|
|
156
|
+
event_type=IntermediateStepType.LLM_END,
|
|
157
|
+
span_event_timestamp=now,
|
|
158
|
+
framework=LLMFrameworkEnum.SEMANTIC_KERNEL,
|
|
159
|
+
name=model_name,
|
|
160
|
+
UUID=uuid,
|
|
161
|
+
data=StreamEventData(input=model_input, output=model_output),
|
|
162
|
+
metadata=TraceMetadata(chat_responses=output[0].model_dump()),
|
|
163
|
+
usage_info=UsageInfo(token_usage=TokenUsageBaseModel(**output[0].metadata["usage"].model_dump())))
|
|
164
|
+
|
|
165
|
+
self.step_manager.push_intermediate_step(output_stats)
|
|
166
|
+
|
|
167
|
+
# Update last_call_ts
|
|
168
|
+
self.last_call_ts = time.time()
|
|
169
|
+
|
|
170
|
+
return output
|
|
171
|
+
|
|
172
|
+
return patched_llm_call
|
|
173
|
+
|
|
174
|
+
def _build_tool_call_patch(self, original_func: Callable[..., Any]) -> Callable[..., Any]:
|
|
175
|
+
"""
|
|
176
|
+
Returns an async monkey-patch that wraps the original tool call (invoke_function_call).
|
|
177
|
+
Replicates usage collection from _tool_use_wrapper.
|
|
178
|
+
"""
|
|
179
|
+
|
|
180
|
+
async def patched_tool_call(kernel_self, *args, **kwargs) -> Any:
|
|
181
|
+
|
|
182
|
+
uuid = str(uuid4())
|
|
183
|
+
now = time.time()
|
|
184
|
+
# Extract the tool input
|
|
185
|
+
if kwargs:
|
|
186
|
+
tool_input = kwargs["function_call"].model_dump(exclude="content_type")
|
|
187
|
+
else:
|
|
188
|
+
tool_input = args[0].model_dump(exclude="content_type")
|
|
189
|
+
|
|
190
|
+
try:
|
|
191
|
+
# Pre-call usage event
|
|
192
|
+
input_stat = IntermediateStepPayload(event_type=IntermediateStepType.TOOL_START,
|
|
193
|
+
framework=LLMFrameworkEnum.SEMANTIC_KERNEL,
|
|
194
|
+
name=tool_input["name"],
|
|
195
|
+
UUID=uuid,
|
|
196
|
+
data=StreamEventData(input=tool_input),
|
|
197
|
+
metadata=TraceMetadata(tool_inputs=copy.deepcopy(tool_input),
|
|
198
|
+
tool_info=copy.deepcopy(tool_input)),
|
|
199
|
+
usage_info=UsageInfo(token_usage=TokenUsageBaseModel()))
|
|
200
|
+
|
|
201
|
+
self.step_manager.push_intermediate_step(input_stat)
|
|
202
|
+
now = time.time()
|
|
203
|
+
# Call the original invoke_function_call
|
|
204
|
+
result = await original_func(kernel_self, *args, **kwargs)
|
|
205
|
+
|
|
206
|
+
# Try to get the chat history from kwargs or args
|
|
207
|
+
if kwargs:
|
|
208
|
+
chat_history = copy.deepcopy(kwargs["chat_history"])
|
|
209
|
+
else:
|
|
210
|
+
chat_history = copy.deepcopy(args[1])
|
|
211
|
+
|
|
212
|
+
# Post-call usage event
|
|
213
|
+
output_stat = IntermediateStepPayload(event_type=IntermediateStepType.TOOL_END,
|
|
214
|
+
span_event_timestamp=now,
|
|
215
|
+
framework=LLMFrameworkEnum.SEMANTIC_KERNEL,
|
|
216
|
+
name=tool_input["name"],
|
|
217
|
+
UUID=uuid,
|
|
218
|
+
data=StreamEventData(input=tool_input,
|
|
219
|
+
output=[
|
|
220
|
+
item.model_dump(exclude="content_type")
|
|
221
|
+
for item in chat_history[-1].items
|
|
222
|
+
]),
|
|
223
|
+
metadata=TraceMetadata(tool_outputs=[
|
|
224
|
+
item.model_dump(exclude="content_type")
|
|
225
|
+
for item in chat_history[-1].items
|
|
226
|
+
],
|
|
227
|
+
tool_info=copy.deepcopy(tool_input)),
|
|
228
|
+
usage_info=UsageInfo(token_usage=TokenUsageBaseModel()))
|
|
229
|
+
|
|
230
|
+
self.step_manager.push_intermediate_step(output_stat)
|
|
231
|
+
|
|
232
|
+
return result
|
|
233
|
+
|
|
234
|
+
except Exception as e:
|
|
235
|
+
logger.exception("ToolUsage._use error: %s", e)
|
|
236
|
+
raise
|
|
237
|
+
|
|
238
|
+
return patched_tool_call
|
|
@@ -0,0 +1,27 @@
|
|
|
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 TokenUsageBaseModel(BaseModel):
|
|
21
|
+
"""
|
|
22
|
+
Base model for token usage callbacks.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
prompt_tokens: int = Field(default=0, description="Number of tokens in the prompt.")
|
|
26
|
+
completion_tokens: int = Field(default=0, description="Number of tokens in the completion.")
|
|
27
|
+
total_tokens: int = Field(default=0, description="Number of tokens total.")
|
|
@@ -0,0 +1,51 @@
|
|
|
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 typing import Any
|
|
17
|
+
|
|
18
|
+
from pydantic import BaseModel
|
|
19
|
+
from pydantic import ConfigDict
|
|
20
|
+
from pydantic import field_validator
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class DataFrameRow(BaseModel):
|
|
24
|
+
model_config = ConfigDict(extra="allow", validate_assignment=True)
|
|
25
|
+
|
|
26
|
+
event_type: Any
|
|
27
|
+
event_timestamp: float | None
|
|
28
|
+
example_number: int | None
|
|
29
|
+
prompt_tokens: int | None
|
|
30
|
+
completion_tokens: int | None
|
|
31
|
+
total_tokens: int | None
|
|
32
|
+
llm_text_input: str | None
|
|
33
|
+
llm_text_output: str | None
|
|
34
|
+
llm_new_token: str | None
|
|
35
|
+
llm_name: str | None
|
|
36
|
+
tool_name: str | None
|
|
37
|
+
function_name: str | None
|
|
38
|
+
function_id: str | None
|
|
39
|
+
parent_function_name: str | None
|
|
40
|
+
parent_function_id: str | None
|
|
41
|
+
UUID: str | None
|
|
42
|
+
framework: str | None
|
|
43
|
+
|
|
44
|
+
@field_validator('llm_text_input', 'llm_text_output', 'llm_new_token', mode='before')
|
|
45
|
+
def cast_to_str(cls, v): # pylint: disable=no-self-argument
|
|
46
|
+
if v is None:
|
|
47
|
+
return v
|
|
48
|
+
try:
|
|
49
|
+
return str(v)
|
|
50
|
+
except Exception as e:
|
|
51
|
+
raise ValueError(f"Value {v} cannot be cast to str: {e}") from e
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
from pydantic import BaseModel
|
|
17
|
+
|
|
18
|
+
from nat.profiler.inference_metrics_model import InferenceMetricsModel
|
|
19
|
+
from nat.profiler.inference_optimization.data_models import WorkflowRuntimeMetrics
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class ProfilerResults(BaseModel):
|
|
23
|
+
workflow_runtime_metrics: WorkflowRuntimeMetrics | None = None
|
|
24
|
+
llm_latency_ci: InferenceMetricsModel | None = None
|
|
File without changes
|
|
@@ -0,0 +1,131 @@
|
|
|
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
|
+
# pylint disable=ungrouped-imports
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import functools
|
|
21
|
+
import logging
|
|
22
|
+
from collections.abc import Callable
|
|
23
|
+
from contextlib import AbstractAsyncContextManager as AsyncContextManager
|
|
24
|
+
from contextlib import asynccontextmanager
|
|
25
|
+
from contextvars import ContextVar
|
|
26
|
+
from typing import Any
|
|
27
|
+
|
|
28
|
+
from nat.builder.framework_enum import LLMFrameworkEnum
|
|
29
|
+
|
|
30
|
+
logger = logging.getLogger(__name__)
|
|
31
|
+
|
|
32
|
+
_library_instrumented = {
|
|
33
|
+
"langchain": False,
|
|
34
|
+
"crewai": False,
|
|
35
|
+
"semantic_kernel": False,
|
|
36
|
+
"agno": False,
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
callback_handler_var: ContextVar[Any | None] = ContextVar("callback_handler_var", default=None)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def set_framework_profiler_handler(
|
|
43
|
+
workflow_llms: dict = None,
|
|
44
|
+
frameworks: list[LLMFrameworkEnum] = None,
|
|
45
|
+
) -> Callable[[Callable[..., AsyncContextManager[Any]]], Callable[..., AsyncContextManager[Any]]]:
|
|
46
|
+
"""
|
|
47
|
+
Decorator that wraps an async context manager function to set up framework-specific profiling.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
def decorator(func: Callable[..., AsyncContextManager[Any]]) -> Callable[..., AsyncContextManager[Any]]:
|
|
51
|
+
|
|
52
|
+
@functools.wraps(func)
|
|
53
|
+
@asynccontextmanager
|
|
54
|
+
async def wrapper(workflow_config, builder):
|
|
55
|
+
|
|
56
|
+
if LLMFrameworkEnum.LANGCHAIN in frameworks and not _library_instrumented["langchain"]:
|
|
57
|
+
from langchain_core.tracers.context import register_configure_hook
|
|
58
|
+
|
|
59
|
+
from nat.profiler.callbacks.langchain_callback_handler import LangchainProfilerHandler
|
|
60
|
+
|
|
61
|
+
handler = LangchainProfilerHandler()
|
|
62
|
+
callback_handler_var.set(handler)
|
|
63
|
+
register_configure_hook(callback_handler_var, inheritable=True)
|
|
64
|
+
_library_instrumented["langchain"] = True
|
|
65
|
+
logger.debug("Langchain callback handler registered")
|
|
66
|
+
|
|
67
|
+
if LLMFrameworkEnum.LLAMA_INDEX in frameworks:
|
|
68
|
+
from llama_index.core import Settings
|
|
69
|
+
from llama_index.core.callbacks import CallbackManager
|
|
70
|
+
|
|
71
|
+
from nat.profiler.callbacks.llama_index_callback_handler import LlamaIndexProfilerHandler
|
|
72
|
+
|
|
73
|
+
handler = LlamaIndexProfilerHandler()
|
|
74
|
+
Settings.callback_manager = CallbackManager([handler])
|
|
75
|
+
logger.debug("LlamaIndex callback handler registered")
|
|
76
|
+
|
|
77
|
+
if LLMFrameworkEnum.CREWAI in frameworks and not _library_instrumented["crewai"]:
|
|
78
|
+
from nat.plugins.crewai.crewai_callback_handler import \
|
|
79
|
+
CrewAIProfilerHandler # pylint: disable=ungrouped-imports,line-too-long # noqa E501
|
|
80
|
+
|
|
81
|
+
handler = CrewAIProfilerHandler()
|
|
82
|
+
handler.instrument()
|
|
83
|
+
_library_instrumented["crewai"] = True
|
|
84
|
+
logger.debug("CrewAI callback handler registered")
|
|
85
|
+
|
|
86
|
+
if LLMFrameworkEnum.SEMANTIC_KERNEL in frameworks and not _library_instrumented["semantic_kernel"]:
|
|
87
|
+
from nat.profiler.callbacks.semantic_kernel_callback_handler import SemanticKernelProfilerHandler
|
|
88
|
+
|
|
89
|
+
handler = SemanticKernelProfilerHandler(workflow_llms=workflow_llms)
|
|
90
|
+
handler.instrument()
|
|
91
|
+
_library_instrumented["semantic_kernel"] = True
|
|
92
|
+
logger.debug("SemanticKernel callback handler registered")
|
|
93
|
+
|
|
94
|
+
if LLMFrameworkEnum.AGNO in frameworks and not _library_instrumented["agno"]:
|
|
95
|
+
from nat.profiler.callbacks.agno_callback_handler import AgnoProfilerHandler
|
|
96
|
+
|
|
97
|
+
handler = AgnoProfilerHandler()
|
|
98
|
+
handler.instrument()
|
|
99
|
+
_library_instrumented["agno"] = True
|
|
100
|
+
logger.info("Agno callback handler registered")
|
|
101
|
+
|
|
102
|
+
# IMPORTANT: actually call the wrapped function as an async context manager
|
|
103
|
+
async with func(workflow_config, builder) as result:
|
|
104
|
+
yield result
|
|
105
|
+
|
|
106
|
+
return wrapper
|
|
107
|
+
|
|
108
|
+
return decorator
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def chain_wrapped_build_fn(
|
|
112
|
+
original_build_fn: Callable[..., AsyncContextManager],
|
|
113
|
+
workflow_llms: dict,
|
|
114
|
+
function_frameworks: list[LLMFrameworkEnum],
|
|
115
|
+
) -> Callable[..., AsyncContextManager]:
|
|
116
|
+
"""
|
|
117
|
+
Convert an original build function into an async context manager that
|
|
118
|
+
wraps it with a single call to set_framework_profiler_handler, passing
|
|
119
|
+
all frameworks at once.
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
# Define a base async context manager that simply calls the original build function.
|
|
123
|
+
@asynccontextmanager
|
|
124
|
+
async def base_fn(*args, **kwargs):
|
|
125
|
+
async with original_build_fn(*args, **kwargs) as w:
|
|
126
|
+
yield w
|
|
127
|
+
|
|
128
|
+
# Instead of wrapping iteratively, we now call the decorator once,
|
|
129
|
+
# passing the entire list of frameworks along with the workflow_llms.
|
|
130
|
+
wrapped_fn = set_framework_profiler_handler(workflow_llms, function_frameworks)(base_fn)
|
|
131
|
+
return wrapped_fn
|