File size: 3,525 Bytes
d4a4da7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
"""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"}