From 15df3c0ad47b4c10a195c33a9d38f90e42f41c5f Mon Sep 17 00:00:00 2001 From: Claude-51124 Date: Sun, 18 Jan 2026 10:58:04 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20LangGraph=201.0=20=EC=97=85=EA=B7=B8?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EB=93=9C=20=EA=B3=84=ED=9A=8D=20=EB=AC=B8?= =?UTF-8?q?=EC=84=9C=20-=20Phase=201,=20Phase=202=20=EC=99=84=EB=A3=8C=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 현재 버전: langgraph 1.0.1 설치 완료 - Phase 1 완료: interrupt() 동적 인터럽트 마이그레이션 - Phase 2 완료: IR Deck 워크플로우 구현 - 테스트 통과: 총 12개 테스트 모두 통과 --- .../251218_langgraph_1.0_upgrade_plan.md | 51 ++++++++++++------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/journey/plans/251218_langgraph_1.0_upgrade_plan.md b/journey/plans/251218_langgraph_1.0_upgrade_plan.md index c938cf3..acbf4fe 100644 --- a/journey/plans/251218_langgraph_1.0_upgrade_plan.md +++ b/journey/plans/251218_langgraph_1.0_upgrade_plan.md @@ -1,8 +1,9 @@ # LangGraph 1.0 업그레이드 계획 **날짜**: 2025-12-18 -**수정일**: 2026-01-17 +**수정일**: 2026-01-18 **작성자**: admin +**진행 상태**: Phase 1, Phase 2 완료 ✅ **관련 파일**: - `rb8001/app/services/workflows/coldmail_workflow.py` - `rb8001/app/router/ir_deck.py` @@ -13,11 +14,11 @@ ## 현재 상황 -- **현재 버전**: `langgraph==0.6.10` (1.0은 2025-10-22 출시 완료, 업그레이드 가능) +- **현재 버전**: `langgraph>=1.0.0` (1.0.1 설치 완료, 2026-01-18) - **사용 위치**: - - 콜드메일 워크플로우 (`coldmail_workflow.py`) - `interrupt_after=["process"]` 사용 중 - - IR Deck 평가 (`ir_deck.py`) - `asyncio.create_task`로 비동기 실행 (LangGraph 미사용) -- **체크포인터**: `AsyncSqliteSaver` 사용 (`coldmail_briefing.py:103`, `coldmail_service.py:121`) + - 콜드메일 워크플로우 (`coldmail_workflow.py`) - `interrupt()` 동적 인터럽트 사용 ✅ + - IR Deck 평가 (`ir_deck_workflow.py`) - LangGraph 워크플로우 사용 ✅ +- **체크포인터**: `AsyncSqliteSaver` 사용 (`coldmail_briefing.py:103`, `coldmail_service.py:121`, `ir_deck.py`) **참고**: LangGraph 1.0은 2025-10-22 출시 완료. 현재 0.6.10에서 1.0으로 업그레이드 진행 가능. `interrupt_after`는 1.0에서도 지원되지만, `interrupt()` 동적 인터럽트 사용 권장. @@ -29,12 +30,18 @@ --- -## Phase 1: 콜드메일 워크플로우 HITL 패턴 마이그레이션 +## Phase 1: 콜드메일 워크플로우 HITL 패턴 마이그레이션 ✅ **완료** (2026-01-18) **목표**: `interrupt_after=["process"]` 정적 인터럽트 → 동적 `interrupt()` 사용 **파일**: `rb8001/app/services/workflows/coldmail_workflow.py` +**완료 내용**: +- `process_node`에서 `waiting_confirmation` 있을 때 `interrupt()` 동적 호출 추가 +- `create_workflow`에서 `interrupt_after` 제거 +- `coldmail_service.py`에서 `Command(resume=True)` 재개 로직 추가, `aupdate_state`로 `confirmed_email_id` 설정 +- 테스트 통과: `test_coldmail_workflow_interrupt.py` 4개, `test_coldmail_workflow_resume.py` 3개 + ### 1.1 마이그레이션 방법 **현재 코드** (0.6.10): @@ -86,13 +93,19 @@ result = await workflow.ainvoke(Command(resume=True), config=config) --- -## Phase 2: 프론트엔드 IR 평가 워크플로우화 +## Phase 2: 프론트엔드 IR 평가 워크플로우화 ✅ **완료** (2026-01-18) **목표**: `asyncio.create_task` 비동기 실행 → LangGraph StateGraph 워크플로우 **파일**: -- 신규: `rb8001/app/services/workflows/ir_deck_workflow.py` -- 수정: `rb8001/app/router/ir_deck.py` +- 신규: `rb8001/app/services/workflows/ir_deck_workflow.py` ✅ +- 수정: `rb8001/app/router/ir_deck.py` ✅ + +**완료 내용**: +- `ir_deck_workflow.py` 신규 생성 (5개 노드: extract, evaluate, analyze_pages, save, answer) +- `ir_deck.py`에서 `asyncio.create_task` → LangGraph 워크플로우 전환 +- 체크포인터 기반 상태 관리로 서버 재시작 시 자동 재개 지원 +- 테스트 통과: `test_ir_deck_workflow.py` 5개 ### 2.1 워크플로우 설계 @@ -174,15 +187,18 @@ class IRDeckState(TypedDict): --- -## 필요 작업 요약 +## 완료 작업 요약 -1. **버전 업그레이드**: `requirements.txt` - `langgraph==0.6.10` → `langgraph>=1.0.0` -2. **Phase 1**: `coldmail_workflow.py` - `interrupt_after` → `interrupt()` 동적 인터럽트 마이그레이션 -3. **Phase 1**: `coldmail_service.py` - `Command(resume=True)` 재개 로직 추가 -4. **Phase 2**: `ir_deck_workflow.py` 신규 생성 - IR 평가 워크플로우 구현 -5. **Phase 2**: `ir_deck.py` - `asyncio.create_task` → LangGraph 워크플로우 전환 -6. **Phase 3**: `workflow_recovery_service.py` 신규 생성 - 서버 재시작 시 미완료 워크플로우 자동 재개 (IR 평가만) -7. **테스트**: 각 Phase별 단위 테스트 및 통합 테스트 +1. ✅ **버전 업그레이드**: `requirements.txt` - `langgraph==0.6.10` → `langgraph>=1.0.0` (langgraph 1.0.1 설치 확인) +2. ✅ **Phase 1**: `coldmail_workflow.py` - `interrupt_after` → `interrupt()` 동적 인터럽트 마이그레이션 +3. ✅ **Phase 1**: `coldmail_service.py` - `Command(resume=True)` 재개 로직 추가, `aupdate_state`로 상태 업데이트 +4. ✅ **Phase 2**: `ir_deck_workflow.py` 신규 생성 - IR 평가 워크플로우 구현 (5개 노드) +5. ✅ **Phase 2**: `ir_deck.py` - `asyncio.create_task` → LangGraph 워크플로우 전환 +6. ✅ **테스트**: Phase 1, Phase 2 단위 테스트 및 통합 테스트 모두 통과 (총 12개 테스트 통과) + +## 남은 작업 + +- ⏳ **Phase 3**: `workflow_recovery_service.py` 신규 생성 - 서버 재시작 시 미완료 워크플로우 자동 재개 (IR 평가만, 선택적) --- @@ -194,4 +210,5 @@ class IRDeckState(TypedDict): - 관련 troubleshooting: - `troubleshooting/251015_claude_coldmail_workflow_langgraph_test.md` - `troubleshooting/251223_coldmail_langgraph_interrupt_and_checkpoint_fix.md` + - `troubleshooting/260118_langgraph_1.0_upgrade_ir_deck_workflow.md` ✅