
    9j                         d Z ddlZddlZddlmZ ddlmZmZmZ ddl	m
Z
  ej                  e      ZdZdZ G d d	e
      Zy)
u  ShotRefClassifyStep — s40/s41 레시피 샷 분류 (order 21.90).

선택(selected) 샷 전체를 한 번에 분류한다:
  data.shots[tag]  = {person_visible, bgonly_reason_ko, prev, prev_reason_ko,
                      usage_en, prev_violation,
                      place_en, environment, place_basis_ko (v3)}
  data.scenes[si]  = {time_of_day_en, place_en, basis_ko}

still_recipe_mode="v1" 일 때만 applicable(if_still_recipe) — OFF 면 run-all
정적 필터에서 제외되고 체크포인트도 만들지 않는다(기존 파이프 byte-identical).
분류 계약 정본: backend/app/modules/pipeline/shot_ref_classify.py docstring.
    N)Path)AnyDictOptional)
StepRunner   5c                   X    e Zd ZdZdefdZdedeeeef      fdZ	d	dedeeef   fdZ
y)
ShotRefClassifyStepuF   샷 참조 분류 — bgonly·prev v3·time_of_day (레시피 이식).returnc                 .   dd l }dd l}ddlm} ddlm} ddlm} |j                  t         |t              |j                   || j                        d}|j                  |j                  |d      j                  d            j!                         d d	 S )
Nr   settings)resolve_prompt_version)compute_config_hash)still_recipe_modeschema_versionprompt_versionmodelproject_config_hashT)	sort_keysutf-8   )hashlibjsonapp.core.configr   &app.modules.pipeline.shot_ref_classifyr   app.core.step_runnerr   r   SCHEMA_VERSIONPROMPT_VERSIONopenai_modelproject_configsha256dumpsencode	hexdigest)selfr   _jsonr   r   r   payloads          [/Users/manta/Documents/Projects/TheRoad-I1/backend/app/core/steps/shot_ref_classify_step.py_config_hashz ShotRefClassifyStep._config_hash%   s    ,	
 	= "*!;!;,4^D**#6t7J7J#K
 ~~KK4K077@

)+cr 	    step_idc                 L   ddl m} t        |j                        | j                  z  dz  dz  | j
                  z  |z  dz  }|j                         r&	 t        j                  |j                  d            S y # t        $ r!}t        j                  d||       Y d }~y d }~ww xY w)	Nr   r   checkpointsepisodeszmanifest.jsonr   )encodingu'   shot_ref_classify: %s 로드 실패: %s)r   r   r   projects_dir
project_id
episode_idexistsr   loads	read_text	Exceptionloggerwarning)r'   r-   r   cpexcs        r*   _load_prev_checkpointz)ShotRefClassifyStep._load_prev_checkpoint<   s    , &&'oo -.0:;oo '(*9: 	
 99;zz",,,"@AA
 	  =w  	s   $A9 9	B#BB#modec           
         ddl m}m} ddlm}m} | j                  d      }|xs i j                  di       j                  dg       xs g } || j                  d            }g }	i }
|D ]  }|j                  d      }|t        |      }|j                  d	      r|d	   |
|<   |j                  d
g       xs g D ]\  }|j                  d      }| ||t        |      f|      s,|	j                  |t        |      |j                  d      xs dd       ^  | j                  d      }i }|xs i j                  di       j                  dg       xs g D ][  }|j                  d      }t        |t              s%|j                  d      xs d||<   |j                  d      sO||
vsT|d   |
|<   ] | j                  d      }i }|xs i j                  di       j                  dg       xs g D ]=  }|j                  d      }|j                  dd      xs d}|-|s0||t        |      <   ? |	s3t        j                  d       dddt        | j                         i i ddS  || j                  | j                   ||
      } ||	||
|t"        | j$                  | j'                               }t)        |	      t)        |d
         dt        | j                         |dS )Nr   )build_selected_keysis_selected)derive_location_by_scenerun_shot_ref_classifyshot_validatordatascenesshot_selectionscene_indexscene_headingshots
shot_indexdescription )rH   rK   rL   
scene_savesegmentstextheadingscene_directorprimary_locationu.   shot_ref_classify: 선택 샷 없음 — no-op)rJ   rF   )applicable_countcompleted_countfailed_countr   config_hashrE   )rJ   scene_textsscene_headingslocation_by_scener   r"   opik_metadata)*app.modules.pipeline.outdoor_direct_commonr@   rA   r   rB   rC   r=   getintappend
isinstancer9   infor   r+   dbr3   r    r"   build_opik_metadatalen)r'   r>   r@   rA   rB   rC   validator_cprF   selected_keysrJ   rY   scsishshiscene_save_cprX   segdirector_cpscene_primaryprimaryrZ   rE   s                          r*   _executezShotRefClassifyStep._executeM   s   	
	
 112BC$"))&"599(BGM2+&&'78
 )+B&BzRBvvo&%'%8r"ffWb)/R/ff\*;"BC>=A')&)#h')vvm'<'B 0 * 22<@&(!'R,,VR8<<ZLRPRRC'B"c""%''&/"7RB779%"N*B),YN2& S 001AB(*$"))&"599(BGM2MB&Bff/4:G~')0c"g&	 N KKHI$%#$ !"0#002"$3  5GGT__m^
 %#)/)..224
 !$E
"4=1,,,.
 	
r,   N)resume)__name__
__module____qualname____doc__strr+   r   r   r   r=   rp    r,   r*   r   r   "   sO    Pc .S Xd38n5M "Y
S Y
S#X Y
r,   r   )ru   r   loggingpathlibr   typingr   r   r   r   r   	getLoggerrr   r9   r   r    r   rw   r,   r*   <module>r|      sJ       & & +			8	$ D
* D
r,   