|
|
"""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="<html><head><meta http-equiv='refresh' content='2'></head><body><h1>Loading...</h1></body></html>", |
|
|
status_code=200, |
|
|
media_type="text/html", |
|
|
) |
|
|
|
|
|
|
|
|
@router.get("/health") |
|
|
async def health(): |
|
|
"""Health check endpoint for Hugging Face Spaces.""" |
|
|
return {"status": "ok"} |
|
|
|