feat(api): implementa routers /policies y /violations (listado + filtros)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Juan
2026-05-10 15:40:09 +02:00
co-authored by Claude Opus 4.7
parent 8927b192f8
commit 09ec79a464
3 changed files with 130 additions and 4 deletions
+20 -2
View File
@@ -1,5 +1,23 @@
"""Router stub de /policies — se implementa en una task posterior."""
"""Router /policies: listado de políticas y de sus versiones."""
from fastapi import APIRouter
from __future__ import annotations
from fastapi import APIRouter, HTTPException
from agentforge_core.api.deps import PolicyStoreDep
from agentforge_core.domain.policy import PolicyDefinition, PolicyVersionMeta
router = APIRouter()
@router.get("", response_model=list[PolicyDefinition])
def list_policies(store: PolicyStoreDep) -> list[PolicyDefinition]:
return store.list_policies()
@router.get("/{name}/versions", response_model=list[PolicyVersionMeta])
def list_versions(name: str, store: PolicyStoreDep) -> list[PolicyVersionMeta]:
try:
return store.list_versions(name)
except FileNotFoundError as exc:
raise HTTPException(status_code=404, detail=str(exc)) from exc
+25 -2
View File
@@ -1,5 +1,28 @@
"""Router stub de /violations — se implementa en una task posterior."""
"""Router /violations: listado filtrable por trace_id y severidad."""
from fastapi import APIRouter
from __future__ import annotations
from typing import Annotated, Literal
from uuid import UUID
from fastapi import APIRouter, Query
from agentforge_core.api.deps import SettingsDep
from agentforge_core.api.persistence import read_violations
from agentforge_core.domain.guardrail import GuardrailViolation
router = APIRouter()
@router.get("", response_model=list[GuardrailViolation])
def list_violations(
settings: SettingsDep,
trace_id: Annotated[UUID | None, Query()] = None,
severity: Annotated[Literal["info", "warning", "block"] | None, Query()] = None,
) -> list[GuardrailViolation]:
items = read_violations(settings.data_dir)
if trace_id is not None:
items = [v for v in items if v.trace_id == trace_id]
if severity is not None:
items = [v for v in items if v.severity == severity]
return items