from __future__ import annotations import time from typing import Any from fastapi import APIRouter, Query, Request from app.core.response import SuccessResponse router = APIRouter(prefix="/v1/templates", tags=["templates"]) def _response(request: Request, started: float, metadata: dict[str, Any]) -> SuccessResponse: return SuccessResponse( request_id=request.state.request_id, processing_time=round(time.monotonic() - started, 4), metadata=metadata, ) @router.get("", response_model=SuccessResponse) async def list_templates( request: Request, category: str | None = Query(default=None) ) -> SuccessResponse: """List metadata, parameters, and examples for every template version.""" started = time.monotonic() request.state.operation = "templates.list" templates = request.app.state.container.template_registry.list_templates(category) return _response( request, started, {"templates": templates, "count": len(templates), "category": category}, ) @router.get("/categories", response_model=SuccessResponse) async def template_categories(request: Request) -> SuccessResponse: """List categories discovered dynamically from YAML definitions.""" started = time.monotonic() request.state.operation = "templates.categories" categories = request.app.state.container.template_registry.categories() return _response(request, started, {"categories": categories}) @router.post("/run", response_model=SuccessResponse) async def run_template(request: Request) -> SuccessResponse: """Resolve any supported media input and execute a versioned template.""" request.state.operation = "templates.run" container = request.app.state.container resolved = await container.resolver.resolve(request) return await container.template_executor.execute_request(resolved) @router.get("/{template_id}", response_model=SuccessResponse) async def template_details(request: Request, template_id: str) -> SuccessResponse: """Return complete metadata and pipeline details for a template reference.""" started = time.monotonic() request.state.operation = "templates.details" template = request.app.state.container.template_registry.template_details(template_id) return _response(request, started, {"template": template})