nvidia-nat 1.3.0.dev2__py3-none-any.whl → 1.3.0rc2__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 +2 -2
- nat/agent/base.py +24 -15
- nat/agent/dual_node.py +9 -4
- nat/agent/prompt_optimizer/prompt.py +68 -0
- nat/agent/prompt_optimizer/register.py +149 -0
- nat/agent/react_agent/agent.py +79 -47
- nat/agent/react_agent/register.py +50 -22
- nat/agent/reasoning_agent/reasoning_agent.py +11 -9
- nat/agent/register.py +1 -1
- nat/agent/rewoo_agent/agent.py +326 -148
- nat/agent/rewoo_agent/prompt.py +19 -22
- nat/agent/rewoo_agent/register.py +54 -27
- nat/agent/tool_calling_agent/agent.py +84 -28
- nat/agent/tool_calling_agent/register.py +51 -28
- nat/authentication/api_key/api_key_auth_provider.py +2 -2
- nat/authentication/credential_validator/bearer_token_validator.py +557 -0
- nat/authentication/http_basic_auth/http_basic_auth_provider.py +1 -1
- nat/authentication/interfaces.py +5 -2
- nat/authentication/oauth2/oauth2_auth_code_flow_provider.py +69 -36
- nat/authentication/oauth2/oauth2_resource_server_config.py +124 -0
- nat/authentication/register.py +0 -1
- nat/builder/builder.py +56 -24
- nat/builder/component_utils.py +9 -5
- nat/builder/context.py +68 -17
- nat/builder/eval_builder.py +16 -11
- nat/builder/framework_enum.py +1 -0
- nat/builder/front_end.py +1 -1
- nat/builder/function.py +378 -8
- nat/builder/function_base.py +3 -3
- nat/builder/function_info.py +6 -8
- nat/builder/user_interaction_manager.py +2 -2
- nat/builder/workflow.py +13 -1
- nat/builder/workflow_builder.py +281 -76
- nat/cli/cli_utils/config_override.py +2 -2
- nat/cli/commands/evaluate.py +1 -1
- nat/cli/commands/info/info.py +16 -6
- nat/cli/commands/info/list_channels.py +1 -1
- nat/cli/commands/info/list_components.py +7 -8
- nat/cli/commands/mcp/__init__.py +14 -0
- nat/cli/commands/mcp/mcp.py +986 -0
- nat/cli/commands/object_store/__init__.py +14 -0
- nat/cli/commands/object_store/object_store.py +227 -0
- nat/cli/commands/optimize.py +90 -0
- nat/cli/commands/registry/publish.py +2 -2
- nat/cli/commands/registry/pull.py +2 -2
- nat/cli/commands/registry/remove.py +2 -2
- nat/cli/commands/registry/search.py +15 -17
- nat/cli/commands/start.py +16 -5
- nat/cli/commands/uninstall.py +1 -1
- nat/cli/commands/workflow/templates/config.yml.j2 +14 -13
- nat/cli/commands/workflow/templates/pyproject.toml.j2 +4 -1
- nat/cli/commands/workflow/templates/register.py.j2 +2 -3
- nat/cli/commands/workflow/templates/workflow.py.j2 +35 -21
- nat/cli/commands/workflow/workflow_commands.py +62 -22
- nat/cli/entrypoint.py +8 -10
- nat/cli/main.py +3 -0
- nat/cli/register_workflow.py +38 -4
- nat/cli/type_registry.py +75 -6
- nat/control_flow/__init__.py +0 -0
- nat/control_flow/register.py +20 -0
- nat/control_flow/router_agent/__init__.py +0 -0
- nat/control_flow/router_agent/agent.py +329 -0
- nat/control_flow/router_agent/prompt.py +48 -0
- nat/control_flow/router_agent/register.py +91 -0
- nat/control_flow/sequential_executor.py +166 -0
- nat/data_models/agent.py +34 -0
- nat/data_models/api_server.py +74 -66
- nat/data_models/authentication.py +23 -9
- nat/data_models/common.py +1 -1
- nat/data_models/component.py +2 -0
- nat/data_models/component_ref.py +11 -0
- nat/data_models/config.py +41 -17
- nat/data_models/dataset_handler.py +1 -1
- nat/data_models/discovery_metadata.py +4 -4
- nat/data_models/evaluate.py +4 -1
- nat/data_models/function.py +34 -0
- nat/data_models/function_dependencies.py +14 -6
- nat/data_models/gated_field_mixin.py +242 -0
- nat/data_models/intermediate_step.py +3 -3
- nat/data_models/optimizable.py +119 -0
- nat/data_models/optimizer.py +149 -0
- nat/data_models/span.py +41 -3
- nat/data_models/swe_bench_model.py +1 -1
- nat/data_models/temperature_mixin.py +44 -0
- nat/data_models/thinking_mixin.py +86 -0
- nat/data_models/top_p_mixin.py +44 -0
- nat/embedder/nim_embedder.py +1 -1
- nat/embedder/openai_embedder.py +1 -1
- nat/embedder/register.py +0 -1
- nat/eval/config.py +3 -1
- nat/eval/dataset_handler/dataset_handler.py +71 -7
- nat/eval/evaluate.py +86 -31
- nat/eval/evaluator/base_evaluator.py +1 -1
- nat/eval/evaluator/evaluator_model.py +13 -0
- nat/eval/intermediate_step_adapter.py +1 -1
- nat/eval/rag_evaluator/evaluate.py +2 -2
- nat/eval/rag_evaluator/register.py +3 -3
- nat/eval/register.py +4 -1
- nat/eval/remote_workflow.py +3 -3
- nat/eval/runtime_evaluator/__init__.py +14 -0
- nat/eval/runtime_evaluator/evaluate.py +123 -0
- nat/eval/runtime_evaluator/register.py +100 -0
- nat/eval/swe_bench_evaluator/evaluate.py +6 -6
- nat/eval/trajectory_evaluator/evaluate.py +1 -1
- nat/eval/trajectory_evaluator/register.py +1 -1
- nat/eval/tunable_rag_evaluator/evaluate.py +4 -7
- nat/eval/utils/eval_trace_ctx.py +89 -0
- nat/eval/utils/weave_eval.py +18 -9
- nat/experimental/decorators/experimental_warning_decorator.py +27 -7
- nat/experimental/test_time_compute/functions/plan_select_execute_function.py +7 -3
- nat/experimental/test_time_compute/functions/ttc_tool_orchestration_function.py +3 -3
- nat/experimental/test_time_compute/functions/ttc_tool_wrapper_function.py +1 -1
- nat/experimental/test_time_compute/models/strategy_base.py +5 -4
- nat/experimental/test_time_compute/register.py +0 -1
- nat/experimental/test_time_compute/selection/llm_based_output_merging_selector.py +1 -3
- nat/front_ends/console/authentication_flow_handler.py +82 -30
- nat/front_ends/console/console_front_end_plugin.py +8 -5
- nat/front_ends/fastapi/auth_flow_handlers/websocket_flow_handler.py +52 -17
- nat/front_ends/fastapi/dask_client_mixin.py +65 -0
- nat/front_ends/fastapi/fastapi_front_end_config.py +36 -5
- nat/front_ends/fastapi/fastapi_front_end_controller.py +4 -4
- nat/front_ends/fastapi/fastapi_front_end_plugin.py +135 -4
- nat/front_ends/fastapi/fastapi_front_end_plugin_worker.py +452 -282
- nat/front_ends/fastapi/job_store.py +518 -99
- nat/front_ends/fastapi/main.py +11 -19
- nat/front_ends/fastapi/message_handler.py +13 -14
- nat/front_ends/fastapi/message_validator.py +19 -19
- nat/front_ends/fastapi/response_helpers.py +4 -4
- nat/front_ends/fastapi/step_adaptor.py +2 -2
- nat/front_ends/fastapi/utils.py +57 -0
- nat/front_ends/mcp/introspection_token_verifier.py +73 -0
- nat/front_ends/mcp/mcp_front_end_config.py +10 -1
- nat/front_ends/mcp/mcp_front_end_plugin.py +45 -13
- nat/front_ends/mcp/mcp_front_end_plugin_worker.py +116 -8
- nat/front_ends/mcp/tool_converter.py +44 -14
- nat/front_ends/register.py +0 -1
- nat/front_ends/simple_base/simple_front_end_plugin_base.py +3 -1
- nat/llm/aws_bedrock_llm.py +24 -12
- nat/llm/azure_openai_llm.py +13 -6
- nat/llm/litellm_llm.py +69 -0
- nat/llm/nim_llm.py +20 -8
- nat/llm/openai_llm.py +14 -6
- nat/llm/register.py +4 -1
- nat/llm/utils/env_config_value.py +2 -3
- nat/llm/utils/thinking.py +215 -0
- nat/meta/pypi.md +9 -9
- nat/object_store/register.py +0 -1
- nat/observability/exporter/base_exporter.py +3 -3
- nat/observability/exporter/file_exporter.py +1 -1
- nat/observability/exporter/processing_exporter.py +309 -81
- nat/observability/exporter/span_exporter.py +35 -15
- nat/observability/exporter_manager.py +7 -7
- nat/observability/mixin/file_mixin.py +7 -7
- nat/observability/mixin/redaction_config_mixin.py +42 -0
- nat/observability/mixin/tagging_config_mixin.py +62 -0
- nat/observability/mixin/type_introspection_mixin.py +420 -107
- nat/observability/processor/batching_processor.py +5 -7
- nat/observability/processor/falsy_batch_filter_processor.py +55 -0
- nat/observability/processor/processor.py +3 -0
- nat/observability/processor/processor_factory.py +70 -0
- nat/observability/processor/redaction/__init__.py +24 -0
- nat/observability/processor/redaction/contextual_redaction_processor.py +125 -0
- nat/observability/processor/redaction/contextual_span_redaction_processor.py +66 -0
- nat/observability/processor/redaction/redaction_processor.py +177 -0
- nat/observability/processor/redaction/span_header_redaction_processor.py +92 -0
- nat/observability/processor/span_tagging_processor.py +68 -0
- nat/observability/register.py +6 -4
- nat/profiler/calc/calc_runner.py +3 -4
- nat/profiler/callbacks/agno_callback_handler.py +1 -1
- nat/profiler/callbacks/langchain_callback_handler.py +6 -6
- nat/profiler/callbacks/llama_index_callback_handler.py +3 -3
- nat/profiler/callbacks/semantic_kernel_callback_handler.py +3 -3
- nat/profiler/data_frame_row.py +1 -1
- nat/profiler/decorators/framework_wrapper.py +62 -13
- nat/profiler/decorators/function_tracking.py +160 -3
- nat/profiler/forecasting/models/forecasting_base_model.py +3 -1
- nat/profiler/forecasting/models/linear_model.py +1 -1
- nat/profiler/forecasting/models/random_forest_regressor.py +1 -1
- nat/profiler/inference_optimization/bottleneck_analysis/nested_stack_analysis.py +1 -1
- nat/profiler/inference_optimization/bottleneck_analysis/simple_stack_analysis.py +1 -1
- nat/profiler/inference_optimization/data_models.py +3 -3
- nat/profiler/inference_optimization/experimental/prefix_span_analysis.py +8 -9
- nat/profiler/inference_optimization/token_uniqueness.py +1 -1
- nat/profiler/parameter_optimization/__init__.py +0 -0
- nat/profiler/parameter_optimization/optimizable_utils.py +93 -0
- nat/profiler/parameter_optimization/optimizer_runtime.py +67 -0
- nat/profiler/parameter_optimization/parameter_optimizer.py +153 -0
- nat/profiler/parameter_optimization/parameter_selection.py +107 -0
- nat/profiler/parameter_optimization/pareto_visualizer.py +380 -0
- nat/profiler/parameter_optimization/prompt_optimizer.py +384 -0
- nat/profiler/parameter_optimization/update_helpers.py +66 -0
- nat/profiler/profile_runner.py +14 -9
- nat/profiler/utils.py +4 -2
- nat/registry_handlers/local/local_handler.py +2 -2
- nat/registry_handlers/package_utils.py +1 -2
- nat/registry_handlers/pypi/pypi_handler.py +23 -26
- nat/registry_handlers/register.py +3 -4
- nat/registry_handlers/rest/rest_handler.py +12 -13
- nat/retriever/milvus/retriever.py +2 -2
- nat/retriever/nemo_retriever/retriever.py +1 -1
- nat/retriever/register.py +0 -1
- nat/runtime/loader.py +2 -2
- nat/runtime/runner.py +106 -8
- nat/runtime/session.py +69 -8
- nat/settings/global_settings.py +16 -5
- nat/tool/chat_completion.py +5 -2
- nat/tool/code_execution/local_sandbox/local_sandbox_server.py +3 -3
- nat/tool/datetime_tools.py +49 -9
- nat/tool/document_search.py +2 -2
- nat/tool/github_tools.py +450 -0
- nat/tool/memory_tools/get_memory_tool.py +1 -1
- nat/tool/nvidia_rag.py +1 -1
- nat/tool/register.py +2 -9
- nat/tool/retriever.py +3 -2
- nat/utils/callable_utils.py +70 -0
- nat/utils/data_models/schema_validator.py +3 -3
- nat/utils/decorators.py +210 -0
- nat/utils/exception_handlers/automatic_retries.py +104 -51
- nat/utils/exception_handlers/schemas.py +1 -1
- nat/utils/io/yaml_tools.py +2 -2
- nat/utils/log_levels.py +25 -0
- nat/utils/reactive/base/observable_base.py +2 -2
- nat/utils/reactive/base/observer_base.py +1 -1
- nat/utils/reactive/observable.py +2 -2
- nat/utils/reactive/observer.py +4 -4
- nat/utils/reactive/subscription.py +1 -1
- nat/utils/settings/global_settings.py +6 -8
- nat/utils/type_converter.py +4 -3
- nat/utils/type_utils.py +9 -5
- {nvidia_nat-1.3.0.dev2.dist-info → nvidia_nat-1.3.0rc2.dist-info}/METADATA +42 -18
- {nvidia_nat-1.3.0.dev2.dist-info → nvidia_nat-1.3.0rc2.dist-info}/RECORD +238 -196
- {nvidia_nat-1.3.0.dev2.dist-info → nvidia_nat-1.3.0rc2.dist-info}/entry_points.txt +1 -0
- nat/cli/commands/info/list_mcp.py +0 -304
- nat/tool/github_tools/create_github_commit.py +0 -133
- nat/tool/github_tools/create_github_issue.py +0 -87
- nat/tool/github_tools/create_github_pr.py +0 -106
- nat/tool/github_tools/get_github_file.py +0 -106
- nat/tool/github_tools/get_github_issue.py +0 -166
- nat/tool/github_tools/get_github_pr.py +0 -256
- nat/tool/github_tools/update_github_issue.py +0 -100
- nat/tool/mcp/exceptions.py +0 -142
- nat/tool/mcp/mcp_client.py +0 -255
- nat/tool/mcp/mcp_tool.py +0 -96
- nat/utils/exception_handlers/mcp.py +0 -211
- /nat/{tool/github_tools → agent/prompt_optimizer}/__init__.py +0 -0
- /nat/{tool/mcp → authentication/credential_validator}/__init__.py +0 -0
- {nvidia_nat-1.3.0.dev2.dist-info → nvidia_nat-1.3.0rc2.dist-info}/WHEEL +0 -0
- {nvidia_nat-1.3.0.dev2.dist-info → nvidia_nat-1.3.0rc2.dist-info}/licenses/LICENSE-3rd-party.txt +0 -0
- {nvidia_nat-1.3.0.dev2.dist-info → nvidia_nat-1.3.0rc2.dist-info}/licenses/LICENSE.md +0 -0
- {nvidia_nat-1.3.0.dev2.dist-info → nvidia_nat-1.3.0rc2.dist-info}/top_level.txt +0 -0
|
@@ -177,14 +177,14 @@ class ExporterManager:
|
|
|
177
177
|
else:
|
|
178
178
|
logger.debug("Skipping cleanup for non-isolated exporter '%s'", name)
|
|
179
179
|
except Exception as e:
|
|
180
|
-
logger.
|
|
180
|
+
logger.exception("Error preparing cleanup for isolated exporter '%s': %s", name, e)
|
|
181
181
|
|
|
182
182
|
if cleanup_tasks:
|
|
183
183
|
# Run cleanup tasks concurrently with timeout
|
|
184
184
|
try:
|
|
185
185
|
await asyncio.wait_for(asyncio.gather(*cleanup_tasks, return_exceptions=True),
|
|
186
186
|
timeout=self._shutdown_timeout)
|
|
187
|
-
except
|
|
187
|
+
except TimeoutError:
|
|
188
188
|
logger.warning("Some isolated exporters did not clean up within timeout")
|
|
189
189
|
|
|
190
190
|
self._active_isolated_exporters.clear()
|
|
@@ -195,7 +195,7 @@ class ExporterManager:
|
|
|
195
195
|
logger.debug("Stopping isolated exporter '%s'", name)
|
|
196
196
|
await exporter.stop()
|
|
197
197
|
except Exception as e:
|
|
198
|
-
logger.
|
|
198
|
+
logger.exception("Error stopping isolated exporter '%s': %s", name, e)
|
|
199
199
|
|
|
200
200
|
@asynccontextmanager
|
|
201
201
|
async def start(self, context_state: ContextState | None = None):
|
|
@@ -251,7 +251,7 @@ class ExporterManager:
|
|
|
251
251
|
try:
|
|
252
252
|
await self._cleanup_isolated_exporters()
|
|
253
253
|
except Exception as e:
|
|
254
|
-
logger.
|
|
254
|
+
logger.exception("Error during isolated exporter cleanup: %s", e)
|
|
255
255
|
|
|
256
256
|
# Then stop the manager tasks
|
|
257
257
|
await self.stop()
|
|
@@ -275,7 +275,7 @@ class ExporterManager:
|
|
|
275
275
|
logger.info("Stopped exporter '%s'", name)
|
|
276
276
|
raise
|
|
277
277
|
except Exception as e:
|
|
278
|
-
logger.error("Failed to run exporter '%s': %s", name, str(e)
|
|
278
|
+
logger.error("Failed to run exporter '%s': %s", name, str(e))
|
|
279
279
|
# Re-raise the exception to ensure it's properly handled
|
|
280
280
|
raise
|
|
281
281
|
|
|
@@ -301,13 +301,13 @@ class ExporterManager:
|
|
|
301
301
|
try:
|
|
302
302
|
task.cancel()
|
|
303
303
|
await asyncio.wait_for(task, timeout=self._shutdown_timeout)
|
|
304
|
-
except
|
|
304
|
+
except TimeoutError:
|
|
305
305
|
logger.warning("Exporter '%s' task did not shut down in time and may be stuck.", name)
|
|
306
306
|
stuck_tasks.append(name)
|
|
307
307
|
except asyncio.CancelledError:
|
|
308
308
|
logger.debug("Exporter '%s' task cancelled", name)
|
|
309
309
|
except Exception as e:
|
|
310
|
-
logger.
|
|
310
|
+
logger.exception("Failed to stop exporter '%s': %s", name, str(e))
|
|
311
311
|
|
|
312
312
|
if stuck_tasks:
|
|
313
313
|
logger.warning("Exporters did not shut down in time: %s", ", ".join(stuck_tasks))
|
|
@@ -103,7 +103,7 @@ class FileExportMixin(ResourceConflictMixin):
|
|
|
103
103
|
self._current_file_path.unlink()
|
|
104
104
|
logger.info("Cleaned up existing file: %s", self._current_file_path)
|
|
105
105
|
except OSError as e:
|
|
106
|
-
logger.
|
|
106
|
+
logger.exception("Error removing existing file %s: %s", self._current_file_path, e)
|
|
107
107
|
|
|
108
108
|
def _get_resource_identifiers(self) -> dict[str, Any]:
|
|
109
109
|
"""Return the file resources this instance will use.
|
|
@@ -154,10 +154,10 @@ class FileExportMixin(ResourceConflictMixin):
|
|
|
154
154
|
old_file.unlink()
|
|
155
155
|
logger.info("Cleaned up old log file during init: %s", old_file)
|
|
156
156
|
except OSError as e:
|
|
157
|
-
logger.
|
|
157
|
+
logger.exception("Error removing old file %s: %s", old_file, e)
|
|
158
158
|
|
|
159
159
|
except Exception as e:
|
|
160
|
-
logger.
|
|
160
|
+
logger.exception("Error during initialization cleanup: %s", e)
|
|
161
161
|
|
|
162
162
|
async def _should_roll_file(self) -> bool:
|
|
163
163
|
"""Check if the current file should be rolled based on size."""
|
|
@@ -191,7 +191,7 @@ class FileExportMixin(ResourceConflictMixin):
|
|
|
191
191
|
await self._cleanup_old_files()
|
|
192
192
|
|
|
193
193
|
except OSError as e:
|
|
194
|
-
logger.
|
|
194
|
+
logger.exception("Error rolling file %s: %s", self._current_file_path, e)
|
|
195
195
|
|
|
196
196
|
async def _cleanup_old_files(self) -> None:
|
|
197
197
|
"""Remove old rolled files beyond the maximum count."""
|
|
@@ -209,10 +209,10 @@ class FileExportMixin(ResourceConflictMixin):
|
|
|
209
209
|
old_file.unlink()
|
|
210
210
|
logger.info("Cleaned up old log file: %s", old_file)
|
|
211
211
|
except OSError as e:
|
|
212
|
-
logger.
|
|
212
|
+
logger.exception("Error removing old file %s: %s", old_file, e)
|
|
213
213
|
|
|
214
214
|
except Exception as e:
|
|
215
|
-
logger.
|
|
215
|
+
logger.exception("Error during cleanup: %s", e)
|
|
216
216
|
|
|
217
217
|
async def export_processed(self, item: str | list[str]) -> None:
|
|
218
218
|
"""Export a processed string or list of strings.
|
|
@@ -248,7 +248,7 @@ class FileExportMixin(ResourceConflictMixin):
|
|
|
248
248
|
await f.write("\n")
|
|
249
249
|
|
|
250
250
|
except Exception as e:
|
|
251
|
-
logger.
|
|
251
|
+
logger.exception("Error exporting event: %s", e)
|
|
252
252
|
|
|
253
253
|
def get_current_file_path(self) -> Path:
|
|
254
254
|
"""Get the current file path being written to.
|
|
@@ -0,0 +1,42 @@
|
|
|
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 RedactionConfigMixin(BaseModel):
|
|
21
|
+
"""Mixin for basic redaction configuration.
|
|
22
|
+
|
|
23
|
+
Provides core redaction functionality that can be used standalone
|
|
24
|
+
or inherited by specialized redaction mixins.
|
|
25
|
+
"""
|
|
26
|
+
redaction_enabled: bool = Field(default=False, description="Whether to enable redaction processing.")
|
|
27
|
+
redaction_value: str = Field(default="[REDACTED]", description="Value to replace redacted attributes with.")
|
|
28
|
+
redaction_attributes: list[str] = Field(default_factory=lambda: ["input.value", "output.value", "nat.metadata"],
|
|
29
|
+
description="Attributes to redact when redaction is triggered.")
|
|
30
|
+
force_redaction: bool = Field(default=False, description="Always redact regardless of other conditions.")
|
|
31
|
+
redaction_tag: str | None = Field(default=None, description="Tag to add to spans when redaction is triggered.")
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class HeaderRedactionConfigMixin(RedactionConfigMixin):
|
|
35
|
+
"""Mixin for header-based redaction configuration.
|
|
36
|
+
|
|
37
|
+
Inherits core redaction fields (redaction_enabled, redaction_attributes, force_redaction)
|
|
38
|
+
and adds header-specific configuration for authentication-based redaction decisions.
|
|
39
|
+
|
|
40
|
+
Note: The callback function must be provided directly to the processor at runtime.
|
|
41
|
+
"""
|
|
42
|
+
redaction_headers: list[str] = Field(default_factory=list, description="Headers to check for redaction decisions.")
|
|
@@ -0,0 +1,62 @@
|
|
|
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 sys
|
|
17
|
+
from collections.abc import Mapping
|
|
18
|
+
from enum import Enum
|
|
19
|
+
from typing import Generic
|
|
20
|
+
from typing import TypeVar
|
|
21
|
+
|
|
22
|
+
from pydantic import BaseModel
|
|
23
|
+
from pydantic import Field
|
|
24
|
+
|
|
25
|
+
if sys.version_info >= (3, 12):
|
|
26
|
+
from typing import TypedDict
|
|
27
|
+
else:
|
|
28
|
+
from typing_extensions import TypedDict
|
|
29
|
+
|
|
30
|
+
TagMappingT = TypeVar("TagMappingT", bound=Mapping)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class BaseTaggingConfigMixin(BaseModel, Generic[TagMappingT]):
|
|
34
|
+
"""Base mixin for tagging spans."""
|
|
35
|
+
tags: TagMappingT | None = Field(default=None, description="Tags to add to the span.")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class PrivacyLevel(str, Enum):
|
|
39
|
+
"""Privacy level for the traces."""
|
|
40
|
+
NONE = "none"
|
|
41
|
+
LOW = "low"
|
|
42
|
+
MEDIUM = "medium"
|
|
43
|
+
HIGH = "high"
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
PrivacyTagSchema = TypedDict(
|
|
47
|
+
"PrivacyTagSchema",
|
|
48
|
+
{
|
|
49
|
+
"privacy.level": PrivacyLevel,
|
|
50
|
+
},
|
|
51
|
+
total=True,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class PrivacyTaggingConfigMixin(BaseTaggingConfigMixin[PrivacyTagSchema]):
|
|
56
|
+
"""Mixin for privacy level tagging on spans."""
|
|
57
|
+
pass
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class CustomTaggingConfigMixin(BaseTaggingConfigMixin[dict[str, str]]):
|
|
61
|
+
"""Mixin for string key-value tagging on spans."""
|
|
62
|
+
pass
|