
    1Dj                         d Z ddlZddlZddlZddlZddlmZ  ed      Zedz  Zedz  dz  Z	dZ
d	Zd
ededefdZdefdZdefdZedk(  r e e             y)u*  shot_selection canary — Flash 3.5 vs 3.7 이 **고르는 샷**이 갈리나.

왜 이 스텝인가: Flash 교체가 그림에 닿는 자리는 실측으로 둘뿐이었다 —
`shot_selection`(무엇을 그릴지)과 `shot_dependency_t2i`(참조 선택).
후자는 이미 봤고(edge 6/6 동일) 이것만 남았다. 고르는 샷이 갈리면
그림이 통째로 달라지므로 영향이 가장 크다.

지키는 것은 dependency canary 와 같다 — 이미지 0장, CP 안 건드림
(`_execute` 만 부른다), 조립을 다시 만들지 않고 `call_structured` 를
감싸 나가는 것을 기록만 한다. 모드는 **프로세스로** 가른다.

    python scratchpad/canary_shot_selection.py --model gemini-3.5-flash [--dry]
    python scratchpad/canary_shot_selection.py --compare A.json B.json
    N)Pathz*/Users/manta/Documents/Projects/TheRoad-I1backend
scratchpadcanary_shot_selectionz$da049582-2c6d-492c-979d-f468d61bab6ez$fb7a883f-baac-4145-9131-732ce628d474modeldryreturnc                    | t         j                  d<   t        j                  j	                  dt        t                     t        j                  t               ddlm	} |j                  | k(  sJ d|j                         ddlm} ddlm} ddlm} ddlm} g |j&                  fd	}||_         |       }	  |d
t(        t*        | ||t(              d|  ddd      }	|	j-                  d      }
|_        |j/                          |
j1                  di       j1                  dg       D ci c]  }d|d    |j1                  dg        }}| t3              t5        d D              t7        t9        |j;                                     d}t<        j?                  dd       t<        |  drdnd dz  }|jA                  tC        jD                  |dd !      d"#       tG        d$|  d%rdnd d&t3               d'|d(           |d)   j;                         D ]  \  }}tG        d*| d+|         tG        d,|        |S # |_        |j/                          w xY wc c}w )-NGEMINI_FLASH_MODELr   )settingsu   env 가 안 먹었다: )SessionLocal)shot_selection_step)get_step_runner)_load_project_configc                      t        | j                  d      xs d      t        | j                  d      xs d      d}rd|d<   j                  |       dg iS  di | }||d<   j                  |       |S )	Nuser_prompt system_prompt)usr_lensys_lenz<dry>resultselected_shots )lengetappend)kwrecr   callsr   	real_calls      N/Users/manta/Documents/Projects/TheRoad-I1/scratchpad/canary_shot_selection.py_spyzrun_one.<locals>._spy.   s~    bff]39r:bff_5;<>#CMLL$b))RHS    shot_selectioncanary_flash_canary_flash_selectionu
   골목 끝)run_tagproject_nameepisode_title)opik_contextresume)modedatascenesSscene_indexselected_shot_indicesc              3   &   K   | ]	  }|d      yw)r   Nr   .0cs     r!   	<genexpr>zrun_one.<locals>.<genexpr>M   s     <e)es   )r   r   	llm_calls	usr_charspicksr   T)parentsexist_ok_r   livez.jsonF   )ensure_asciiindentutf-8encoding[ z] calls= usr_chars=r8   r9     z: z	  saved: )$osenvironsyspathinsertstrBACKENDchdirapp.core.configr   gemini_flash_modelapp.core.databaser   app.core.stepsr   &app.services.analysis_dispatch_servicer   #app.services.step_execution_servicer   call_structured
PROJECT_ID
EPISODE_ID_executecloser   r   sumdictsorteditemsOUT_DIRmkdir
write_textjsondumpsprint)r   r   r   r   modr   r   r"   dbrunnerr   sr9   payloadoutkvr   r    s    `               @@r!   run_onerm      sl   ',BJJ#$HHOOAs7|$HHW(&&%/ C
!("="=!@AC/ /9FHE##I
 C	B j*b Z0'4UG%<*B+79
 h/'

 jj,002>@> =!"#QUU+BB%GG> 
 @cJ<e<<VEKKM23	G
 MM$M.
ugQu8>
>CNN4::gE!D#  %	AeWAse/xE
| D{+,. / &&(11#Rsm )	IcU
J' (

@s   :I 7 I-I*c           
         | D cg c]0  }t        j                  t        |      j                  d            2 }}t	        |D ch c]  }|d   D ]  }|  c}}      }t        d       t        ddddj                  d |D              z          g }|D ]  }|D cg c]  }|d   j                  |       }}t        |D ch c]  }t        |       c}      d	k(  }	t        |dddj                  d
 |D              z   |	rdndz          |	r{|j                  |        t        d       |D ]  }t        d|d    d|d    d|d           ! t        d|r|nd        t        |      S c c}w c c}}w c c}w c c}w )NrA   rB   r9   u   
=== 고른 샷 대조 ===scene8srE   c              3   *   K   | ]  }|d    d  yw)r   <22sNr   )r4   ds     r!   r6   zcompare.<locals>.<genexpr>`   s     %IDq7D(9&:Ds      c              3   6   K   | ]  }t        |      d   yw)rr   N)rM   r3   s     r!   r6   zcompare.<locals>.<genexpr>e   s     #Des1vdm$4es   r   u      <-- 다름u   
=== 발송량 ===rG   r   z: calls=r7   rF   r8   u   
다른 씬: u   없음 — 고른 샷 동일)rb   loadsr   	read_textr]   rd   joinr   r   rM   r   )
pathspdocsrs   rk   keysdiffcellsr5   sames
             r!   comparer   \   s   EJKUDJJtAw(('(:;UDKd7dAgJq1J1d78D	
'(	WRL
SXX%ID%II
IJD,01Dq7"D1E*EqCFE*+q02aj388#De#DDD2 	3KKN  

 1W:,hq~&6k!K.AQRS 	N44-KL
MNt9! L7
 2*s   5E2E7
E=F
c                  v   t        j                         } | j                  d       | j                  dd       | j                  dd       | j                         }|j                  rt	        |j                        S |j
                  s| j                  d       t        |j
                  |j                         y	)
Nz--modelz--dry
store_true)actionz	--compare+)nargsu)   --model 또는 --compare 가 필요하다r   )	argparseArgumentParseradd_argument
parse_argsr   r   errorrm   r   )apas     r!   mainr   p   s    		 	 	"BOOIOOGLO1OOKsO+
Ayyqyy!!77
<=AGGQUUr#   __main__)__doc__r   rb   rH   rJ   pathlibr   ROOTrN   r_   rW   rX   rM   boolrm   intr   r   __name__
SystemExitr   r#   r!   <module>r      s      	 
 89



 7
73
3
<3 <T <d <~c (c  z
TV
 r#   