From b7c470405b80e7747479ad405ea9f7af15714892 Mon Sep 17 00:00:00 2001 From: Juan Date: Sun, 10 May 2026 10:46:35 +0200 Subject: [PATCH] =?UTF-8?q?feat(guardrails):=20a=C3=B1ade=20Protocol=20Gua?= =?UTF-8?q?rdrailEngine?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- core/requirements.txt | 1 + core/src/agentforge_core/guardrails/base.py | 29 +++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 core/src/agentforge_core/guardrails/base.py diff --git a/core/requirements.txt b/core/requirements.txt index 2f5e1fd..6a6395f 100644 --- a/core/requirements.txt +++ b/core/requirements.txt @@ -11,4 +11,5 @@ presidio-analyzer>=2.2,<3.0 presidio-anonymizer>=2.2,<3.0 openai>=1.50,<2.0 PyYAML>=6.0,<7.0 +jsonschema>=4.0,<5.0 nemoguardrails>=0.10,<0.12 diff --git a/core/src/agentforge_core/guardrails/base.py b/core/src/agentforge_core/guardrails/base.py new file mode 100644 index 0000000..36c8dd5 --- /dev/null +++ b/core/src/agentforge_core/guardrails/base.py @@ -0,0 +1,29 @@ +"""Interfaz Protocol del motor de guardrails.""" + +from __future__ import annotations + +from typing import Any, Protocol +from uuid import UUID + +from agentforge_core.domain.guardrail import GuardrailViolation +from agentforge_core.domain.policy import PolicyDefinition + + +class GuardrailEngine(Protocol): + """Motor de validación. Las violaciones se devuelven; el grafo decide bloquear.""" + + name: str + + async def validate_input( + self, + payload: str, + policy: PolicyDefinition, + trace_id: UUID, + ) -> list[GuardrailViolation]: ... + + async def validate_output( + self, + payload: dict[str, Any], + policy: PolicyDefinition, + trace_id: UUID, + ) -> list[GuardrailViolation]: ...