-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path.env.example
More file actions
89 lines (78 loc) · 4.58 KB
/
Copy path.env.example
File metadata and controls
89 lines (78 loc) · 4.58 KB
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# ===== 공통 =====
NUTTI_ENV=dev # dev | staging | prod
NUTTI_LOG_LEVEL=INFO
NUTTI_DRY_RUN=true # true면 실제 외부 API 호출 없이 시뮬레이션으로 동작
# ===== 1단계: 대본 생성 (Claude) =====
ANTHROPIC_API_KEY=
NUTTI_SCRIPT_MODEL=claude-opus-4-8
# ===== 상태·분석·비용 =====
NUTTI_STATE_PATH=data/pipeline_state.json # 사이클 간 피드백·최근 주제 영속 상태
NUTTI_ANALYTICS_MIN_AGE_HOURS=48 # 업로드 후 성과 수집까지 숙성 시간(집계 지연 회피)
NUTTI_COST_LEDGER_PATH=data/cost_ledger.json # `nutti cost` 누적 비용 원장
# ===== 2단계: 영상 생성 (fal.ai FLUX.1 Kontext 프레임 → fal.ai Veo 3.1) =====
# FAL_KEY 하나로 시작 프레임(Kontext)·영상(Veo) 모두 처리. fal.ai 대시보드에서 발급.
FAL_KEY= # fal.ai API 키
NUTTI_MASCOT_IMAGE= # 마스코트 레퍼런스 이미지 경로 — 라이브 실행 시 필수(예: assets/mascot.png)
NUTTI_MEDIA_DIR=data/media # 프레임/영상 로컬 저장 디렉터리
# ----- fal.ai FLUX.1 Kontext 시작 프레임 -----
NUTTI_KONTEXT_MODEL=fal-ai/flux-pro/kontext
NUTTI_KONTEXT_POLL_INTERVAL_SEC=3.0
NUTTI_KONTEXT_TIMEOUT_SEC=120.0
# ----- fal.ai Veo 3.1 (단일 백엔드 veo_fal) -----
# 기본은 끝프레임 고정(ENDFRAME_LOCK=true)이라 FLF_MODEL이 실제 사용 모델이다.
# ENDFRAME_LOCK=false로 바꾸면 image-to-video(VEO_FAL_MODEL) 경로를 쓴다.
NUTTI_VEO_FAL_ENDFRAME_LOCK=true
NUTTI_VEO_FAL_FLF_MODEL=fal-ai/veo3.1/lite/first-last-frame-to-video
NUTTI_VEO_FAL_MODEL=fal-ai/veo3.1/lite/image-to-video # lite(저비용) | fast | standard
NUTTI_VEO_FAL_POLL_INTERVAL_SEC=10.0
NUTTI_VEO_FAL_TIMEOUT_SEC=600.0
NUTTI_VEO_FAL_RESOLUTION=720p # 720p(기본·저비용) | 1080p
# NUTTI_VEO_FAL_NEGATIVE_PROMPT= # 비우면 코드 기본값(자막·페이드·BGM 억제) 사용 — config.py 참조
NUTTI_VEO_FAL_SEED= # 비우면 영상마다 자동(영상 내 비트 간 일관, 영상 간 다양성)
NUTTI_VEO_FAL_CLIP_TAIL_TRIM_SEC=0.0 # 0=적응 무음 트림에 위임(기본)
# ----- 스티칭·자막·훅 오버레이 -----
NUTTI_VEO_FAL_CROSSFADE_SEC=0.35 # 비트 경계 디졸브 길이(0=단순 concat)
NUTTI_VEO_FAL_PUNCH_IN_SCALE=1.0 # 1.0 이하=비활성(기본, 2026-07-10 PO)
NUTTI_STITCH_SIM_THRESHOLD=18.0 # 경계 유사도 컷 MAD 임계(0 이하=비활성)
NUTTI_CAPTION_BURN=true # 하단 한글 자막 굽기(기본 켬, 2026-07-07 PO 승인)
NUTTI_CAPTION_FONT= # 비우면 OS 폰트 후보 탐색(잘난체→맑은고딕→Noto)
NUTTI_CAPTION_FONT_SIZE=34
NUTTI_CAPTION_Y_POS=960 # 자막 하단 y(1280 기준) — Shorts UI 회피
NUTTI_HOOK_OVERLAY=true # 훅 첫 문장 상단 텍스트 오버레이(무음 시청 대응)
NUTTI_HOOK_FONT_SIZE=48
NUTTI_HOOK_Y_POS=200
# ----- 비트 클립 QC 레이어(불량 클립 자동 재생성) -----
NUTTI_QC_ENABLED=true
NUTTI_QC_MAX_RETRIES=2
NUTTI_QC_FREEZE_MIN_SEC=0.5
NUTTI_QC_BLACK_MIN_SEC=0.3
NUTTI_QC_EDGE_IGNORE_SEC=0.5
NUTTI_QC_MIN_SPEECH_SEC=1.0
NUTTI_QC_TAIL_WINDOW_SEC=1.0
NUTTI_QC_TAIL_CONVERGE_MAD_MAX=20.0
NUTTI_QC_TAIL_DELTA_MAX=8.0
NUTTI_QC_TEXT_ENABLED=true # 화면 내 깨진 자막 비전 QC(Claude 판정)
# ===== 저장소: Google Sheets =====
GOOGLE_SHEETS_ID=
GOOGLE_SERVICE_ACCOUNT_JSON= # 서비스 계정 JSON 파일 경로
# ===== 검수: 텔레그램(단일 채널) =====
TELEGRAM_BOT_TOKEN=
TELEGRAM_CHAT_ID=
NUTTI_REVIEW_TIMEOUT_SEC=3600 # 검수 버튼 대기 최대 시간(초)
NUTTI_REVIEW_POLL_INTERVAL_SEC=3.0 # 텔레그램 폴링 간격(초)
NUTTI_REVIEW_STORE_PATH=data/reviews.json # 검수 상태 영속 파일
# ===== 4단계: 업로드 (YouTube 자동 · 인스타는 텔레그램 수동 핸드오프) =====
YOUTUBE_CLIENT_ID=
YOUTUBE_CLIENT_SECRET=
YOUTUBE_REFRESH_TOKEN=
# 업로드 공개 범위: public(운영 기본) | unlisted | private. 첫 라이브 검증은 private 권장.
NUTTI_YOUTUBE_PRIVACY_STATUS=public
# 알고리즘 노출 최적화 메타데이터
NUTTI_YOUTUBE_CATEGORY_ID=15 # 15=Pets & Animals(애견), 22=People & Blogs
NUTTI_YOUTUBE_DEFAULT_LANGUAGE=ko # 제목/설명·음성 언어(시청자 타겟팅)
NUTTI_YOUTUBE_MADE_FOR_KIDS=false # 아동용 선언(애견 콘텐츠는 false 권장)
# Instagram 키는 성과(인사이트) 조회용 — 자동 게시는 없음(수동 업로드).
INSTAGRAM_ACCESS_TOKEN=
INSTAGRAM_ACCOUNT_ID=
# ===== 간식계산기 (영상 설명란 고정 링크) =====
NUTTI_CALCULATOR_URL=https://nutti.co.kr/calculator.html