feat(api): scaffolding FastAPI con TraceIdMiddleware, /health y routers stub

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Juan
2026-05-10 15:30:38 +02:00
co-authored by Claude Opus 4.7
parent 38d81252c6
commit 1c763d26d8
7 changed files with 107 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
"""Router stub de /agents — se implementa en una task posterior."""
from fastapi import APIRouter
router = APIRouter()
@@ -0,0 +1,5 @@
"""Router stub de /executions — se implementa en una task posterior."""
from fastapi import APIRouter
router = APIRouter()
@@ -0,0 +1,27 @@
"""Middleware de propagación de `trace_id` en cada request HTTP."""
from __future__ import annotations
from uuid import uuid4
from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint
from starlette.requests import Request
from starlette.responses import Response
from agentforge_core.observability.logging import bind_trace_id, clear_trace_id
class TraceIdMiddleware(BaseHTTPMiddleware):
"""Lee o genera `X-Trace-Id`, lo bind-ea al contexto de structlog y lo devuelve en la respuesta."""
async def dispatch(
self, request: Request, call_next: RequestResponseEndpoint
) -> Response:
trace_id = request.headers.get("X-Trace-Id") or str(uuid4())
bind_trace_id(trace_id)
try:
response = await call_next(request)
response.headers["X-Trace-Id"] = trace_id
return response
finally:
clear_trace_id()
+5
View File
@@ -0,0 +1,5 @@
"""Router stub de /policies — se implementa en una task posterior."""
from fastapi import APIRouter
router = APIRouter()
@@ -0,0 +1,5 @@
"""Router stub de /violations — se implementa en una task posterior."""
from fastapi import APIRouter
router = APIRouter()
+36
View File
@@ -0,0 +1,36 @@
"""Composición raíz de la aplicación FastAPI (agentforge-core)."""
from __future__ import annotations
from fastapi import FastAPI
from agentforge_core.api.middlewares import TraceIdMiddleware
from agentforge_core.config import Settings
from agentforge_core.observability.logging import configure_logging
def create_app() -> FastAPI:
"""Construye la app: logging, middleware de trace_id, /health y routers."""
settings = Settings()
configure_logging(level=settings.log_level)
app = FastAPI(
title="AgentForge Core",
version="0.1.0",
description="Plataforma de gobernanza de agentes IA — API REST.",
)
app.add_middleware(TraceIdMiddleware)
@app.get("/health", tags=["meta"])
async def health() -> dict[str, str]:
return {"status": "ok"}
from agentforge_core.api import agents, executions, policies, violations
app.include_router(agents.router, prefix="/agents", tags=["agents"])
app.include_router(executions.router, prefix="/executions", tags=["executions"])
app.include_router(policies.router, prefix="/policies", tags=["policies"])
app.include_router(violations.router, prefix="/violations", tags=["violations"])
return app
app = create_app()