aip-agents-binary 0.5.23__py3-none-any.whl → 0.5.25__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.
Files changed (32) hide show
  1. aip_agents/agent/base_langgraph_agent.py +6 -0
  2. aip_agents/agent/langgraph_react_agent.py +96 -14
  3. aip_agents/agent/langgraph_react_agent.pyi +6 -1
  4. aip_agents/guardrails/__init__.py +83 -0
  5. aip_agents/guardrails/__init__.pyi +6 -0
  6. aip_agents/guardrails/engines/__init__.py +69 -0
  7. aip_agents/guardrails/engines/__init__.pyi +4 -0
  8. aip_agents/guardrails/engines/base.py +90 -0
  9. aip_agents/guardrails/engines/base.pyi +61 -0
  10. aip_agents/guardrails/engines/nemo.py +101 -0
  11. aip_agents/guardrails/engines/nemo.pyi +46 -0
  12. aip_agents/guardrails/engines/phrase_matcher.py +113 -0
  13. aip_agents/guardrails/engines/phrase_matcher.pyi +48 -0
  14. aip_agents/guardrails/exceptions.py +39 -0
  15. aip_agents/guardrails/exceptions.pyi +23 -0
  16. aip_agents/guardrails/manager.py +163 -0
  17. aip_agents/guardrails/manager.pyi +42 -0
  18. aip_agents/guardrails/middleware.py +199 -0
  19. aip_agents/guardrails/middleware.pyi +87 -0
  20. aip_agents/guardrails/schemas.py +63 -0
  21. aip_agents/guardrails/schemas.pyi +43 -0
  22. aip_agents/guardrails/utils.py +45 -0
  23. aip_agents/guardrails/utils.pyi +19 -0
  24. aip_agents/mcp/client/persistent_session.py +6 -3
  25. aip_agents/middleware/base.py +8 -0
  26. aip_agents/middleware/base.pyi +4 -0
  27. aip_agents/middleware/manager.py +22 -0
  28. aip_agents/middleware/manager.pyi +4 -0
  29. {aip_agents_binary-0.5.23.dist-info → aip_agents_binary-0.5.25.dist-info}/METADATA +3 -1
  30. {aip_agents_binary-0.5.23.dist-info → aip_agents_binary-0.5.25.dist-info}/RECORD +32 -12
  31. {aip_agents_binary-0.5.23.dist-info → aip_agents_binary-0.5.25.dist-info}/WHEEL +0 -0
  32. {aip_agents_binary-0.5.23.dist-info → aip_agents_binary-0.5.25.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,101 @@
1
+ """NemoGuardrailEngine wrapper for GL SDK guardrails.
2
+
3
+ This module wraps the GL SDK's NemoGuardrailEngine to provide advanced
4
+ LLM-based content filtering capabilities.
5
+
6
+ Authors:
7
+ Reinhart Linanda (reinhart.linanda@gdplabs.id)
8
+ """
9
+
10
+ from typing import Any
11
+
12
+ from aip_agents.guardrails.engines.base import BaseGuardrailEngine
13
+ from aip_agents.guardrails.schemas import (
14
+ BaseGuardrailEngineConfig,
15
+ GuardrailResult,
16
+ )
17
+ from aip_agents.guardrails.utils import convert_guardrail_mode_to_gl_sdk
18
+
19
+
20
+ class NemoGuardrailEngine(BaseGuardrailEngine):
21
+ """Wrapper for GL SDK NemoGuardrailEngine with aip-agents interface.
22
+
23
+ This engine provides advanced LLM-based content filtering using NVIDIA's
24
+ NeMo Guardrails. It can detect more complex safety violations beyond
25
+ simple phrase matching.
26
+
27
+ Note: Import of gllm_guardrail is deferred to __init__ to support
28
+ lazy loading when guardrails are optional dependency.
29
+ """
30
+
31
+ def __init__(self, config: BaseGuardrailEngineConfig | None = None, **nemo_config: dict[str, Any]) -> None:
32
+ """Initialize the NemoGuardrailEngine.
33
+
34
+ Args:
35
+ config: Engine configuration. Uses defaults if None provided.
36
+ **nemo_config: Additional configuration passed to the underlying
37
+ NeMo engine (e.g., model paths, thresholds, etc.)
38
+
39
+ Raises:
40
+ ImportError: If gllm-guardrail is not installed.
41
+ """
42
+ super().__init__(config)
43
+
44
+ # Lazy import to support optional dependency and avoid import errors
45
+ # when gllm-guardrail is not installed
46
+ try:
47
+ from gllm_guardrail import NemoGuardrailEngine as GLNemoGuardrailEngine
48
+ from gllm_guardrail.engine.nemo_engine import NemoGuardrailEngineConfig as GLNemoGuardrailEngineConfig
49
+ except ImportError as e:
50
+ raise ImportError(
51
+ "gllm-guardrail is required for guardrails. Install with: pip install 'aip-agents[guardrails]'"
52
+ ) from e
53
+
54
+ # Convert our GuardrailMode to GL SDK's GuardrailMode
55
+ gl_mode = convert_guardrail_mode_to_gl_sdk(self.config.guardrail_mode)
56
+
57
+ # Create GL SDK config with guardrail_mode and any additional NeMo config
58
+ # NemoGuardrailEngineConfig accepts guardrail_mode and other NeMo-specific params directly
59
+ gl_config = GLNemoGuardrailEngineConfig(guardrail_mode=gl_mode, **nemo_config)
60
+
61
+ # Initialize the underlying GL SDK engine
62
+ self._engine = GLNemoGuardrailEngine(config=gl_config)
63
+
64
+ async def check_input(self, content: str) -> GuardrailResult:
65
+ """Check user input content using wrapped GL SDK NeMo engine.
66
+
67
+ Args:
68
+ content: The user input content to check
69
+
70
+ Returns:
71
+ GuardrailResult indicating if content is safe
72
+ """
73
+ gl_result = await self._engine.check_input(content)
74
+ return GuardrailResult(
75
+ is_safe=gl_result.is_safe,
76
+ reason=gl_result.reason,
77
+ filtered_content=gl_result.filtered_content,
78
+ )
79
+
80
+ async def check_output(self, content: str) -> GuardrailResult:
81
+ """Check AI output content using wrapped GL SDK NeMo engine.
82
+
83
+ Args:
84
+ content: The AI output content to check
85
+
86
+ Returns:
87
+ GuardrailResult indicating if content is safe
88
+ """
89
+ gl_result = await self._engine.check_output(content)
90
+ return GuardrailResult(
91
+ is_safe=gl_result.is_safe,
92
+ reason=gl_result.reason,
93
+ filtered_content=gl_result.filtered_content,
94
+ )
95
+
96
+ def model_dump(self) -> dict:
97
+ """Serialize engine configuration into a JSON-compatible dictionary."""
98
+ return {
99
+ "type": "nemo",
100
+ "config": self._engine.config.model_dump(),
101
+ }
@@ -0,0 +1,46 @@
1
+ from aip_agents.guardrails.engines.base import BaseGuardrailEngine as BaseGuardrailEngine
2
+ from aip_agents.guardrails.schemas import BaseGuardrailEngineConfig as BaseGuardrailEngineConfig, GuardrailResult as GuardrailResult
3
+ from aip_agents.guardrails.utils import convert_guardrail_mode_to_gl_sdk as convert_guardrail_mode_to_gl_sdk
4
+ from typing import Any
5
+
6
+ class NemoGuardrailEngine(BaseGuardrailEngine):
7
+ """Wrapper for GL SDK NemoGuardrailEngine with aip-agents interface.
8
+
9
+ This engine provides advanced LLM-based content filtering using NVIDIA's
10
+ NeMo Guardrails. It can detect more complex safety violations beyond
11
+ simple phrase matching.
12
+
13
+ Note: Import of gllm_guardrail is deferred to __init__ to support
14
+ lazy loading when guardrails are optional dependency.
15
+ """
16
+ def __init__(self, config: BaseGuardrailEngineConfig | None = None, **nemo_config: dict[str, Any]) -> None:
17
+ """Initialize the NemoGuardrailEngine.
18
+
19
+ Args:
20
+ config: Engine configuration. Uses defaults if None provided.
21
+ **nemo_config: Additional configuration passed to the underlying
22
+ NeMo engine (e.g., model paths, thresholds, etc.)
23
+
24
+ Raises:
25
+ ImportError: If gllm-guardrail is not installed.
26
+ """
27
+ async def check_input(self, content: str) -> GuardrailResult:
28
+ """Check user input content using wrapped GL SDK NeMo engine.
29
+
30
+ Args:
31
+ content: The user input content to check
32
+
33
+ Returns:
34
+ GuardrailResult indicating if content is safe
35
+ """
36
+ async def check_output(self, content: str) -> GuardrailResult:
37
+ """Check AI output content using wrapped GL SDK NeMo engine.
38
+
39
+ Args:
40
+ content: The AI output content to check
41
+
42
+ Returns:
43
+ GuardrailResult indicating if content is safe
44
+ """
45
+ def model_dump(self) -> dict:
46
+ """Serialize engine configuration into a JSON-compatible dictionary."""
@@ -0,0 +1,113 @@
1
+ """PhraseMatcherEngine wrapper for GL SDK guardrails.
2
+
3
+ This module wraps the GL SDK's PhraseMatcherEngine to provide a consistent
4
+ interface for the aip-agents guardrails system.
5
+
6
+ Authors:
7
+ Reinhart Linanda (reinhart.linanda@gdplabs.id)
8
+ """
9
+
10
+ from aip_agents.guardrails.engines.base import BaseGuardrailEngine
11
+ from aip_agents.guardrails.schemas import (
12
+ BaseGuardrailEngineConfig,
13
+ GuardrailResult,
14
+ )
15
+ from aip_agents.guardrails.utils import convert_guardrail_mode_to_gl_sdk
16
+
17
+
18
+ class PhraseMatcherEngine(BaseGuardrailEngine):
19
+ """Wrapper for GL SDK PhraseMatcherEngine with aip-agents interface.
20
+
21
+ This engine performs rule-based banned phrase detection using the
22
+ GL SDK's PhraseMatcherEngine. It checks for exact phrase matches
23
+ and blocks content containing banned phrases.
24
+
25
+ Note: Import of gllm_guardrail is deferred to __init__ to support
26
+ lazy loading when guardrails are optional dependency.
27
+ """
28
+
29
+ def __init__(
30
+ self,
31
+ config: BaseGuardrailEngineConfig | None = None,
32
+ banned_phrases: list[str] | None = None,
33
+ ) -> None:
34
+ """Initialize the PhraseMatcherEngine.
35
+
36
+ Args:
37
+ config: Engine configuration. Uses defaults if None provided.
38
+ banned_phrases: List of phrases that should trigger blocking.
39
+ Defaults to empty list if None provided.
40
+
41
+ Raises:
42
+ ImportError: If gllm-guardrail is not installed.
43
+ """
44
+ super().__init__(config)
45
+
46
+ # Lazy import to support optional dependency and avoid import errors
47
+ # when gllm-guardrail is not installed
48
+ try:
49
+ from gllm_guardrail import PhraseMatcherEngine as GLPhraseMatcherEngine
50
+ from gllm_guardrail.engine.base_engine import BaseGuardrailEngineConfig as GLBaseGuardrailEngineConfig
51
+ except ImportError as e:
52
+ raise ImportError(
53
+ "gllm-guardrail is required for guardrails. Install with: pip install 'aip-agents[guardrails]'"
54
+ ) from e
55
+
56
+ # Convert our GuardrailMode to GL SDK's GuardrailMode
57
+ gl_mode = convert_guardrail_mode_to_gl_sdk(self.config.guardrail_mode)
58
+
59
+ # Create GL SDK config
60
+ gl_config = GLBaseGuardrailEngineConfig(guardrail_mode=gl_mode)
61
+
62
+ # Initialize the underlying GL SDK engine
63
+ self._engine = GLPhraseMatcherEngine(
64
+ config=gl_config,
65
+ banned_phrases=banned_phrases or [],
66
+ )
67
+
68
+ @property
69
+ def banned_phrases(self) -> list[str]:
70
+ """Get the list of banned phrases."""
71
+ return self._engine.banned_phrases
72
+
73
+ async def check_input(self, content: str) -> GuardrailResult:
74
+ """Check user input content using wrapped GL SDK engine.
75
+
76
+ Args:
77
+ content: The user input content to check
78
+
79
+ Returns:
80
+ GuardrailResult indicating if content is safe
81
+ """
82
+ gl_result = await self._engine.check_input(content)
83
+ return GuardrailResult(
84
+ is_safe=gl_result.is_safe,
85
+ reason=gl_result.reason,
86
+ filtered_content=gl_result.filtered_content,
87
+ )
88
+
89
+ async def check_output(self, content: str) -> GuardrailResult:
90
+ """Check AI output content using wrapped GL SDK engine.
91
+
92
+ Args:
93
+ content: The AI output content to check
94
+
95
+ Returns:
96
+ GuardrailResult indicating if content is safe
97
+ """
98
+ gl_result = await self._engine.check_output(content)
99
+ return GuardrailResult(
100
+ is_safe=gl_result.is_safe,
101
+ reason=gl_result.reason,
102
+ filtered_content=gl_result.filtered_content,
103
+ )
104
+
105
+ def model_dump(self) -> dict:
106
+ """Serialize engine configuration into a JSON-compatible dictionary."""
107
+ return {
108
+ "type": "phrase_matcher",
109
+ "config": {
110
+ **self.config.model_dump(),
111
+ "banned_phrases": self.banned_phrases,
112
+ },
113
+ }
@@ -0,0 +1,48 @@
1
+ from aip_agents.guardrails.engines.base import BaseGuardrailEngine as BaseGuardrailEngine
2
+ from aip_agents.guardrails.schemas import BaseGuardrailEngineConfig as BaseGuardrailEngineConfig, GuardrailResult as GuardrailResult
3
+ from aip_agents.guardrails.utils import convert_guardrail_mode_to_gl_sdk as convert_guardrail_mode_to_gl_sdk
4
+
5
+ class PhraseMatcherEngine(BaseGuardrailEngine):
6
+ """Wrapper for GL SDK PhraseMatcherEngine with aip-agents interface.
7
+
8
+ This engine performs rule-based banned phrase detection using the
9
+ GL SDK's PhraseMatcherEngine. It checks for exact phrase matches
10
+ and blocks content containing banned phrases.
11
+
12
+ Note: Import of gllm_guardrail is deferred to __init__ to support
13
+ lazy loading when guardrails are optional dependency.
14
+ """
15
+ def __init__(self, config: BaseGuardrailEngineConfig | None = None, banned_phrases: list[str] | None = None) -> None:
16
+ """Initialize the PhraseMatcherEngine.
17
+
18
+ Args:
19
+ config: Engine configuration. Uses defaults if None provided.
20
+ banned_phrases: List of phrases that should trigger blocking.
21
+ Defaults to empty list if None provided.
22
+
23
+ Raises:
24
+ ImportError: If gllm-guardrail is not installed.
25
+ """
26
+ @property
27
+ def banned_phrases(self) -> list[str]:
28
+ """Get the list of banned phrases."""
29
+ async def check_input(self, content: str) -> GuardrailResult:
30
+ """Check user input content using wrapped GL SDK engine.
31
+
32
+ Args:
33
+ content: The user input content to check
34
+
35
+ Returns:
36
+ GuardrailResult indicating if content is safe
37
+ """
38
+ async def check_output(self, content: str) -> GuardrailResult:
39
+ """Check AI output content using wrapped GL SDK engine.
40
+
41
+ Args:
42
+ content: The AI output content to check
43
+
44
+ Returns:
45
+ GuardrailResult indicating if content is safe
46
+ """
47
+ def model_dump(self) -> dict:
48
+ """Serialize engine configuration into a JSON-compatible dictionary."""
@@ -0,0 +1,39 @@
1
+ """Exceptions raised by the guardrails system.
2
+
3
+ This module defines custom exceptions that are raised when guardrail
4
+ violations occur or when guardrail operations fail.
5
+
6
+ Authors:
7
+ Reinhart Linanda (reinhart.linanda@gdplabs.id)
8
+ """
9
+
10
+ from aip_agents.guardrails.schemas import GuardrailResult
11
+
12
+
13
+ class GuardrailViolationError(Exception):
14
+ """Exception raised when unsafe content is detected by guardrails.
15
+
16
+ This exception is raised by GuardrailMiddleware when content violates
17
+ safety policies. It contains the GuardrailResult with details about
18
+ why the content was blocked.
19
+
20
+ Attributes:
21
+ result: The GuardrailResult containing safety check details
22
+ message: Human-readable error message
23
+ """
24
+
25
+ def __init__(self, result: GuardrailResult, message: str | None = None) -> None:
26
+ """Initialize the exception.
27
+
28
+ Args:
29
+ result: The GuardrailResult from the failed safety check
30
+ message: Optional custom error message
31
+ """
32
+ self.result = result
33
+ self.message = message or f"Content blocked by guardrails: {result.reason}"
34
+
35
+ super().__init__(self.message)
36
+
37
+ def __str__(self) -> str:
38
+ """Return string representation of the exception."""
39
+ return self.message
@@ -0,0 +1,23 @@
1
+ from _typeshed import Incomplete
2
+ from aip_agents.guardrails.schemas import GuardrailResult as GuardrailResult
3
+
4
+ class GuardrailViolationError(Exception):
5
+ """Exception raised when unsafe content is detected by guardrails.
6
+
7
+ This exception is raised by GuardrailMiddleware when content violates
8
+ safety policies. It contains the GuardrailResult with details about
9
+ why the content was blocked.
10
+
11
+ Attributes:
12
+ result: The GuardrailResult containing safety check details
13
+ message: Human-readable error message
14
+ """
15
+ result: Incomplete
16
+ message: Incomplete
17
+ def __init__(self, result: GuardrailResult, message: str | None = None) -> None:
18
+ """Initialize the exception.
19
+
20
+ Args:
21
+ result: The GuardrailResult from the failed safety check
22
+ message: Optional custom error message
23
+ """
@@ -0,0 +1,163 @@
1
+ """GuardrailManager for orchestrating multiple guardrail engines.
2
+
3
+ This module provides the GuardrailManager class that coordinates multiple
4
+ guardrail engines with fail-fast behavior.
5
+
6
+ Authors:
7
+ Reinhart Linanda (reinhart.linanda@gdplabs.id)
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from typing import TYPE_CHECKING, Any
13
+
14
+ from aip_agents.guardrails.schemas import GuardrailInput, GuardrailMode, GuardrailResult
15
+
16
+ if TYPE_CHECKING:
17
+ from aip_agents.guardrails.engines.base import GuardrailEngine
18
+
19
+
20
+ class GuardrailManager:
21
+ """Orchestrates multiple guardrail engines with fail-fast behavior.
22
+
23
+ The manager accepts one or more guardrail engines and runs them in sequence.
24
+ If any engine reports unsafe content, execution stops immediately (fail-fast)
25
+ and returns the violation result.
26
+
27
+ Attributes:
28
+ engines: List of guardrail engines to orchestrate
29
+ """
30
+
31
+ def __init__(
32
+ self,
33
+ engine: GuardrailEngine | list[GuardrailEngine] | None = None,
34
+ engines: list[GuardrailEngine] | None = None,
35
+ ) -> None:
36
+ """Initialize the GuardrailManager.
37
+
38
+ Args:
39
+ engine: Single guardrail engine to use
40
+ engines: List of guardrail engines to use
41
+
42
+ Raises:
43
+ ValueError: If both engine and engines are provided
44
+ """
45
+ self.enabled = True
46
+ if engine is not None and engines is not None:
47
+ raise ValueError("Cannot specify both 'engine' and 'engines'")
48
+
49
+ if engine is not None:
50
+ if isinstance(engine, list):
51
+ self.engines = engine
52
+ else:
53
+ self.engines = [engine]
54
+ elif engines is not None:
55
+ self.engines = engines
56
+ else:
57
+ self.engines = []
58
+
59
+ def model_dump(self) -> dict[str, Any]:
60
+ """Serialize manager configuration into a JSON-compatible dictionary."""
61
+ return {
62
+ "enabled": self.enabled,
63
+ "engines": [engine.model_dump() for engine in self.engines],
64
+ }
65
+
66
+ async def check_content(self, content: str | GuardrailInput) -> GuardrailResult:
67
+ """Check content against all registered engines.
68
+
69
+ Executes engines in order with fail-fast behavior. If any engine
70
+ reports unsafe content, returns immediately with that result.
71
+
72
+ Args:
73
+ content: Content to check. Can be a string (treated as input-only)
74
+ or GuardrailInput with input/output fields.
75
+
76
+ Returns:
77
+ GuardrailResult indicating if content passed all checks
78
+ """
79
+ # Normalize input to GuardrailInput
80
+ guardrail_input = self._normalize_content(content)
81
+
82
+ # Execute engines in order (fail-fast on first unsafe result)
83
+ for engine in self.engines:
84
+ result = await self._check_engine(engine, guardrail_input)
85
+ if result is not None:
86
+ return result
87
+
88
+ # All engines passed
89
+ return GuardrailResult(is_safe=True, reason=None, filtered_content=None)
90
+
91
+ @staticmethod
92
+ def _normalize_content(content: str | GuardrailInput) -> GuardrailInput:
93
+ """Normalize content input to GuardrailInput.
94
+
95
+ Args:
96
+ content: Content to normalize
97
+
98
+ Returns:
99
+ GuardrailInput object
100
+ """
101
+ if isinstance(content, str):
102
+ return GuardrailInput(input=content, output=None)
103
+ return content
104
+
105
+ async def _check_engine(self, engine: GuardrailEngine, guardrail_input: GuardrailInput) -> GuardrailResult | None:
106
+ """Check content against a single engine.
107
+
108
+ Args:
109
+ engine: The guardrail engine to check against
110
+ guardrail_input: The content to check
111
+
112
+ Returns:
113
+ GuardrailResult if unsafe content detected, None if safe
114
+ """
115
+ engine_mode = engine.config.guardrail_mode
116
+
117
+ # Skip disabled engines
118
+ if engine_mode == GuardrailMode.DISABLED:
119
+ return None
120
+
121
+ if self._should_check_input(engine_mode, guardrail_input) and guardrail_input.input is not None:
122
+ result = await engine.check_input(guardrail_input.input)
123
+ if not result.is_safe:
124
+ return result
125
+
126
+ if self._should_check_output(engine_mode, guardrail_input) and guardrail_input.output is not None:
127
+ result = await engine.check_output(guardrail_input.output)
128
+ if not result.is_safe:
129
+ return result
130
+
131
+ return None
132
+
133
+ @staticmethod
134
+ def _should_check_input(engine_mode: GuardrailMode, guardrail_input: GuardrailInput) -> bool:
135
+ """Determine if input should be checked based on engine mode.
136
+
137
+ Args:
138
+ engine_mode: The guardrail mode of the engine
139
+ guardrail_input: The content to check
140
+
141
+ Returns:
142
+ True if input should be checked, False otherwise
143
+ """
144
+ return guardrail_input.input is not None and engine_mode in (
145
+ GuardrailMode.INPUT_ONLY,
146
+ GuardrailMode.INPUT_OUTPUT,
147
+ )
148
+
149
+ @staticmethod
150
+ def _should_check_output(engine_mode: GuardrailMode, guardrail_input: GuardrailInput) -> bool:
151
+ """Determine if output should be checked based on engine mode.
152
+
153
+ Args:
154
+ engine_mode: The guardrail mode of the engine
155
+ guardrail_input: The content to check
156
+
157
+ Returns:
158
+ True if output should be checked, False otherwise
159
+ """
160
+ return guardrail_input.output is not None and engine_mode in (
161
+ GuardrailMode.OUTPUT_ONLY,
162
+ GuardrailMode.INPUT_OUTPUT,
163
+ )
@@ -0,0 +1,42 @@
1
+ from _typeshed import Incomplete
2
+ from aip_agents.guardrails.engines.base import GuardrailEngine as GuardrailEngine
3
+ from aip_agents.guardrails.schemas import GuardrailInput as GuardrailInput, GuardrailMode as GuardrailMode, GuardrailResult as GuardrailResult
4
+ from typing import Any
5
+
6
+ class GuardrailManager:
7
+ """Orchestrates multiple guardrail engines with fail-fast behavior.
8
+
9
+ The manager accepts one or more guardrail engines and runs them in sequence.
10
+ If any engine reports unsafe content, execution stops immediately (fail-fast)
11
+ and returns the violation result.
12
+
13
+ Attributes:
14
+ engines: List of guardrail engines to orchestrate
15
+ """
16
+ enabled: bool
17
+ engines: Incomplete
18
+ def __init__(self, engine: GuardrailEngine | list[GuardrailEngine] | None = None, engines: list[GuardrailEngine] | None = None) -> None:
19
+ """Initialize the GuardrailManager.
20
+
21
+ Args:
22
+ engine: Single guardrail engine to use
23
+ engines: List of guardrail engines to use
24
+
25
+ Raises:
26
+ ValueError: If both engine and engines are provided
27
+ """
28
+ def model_dump(self) -> dict[str, Any]:
29
+ """Serialize manager configuration into a JSON-compatible dictionary."""
30
+ async def check_content(self, content: str | GuardrailInput) -> GuardrailResult:
31
+ """Check content against all registered engines.
32
+
33
+ Executes engines in order with fail-fast behavior. If any engine
34
+ reports unsafe content, returns immediately with that result.
35
+
36
+ Args:
37
+ content: Content to check. Can be a string (treated as input-only)
38
+ or GuardrailInput with input/output fields.
39
+
40
+ Returns:
41
+ GuardrailResult indicating if content passed all checks
42
+ """