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,174 @@
|
|
|
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 dataclasses
|
|
17
|
+
import logging
|
|
18
|
+
import typing
|
|
19
|
+
|
|
20
|
+
from aiq.data_models.intermediate_step import IntermediateStep
|
|
21
|
+
from aiq.data_models.intermediate_step import IntermediateStepPayload
|
|
22
|
+
from aiq.data_models.intermediate_step import IntermediateStepState
|
|
23
|
+
from aiq.utils.reactive.observable import OnComplete
|
|
24
|
+
from aiq.utils.reactive.observable import OnError
|
|
25
|
+
from aiq.utils.reactive.observable import OnNext
|
|
26
|
+
from aiq.utils.reactive.subscription import Subscription
|
|
27
|
+
|
|
28
|
+
if typing.TYPE_CHECKING:
|
|
29
|
+
from aiq.builder.context import AIQContextState
|
|
30
|
+
|
|
31
|
+
logger = logging.getLogger(__name__)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclasses.dataclass
|
|
35
|
+
class OpenStep:
|
|
36
|
+
step_id: str
|
|
37
|
+
step_name: str
|
|
38
|
+
step_type: str
|
|
39
|
+
step_parent_id: str
|
|
40
|
+
prev_stack: list[str]
|
|
41
|
+
active_stack: list[str]
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class IntermediateStepManager:
|
|
45
|
+
"""
|
|
46
|
+
Manages updates to the AIQ Toolkit Event Stream for intermediate steps
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
def __init__(self, context_state: "AIQContextState"): # noqa: F821
|
|
50
|
+
self._context_state = context_state
|
|
51
|
+
|
|
52
|
+
self._outstanding_start_steps: dict[str, OpenStep] = {}
|
|
53
|
+
|
|
54
|
+
def push_intermediate_step(self, payload: IntermediateStepPayload) -> None:
|
|
55
|
+
"""
|
|
56
|
+
Pushes an intermediate step to the AIQ Toolkit Event Stream
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
if not isinstance(payload, IntermediateStepPayload):
|
|
60
|
+
raise TypeError(f"Payload must be of type IntermediateStepPayload, not {type(payload)}")
|
|
61
|
+
|
|
62
|
+
active_span_id_stack = self._context_state.active_span_id_stack.get()
|
|
63
|
+
|
|
64
|
+
if (payload.event_state == IntermediateStepState.START):
|
|
65
|
+
|
|
66
|
+
prev_stack = active_span_id_stack
|
|
67
|
+
|
|
68
|
+
parent_step_id = active_span_id_stack[-1]
|
|
69
|
+
|
|
70
|
+
# Note, this must not mutate the active_span_id_stack in place
|
|
71
|
+
active_span_id_stack = active_span_id_stack + [payload.UUID]
|
|
72
|
+
self._context_state.active_span_id_stack.set(active_span_id_stack)
|
|
73
|
+
|
|
74
|
+
self._outstanding_start_steps[payload.UUID] = OpenStep(step_id=payload.UUID,
|
|
75
|
+
step_name=payload.name or payload.UUID,
|
|
76
|
+
step_type=payload.event_type,
|
|
77
|
+
step_parent_id=parent_step_id,
|
|
78
|
+
prev_stack=prev_stack,
|
|
79
|
+
active_stack=active_span_id_stack)
|
|
80
|
+
|
|
81
|
+
logger.debug("Pushed start step %s, name %s, type %s, parent %s, stack id %s",
|
|
82
|
+
payload.UUID,
|
|
83
|
+
payload.name,
|
|
84
|
+
payload.event_type,
|
|
85
|
+
parent_step_id,
|
|
86
|
+
id(active_span_id_stack))
|
|
87
|
+
|
|
88
|
+
elif (payload.event_state == IntermediateStepState.END):
|
|
89
|
+
|
|
90
|
+
# Remove the current step from the outstanding steps
|
|
91
|
+
open_step = self._outstanding_start_steps.pop(payload.UUID, None)
|
|
92
|
+
|
|
93
|
+
if (open_step is None):
|
|
94
|
+
logger.warning("Step id %s not found in outstanding start steps", payload.UUID)
|
|
95
|
+
return
|
|
96
|
+
|
|
97
|
+
parent_step_id = open_step.step_parent_id
|
|
98
|
+
|
|
99
|
+
# Get the current and previous active span id stack.
|
|
100
|
+
curr_stack = open_step.active_stack
|
|
101
|
+
prev_stack = open_step.prev_stack
|
|
102
|
+
|
|
103
|
+
# To restore the stack, we need to handle two scenarios:
|
|
104
|
+
# 1. This function is called from a coroutine. In this case, the context variable will be the same as the
|
|
105
|
+
# one used in START. So we can just set the context variable to the previous stack.
|
|
106
|
+
# 2. This function is called from a task. In this case, the context variable will be separate from the one
|
|
107
|
+
# used in START so calling set() will have no effect. However, we still have a reference to the list used
|
|
108
|
+
# in START. So we update the reference to be equal to the old one.. So we need to update the current
|
|
109
|
+
# reference stack to be equal to the previous stack.
|
|
110
|
+
|
|
111
|
+
# Scenario 1: Restore the previous active span id stack in case we are in a coroutine. Dont use reset here
|
|
112
|
+
# since we can be in different contexts
|
|
113
|
+
self._context_state.active_span_id_stack.set(prev_stack)
|
|
114
|
+
|
|
115
|
+
pop_count = 0
|
|
116
|
+
|
|
117
|
+
# Scenario 2: Remove all steps from the current stack until we reach the parent step id to make it equal to
|
|
118
|
+
# the previous stack. In the coroutine case, this will not have any effect.
|
|
119
|
+
while (curr_stack[-1] != parent_step_id):
|
|
120
|
+
curr_stack.pop()
|
|
121
|
+
pop_count += 1
|
|
122
|
+
|
|
123
|
+
if (pop_count != 1):
|
|
124
|
+
logger.warning(
|
|
125
|
+
"Step id %s not the last step in the stack. "
|
|
126
|
+
"Removing it from the stack but this is likely an error",
|
|
127
|
+
payload.UUID)
|
|
128
|
+
|
|
129
|
+
# Verify that the stack is now equal to the previous stack
|
|
130
|
+
if (curr_stack != prev_stack):
|
|
131
|
+
logger.warning("Current span ID stack is not equal to the previous stack. "
|
|
132
|
+
"This is likely an error. Report this to the AIQ team.")
|
|
133
|
+
|
|
134
|
+
logger.debug("Popped end step %s, name %s, type %s, parent %s, stack id %s",
|
|
135
|
+
payload.UUID,
|
|
136
|
+
payload.name,
|
|
137
|
+
payload.event_type,
|
|
138
|
+
parent_step_id,
|
|
139
|
+
id(curr_stack))
|
|
140
|
+
|
|
141
|
+
elif (payload.event_state == IntermediateStepState.CHUNK):
|
|
142
|
+
|
|
143
|
+
# Get the current step from the outstanding steps
|
|
144
|
+
open_step = self._outstanding_start_steps.get(payload.UUID, None)
|
|
145
|
+
|
|
146
|
+
# Generate a warning if the parent step id is not set to the current step id
|
|
147
|
+
if (open_step is None):
|
|
148
|
+
logger.warning(
|
|
149
|
+
"Created a chunk for step %s, but no matching start step was found. "
|
|
150
|
+
"Chunks must be created with the same ID as the start step.",
|
|
151
|
+
payload.UUID)
|
|
152
|
+
return
|
|
153
|
+
|
|
154
|
+
parent_step_id = open_step.step_parent_id
|
|
155
|
+
else:
|
|
156
|
+
assert False, "Invalid event state"
|
|
157
|
+
|
|
158
|
+
active_function = self._context_state.active_function.get()
|
|
159
|
+
|
|
160
|
+
intermediate_step = IntermediateStep(parent_id=parent_step_id,
|
|
161
|
+
function_ancestry=active_function,
|
|
162
|
+
payload=payload)
|
|
163
|
+
|
|
164
|
+
self._context_state.event_stream.get().on_next(intermediate_step)
|
|
165
|
+
|
|
166
|
+
def subscribe(self,
|
|
167
|
+
on_next: OnNext[IntermediateStep],
|
|
168
|
+
on_error: OnError = None,
|
|
169
|
+
on_complete: OnComplete = None) -> Subscription:
|
|
170
|
+
"""
|
|
171
|
+
Subscribes to the AIQ Toolkit Event Stream for intermediate steps
|
|
172
|
+
"""
|
|
173
|
+
|
|
174
|
+
return self._context_state.event_stream.get().subscribe(on_next, on_error, on_complete)
|
aiq/builder/llm.py
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
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
|
+
from aiq.data_models.llm import LLMBaseConfig
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class LLMProviderInfo:
|
|
20
|
+
|
|
21
|
+
def __init__(self, *, config: LLMBaseConfig, description: str):
|
|
22
|
+
|
|
23
|
+
self.config = config
|
|
24
|
+
self.provider_type = type(config).static_type()
|
|
25
|
+
self.description = description
|
aiq/builder/retriever.py
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
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 aiq.data_models.retriever import RetrieverBaseConfig
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class RetrieverProviderInfo:
|
|
20
|
+
|
|
21
|
+
def __init__(self, *, config: RetrieverBaseConfig, description: str):
|
|
22
|
+
|
|
23
|
+
self.config = config
|
|
24
|
+
self.provider_type = type(config).static_type()
|
|
25
|
+
self.description = description
|
|
@@ -0,0 +1,74 @@
|
|
|
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
|
+
import time
|
|
18
|
+
import uuid
|
|
19
|
+
|
|
20
|
+
from aiq.data_models.interactive import HumanPrompt
|
|
21
|
+
from aiq.data_models.interactive import HumanResponse
|
|
22
|
+
from aiq.data_models.interactive import InteractionPrompt
|
|
23
|
+
from aiq.data_models.interactive import InteractionResponse
|
|
24
|
+
from aiq.data_models.interactive import InteractionStatus
|
|
25
|
+
|
|
26
|
+
logger = logging.getLogger(__name__)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class AIQUserInteractionManager:
|
|
30
|
+
"""
|
|
31
|
+
AIQUserInteractionManager is responsible for requesting user input
|
|
32
|
+
at runtime. It delegates the actual prompting to a callback function
|
|
33
|
+
stored in AIQContextState.user_input_callback.
|
|
34
|
+
|
|
35
|
+
Type is not imported in __init__ to prevent partial import.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
def __init__(self, context_state: "AIQContextState") -> None: # noqa: F821
|
|
39
|
+
self._context_state = context_state
|
|
40
|
+
|
|
41
|
+
@staticmethod
|
|
42
|
+
async def default_callback_handler(prompt: InteractionPrompt) -> HumanResponse:
|
|
43
|
+
"""
|
|
44
|
+
Default callback handler for user input. This is a no-op function
|
|
45
|
+
that simply returns the input text from the Interaction Content
|
|
46
|
+
object.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
prompt (InteractionPrompt): The interaction to process.
|
|
50
|
+
"""
|
|
51
|
+
raise NotImplementedError("No human prompt callback was registered. Unable to handle requested prompt.")
|
|
52
|
+
|
|
53
|
+
async def prompt_user_input(self, content: HumanPrompt) -> InteractionResponse:
|
|
54
|
+
"""
|
|
55
|
+
Ask the user a question and wait for input. This calls out to
|
|
56
|
+
the callback from user_input_callback, which is typically
|
|
57
|
+
set by AIQSessionManager.
|
|
58
|
+
|
|
59
|
+
Returns the user's typed-in answer as a string.
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
uuid_req = str(uuid.uuid4())
|
|
63
|
+
status = InteractionStatus.IN_PROGRESS
|
|
64
|
+
timestamp = time.strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
65
|
+
sys_human_interaction = InteractionPrompt(id=uuid_req, status=status, timestamp=timestamp, content=content)
|
|
66
|
+
|
|
67
|
+
resp = await self._context_state.user_input_callback.get()(sys_human_interaction)
|
|
68
|
+
|
|
69
|
+
# Rebuild a InteractionResponse object with the response
|
|
70
|
+
timestamp = time.strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
71
|
+
status = InteractionStatus.COMPLETED
|
|
72
|
+
sys_human_interaction = InteractionResponse(id=uuid_req, status=status, timestamp=timestamp, content=resp)
|
|
73
|
+
|
|
74
|
+
return sys_human_interaction
|
aiq/builder/workflow.py
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
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
|
+
from contextlib import asynccontextmanager
|
|
17
|
+
from contextvars import ContextVar
|
|
18
|
+
from typing import Any
|
|
19
|
+
|
|
20
|
+
from aiq.builder.context import AIQContextState
|
|
21
|
+
from aiq.builder.embedder import EmbedderProviderInfo
|
|
22
|
+
from aiq.builder.function import Function
|
|
23
|
+
from aiq.builder.function_base import FunctionBase
|
|
24
|
+
from aiq.builder.function_base import InputT
|
|
25
|
+
from aiq.builder.function_base import SingleOutputT
|
|
26
|
+
from aiq.builder.function_base import StreamingOutputT
|
|
27
|
+
from aiq.builder.llm import LLMProviderInfo
|
|
28
|
+
from aiq.builder.retriever import RetrieverProviderInfo
|
|
29
|
+
from aiq.data_models.config import AIQConfig
|
|
30
|
+
from aiq.experimental.test_time_compute.models.strategy_base import StrategyBase
|
|
31
|
+
from aiq.memory.interfaces import MemoryEditor
|
|
32
|
+
from aiq.object_store.interfaces import ObjectStore
|
|
33
|
+
from aiq.observability.exporter.base_exporter import BaseExporter
|
|
34
|
+
from aiq.observability.exporter_manager import ExporterManager
|
|
35
|
+
from aiq.runtime.runner import AIQRunner
|
|
36
|
+
|
|
37
|
+
callback_handler_var: ContextVar[Any | None] = ContextVar("callback_handler_var", default=None)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class Workflow(FunctionBase[InputT, StreamingOutputT, SingleOutputT]):
|
|
41
|
+
|
|
42
|
+
def __init__(self,
|
|
43
|
+
*,
|
|
44
|
+
config: AIQConfig,
|
|
45
|
+
entry_fn: Function[InputT, StreamingOutputT, SingleOutputT],
|
|
46
|
+
functions: dict[str, Function] | None = None,
|
|
47
|
+
llms: dict[str, LLMProviderInfo] | None = None,
|
|
48
|
+
embeddings: dict[str, EmbedderProviderInfo] | None = None,
|
|
49
|
+
memory: dict[str, MemoryEditor] | None = None,
|
|
50
|
+
object_stores: dict[str, ObjectStore] | None = None,
|
|
51
|
+
telemetry_exporters: dict[str, BaseExporter] | None = None,
|
|
52
|
+
retrievers: dict[str | None, RetrieverProviderInfo] | None = None,
|
|
53
|
+
ttc_strategies: dict[str, StrategyBase] | None = None,
|
|
54
|
+
context_state: AIQContextState):
|
|
55
|
+
|
|
56
|
+
super().__init__(input_schema=entry_fn.input_schema,
|
|
57
|
+
streaming_output_schema=entry_fn.streaming_output_schema,
|
|
58
|
+
single_output_schema=entry_fn.single_output_schema)
|
|
59
|
+
|
|
60
|
+
self.config = config
|
|
61
|
+
self.functions = functions or {}
|
|
62
|
+
self.llms = llms or {}
|
|
63
|
+
self.embeddings = embeddings or {}
|
|
64
|
+
self.memory = memory or {}
|
|
65
|
+
self.telemetry_exporters = telemetry_exporters or {}
|
|
66
|
+
self.object_stores = object_stores or {}
|
|
67
|
+
self.retrievers = retrievers or {}
|
|
68
|
+
|
|
69
|
+
self._exporter_manager = ExporterManager.from_exporters(self.telemetry_exporters)
|
|
70
|
+
self.ttc_strategies = ttc_strategies or {}
|
|
71
|
+
|
|
72
|
+
self._entry_fn = entry_fn
|
|
73
|
+
|
|
74
|
+
self._context_state = context_state
|
|
75
|
+
|
|
76
|
+
@property
|
|
77
|
+
def has_streaming_output(self) -> bool:
|
|
78
|
+
|
|
79
|
+
return self._entry_fn.has_streaming_output
|
|
80
|
+
|
|
81
|
+
@property
|
|
82
|
+
def has_single_output(self) -> bool:
|
|
83
|
+
|
|
84
|
+
return self._entry_fn.has_single_output
|
|
85
|
+
|
|
86
|
+
@asynccontextmanager
|
|
87
|
+
async def run(self, message: InputT):
|
|
88
|
+
"""
|
|
89
|
+
Called each time we start a new workflow run. We'll create
|
|
90
|
+
a new top-level workflow span here.
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
async with AIQRunner(input_message=message,
|
|
94
|
+
entry_fn=self._entry_fn,
|
|
95
|
+
context_state=self._context_state,
|
|
96
|
+
exporter_manager=self._exporter_manager.get()) as runner:
|
|
97
|
+
|
|
98
|
+
# The caller can `yield runner` so they can do `runner.result()` or `runner.result_stream()`
|
|
99
|
+
yield runner
|
|
100
|
+
|
|
101
|
+
async def result_with_steps(self, message: InputT, to_type: type | None = None):
|
|
102
|
+
|
|
103
|
+
async with self.run(message) as runner:
|
|
104
|
+
|
|
105
|
+
from aiq.eval.runtime_event_subscriber import pull_intermediate
|
|
106
|
+
|
|
107
|
+
# Start the intermediate stream
|
|
108
|
+
pull_done, intermediate_steps = pull_intermediate()
|
|
109
|
+
|
|
110
|
+
# Wait on the result
|
|
111
|
+
result = await runner.result(to_type=to_type)
|
|
112
|
+
|
|
113
|
+
await pull_done.wait()
|
|
114
|
+
|
|
115
|
+
return result, intermediate_steps
|
|
116
|
+
|
|
117
|
+
@staticmethod
|
|
118
|
+
def from_entry_fn(*,
|
|
119
|
+
config: AIQConfig,
|
|
120
|
+
entry_fn: Function[InputT, StreamingOutputT, SingleOutputT],
|
|
121
|
+
functions: dict[str, Function] | None = None,
|
|
122
|
+
llms: dict[str, LLMProviderInfo] | None = None,
|
|
123
|
+
embeddings: dict[str, EmbedderProviderInfo] | None = None,
|
|
124
|
+
memory: dict[str, MemoryEditor] | None = None,
|
|
125
|
+
object_stores: dict[str, ObjectStore] | None = None,
|
|
126
|
+
telemetry_exporters: dict[str, BaseExporter] | None = None,
|
|
127
|
+
retrievers: dict[str | None, RetrieverProviderInfo] | None = None,
|
|
128
|
+
ttc_strategies: dict[str, StrategyBase] | None = None,
|
|
129
|
+
context_state: AIQContextState) -> 'Workflow[InputT, StreamingOutputT, SingleOutputT]':
|
|
130
|
+
|
|
131
|
+
input_type: type = entry_fn.input_type
|
|
132
|
+
streaming_output_type = entry_fn.streaming_output_type
|
|
133
|
+
single_output_type = entry_fn.single_output_type
|
|
134
|
+
|
|
135
|
+
class WorkflowImpl(Workflow[input_type, streaming_output_type, single_output_type]):
|
|
136
|
+
pass
|
|
137
|
+
|
|
138
|
+
return WorkflowImpl(config=config,
|
|
139
|
+
entry_fn=entry_fn,
|
|
140
|
+
functions=functions,
|
|
141
|
+
llms=llms,
|
|
142
|
+
embeddings=embeddings,
|
|
143
|
+
memory=memory,
|
|
144
|
+
object_stores=object_stores,
|
|
145
|
+
telemetry_exporters=telemetry_exporters,
|
|
146
|
+
retrievers=retrievers,
|
|
147
|
+
ttc_strategies=ttc_strategies,
|
|
148
|
+
context_state=context_state)
|