feat(domain): añade modelos GuardrailViolation, PolicyDefinition y AgentExecution
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
"""Modelos de ejecución del agente: estado, traza, acciones propuestas."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from typing import Any, Literal
|
||||
from uuid import UUID
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from agentforge_core.domain.guardrail import GuardrailViolation
|
||||
|
||||
|
||||
class ProposedAction(BaseModel):
|
||||
"""Acción propuesta por el agente, con su análisis de riesgo y rollback."""
|
||||
|
||||
id: str
|
||||
action: str
|
||||
target: str
|
||||
risk_score: int = Field(ge=1, le=5)
|
||||
rollback_plan: str
|
||||
requires_approval: bool
|
||||
|
||||
|
||||
class DecisionStep(BaseModel):
|
||||
"""Un paso individual del decision_path de la ejecución."""
|
||||
|
||||
step: str
|
||||
timestamp: datetime
|
||||
duration_ms: int
|
||||
detail: dict[str, Any]
|
||||
|
||||
|
||||
ExecutionStatus = Literal[
|
||||
"running",
|
||||
"awaiting_approval",
|
||||
"blocked_by_guardrail",
|
||||
"completed",
|
||||
"failed",
|
||||
]
|
||||
|
||||
|
||||
class AgentExecution(BaseModel):
|
||||
"""Estado completo de una ejecución, persistido en JSONL al terminar."""
|
||||
|
||||
trace_id: UUID
|
||||
agent_name: str
|
||||
agent_version: str
|
||||
status: ExecutionStatus
|
||||
started_at: datetime
|
||||
finished_at: datetime | None
|
||||
decision_path: list[DecisionStep]
|
||||
violations: list[GuardrailViolation]
|
||||
proposed_actions: list[ProposedAction]
|
||||
needs_human_for: list[ProposedAction] | None
|
||||
final_output: dict[str, Any] | None
|
||||
error: str | None
|
||||
|
||||
|
||||
class AgentExecutionSummary(BaseModel):
|
||||
"""Versión ligera para listados (sin decision_path ni violations completas)."""
|
||||
|
||||
trace_id: UUID
|
||||
agent_name: str
|
||||
agent_version: str
|
||||
status: ExecutionStatus
|
||||
started_at: datetime
|
||||
finished_at: datetime | None
|
||||
n_violations: int
|
||||
n_proposed_actions: int
|
||||
@@ -0,0 +1,21 @@
|
||||
"""Modelos de dominio de guardrails."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from typing import Literal
|
||||
from uuid import UUID
|
||||
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
class GuardrailViolation(BaseModel):
|
||||
"""Resultado de un validador. Una ejecución puede acumular varias."""
|
||||
|
||||
trace_id: UUID
|
||||
timestamp: datetime
|
||||
stage: Literal["input", "output"]
|
||||
validator: str
|
||||
severity: Literal["info", "warning", "block"]
|
||||
message: str
|
||||
blocked: bool
|
||||
@@ -0,0 +1,36 @@
|
||||
"""Modelos de políticas de guardrails."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from typing import Any, Literal
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
|
||||
class PolicyValidator(BaseModel):
|
||||
"""Validador individual configurado en una política."""
|
||||
|
||||
type: str
|
||||
config: dict[str, Any] = Field(default_factory=dict)
|
||||
|
||||
|
||||
class PolicyVersionMeta(BaseModel):
|
||||
"""Metadatos de una versión concreta de una política (estilo commit Git)."""
|
||||
|
||||
id: str
|
||||
hash: str
|
||||
author: str
|
||||
message: str
|
||||
created_at: datetime
|
||||
|
||||
|
||||
class PolicyDefinition(BaseModel):
|
||||
"""Política completa con validadores de entrada y salida."""
|
||||
|
||||
name: str
|
||||
version: str
|
||||
description: str
|
||||
input_validators: list[PolicyValidator]
|
||||
output_validators: list[PolicyValidator]
|
||||
on_validator_error: Literal["fail_open", "fail_closed"] = "fail_closed"
|
||||
Reference in New Issue
Block a user