입출력 가드레일 / 정책 계층 (트렌드 보고서 Tier 3.9).
성숙도와 함께 필수가 되는 안전장치 — LLM 입출력 검증(PII/비밀/길이)과 툴 인가를 조합
가능한 가드로 표현한다. max_steps/budget(비용)의 자연스러운 확장이다.
가드는 (value, ctx) -> :ok | {:block, reason} | {:transform, new_value} 함수다.
check/3이 순서대로 적용한다 — transform은 값을 바꿔 다음 가드로 넘기고, block은 즉시
중단한다. 노드 안에서 LLM 입력/출력이나 tool_call 이름에 적용한다.
guards = [Guardrail.redact(~r/\d{3}-\d{4}/, "[REDACTED]"), Guardrail.max_length(4000)]
case Guardrail.check(guards, user_input) do
{:ok, safe} -> ...
{:blocked, reason} -> ...
end
Summary
Functions
값(툴 이름)이 허용 목록에 없으면 차단한다 — 툴 인가.
가드를 순서대로 적용한다. 통과 시 {:ok, value}, 차단 시 {:blocked, reason}.
값이 패턴에 매치하면 차단한다 (PII/비밀 누출 등).
요청한 PII 타입이 하나라도 있으면 {:block, {:pii, type}}로 차단한다. :all은 모든 패턴.
상태 맵의 key 필드를 가드로 검사한다. 통과 시 변환된 값을 다시 넣은 상태를
{:ok, state}로, 차단 시 {:blocked, reason}을 반환한다 — 노드의 입출력 가딩 진입점.
문자열 길이가 max를 넘으면 차단한다.
패턴 매치 부분을 치환한다 (마스킹). 항상 통과하며 값만 바꾼다.
요청한 PII 타입을 마스킹하는 가드를 반환한다. :all은 모든 패턴이다.
치환 문자열 기본값은 "[REDACTED]". 항상 통과하며 값만 바꾼다.
값(keyword 또는 map)을 NimbleOptions 스키마로 검증한다. 유효하면 :ok,
아니면 {:block, {:invalid_output, reason}}. keyword 스키마는 컴파일해서 받는다.
Types
Functions
값(툴 이름)이 허용 목록에 없으면 차단한다 — 툴 인가.
가드를 순서대로 적용한다. 통과 시 {:ok, value}, 차단 시 {:blocked, reason}.
iex> ElGraph.Guardrail.check([], "hi")
{:ok, "hi"}
iex> ElGraph.Guardrail.check([ElGraph.Guardrail.max_length(3)], "toolong")
{:blocked, {:too_long, 3}}
값이 패턴에 매치하면 차단한다 (PII/비밀 누출 등).
요청한 PII 타입이 하나라도 있으면 {:block, {:pii, type}}로 차단한다. :all은 모든 패턴.
상태 맵의 key 필드를 가드로 검사한다. 통과 시 변환된 값을 다시 넣은 상태를
{:ok, state}로, 차단 시 {:blocked, reason}을 반환한다 — 노드의 입출력 가딩 진입점.
@spec max_length(pos_integer()) :: guard()
문자열 길이가 max를 넘으면 차단한다.
패턴 매치 부분을 치환한다 (마스킹). 항상 통과하며 값만 바꾼다.
요청한 PII 타입을 마스킹하는 가드를 반환한다. :all은 모든 패턴이다.
치환 문자열 기본값은 "[REDACTED]". 항상 통과하며 값만 바꾼다.
@spec validate_schema(NimbleOptions.t() | keyword()) :: guard()
값(keyword 또는 map)을 NimbleOptions 스키마로 검증한다. 유효하면 :ok,
아니면 {:block, {:invalid_output, reason}}. keyword 스키마는 컴파일해서 받는다.