DOCS/workflow/01_conversation/coldmail_ir_notification_sync.md
happybell80 9cb0145a4e docs: 01_conversation + 02_skills 워크플로우 문서 현행화 — n8n 제거, SKILL.md+executor 기준 재작성
- coldmail_ir_notification_sync: LangGraph+APScheduler 기반으로 전면 재작성
- slack_action_extractor_request: v2 IntentClassifier→executor 흐름 기준 재작성
- slack_thread_summary_request: 동일
- message_flow_v2: _format_as_robeing() 해석 단계 보완
- skill_calendar/email/news_request: SKILL.md→executor 직접 호출 기준 재작성
- skill_slack_send_message_bridge: slack_sdk 직접 호출 + skill-slack HTTP 이중 경로 기술
- slack_direct_api_send: grounding 개선 사항 반영

Refs: DOCS#8

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 07:57:58 +09:00

3.8 KiB
Raw Blame History

type, tags, last_updated
type tags last_updated
workflow
workflow
coldmail
langgraph
scheduler
ir-deck
2026-04-06

coldmail_ir_notification_sync 워크플로우

목적

콜드메일을 자동 감지하여 IR 자료 포함 여부를 판별하고, Slack에 요약 알림을 게시한다. 신뢰도에 따라 자동 등록 또는 사용자 확인을 거친다.

현행 아키텍처

  • 스케줄러: APScheduler DB 기반 cron (coldmail_briefing 잡)
  • 워크플로우 엔진: LangGraph StateGraph + AsyncSqliteSaver 체크포인트
  • Slack 전송: skill-slack 서비스 HTTP 호출 (SKILL_SLACK_URL 환경변수)

n8n은 사용하지 않는다.

흐름

APScheduler cron (평일 09:05)
  → coldmail_briefing.py._run_coldmail_briefing()
  → briefing_window 계산 (월요일 72h, 화~금 24h)
  → LangGraph 워크플로우 실행:
      fetch → filter → process → wait_confirmation (interrupt) → confirm → send → END

단계별 상세

1. 스케줄러 트리거

항목 내용
코드 app/scheduler/jobs/coldmail_briefing.py
설정 settings.COLDMAIL_BRIEFING_ENABLED, settings.COLDMAIL_BRIEFING_SCHEDULE
스케줄 cron 표현식 → APScheduler 형식으로 변환
사용자 settings.NAVERWORKS_COMPANY_EMAIL → UUID 조회

2. LangGraph 워크플로우

항목 내용
코드 app/services/workflows/coldmail_workflow.py
상태 ColdmailState TypedDict (emails, coldmail_candidates, processed_results, waiting_confirmation 등)
체크포인트 AsyncSqliteSaver (settings.LANGGRAPH_STATE_DIR / settings.LANGGRAPH_SQLITE_FILE)
thread_id coldmail:{user_id}:{date}

3. 노드 <20><>

노드 함수 역할
fetch fetch_node coldmail_email_fetcher.fetch_emails() 호출. 사전 주입 이메일이 있으면 그대로 사용
filter filter_node coldmail_hybrid_filter.hybrid_coldmail_filter() — 하이브리드 필터(첨부파일+본문) 적용
process process_node 신뢰도 95% 이상 자동 처리, 미만은 waiting_confirmation에 추가
wait_confirmation wait_confirmation_node interrupt() 호출하여 워크플로우 일시정지. 사용자 확인/거부 대기
confirm confirm_node 확인된 이메일을 리스트에 등록하고 로딩 메시지 업데이트
send send_node Slack 채널에 처리 결과 요약 전송

4. 조건부 라우팅

분기점 조건 다음 노드
filter 후 coldmail_candidates 있음 process
filter 후 coldmail_candidates 없음 END
wait_confirmation 후 confirmed_email_id 있음 confirm
wait_confirmation 후 waiting_confirmation 남음 wait_confirmation (루프)
wait_confirmation 후 둘 다 없음 send
confirm 후 waiting_confirmation 남음 wait_confirmation
confirm 후 없음 send

엔드포인트

  • 인바운드: 없음 (스케줄러가 내부 직접 호출)
  • 아웃바운드: POST {SKILL_SLACK_URL}/api/v1/send — Slack 요약 전송
  • 아웃바운드: POST {SKILL_SLACK_URL}/api/v1/update — 로딩 메시지 업데이트

환경변수

변수 용도
COLDMAIL_CHANNEL_ID Slack 알림 채널
SKILL_SLACK_URL skill-slack 서비스 URL
SKILL_SLACK_API_KEY / SERVICE_API_KEY skill-slack 인증
NAVERWORKS_COMPANY_EMAIL 이메일 조회 대상 사용자
LANGGRAPH_STATE_DIR 체크포인트 DB 디렉터리
LANGGRAPH_SQLITE_FILE 체크포인트 DB 파일명

관련 문서