"""SVG 아이콘 생성 — 텍스트 설명→SVG 코드 자동 생성"""
from __future__ import annotations
import json, logging, re
from datetime import datetime
from pathlib import Path
from typing import Optional
import httpx
from fastapi import APIRouter, Depends, HTTPException
from fastapi.responses import Response
from pydantic import BaseModel
from sqlalchemy import select, desc, func
from sqlalchemy.ext.asyncio import AsyncSession
from core.auth import get_current_user
from database import get_db
from models import User, GeneratedIcon
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/icon", tags=["아이콘 생성"])
OLLAMA_URL = "http://localhost:11434"
TEXT_MODEL = "llama3"
# 내장 아이콘 템플릿 (GUARDiA 브랜드 #003366)
BUILTIN_ICONS = {
"server": '',
"alert": '',
"check": '',
"deploy": '',
"user": '',
"database": '',
"network": '',
"security": '',
}
SVG_SYSTEM_PROMPT = """당신은 SVG 아이콘 전문 디자이너입니다.
요구사항에 맞는 24x24 픽토그램 SVG 코드를 생성합니다.
규칙:
1. viewBox="0 0 24 24" 사용
2. xmlns="http://www.w3.org/2000/svg" 포함
3. 기본 색상: fill="{color}"
4. 단순하고 명확한 픽토그램 스타일
5. SVG 코드만 출력 (다른 텍스트 없음)
6. 반드시 완전한 SVG 태그로 시작하고 끝내기"""
async def _generate_svg(description: str, color: str = "#003366", size: int = 24) -> str:
"""Ollama로 SVG 아이콘 생성."""
system = SVG_SYSTEM_PROMPT.replace("{color}", color)
prompt = f"다음 아이콘을 SVG로 생성 (viewBox 0 0 {size} {size}): {description}"
try:
async with httpx.AsyncClient(timeout=30) as c:
r = await c.post(f"{OLLAMA_URL}/api/generate", json={
"model": TEXT_MODEL,
"system": system,
"prompt": prompt,
"stream": False,
})
resp = r.json().get("response", "")
# SVG 추출
svg_match = re.search(r'(