feat: v3.0 엔진 추상화 + 소설 파이프라인 추가
[1순위] 엔진 추상화 리팩토링 - config/engine.json: 단일 설정 파일로 writing/tts/image/video/publishing 엔진 제어 - bots/engine_loader.py: EngineLoader 팩토리 클래스 (Claude/OpenClaw/Gemini Writer, gTTS/GoogleCloud/OpenAI/ElevenLabs TTS, DALL-E/External 이미지) [2순위] VideoEngine 추상화 - bots/converters/video_engine.py: VideoEngine ABC + FFmpegSlidesEngine/SeedanceEngine/SoraEngine/RunwayEngine/VeoEngine 구현 - Seedance 2.0 API 연동 + 실패 시 ffmpeg_slides 자동 fallback [3순위] 소설 연재 파이프라인 - bots/novel/novel_writer.py: AI 에피소드 자동 생성 (Claude/엔진 추상화) - bots/novel/novel_blog_converter.py: 에피소드 → 장르별 테마 Blogger HTML - bots/novel/novel_shorts_converter.py: key_scenes → TTS + Pillow + VideoEngine → MP4 - bots/novel/novel_manager.py: 전체 파이프라인 조율 + Telegram 명령 처리 - config/novels/shadow-protocol.json: 예시 소설 설정 (2040 서울 SF 스릴러) [스케줄러] 소설 파이프라인 통합 - 매주 월/목 09:00 자동 실행 (job_novel_pipeline) - Telegram 명령: /novel_list, /novel_gen, /novel_status [기타 수정] - collector_bot.py: 한국어 유니코드 감지 + RSS 신뢰도 override 버그 수정 - quality_rules.json: min_score 70→60 - scripts/get_token.py: YouTube OAuth scope 추가 - .env.example: SEEDANCE/ELEVENLABS/GEMINI/RUNWAY API 키 항목 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
173
config/engine.json
Normal file
173
config/engine.json
Normal file
@@ -0,0 +1,173 @@
|
||||
{
|
||||
"_comment": "The 4th Path 블로그 자동 수익 엔진 — 엔진 설정 (v3)",
|
||||
"_updated": "2026-03-26",
|
||||
|
||||
"writing": {
|
||||
"provider": "claude",
|
||||
"options": {
|
||||
"claude": {
|
||||
"api_key_env": "ANTHROPIC_API_KEY",
|
||||
"model": "claude-opus-4-5",
|
||||
"max_tokens": 4096,
|
||||
"temperature": 0.7
|
||||
},
|
||||
"openclaw": {
|
||||
"agent_name": "blog-writer",
|
||||
"timeout": 120
|
||||
},
|
||||
"gemini": {
|
||||
"api_key_env": "GEMINI_API_KEY",
|
||||
"model": "gemini-2.0-flash",
|
||||
"max_tokens": 4096,
|
||||
"temperature": 0.7
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"tts": {
|
||||
"provider": "gtts",
|
||||
"options": {
|
||||
"google_cloud": {
|
||||
"api_key_env": "GOOGLE_TTS_API_KEY",
|
||||
"voice": "ko-KR-Wavenet-A",
|
||||
"speaking_rate": 1.05,
|
||||
"pitch": 0
|
||||
},
|
||||
"openai": {
|
||||
"api_key_env": "OPENAI_API_KEY",
|
||||
"model": "tts-1-hd",
|
||||
"voice": "alloy",
|
||||
"speed": 1.0
|
||||
},
|
||||
"elevenlabs": {
|
||||
"api_key_env": "ELEVENLABS_API_KEY",
|
||||
"model": "eleven_multilingual_v2",
|
||||
"voice_id": "pNInz6obpgDQGcFmaJgB",
|
||||
"stability": 0.5,
|
||||
"similarity_boost": 0.75
|
||||
},
|
||||
"gtts": {
|
||||
"lang": "ko",
|
||||
"slow": false
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"image_generation": {
|
||||
"provider": "dalle",
|
||||
"options": {
|
||||
"dalle": {
|
||||
"api_key_env": "OPENAI_API_KEY",
|
||||
"model": "dall-e-3",
|
||||
"size": "1024x1792",
|
||||
"quality": "standard"
|
||||
},
|
||||
"external": {
|
||||
"comment": "수동 이미지 제공 — 자동 생성 없음"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"video_generation": {
|
||||
"provider": "ffmpeg_slides",
|
||||
"options": {
|
||||
"ffmpeg_slides": {
|
||||
"resolution": "1080x1920",
|
||||
"fps": 30,
|
||||
"transition": "fade",
|
||||
"transition_duration": 0.5,
|
||||
"bgm_volume": 0.08,
|
||||
"zoom_speed": 0.0003,
|
||||
"zoom_max": 1.05,
|
||||
"burn_subtitles": true
|
||||
},
|
||||
"seedance": {
|
||||
"api_url": "https://api.seedance2.ai/v1/generate",
|
||||
"api_key_env": "SEEDANCE_API_KEY",
|
||||
"resolution": "1080x1920",
|
||||
"duration": "10s",
|
||||
"audio": true,
|
||||
"fallback": "ffmpeg_slides"
|
||||
},
|
||||
"sora": {
|
||||
"comment": "OpenAI Sora — API 접근 가능 시 활성화",
|
||||
"api_key_env": "OPENAI_API_KEY",
|
||||
"fallback": "ffmpeg_slides"
|
||||
},
|
||||
"runway": {
|
||||
"api_key_env": "RUNWAY_API_KEY",
|
||||
"model": "gen3a_turbo",
|
||||
"duration": 10,
|
||||
"ratio": "768:1344",
|
||||
"fallback": "ffmpeg_slides"
|
||||
},
|
||||
"veo": {
|
||||
"comment": "Google Veo 3.1 — API 접근 가능 시 활성화",
|
||||
"api_key_env": "GEMINI_API_KEY",
|
||||
"fallback": "ffmpeg_slides"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"publishing": {
|
||||
"blogger": {
|
||||
"enabled": true,
|
||||
"blog_id_env": "BLOG_MAIN_ID"
|
||||
},
|
||||
"youtube": {
|
||||
"enabled": true,
|
||||
"channel_id_env": "YOUTUBE_CHANNEL_ID",
|
||||
"category": "shorts",
|
||||
"privacy": "public",
|
||||
"tags": ["쇼츠", "AI", "the4thpath"]
|
||||
},
|
||||
"instagram": {
|
||||
"enabled": false,
|
||||
"account_id_env": "INSTAGRAM_ACCOUNT_ID"
|
||||
},
|
||||
"x": {
|
||||
"enabled": false
|
||||
},
|
||||
"tiktok": {
|
||||
"enabled": false
|
||||
},
|
||||
"novel": {
|
||||
"enabled": false,
|
||||
"comment": "노벨피아 연재 — 추후 활성화"
|
||||
}
|
||||
},
|
||||
|
||||
"quality_gates": {
|
||||
"gate1_research_min_score": 60,
|
||||
"gate2_writing_min_score": 70,
|
||||
"gate3_review_required": true,
|
||||
"gate3_auto_approve_score": 90,
|
||||
"min_key_points": 2,
|
||||
"min_word_count": 300,
|
||||
"safety_check": true
|
||||
},
|
||||
|
||||
"schedule": {
|
||||
"collector": "07:00",
|
||||
"writer": "08:00",
|
||||
"converter": "08:30",
|
||||
"publisher": "09:00",
|
||||
"youtube_uploader": "10:00",
|
||||
"analytics": "22:00"
|
||||
},
|
||||
|
||||
"brand": {
|
||||
"name": "The 4th Path",
|
||||
"sub": "Independent Tech Media",
|
||||
"by": "by 22B Labs",
|
||||
"url": "the4thpath.com",
|
||||
"cta": "팔로우하면 매일 이런 정보를 받습니다"
|
||||
},
|
||||
|
||||
"optional_keys": {
|
||||
"SEEDANCE_API_KEY": "Seedance 2.0 AI 영상 생성",
|
||||
"ELEVENLABS_API_KEY": "ElevenLabs 고품질 TTS",
|
||||
"GEMINI_API_KEY": "Google Gemini 글쓰기 / Veo 영상",
|
||||
"RUNWAY_API_KEY": "Runway Gen-3 AI 영상 생성"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user