
    KiO                    T   d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZmZ ddlmZ ddlmZmZmZmZmZ  ej,                  e      Z ed	      Z G d
 d      ZdddZdddZedk(  r5 ej:                  ej<                          ej>                   e              yy)u=  publishing/chapter_runner.py — 챕터 단위 3대 엔진 합의도출 실행 진입점.

CLI 인터페이스: python3 chapter_runner.py --chapter N --task-id task-XXX
출처: memory/specs/three-engine-consensus.md

4개 검토시각: 자산관리전문가, 세금/연금전문가, 집필/편집전문가, 레드팀
    )annotationsN)Path)EngineResult)MAX_CONSENSUS_ROUNDSConsensusPipeline)PublishingAdapter)step1_parallel_draftstep2_gemini_synthesisstep3_chatgpt_reviewstep4_gemini_feedbackstep5_claude_finalz%/home/jay/workspace/memory/publishingc                  *    e Zd ZdZdddZddZd	dZy)
ChapterRunneru7   챕터 단위 3대 엔진 합의도출 파이프라인.c                    || _         || _        || _        || _        t	               | _        t               | _        i | _        y N)	_chapter_task_id_guide_chapter_infor   _adapterr   
_consensus_results)selfchaptertask_idguidechapter_infos        H/home/jay/workspace/services/multimodel-bot/publishing/chapter_runner.py__init__zChapterRunner.__init__$   s:    ))++-79    c                Z  K   t         d| j                   z  }|j                  dd       t        j	                  d       t        | j                  | j                        }| j                  j                  ||gddg| j                  d       d	{   }|| j                  d
<   | j                  |d|       t        |      dkD  r|d   j                  nd}t        |      dkD  r|d   j                  nd}t        j	                  d       t        ||      }d}g }|D ]s  }	|s|	n|	 d| }
| j                  j                  |
gdg| j                  d       d	{   }|j!                  |       |sU|d   j"                  re|d   j                  }u || j                  d<   | j                  |d|       t        j	                  dt$               | j&                  j)                          t+        dt$        dz         D ]  }t-        |      }| j                  j                  |gdg| j                  d       d	{   }|| j                  d| <   | j&                  j/                  |      st        j	                  d|        n|r|d   j                  nd}t1        ||      }| j                  j                  |gdg| j                  d       d	{   }|| j                  d| <   |r|d   j"                  s|d   j                  }| j                  |d|         t        j	                  d       t3        |      }| j                  j                  |gdg| j                  d       d	{   }|| j                  d<   | j                  |d|       | j                  S 7 7 H7 k7 7 =w)u   전체 파이프라인 실행.zchapter-T)parentsexist_oku.   Step 1: 병렬 초안 생성 (Claude + Gemini)claudegemini   )promptsenginesr   stepNstep1r    u   Step 2: Gemini 집대성u   

## 이전 결과
   step2u@   Step 3-4: ChatGPT 비평 → Gemini 반영 (최대 %d 라운드)codex   step3_roundu6   Round %d: 합의 달성 또는 최대 라운드 도달   step4_roundu   Step 5: Claude 최종 통합   step5)_OUTPUT_DIRr   mkdirloggerinfor	   r   r   r   run_stepr   r   
_save_steplencontentr
   extenderrorr   r   resetranger   should_continuer   r   )r   
output_dirpromptstep1_resultsdraft_claudedraft_geministep2_promptscurrent_contentstep2_results
sub_promptfull_promptresults	round_numreview_promptstep3_resultsfeedback	fb_promptstep4_resultsfinal_promptstep5_resultss                       r   runzChapterRunner.run-   s     Xdmm_#==
5 	DE%dkk43E3EF"mm44V$x(MM	 5 
 
 "/g
A}536}3E3I}Q'//r36}3E3I}Q'//r 	./.|\J,.' 
	5J,;*J<OefuevAwK MM22$!
	 3  G   )wqz//")!*"4"4
	5 "/g
A}5 	VXlmq"6":; 	:I0AM"&--"8"8& 		 #9 # M 8EDMMK	{34??22=ATV_` 4A}Q'//bH-oxHI"&--"8"8"!
	 #9 # M 8EDMMK	{34]1%5%;%;"/"2":":OOJ=97	:< 	23)/:"mm44!NJMM	 5 
 
 "/g
A}5}}W
&$
sj   BN+NCN+N!N+2N+B7N+9N$:BN+N'BN++N),3N+!N+$N+'N+)N+c                    t        |      D ]]  \  }}t        |      dkD  rd| nd}|d| | dz  }|j                  |j                  s|j                  nd|j                   d       _ y	)
u    Step 결과를 파일로 저장.r&   -r+   zstep-z.mdzERROR: utf-8encodingN)	enumerater;   
write_textr>   r<   )r   rB   r)   rL   iresultsuffixfilepaths           r   r:   zChapterRunner._save_step   sz    "7+ 	vIAv #Gq 0qWbF!eD6&$==Hfll'RXR`R`QaHbmtu	vr    N)r+   r+   )
r   intr   strr   rb   r   rb   returnNone)rc   zdict[str, list[EngineResult]])rB   r   r)   ra   rL   zlist[EngineResult]rc   rd   )__name__
__module____qualname____doc__r   rU   r:    r    r   r   r   !   s    A:Sjvr    r   c                   t        j                  d      }|j                  dt        dd       |j                  dt        dd       |j                  d	t        d
d       |j                  dt        d
d       |j                  |       S )u   CLI 인수 파싱.u&   3대 엔진 합의도출 챕터 실행)descriptionz	--chapterTu   챕터 번호)typerequiredhelpz	--task-idu   작업 ID (예: task-XXX)z--guider+   u.   집필가이드 텍스트 또는 파일 경로)rl   defaultrn   z--chapter-infou   챕터 정보)argparseArgumentParseradd_argumentra   rb   
parse_args)argvparsers     r   rs   rs      s    $$1YZF
#?S
#C^_
	R>no
(sB_UT""r    c                  K   t        |       }|j                  }|r4t        |      j                         rt        |      j	                  d      }t        |j                  |j                  ||j                        }|j                          d{   }t        j                  d|j                  t        |             y7 /w)u   메인 진입점.rX   rY   )r   r   r   r   Nu   챕터 %d 완료. Step 수: %d)rs   r   r   is_file	read_textr   r   r   r   rU   r7   r8   r;   )rt   argsr   runnerrL   s        r   mainr{      s     dDJJEe$$&U%%w%7&&	F JJL G
KK0$,,GM !s   BCC 0C__main__)levelr   )rt   list[str] | Nonerc   zargparse.Namespace)rt   r~   rc   rd   ) rh   
__future__r   rp   asynciologgingsyspathlibr   engine_v2.engine_resultr   publishing.consensus_pipeliner   r   publishing.publishing_adapterr   publishing.step_templatesr	   r
   r   r   r   	getLoggerre   r7   r5   r   rs   r{   basicConfigINFOrU   ri   r    r   <module>r      s    #    
  0 Q ;  
		8	$:;fv fvR#N" zGgll+GKK r    