Skip to content
This repository was archived by the owner on Mar 4, 2026. It is now read-only.

Commit 20261d1

Browse files
Merge pull request #17 from UiPath/AL-197_custom_guardrails
feat: add custom guardrails service and guardrails models [AL-197]
2 parents 013ba17 + de5d7f8 commit 20261d1

7 files changed

Lines changed: 1660 additions & 2 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "uipath-core"
3-
version = "0.1.1"
3+
version = "0.1.2"
44
description = "UiPath Core abstractions"
55
readme = { file = "README.md", content-type = "text/markdown" }
66
requires-python = ">=3.11"
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
"""UiPath Guardrails Models.
2+
3+
This module contains models related to UiPath Guardrails.
4+
"""
5+
6+
from ._deterministic_guardrails_service import DeterministicGuardrailsService
7+
from .guardrails import (
8+
AllFieldsSelector,
9+
ApplyTo,
10+
BaseGuardrail,
11+
BooleanRule,
12+
DeterministicGuardrail,
13+
FieldReference,
14+
FieldSelector,
15+
FieldSource,
16+
GuardrailScope,
17+
GuardrailSelector,
18+
NumberRule,
19+
Rule,
20+
SelectorType,
21+
SpecificFieldsSelector,
22+
UniversalRule,
23+
WordRule,
24+
)
25+
26+
__all__ = [
27+
"DeterministicGuardrailsService",
28+
"FieldSource",
29+
"ApplyTo",
30+
"FieldReference",
31+
"SelectorType",
32+
"AllFieldsSelector",
33+
"SpecificFieldsSelector",
34+
"FieldSelector",
35+
"BaseGuardrail",
36+
"DeterministicGuardrail",
37+
"WordRule",
38+
"NumberRule",
39+
"BooleanRule",
40+
"UniversalRule",
41+
"Rule",
42+
"GuardrailScope",
43+
"GuardrailSelector",
44+
]
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
from typing import Any
2+
3+
from pydantic import BaseModel
4+
5+
from ..tracing.decorators import traced
6+
from ._evaluators import (
7+
evaluate_boolean_rule,
8+
evaluate_number_rule,
9+
evaluate_universal_rule,
10+
evaluate_word_rule,
11+
)
12+
from .guardrails import (
13+
BooleanRule,
14+
DeterministicGuardrail,
15+
GuardrailValidationResult,
16+
NumberRule,
17+
UniversalRule,
18+
WordRule,
19+
)
20+
21+
22+
class DeterministicGuardrailsService(BaseModel):
23+
@traced("evaluate_pre_deterministic_guardrail", run_type="uipath")
24+
def evaluate_pre_deterministic_guardrail(
25+
self,
26+
input_data: dict[str, Any],
27+
guardrail: DeterministicGuardrail,
28+
) -> GuardrailValidationResult:
29+
"""Evaluate deterministic guardrail rules against input data (pre-execution)."""
30+
return self._evaluate_deterministic_guardrail(
31+
input_data=input_data,
32+
output_data={},
33+
guardrail=guardrail,
34+
)
35+
36+
@traced("evaluate_post_deterministic_guardrails", run_type="uipath")
37+
def evaluate_post_deterministic_guardrail(
38+
self,
39+
input_data: dict[str, Any],
40+
output_data: dict[str, Any],
41+
guardrail: DeterministicGuardrail,
42+
) -> GuardrailValidationResult:
43+
"""Evaluate deterministic guardrail rules against input and output data."""
44+
return self._evaluate_deterministic_guardrail(
45+
input_data=input_data,
46+
output_data=output_data,
47+
guardrail=guardrail,
48+
)
49+
50+
@staticmethod
51+
def _evaluate_deterministic_guardrail(
52+
input_data: dict[str, Any],
53+
output_data: dict[str, Any],
54+
guardrail: DeterministicGuardrail,
55+
) -> GuardrailValidationResult:
56+
"""Evaluate deterministic guardrail rules against input and output data."""
57+
for rule in guardrail.rules:
58+
if isinstance(rule, WordRule):
59+
passed, reason = evaluate_word_rule(rule, input_data, output_data)
60+
elif isinstance(rule, NumberRule):
61+
passed, reason = evaluate_number_rule(rule, input_data, output_data)
62+
elif isinstance(rule, BooleanRule):
63+
passed, reason = evaluate_boolean_rule(rule, input_data, output_data)
64+
elif isinstance(rule, UniversalRule):
65+
passed, reason = evaluate_universal_rule(rule, output_data)
66+
else:
67+
return GuardrailValidationResult(
68+
validation_passed=False,
69+
reason=f"Unknown rule type: {type(rule)}",
70+
)
71+
72+
if not passed:
73+
return GuardrailValidationResult(
74+
validation_passed=False, reason=reason or "Rule validation failed"
75+
)
76+
77+
return GuardrailValidationResult(
78+
validation_passed=True, reason="All deterministic guardrail rules passed"
79+
)

0 commit comments

Comments
 (0)