bjooo commited on
Commit
cc02627
·
verified ·
1 Parent(s): 9c98083

Delete custom_nodes/dolphin_nodes/HANDOFF.md

Browse files
Files changed (1) hide show
  1. custom_nodes/dolphin_nodes/HANDOFF.md +0 -192
custom_nodes/dolphin_nodes/HANDOFF.md DELETED
@@ -1,192 +0,0 @@
1
- # Dolphin ComfyUI 노드 프로젝트 — 인수인계
2
-
3
- ## 프로젝트 목적
4
- ComfyUI에서 **이미지 1장(또는 텍스트 서사) + 로라 + 필수동작**을 넣으면
5
- **4개의 연속된 5초 비디오 클립(총 20초)** 을 만드는 커스텀 노드 세트.
6
-
7
- 비디오 체인은 WAN 2.2 Lightning 기반: `First`(clip1) + `Extend`×3(clip2~4 이어붙이기),
8
- 각 클립마다 TripleKSampler(base/high/low 3스테이지)로 샘플링.
9
-
10
- ---
11
-
12
- ## 현재 쓰는 파일 (7개 노드 + 워크플로우)
13
-
14
- ### 노드 코드 (커스텀 노드 폴더에 넣기)
15
- 1. **`__init__.py`** — 아래 5개 노드를 등록. 각 등록은 개별 try/except.
16
- 2. **`wan_resizer.py`** — `WanNativeResize_Dolphin`. 이미지를 WAN 해상도(480/720/1080P)로 비율 유지 리사이즈 + 정렬(16배수). (원본 그대로, 수정 안 함)
17
- 3. **`promp_logic_v32_story.py`** — `DolphinMultiActionPromptNode_V32`. 텍스트 서사 → LLM이 4샷 프롬프트로 분배. JSON 강제 + 폴백. 모델 프리셋 드롭다운 있음.
18
- 4. **`arch_logic_v16.py`** — `DolphinArchitectV16`. 클립별 LoRA를 model에만 적용(CLIP 로라 연산 제거로 속도↑) → TripleKSampler 공급. 트리거 통합 1출력. 해시 캐싱.
19
- 5. **`dolphin_director.py`** — `DolphinCinematicDirector`. ⚠️ **사실상 고장난 죽은 코드** (2026-07-03 확인). `_llm_split()`는 아무것도 반환하지 않고 호출되지도 않음, `direct()`는 `mode`/LLM 호출을 무시하고 `clips = [master_story] * 4`로 하드코딩, 로라도 전혀 적용 안 함. `__init__.py`엔 등록돼 있지만 실사용 금지 — 쓰려면 사실상 재작성 필요.
20
- 6. **`dolphin_vision_director.py`** — `DolphinVisionDirector`. **최신 주력 노드**. 이미지 직접 인식(VLM) + 필수동작 N샷 분배(`num_clips`) + 클립당 로라 4개(개별 웨이트, on/off 토글) + 트리거 자동 추출/주입.
21
- 7. **`dolphin_prompt_director.py`** — `DolphinPromptDirector` (2026-07-21 신설). `DolphinVisionDirector`와 **완전히 같은 비전+LLM 프롬프트 엔진**을 쓰되 `MODEL`/로라 관련을 전부 제거하고 프롬프트 문자열(`c1~c4_prompt`)만 뽑는 버전. 로직 중복을 피하려고 `DolphinVisionDirector`를 내부에서 인스턴스화해 `_vision_analyze`/`_plan_shots`/`_local_split`/`_build_final` 등 로라를 안 건드리는 순수 메서드만 위임 호출 — 프롬프트 정책(연속성 규칙 등)을 고치면 `dolphin_vision_director.py` 한 곳만 고치면 이 노드에도 자동 반영됨. 로라/모델 적용은 `DolphinArchitectV16` 같은 별도 노드에서 처리한다는 전제.
22
-
23
- ### 워크플로우 JSON
24
- - **`0705_vision2.json`** — **현재 실사용 중인 최신 워크플로우** (2026-07-03 기준). VisionDirector + JoyCaption(`JC` 노드) 로컬 캡션 우선 사용, `Model Loader`(f9a6f9ae 서브그래프)에서 lightx2v rank256 + SVI_v2_PRO rank128 사전 적용 → DolphinVisionDirector에서 클립별 PENISLORA(rank32) 패치 → ModelSamplingSD3 → NAG → TripleKSamplerWan22LightningAdvanced(First/Extend). 61개 노드, 서브그래프 16개.
25
- - `0705_vision.json` — vision2 이전 버전.
26
- - `0705_director.json` — CinematicDirector(텍스트) 버전. 위 5번 참고 — 노드 자체가 고장나 있어 이 워크플로우도 실동작 안 함.
27
- - `0705_optimized.json` — V32 + Architect V16 분리형 버전.
28
- (원본은 사용자가 처음 올린 `0705.json`. API 키는 vision/director/optimized 등 배포용 JSON에선 비워두는 게 원칙이나, `0705_vision2.json`은 사용자 로컬 작업본이라 실키가 들어있음 — 아래 "미해결" 참고.)
29
-
30
- ---
31
-
32
- ## DolphinVisionDirector 상세 (주력 노드)
33
-
34
- ### 입력
35
- - `image` (IMAGE) — WanNativeResize 출력에서
36
- - `model_base / model_high / model_low` (MODEL) — Model Loader에서
37
- - `essential_actions` — **필수 동작만** 콤마로. LLM이 이걸 N샷으로 분배.
38
- - `num_clips` (2026-07-03 추가) — `"4 (20s)"`/`"3 (15s)"`/`"2 (10s)"`, 기본 4. 실제 렌더링/저장될 클립 수를 여기서 단일 결정 (아래 "클립 개수 중앙 제어" 참고).
39
- - `character_name` (AUTO면 LLM이 작명), `artistic_vibe`, `pacing`, `detail_level`
40
- - `inject_triggers`(토글), `use_vision`(토글)
41
- - `openrouter_api_key`
42
- - `vlm_preset` + `vlm_model` — 비전 모델 (기본 Qwen2.5-VL 72B)
43
- - `llm_preset` + `llm_model` — 텍스트 분배 모델 (기본 DeepSeek V3.2)
44
- - `creativity`, `seed`
45
- - 로라: **`c{1..4}_lora_{1..3}`** (드롭다운) + **`c{1..4}_w_{1..3}`** (웨이트 문자열 `"base, high, low"`)
46
- - `manual_triggers`
47
-
48
- ### 출력 (23개, 2026-07-03 기준)
49
- - `c1_base, c1_high, c1_low, c1_prompt` × 4클립 (16개) — `num_clips`보다 큰 클립은 base/high/low가 `ExecutionBlocker(None)`
50
- - `triggers` — 사용된 모든 로라 트리거 통합
51
- - `scene_analysis` — VLM이 이미지에서 읽은 앵커
52
- - `debug_info`
53
- - `c1_is_final, c2_is_final, c3_is_final, c4_is_final` (2026-07-03 추가) — `c == num_clips`인 클립만 True. 각 단계별 VideoCombine의 `save_output` 입력에 연결해서 선택한 길이만 저장되게 함.
54
-
55
- ### 로라 웨이트 규칙 (스크린샷의 Triple Lora Matrix 방식 채택)
56
- - 로라당 웨이트를 `"base, high, low"` 한 줄로. 예: `0.3, 0.8, 0.0`
57
- - 값 부족 시 마지막 값으로 채움 (`1.0`→전부 1.0, `0.5, 0.7`→base 0.5/high·low 0.7)
58
- - **스테이지 분리 로라 지원**: WAN 2.2에서 HIGH 로라는 `0.3, 0.8, 0.0`(low=0), LOW 로라는 `0.0, 0.0, 0.4`(base·high=0)로 나눠 씀. 검증 완료.
59
- - 웨이트 0인 스테이지는 그 로라를 안 붙임.
60
-
61
- ### 프롬프트 설계 (사용자 요구 반영 완료)
62
- - **동작 순서 보존**: essential_actions는 시간순. 뒤 동작은 clip3 후반~clip4에만 (front-loading 금지).
63
- - **묘사 배제**: 환경/조명/의상/분위기 다 빼고 **동작(신체 움직임)만**.
64
- - **타임코드 제거**: `[0-1s]` 방식은 WAN I2V에서 노이즈라 뺌.
65
- - **슬로우모션 방지**: (1) 5초를 연속 동작으로 채움 (2) 속도 어휘(swiftly/rapidly/explosively) (3) "real-time speed, no slow motion, no freeze" 명시.
66
- - master_scene은 비움(묘사 안 함).
67
- - 비전 역할은 "묘사"가 아니라 "앵커(캐릭터 상태/자세/환경) 추출"로 좁혀 장황함 억제.
68
-
69
- ---
70
-
71
- ## 모델 프리셋 (OpenRouter, NSFW/무삭제 대응)
72
-
73
- ### 텍스트 LLM (4샷 분배용)
74
- - `deepseek/deepseek-v3.2` (기본, 무삭제+JSON안정+한국어 좋음) ← 추천
75
- - `deepseek/deepseek-chat-v3-0324`
76
- - `anthracite-org/magnum-v4-72b` (표현 자연스러움)
77
- - `thedrummer/cydonia-24b-v4.1` (경량)
78
- - `cognitivecomputations/dolphin-mistral-24b-venice-edition:free` (무료)
79
- - custom 선택 시 텍스트 필드값 사용
80
-
81
- ### 비전 VLM (이미지 인식용)
82
- - `qwen/qwen2.5-vl-72b-instruct` (기본, 특수상황 강함) ← 추천
83
- - `qwen/qwen2.5-vl-32b-instruct` (+ `:free` 무료)
84
- - `mistralai/mistral-small-3.1-24b-instruct` (Pixtral)
85
- - `google/gemma-3-27b-it`
86
-
87
- 이미지 전송: ComfyUI IMAGE 텐서 → JPEG base64 data URI → OpenRouter `image_url` content block. (PIL 필요, ComfyUI 기본 포함)
88
-
89
- ---
90
-
91
- ## 미해결 / 다음에 할 수 있는 것
92
-
93
- ### 다음 세션 최우선 확인 사항 (2026-07-03 세션 종료 시점)
94
- 1. **`lightning_steps` 8→4 수정 실사용 검증** — 슬로우모션 증상의 유력 원인으로 지목하고 고쳤지만(아래 3번 상세), 아직 실제 렌더로 개선 확인 안 함. ComfyUI는 이미 재시작됨(코드 변경 반영 완료), 워크플로우만 새로고침해서 한 번 돌려볼 것.
95
- 2. **`num_clips`/`Extend range` 관계 숙지** — `num_clips`가 이제 유일한 클립 개수 컨트롤. "Extend range"(Fast Groups Bypasser) 토글은 **절대 건드리지 말 것**(구 방식과 충돌).
96
- 3. ~~`openrouter_api_key` 평문 제거~~ **완료(2026-07-21)** — 아래 6번 참고.
97
- 4. **git 저장소 신설(2026-07-21)** — `dolphin_nodes`에 로컬 git 초기화 + 현재 상태 전체(코드/워크플로우/`old/`/`.bak_*`) 첫 커밋 완료. 앞으로 파일 수정 전 `.bak_*`/`_v조` 파일 복사하는 습관은 그만두고 `git commit`으로 대체할 것. `old/` 폴더와 17개 `.bak_*` 파일은 이제 git 히스토리로도 안전하게 보존돼 있으니, 폴더 정리(삭제)는 다음 세션에서 사용자 확인 후 진행 가능.
98
-
99
- 1. **NSFW 비전 모델 (해결)** — `0705_vision2.json`은 로컬 JoyCaption(`JC` 노드, `vision_caption` 입력)으로 OpenRouter VLM을 우회 중. `use_vision` 위젯은 **재확인 결과 이미 `true`(ON)로 켜져 있음** — JoyCaption이 성공하면 `vision_caption`을 우선 쓰고 VLM 호출 자체가 안 일어나지만, JoyCaption이 실패/빈 응답이면 이제 안전망으로 OpenRouter VLM 폴백이 작동함. 실행 로그(`debug_info`)에서도 `vlm=vision ok (local caption node)`로 정상 확인됨.
100
- - 클라우드 무삭제+이미지 동시지원 모델은 여전히 드묾(Qwen2.5-VL이 그나마 관대). 완전 로컬 VLM 전환은 대안 B로 남아있음(현재는 JoyCaption 로컬 캡션으로 사실상 우회 중이라 급하지 않음).
101
-
102
- 2. **로라 드롭다운 검색/필터** — 노드 코드로 불가. ComfyUI 프론트엔드 기능이라 ComfyUI 업데이트로 해결하거나 rgthree-comfy 설치 필요.
103
-
104
- 3. **슬로우모션/연기 일관성**:
105
- - **클립 "안"의 슬로우모션 (2026-07-03 원인 특정, 수정 적용함 — 실사용 검증 아직)**: 로라 파일명(`Wan_2_2_I2V_A14B_HIGH/LOW_lightx2v_4step_lora_...`, 그 외 D:/sd/models/loras의 다른 Lightning 로라들도 전부 "4step/4steps")이 전부 **총 4스텝 증류**를 명시하는데, 워크플로우의 TripleKSampler 4개(clip1~4, node 532/484/480/1077) 전부 `lightning_steps=8`(HIGH 4 + LOW 4, 50% 지점 분할)로 설정돼 있었음 — 증류 스텝의 **정확히 2배**. 증류된 Lightning 모델에 계산보다 많은 스텝을 쓰면 스케줄을 벗어나서 동작이 억눌리고 뭉개지는(슬로우모션처럼 보이는) 현상이 흔함. **`lightning_steps`를 4개 노드 전부 8→4로 변경 완료**(��업: `0705_vision2.json.bak_20260703_before_lightningsteps`). 나머지 값(sigma_shift=5, switch_strategy="50% of steps" 등)은 그대로 — 2 HIGH + 2 LOW로 재분배됨. **다음 세션에서 실제 렌더로 개선 여부 확인 필요**.
106
- - 참고로 조사 중 "외부 ModelSamplingSD3 서브그래프(shift=5) + TripleKSampler 자체 내부 sigma_shift=5 이중 적용" 가설도 검토했으나, `comfy/model_sampling.py`의 `set_parameters()`가 매번 새 model_sampling 객체로 완전히 덮어쓰는 방식이라 **이중 적용해도 누적 안 됨**(같은 값으로 두 번 걸면 한 번 건 것과 동일) — 이건 범인 아님, 낭비적이지만 무해한 중복이라 안 건드림.
107
- - **클립 "사이" 연속성(2026-07-03 해결)**: `_plan_shots` 시스템 프롬프트에 rule 3 "INTER-CLIP CONTINUITY" 추가 — clip_N이 clip_(N-1) 끝난 자세/모멘텀에서 이어서 시작하도록 명시. I2V 프레임 체인(마지막 프레임 그대로 다음 클립 시작)은 원래도 있었지만, 텍스트 프롬프트가 그 연속성을 언급 안 해서 "따로 노는 동작"처럼 보일 수 있었던 gap을 메움. 실사용 검증은 아직 안 함 — 다음 세션에서 4클립 이어보고 확인 필요.
108
-
109
- 4. **동일 로라 중복 로딩** — 4클립 같은 로라면 4번 패치(클립별 유연성 위한 의도적 트레이드오프). 캐싱 최적화 가능하나 미적용.
110
-
111
- 5. `dolphin_director.py`(텍스트 버전) — 위 "현재 쓰는 파일" 참고, 로라 방식 통일 이전에 **노드 자체가 동작하지 않음**. 재작성하거나 `__init__.py`에서 등록 제거할지 결정 필요.
112
-
113
- 6. **`0705_vision2.json` 워크플로우 정리 항목 (2026-07-03 감사)**:
114
- - ~~`use_vision` OFF → ON 권장~~ **재확인 결과 이미 `true`로 바뀌어 있었음** (핸드오프 기록이 낡았던 것, 실제 위젯값 재확인 완료).
115
- - ~~죽은 `StringConcatenate` 노드(id 1062)~~ **이미 삭제돼 있음** (재확인 완료).
116
- - ~~`openrouter_api_key` 위젯에 여전히 실키가 평문 저장돼 있음~~ **해결됨(2026-07-21)**: 키를 Windows User 환경변수 `OPENROUTER_API_KEY`로 옮기고, `0705_vision2.json` + 모든 `.bak_*` + `v30.json` + 중복본(`0705_vision2 (1).json`)에서 키 문자열 전부 제거 후 git 커밋(그래서 git 히스토리에도 안 들어감). `resolve_api_key()`가 위젯 비어있으면 자동으로 env var 사용. ComfyUI도 새 env var 반영을 위해 재시작함 — **다음 세션에서 debug_info가 `vlm=no api key`로 뜨진 않는지만 확인하면 끝**.
117
- - `triggers` 출력 포트 미연결(디버깅용, 급하지 않음).
118
-
119
- 7. **검증 완료 (2026-07-03) — 더 이상 의심 안 해도 됨**:
120
- - **로라 인젝션 체인 전수 확인**: `Model Loader`(553) → `DolphinVisionDirector`(1086) → `ModelSamplingSD3` → `NAG` → `TripleKSamplerWan22LightningAdvanced`(First/Extend) 까지 4클립 전부 끊김/교차배선 없이 연결됨. 파일 경로 전부 실재, weight 0/None 오류 없음. 실행 로그(`comfyui_restart_log.txt`)에도 트리거워드 `PENISLORA` 주입 확인됨.
121
- - **lightx2v는 이미 rank256으로 적용 중** (HIGH/LOW 둘 다, weight 1.0), SVI_v2_PRO rank128과 스택. `model_base`(stage1)엔 lightx2v 미적용(의도된 설계 — stage1은 non-lightning 풀스텝), `model_high`/`model_low`(stage2/3)에만 적용.
122
- - PENISLORA HIGH(e320)/LOW(e496)는 rank32 (안전텐서 텐서 shape로 직접 확인).
123
-
124
- ---
125
-
126
- ## 최근 수정 이력 (dolphin_vision_director.py)
127
-
128
- ### 2026-07-03 세션
129
- - **`_plan_shots` 에러 삼킴 버그 수정**: LLM 4샷 분배 API 호출 실패 시 실제 원인(HTTP 코드/본문, 예외 타입, 불완전 JSON)이 `last` 변수에만 담기고 버려져서 `debug_info`엔 항상 "⚠️ plan failed"만 찍혔음. 이제 원인이 그대로 `debug_info`/콘솔에 남음.
130
- - **API 키 환경변수 폴백 추가**: `resolve_api_key()` 함수 — `openrouter_api_key` 위젯이 비어있으면 `OPENROUTER_API_KEY` 환경변수 사용. 기존 위젯에 키가 있으면 동작 그대로(하위호환), 워크플로우 JSON에 실키를 안 박아둬도 되게 하려는 목적.
131
- - **클립 간 물리적 연속성 규칙 추가** (`_plan_shots` 시스템 프롬프트): 새 rule 3 "INTER-CLIP CONTINUITY" — clip_N은 clip_(N-1)이 끝난 정확한 신체 위치/모멘텀에서 이어서 시작(단, "continuing from" 같은 연결 문구를 텍스트에 직접 쓰는 건 금지 — 물리적 일관성만 지키고 "동작만 쓴다" 규칙과 안 부딪히게). 기존 rule 2(clip_1은 이미지 속 자세에서 시작)는 clip_1에만 적용됐던 걸 clip_2~4로 확장한 셈. 규칙 번호 3~8이 4~9로 밀림(내부 상호참조도 전부 갱신됨).
132
- - **미사용 데드코드 제거**: `_fallback_name_deterministic` (호출부 없음, 주석에도 "미사용"이라 표시돼 있었음).
133
- - **백업**: 위 변경 전 버전을 `old/dolphin_vision_director_pre_continuity_20260702.py`에 저장.
134
- - **`0705_vision2.json` 전수 감사** + **���라 인젝션 체인 전수 검증** — 상세는 위 "미해결" 6번/7번 항목 참고.
135
- - **ComfyUI 재시작 완료**: 기존 프로세스(PID 5452) 종료 후 동일 실행 옵션(`--enable-dynamic-vram --use-sage-attention --output-directory D:\sd\output`)으로 재기동, `dolphin_nodes` 에러 없이 로드 확인, `DolphinVisionDirector` API 등록 확인. 재시작 로그는 `comfyui_restart_log.txt`(stdout) / `comfyui_restart_log.txt.err`(stderr, 진행상황 대부분 여기).
136
- - 문법 컴파일(`py_compile`) 확인 완료. **아직 실제 4클립 생성 재실행으로 rule 3 효과는 검증 안 함** — 다음 세션 우선 확인 사항.
137
-
138
- ### 2026-07-03 세션 (이어서) — 메모리 정리 / 클립 개수 중앙 제어 / 속도 실험
139
-
140
- **1. VRAM 정리 자동화 (해결)**
141
- - 증상: 워크플로우 실행 후 VRAM이 절반쯤 계속 점유된 채 안 비워짐. 원인은 버그가 아니라 ComfyUI의 정상 캐싱 동작(다음 실행 빠르게 하려고 마지막 쓴 모델을 VRAM에 남겨둠) — 다만 이걸 강제로 비워주는 노드가 그래프에 없었음.
142
- - 이미 설치돼 있던 `comfyui_memory_cleanup` 커스텀 노드(`VRAMCleanup`, 표시명 "🎈VRAM-Cleanup")를 최종 저장 노드(`VHS_VideoCombine` id 487)의 출력에 연결(node 1092, `offload_model=True, offload_cache=True`) → 렌더 끝나면 자동으로 `unload_all_models()` + `soft_empty_cache()` 실행됨. 위치는 First-I2V bypass 그룹 박스 안에 잘못 들어갔던 걸 나중에 밖으로 재배치함(그룹 좌표 [3450, -509]로 이동, 어떤 그룹에도 안 걸리게).
143
- - 트레이드오프: 다음 생성 시작 시 모델을 디스크에서 다시 로드해야 해서 첫 스텝 전 로딩 시간이 늘어남.
144
-
145
- **2. 클립 개수(10s/15s/20s) 중앙 제어 — `DolphinVisionDirector`가 단일 컨트롤 포인트 (해결)**
146
- - 처음엔 워크플로우에 이미 있던 "Extend range"(rgthree `Fast Groups Bypasser`, node 332) 토글로 clip3/4 렌더를 스킵하는 방식을 검토했으나, 이 노드는 **순수 프론트엔드 전용**(백엔드 미등록, `RgthreeBaseVirtualNode`)이라 다른 노드가 프로그래밍적으로 제어 불가 + `num_clips`와 별도로 수동 동기화해야 하는 문제가 있어서 폐기.
147
- - 대신 `DolphinVisionDirector`에 `num_clips` 위젯(`"4 (20s)"`/`"3 (15s)"`/`"2 (10s)"`, 기본 4, 하위호환) 추가. `_split_actions_to_clips`/`_plan_shots`(LLM 시스템 프롬프트+JSON 스키마)/`_local_split`(폴백) 전부 클립 개수에 맞춰 동적으로 동작하도록 일반화(마지막 동작=마지막 클립 규칙, 연속성 규칙 모두 N클립 대응). num_clips보다 큰 클립 인덱스는 essential_actions 배분에서 제외되고, 마지막 실사용 클립 내용을 반복해서 채움(안전장치).
148
- - **실제 렌더 스킵은 ComfyUI 네이티브 `ExecutionBlocker`로 구현** (`from comfy_execution.graph_utils import ExecutionBlocker`): `num_clips`보다 큰 클립의 `c{N}_base/high/low` 출력에 `ExecutionBlocker(None)`을 반환 → 그 아래 `ModelSamplingSD3→NAG→TripleKSampler→해당 클립 VideoCombine` 체인 전체가 연산 없이 자동 스킵됨(서브그래프 내부는 안 건드림 — DolphinVisionDirector가 top-level에서 서브그래프 인스턴스로 모델을 넘기는 구조라 출력 쪽만 바꾸면 됨).
149
- - **정확한 길이만 저장**: 새 BOOLEAN 출력 4개 `c1_is_final~c4_is_final`(RETURN_TYPES/NAMES 19→23개로 확장, `direct()`가 `c == n_clips`로 계산) 추가 → 각 단계별 `VHS_VideoCombine`(1091=5s/456=10s/464=15s/487=20s)의 `save_output` 위젯을 입력으로 변환(convert widget to input, `frame_rate`가 이미 이렇게 돼있던 패턴 재사용)해서 연결. 실행되지만 최종이 아닌 중간 클립은 미리보기로만 남고, `num_clips`가 선택한 길이 딱 하나만 디스크에 저장됨. 각 VideoCombine 파일명도 `_5s/_10s/_15s/_20s` 접미사로 구분해둠(예전엔 `Wan2`라는 구분 안 되는 접두사였음).
150
- - "Extend range" 노드는 이제 완전히 불필요 — **토글을 절대 건드리지 말 것**(건드리면 옛날 bypass 방식과 새 ExecutionBlocker 로직이 충돌해서 혼란스러운 결과 가능). 삭제할지는 미결정, 일단 놔둠.
151
- - 백업 다수: `0705_vision2.json.bak_20260703_before_vramcleanup`, `..._before_torchcompile`, `..._before_numclips`, `..._before_isfinal_wiring`, `..._before_torchcompile_revert`, `..._before_lightningsteps`.
152
-
153
- **3. 속도 실험 — 둘 다 실익 없어서 원복/포기**
154
- - **torch.compile**: `TorchCompileModel` 노드 3개(base/high/low, 클립당 1회만 컴파일되게 Model Loader 출력 쪽에 배치)로 테스트 → 실행 로그에 `torch._dynamo hit config.recompile_limit (8)` 반복(원인: `attention_sage`와 WAN 모델 forward의 `tensor_shape` 속성 접근이 dynamo가 추적하기 어려운 커스텀 텐서 서브클래스라 매번 재컴파일 필요 → 8회 만에 조용히 eager 폴백). 컴파일 이득 0, 오히려 실패 컴파일 시도로 시간 낭비 ��� **노드 3개 제거, 원래 직결 배선 복원함**.
155
- - **SageAttention 3 (Blackwell/RTX5090 전용, FP4 텐서코어, 논문상 RTX5090 5x/비디오모델 end-to-end 약 3x)**: 소스 빌드 시도했으나 순서대로 3개 문제 부딪힘 — ① PyTorch(cu130)와 시스템 nvcc(12.8) 메이저 버전 불일치(→ `torch.utils.cpp_extension._check_cuda_version` 몽키패치로 우회 성공) ② Windows `MAX_PATH`(260자) 초과로 CUTLASS 헤더를 못 찾음(→ `C:\sage3build`처럼 짧은 경로로 재클론해서 해결) ③ **CUTLASS 템플릿(`BlockScaledConfig::LayoutSF`/`SfAtom`)에서 MSVC C2061 컴파일 에러** — CUTLASS 버전을 sageattn3 코드 작성 시점(2026-01-14 커밋)까지 맞춰봐도 동일 에러 재현, 패키지 PyPI 분류자도 `"Operating System :: Unix"`라 애초에 Linux/GCC 전용 개발로 보임 → **MSVC 템플릿 2단계 name lookup 호환성 문제로 결론, 빌드 포기**. 빌드 흔적(`C:\sage3build`, 스크래치 클론) 삭제 완료, `sageattn3`은 site-packages에 설치 안 됨(ComfyUI 환경 무변경).
156
- - 참고: KJNodes(`comfyui-kjnodes`)의 `PathchSageAttentionKJ` 노드(`KJNodes/experimental` 카테고리)가 `sageattn3` 모드를 이미 지원하므로, 나중에 WSL2 등 Linux 환경에서 별도로 빌드에 성공하면 **ComfyUI 코어를 안 건드리고** 이 노드만 워크플로우에 추가해서 바로 쓸 수 있음(다만 WSL에서 빌드한 건 Windows 네이티브 Python엔 못 씀 — ComfyUI 자체를 WSL로 옮기는 게 아니라면 의미 없음, 별도의 큰 결정 필요).
157
- - 현재 상태: 기존 `sageattention` v2.2.0(cu130torch2.9.0 빌드) 그대로 유지, `--use-sage-attention` 플래그로 정상 작동 중. RTX 5090(sm_120) 전용 커널은 없지만(v2는 sm80/89/90까지) 크래시 없이 잘 돎.
158
-
159
- ### 3대 버그 수정
160
- - **① 캐릭터 이름 AUTO로 샘**: 비전 앵커로 동양/서양 판단해 작명하도록 프롬프트 강화 + `_fallback_name()` 안전장치(LLM이 AUTO/빈값 반환 시 앵커 키워드로 이름 선택).
161
- - **② 마지막 동작을 처음부터 함**: `_split_actions_to_clips()`가 동작을 코드에서 클립별로 미리 배정(마지막 동작은 반드시 clip4), LLM엔 배정표를 못박아 전달. 순서 위반이 최우선 금지 규칙.
162
- - **③ 트리거워드 안 들어감**: `triggers` 출력 부활 + 클립별 로라 트리거 디버그(`_last_trig_dbg`) 콘솔 출력.
163
-
164
- ### 비전 진단 강화 (사용자가 "비전 작동 의심" 제기 후)
165
- - `tensor_to_base64`: PIL/None/인코딩 실패를 명확한 콘솔 에러로. 성공 시 이미지 크기 로그.
166
- - `_vision_analyze`: VLM 응답 원문/HTTP 에러/빈 응답을 콘솔에 출력.
167
- - `direct` STEP1: use_vision OFF / no key / no image / encode fail 각각 구체적 debug_v 메시지.
168
- - **debug_info 출력만 봐도 비전 실패 원인 파악 가능**:
169
- - `vlm=no api key` → 키 미입력 (사용자 증상의 유력 원인)
170
- - `vlm=vision OFF` → 토글 꺼짐
171
- - `vlm=no image` → IMAGE 미연결
172
- - `vlm=vision HTTP 400` → VLM 거부(슬러그 오타/NSFW 거부)
173
- - `vlm=vision empty response` → 빈 응답
174
- - `vlm=vision ok` → 정상
175
-
176
- ### 진단 결론
177
- "씬 묘사 없음 + AUTO + 바로 동작" 증상 = 비전+LLM 실패 후 로컬 폴백. **가장 유력한 원인은 openrouter_api_key 미입력**(워크플로우에서 보안상 비워둠). 다음 실행 시 debug_info 확인 필요.
178
-
179
- ### 프롬프트 정책 (확정)
180
- - 타임코드([0-1s]) 제거 (WAN 노이즈). 대신 연속동작+속도어휘로 슬로우모션 방지.
181
- - 묘사(환경/조명/의상) 배제, 동작만. master_scene 비움.
182
- - 동작 순서 보존, 마지막 동작은 clip4.
183
-
184
- ---
185
-
186
- ## 중요 참고
187
- - **git 저장소 있음 (2026-07-21부터)**: `dolphin_nodes` 자체가 로컬 git 저장소(`git init` 완료, 원격 없음/로컬 전용). 상위 ComfyUI 저장소의 `.gitignore`가 `custom_nodes/`를 통째로 무시해서 이 폴더는 별도 독립 저장소로 관리. `.gitignore`는 `__pycache__/`, 런타임 로그, `dolphin_tags_cache.json`, `.claude/settings.local.json` 제외. 커밋 전 `git status`/`git diff`로 확인 습관화, 새 `.bak_*` 파일 만드는 대신 `git commit` 사용.
188
- - **위젯 이름이 바뀌면** 기존 저장 워크플로우의 로라 설정이 초기화될 수 있음. VisionDirector는 최근 `_h_clip` 헤더 제거 + `c{c}_lora_{n}` 이름으로 변경됨.
189
- - 모든 노드: `INPUT_TYPES`의 required 순서 = 함수 시그니처 순서 (ComfyUI 규칙). 수정 시 AST로 일치 검증할 것.
190
- - 워크플로우 편집 후엔 항상 무결성 체크: dangling_in / backref_mismatch / slot_oob 전부 0이어야 함. (단, `outputs[].links`에 참조된 링크 id가 top-level `links`에도 서브그래프 `definitions.subgraphs[].links`에도 없는 "유령 출력링크"는 정상적으로 존재할 수 있음 — 과거 편집 잔재로, ComfyUI가 로드시 무시하는 것으로 보임. `0705_vision2.json`의 negative prompt 노드(817)/서브그래프(553)에 ~1700개 있었���데 실행엔 지장 없었음.)
191
- - 원본 `0705.json`의 UUID 노드들은 subgraph (First/Extend/Encode 등). `definitions.subgraphs[]`에 정의가 있고, 인스턴스 노드의 `type` 필드가 그 서브그래프의 `id`(UUID)와 일치.
192
- - **`0705_vision2.json` LoRA/모델 체인 구조** (디버깅 시 참고): `Model Loader`(553, "f9a6f9ae..." 서브그래프)에서 GGUF 베이스 로드 + lightx2v(rank256) + SVI_v2_PRO(rank128)를 미리 적용해 `MODEL`(slot0, =model_high, lightx2v 있음)/`MODEL_1`(slot1, =model_low, lightx2v 있음)/`MODEL_2`(slot4, =model_base, lightx2v **없음** — stage1은 non-lightning 풀스텝이라 SVI만 적용) 3종을 출력 → `DolphinVisionDirector`가 클립별 캐릭터 로라를 추가 패치 → 클립마다 `ModelSamplingSD3` 서브그래프 → `NAG`(WanVideoNAG) 서브그래프 → `First`/`Extend` 서브그래프 내부 `TripleKSamplerWan22LightningAdvanced`로 도달. 클립1=786/787/453(First), 클립2=791/792/462(Extend), 클립3=793/794/463(Extend), 클립4=1070/1071/1080(Extend) — 각각 ModelSamplingSD3/NAG/샘플러 순. (444는 별개의 "Encode" 서브그래프로 이미지→latent 변환만 담당, 이 모델 체인과 무관.)