블로그 자동 포스팅 에이전트 요약
개요
- GitHub Actions 워크플로가 매일 09:10 KST(UTC
00:10) 또는workflow_dispatch로 실행되어, 랜덤 소스 마크다운을 Jekyll 포스트로 변환합니다. - 에이전트는
_agent_source/에서 소스를 선택하고 LLM으로 변환한 뒤 검증을 통과하면_posts/에 저장합니다. 중복 방지는 state 기록과 아카이브 이동으로 처리합니다. - 소스 문서의 Obsidian 첨부 링크(
![[...]],@files/...)는 발행 시 공개 경로(/assets/agent-source/...)로 치환되며, 참조 파일은 구조를 유지한 채 복사됩니다. - 발행 방식은 PR 모드(기본)와 direct 모드(옵션)를 지원합니다.
- LLM 쿼터 소진(
insufficient_quota) 시 기본 동작은 워크플로 실패가 아닌 스킵 처리이며,FAIL_ON_LLM_ERROR=true로 실패 모드 전환이 가능합니다.
실행 흐름(요약)
tools/blog_agent/config.yml설정을 읽고(없으면 기본값 사용) 실행합니다._agent_source/의.md파일 목록에서.blog-agent/state.json에 기록된 사용 이력을 제외합니다.- 랜덤 소스를 선택한 뒤 LLM 프롬프트로 게시용 포스트를 생성합니다.
- 결과물을 검증합니다.
- front matter 파싱 및 필수 필드 확인
- 날짜 형식 검증
- 카테고리 2단 구조 및 태그 3–8개 확인
- 본문 최소 길이(기본 600자)
- 코드 펜스 균형 및 민감정보 패턴 차단
_posts/YYYY-MM-DD-<slug>.md로 저장하고, 원본은_agent_archive/로 이동합니다..blog-agent/state.json에 사용 이력 기록 및 workflow summary를 출력합니다.MODE=direct면 현재 브랜치에 커밋/푸시합니다.
중복 방지
- State 기록:
.blog-agent/state.json의used_sources에 저장된 파일은 다음 실행에서 제외됩니다. - Archive 이동: 처리된 원본은
_agent_archive/로 이동되어 재사용을 방지합니다.
Workflow Summary 출력
워크플로 요약에 아래 항목이 기록됩니다.
- 선택된 원본 파일명
- 생성된 포스트 파일명
- 검증 결과
Discord 모니터링(선택)
DISCORD_WEBHOOK_URL을 설정하면 실행 단계별 상세 로그가 Discord로 전송됩니다.- 소스 선택, LLM 요청, 검증 결과, 생성된 포스트 정보(제목/카테고리/태그/요약), GitHub Actions 실행 링크 등이 포함됩니다.
- 설정 방법은
tools/blog_agent/NOTIFICATIONS.md문서를 참고하세요.
실행 방법
로컬 실행
export LLM_API_KEY=...
# 선택: LLM_API_BASE, LLM_MODEL, MODE=direct
python tools/blog_agent/main.py
GitHub Actions 실행
- 스케줄 실행 또는
workflow_dispatch로 실행합니다. mode입력값(pr/direct)으로 발행 방식을 제어합니다.
필요한 Secrets
LLM_API_KEY(필수)LLM_API_BASE(선택)LLM_MODEL(선택)