"""Info, root, and health endpoints.""" import httpx from fastapi import APIRouter from fastapi.responses import Response as FastAPIResponse router = APIRouter(tags=["info"]) @router.get("/api/info") async def api_info(): """API info endpoint.""" return { "name": "PsyAdGenesis", "version": "2.0.0", "description": "Design ads that stop the scroll. Generate high-converting ads using Angle × Concept matrix system", "endpoints": { "POST /generate": "Generate single ad (original mode)", "POST /generate/batch": "Generate multiple ads (original mode)", "POST /matrix/generate": "Generate ad using Angle × Concept matrix", "POST /matrix/testing": "Generate testing matrix (30 combinations)", "GET /matrix/angles": "List all 100 angles", "GET /matrix/concepts": "List all 100 concepts", "GET /matrix/angle/{key}": "Get specific angle details", "GET /matrix/concept/{key}": "Get specific concept details", "GET /matrix/compatible/{angle_key}": "Get compatible concepts for angle", "POST /extensive/generate": "Generate ad using extensive (researcher → creative director → designer → copywriter)", "POST /api/motivator/generate": "Generate motivators from niche + angle + concept (Matrix mode)", "POST /api/correct": "Correct image for spelling mistakes and visual issues (requires image_id)", "POST /api/regenerate": "Regenerate image with optional model selection (requires image_id)", "GET /api/models": "List all available image generation models", "POST /api/creative/upload": "Upload a creative image for analysis", "POST /api/creative/analyze": "Analyze a creative image with AI vision (via URL)", "POST /api/creative/analyze/upload": "Analyze a creative image with AI vision (via file upload)", "POST /api/creative/modify": "Modify a creative with new angle/concept", "GET /api/trends/{niche}": "Get current trending topics from Google News", "GET /api/trends/angles/{niche}": "Get auto-generated angles from trending topics", "GET /health": "Health check", }, "supported_niches": ["home_insurance", "glp1"], "matrix_system": { "total_angles": 100, "total_concepts": 100, "possible_combinations": 10000, "formula": "1 Offer → 5-8 Angles → 3-5 Concepts per angle", }, } @router.get("/") async def root(): """Proxy root to Next.js frontend.""" try: async with httpx.AsyncClient(timeout=30.0) as client: response = await client.get("http://localhost:3000/") return FastAPIResponse( content=response.content, status_code=response.status_code, headers={k: v for k, v in response.headers.items() if k.lower() not in ["content-encoding", "transfer-encoding", "content-length"]}, media_type=response.headers.get("content-type"), ) except httpx.RequestError: return FastAPIResponse( content="