ElGraph.Guardrail (ElGraph v0.3.0)

Copy Markdown View Source

입출력 가드레일 / 정책 계층 (트렌드 보고서 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

guard()

@type guard() :: (term(), map() -> :ok | {:block, term()} | {:transform, term()})

Functions

authorize_tool(allowed)

@spec authorize_tool([String.t()]) :: guard()

값(툴 이름)이 허용 목록에 없으면 차단한다 — 툴 인가.

check(guards, value, ctx \\ %{})

@spec check([guard()], term(), map()) :: {:ok, term()} | {:blocked, term()}

가드를 순서대로 적용한다. 통과 시 {: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}}

deny(pattern, reason)

@spec deny(Regex.t(), term()) :: guard()

값이 패턴에 매치하면 차단한다 (PII/비밀 누출 등).

deny_pii(types)

@spec deny_pii([atom()] | :all) :: guard()

요청한 PII 타입이 하나라도 있으면 {:block, {:pii, type}}로 차단한다. :all은 모든 패턴.

guard_value(state, key, guards, opts \\ [])

@spec guard_value(map(), atom(), [guard()], keyword()) ::
  {:ok, map()} | {:blocked, term()}

상태 맵의 key 필드를 가드로 검사한다. 통과 시 변환된 값을 다시 넣은 상태를 {:ok, state}로, 차단 시 {:blocked, reason}을 반환한다 — 노드의 입출력 가딩 진입점.

max_length(max)

@spec max_length(pos_integer()) :: guard()

문자열 길이가 max를 넘으면 차단한다.

redact(pattern, replacement)

@spec redact(Regex.t(), String.t()) :: guard()

패턴 매치 부분을 치환한다 (마스킹). 항상 통과하며 값만 바꾼다.

redact_pii(types, replacement \\ "[REDACTED]")

@spec redact_pii([atom()] | :all, String.t()) :: guard()

요청한 PII 타입을 마스킹하는 가드를 반환한다. :all은 모든 패턴이다. 치환 문자열 기본값은 "[REDACTED]". 항상 통과하며 값만 바꾼다.

validate_schema(schema)

@spec validate_schema(NimbleOptions.t() | keyword()) :: guard()

값(keyword 또는 map)을 NimbleOptions 스키마로 검증한다. 유효하면 :ok, 아니면 {:block, {:invalid_output, reason}}. keyword 스키마는 컴파일해서 받는다.