
    Ri                         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Z	dZ
dZd Zdd	Zdd
ZddZddZddZddZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 	 	 ddZy)z@AI-powered comparison and benchmarking for output review system.    )annotationsN)Anyzclaude-sonnet-4-6i   i   c                     dd l } t        j                  j                  d      }|st	        d      | j                  |      S )Nr   ANTHROPIC_API_KEYu?   ANTHROPIC_API_KEY 환경변수가 설정되지 않았습니다.)api_key)	anthropicosenvirongetEnvironmentError	Anthropic)r   r   s     I/home/jay/workspace/.worktrees/task-2117-dev1/scripts/output_review_ai.py_get_anthropic_clientr      s;    jjnn01G`aaw//    c                T   | j                         } 	 t        j                  |       S # t        j                  $ r Y nw xY wt	        j
                  d| t        j                        }|r2t        j                  |j                  d      j                               S t        d| d d        )Nz```json\s*(.*?)```   u$   JSON을 추출할 수 없습니다:    )	stripjsonloadsJSONDecodeErrorresearchDOTALLgroup
ValueError)textms     r   _extract_jsonr      s    ::<Dzz$ 
		'ryy9Azz!''!***,--
;D#J<H
IIs   ' ==c           	     P   d| fd|fg}t        j                  |       |d   |d   c\  }}\  }}|rdj                  d |D              nd}	d| d	|	 d
| d| d	}
	 t               }|j                  j                  t        t        d|
dg      }t        |j                  d   j                        }t        |j                  dd            dk(  r|n|}i }|j                  di       j                         D ]W  \  }}t        |t        t         f      st#        |      dk(  s,t%        |d         t%        |d         }}|dk(  r||gn||g||<   Y |t        |j                  dd            |dS # t&        $ r.}t#        |       t#        |      k\  rdnd}|d| i dcY d}~S d}~ww xY w)uQ   AI 비교 판정. A/B 순서를 랜덤화하여 position bias를 방지합니다.ABr   r   
c              3  &   K   | ]	  }d |   ywz- N ).0axs     r   	<genexpr>z%compare_outputs_ai.<locals>.<genexpr>*   s     7r2bT7   u   - 전반적 품질   스킬: u   
평가 축:
u   

아웃풋 1:
u   

아웃풋 2:
uo   

JSON only: {"winner": "1" or "2", "reason": "...", "scores": {"axis": [s1,s2]}}
각 축 점수는 1~5 정수.userrolecontentmodel
max_tokensmessageswinner1scores   reason )r4   r8   r6   u   AI 판정 실패 (fallback): N)randomshufflejoinr   r3   createAI_MODELMAX_TOKENS_COMPAREr   r/   r   strr   items
isinstancelisttuplelenint	Exception)output_aoutput_b	eval_axes
skill_namerA   l1t1l2t2axes_strpromptclientmsgreswinner_labelr6   r(   valss1s2er4   s                         r   compare_outputs_airZ   %   s   8_sHo.E
NN5q58HRhr2;Dtyy7Y77J^H
:,ohZ7I"M_`b_c d( 	) 
_&(oo$$'9fagEhDi % 
 CKKN//0 3!78C?rR')"-335 	AHB$u.3t9>T!Ws47|B)+sb"XRr
	A '#cggh6K2LX^__ _HX6C .KA3,O[]^^_s,   B6E. E. !AE. .	F%7#F F% F%c                    d|  d| d}	 t               }|j                  j                  t        t        d|dg      }|j
                  d   j                  S # t        $ r Y yw xY w)	uV   AI를 사용해 해당 스킬의 전문가 수준 가이드/기법을 생성합니다.   스킬 'u	   '에서 'u   ' 주제의 전문가 수준 가이드와 핵심 기법을 실무에 바로 적용 가능하게 구체적으로 작성해주세요.r,   r-   r0   r   N)r   r3   r=   r>   r?   r/   r   rG   )rK   topicrQ   rR   rS   s        r   search_expert_outputr^   B   s     :,iw /S 	T &(oo$$'9fagEhDi % 
 {{1~""" s   AA 	A$#A$c                    dg dS )u>   스텁: Venus/Atlas 연동 전 self-review로 대체합니다.passverdictsuggestionsr&   )outputrK   s     r   cross_model_verifyre   R   s    b11r   c                >   |s| S d| d|rdj                  |      nd d|  ddj                  d |D              z   d	z   }	 t               }|j                  j                  t        t
        d
|dg      }|j                  d   j                  S # t        $ r | cY S w xY w)u7   AI를 사용해 개선된 아웃풋을 생성합니다.r+   u   
평가 축: , u   전반적 품질u
   

원본:
u   

개선 제안:
r#   c              3  &   K   | ]	  }d |   ywr%   r&   )r'   ss     r   r)   z+generate_improved_output.<locals>.<genexpr>^   s     2bH2r*   uZ   

제안을 반영한 개선 아웃풋만 출력하세요. 설명/메타 텍스트 없이.r,   r-   r0   r   )	r<   r   r3   r=   r>   MAX_TOKENS_IMPROVEr/   r   rG   )originalrc   rK   rJ   rQ   rR   rS   s          r   generate_improved_outputrl   W   s    
:,nYTYYy-ATf,g h:1	3
))2k2
2	3 i	i &(oo$$'9fagEhDi % 
 {{1~""" s   AB BBc                n    t        | |||      }|j                  d      dk(  ||j                  dd      dS )u8   v2가 v1보다 개선되었는지 AI로 검증합니다.r4   r"   r8   r9   )improved
comparisonr8   )rZ   r   )v1v2rJ   rK   ro   s        r   delta_verifyrr   k   s>    #BIzBJNN8,3 ..2. r   c                    t        | |||      }t        | |||      }||d<   |j                  dd      |d<   |j                  d      r|j                  | d       |S |j                  | d       | S )Ndelta_resultrn   Fimprovement_appliedu    기반 개선 적용 완료u3    개선 후 역행 감지 → AB winner로 fallback)rl   rr   r   append)	baserc   rK   rJ   init_process	learningslabelrn   deltas	            r   _apply_improvementr|   u   s     (k:yQHxJ?E#(L */))J*FL&'yyE7">?@wQRSKr   c           	        i dddd}g }t        | |||      }||d<   |j                  d      dk(  r| n|}|j                  d|j                  d       d|j                  d	d
      dd         |}	|dk(  rt        ||      }
|
s|j                  d       |	||dS d|
dd i|d<   d| d|
 d| d}g }	 t	               }|j
                  j                  t        t        d|dg      }t        |j                  d   j                        j                  dg       }|rpt        ||||||d      }	n^|dk(  rY	 t        ||      }||d<   |j                  d!      d"k(  r"t        ||j                  dg       ||||d      }	n|j                  d#       |	||dS # t        $ r}|j                  d|        Y d}~d}~ww xY w# t        $ r#}|j                  d|        dg d }Y d}~d}~ww xY w)$uD   전체 초회 강화 프로세스를 오케스트레이션합니다.NF)ab_comparisonbenchmark_resultru   rt   r~   r4   r!   u   A/B 비교: winner=rg   r8   r9   P   online_expertu?   전문가 검색 실패 → AB winner를 챔피언으로 사용)champion_outputrx   ry   expert_referencer   r   r\   uk   ' 전문가 가이드와 현재 아웃풋을 비교해 구체적 개선점을 나열하세요.

전문가:
u   

아웃풋:
z*

JSON only: {"suggestions": ["...", ...]}r,   r-   r0   r   rc   u   개선점 도출 실패: u   전문가 벤치마킹cross_modelu4   cross_model_verify 실패 → self-review fallback: r`   ra   rb   improveu*   cross_model verdict=pass → 개선 스킵)rZ   r   rv   r^   r   r3   r=   r>   r?   r   r/   r   rG   r|   re   )rH   rI   rJ   rK   benchmark_methodrx   ry   abwinner_outputr   expert_textrQ   rc   rR   rS   rY   verify_results                    r   run_init_enhancementr      sq   
  $	$L I	Hh	:	FB$&L! "x 0C 7HXM*266(+;*<BrvvhPR?STWUW?X>YZ[#O?**:zB^_'6clmm,>DS@Q+R'(zl #&-'7 G9: 	
 "$	>*,F//((+=RXekIlHm ) C (A(;(;<@@PRSK 0{J	<QZ\tO 
]	*	C.}jIM ,9'(Y'940!!-4O IJ.[dee7  	>8<==	>  	CSTUSVWX(.rBM	Cs1   3A&F 3F; 	F8F33F8;	G'G""G')r   r@   returndict[str, Any])
rH   r@   rI   r@   rJ   	list[str]rK   r@   r   r   )rK   r@   r]   r@   r   z
str | None)rd   r@   rK   r@   r   r   )
rk   r@   rc   r   rK   r@   rJ   r   r   r@   )
rp   r@   rq   r@   rJ   r   rK   r@   r   r   )rw   r@   rc   r   rK   r@   rJ   r   rx   r   ry   r   rz   r@   r   r@   )rH   r@   rI   r@   rJ   r   rK   r@   r   r@   r   r   )__doc__
__future__r   r   r	   r:   r   typingr   r>   r?   rj   r   r   rZ   r^   re   rl   rr   r|   r   r&   r   r   <module>r      s    F "  	  	   0	J_: 2
(
  	
 !   	(?f?f ?f-6?fDG?f[^?f?fr   