Google Form 응답을 트리거로 Vercel API에서 만세력(manseryeok) 계산 → Gemini로 HTML 생성(CSS 포함) → PDF 생성을 수행하고, Apps Script가 PDF를 Google Drive에 업로드한 뒤 링크를 Google Sheets에 기록합니다.
npm install
cp .env.example .env.local
npm run dev.env.local에 아래 값을 채워주세요.
GEMINI_API_KEY: Gemini API Key (코드 하드코딩 금지, Vercel 환경변수 권장)GEMINI_MODEL: 기본gemini-2.5-flashLLM_PROVIDER: 기본gemini(openai로 지정 시에만 OpenAI 호출)OPENAI_API_KEY: (선택)LLM_PROVIDER=openai일 때 필요OPENAI_MODEL: (선택) 기본gpt-4o-miniREPORT_BACKGROUND_IMAGE_URL: (선택) 모든 PDF 페이지 배경 이미지 URLREPORT_FOOTER_LOGO_URL: (선택) 모든 PDF 페이지 하단 중앙 로고 URLREPORT_COVER_IMAGE_URL: (레거시) 배경 이미지 자동 로드 실패 시 fallback URLWEBHOOK_SECRET: Apps Script와 공유하는 시크릿REPORT_DEBUG_OUTPUT: (선택)true면 API 응답에 프롬프트/LLM raw/파싱 JSON 포함- (옵션)
PUPPETEER_EXECUTABLE_PATH: 로컬 PDF 렌더링용 Chrome 경로
예시:
REPORT_BACKGROUND_IMAGE_URL=https://<your-vercel-app>.vercel.app/saju-bg.pngREPORT_FOOTER_LOGO_URL=https://<your-vercel-app>.vercel.app/footer-logo.png
로컬에서 Gemini 없이 PDF 파이프라인만 빠르게 확인하려면:
SKIP_GEMINI=true WEBHOOK_SECRET=devsecret \
PUPPETEER_EXECUTABLE_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
PORT=3005 npm run dev그리고 다른 터미널에서:
WEBHOOK_SECRET=devsecret BASE_URL=http://localhost:3005 bash scripts/smoke-generate.sh긴 작업(LLM + PDF) 타임아웃 회피를 위해 start/poll 비동기 흐름을 사용하세요.
POST /api/generate/start
Headers:
X-Webhook-Secret: <WEBHOOK_SECRET>
Body:
{
"name": "홍길동",
"gender": "남",
"calendar": "solar",
"birth": { "year": 1992, "month": 10, "day": 24, "hour": 5, "minute": 30 },
"isLeapMonth": false
}Response:
status: "processing"jobToken: 다음 poll 호출에 전달할 토큰
POST /api/generate/poll
Headers:
X-Webhook-Secret: <WEBHOOK_SECRET>
Body:
{ "jobToken": "..." }Response:
- 진행 중:
status: "processing",jobToken,progressPercent - 완료:
status: "completed",pdfBase64,fileName,meta
레거시 동기 엔드포인트 POST /api/generate도 남아 있지만, 긴 생성에서는 타임아웃이 날 수 있습니다.
Apps Script 설정은 apps-script/README.md를 참고하세요.