
    !_j                     *   d Z ddlmZ ddlZddlmZ ddlZ ee      j                         j                  Zej                  Zedz  Zej                  j                  d ee             ddlZddlmZ edz  Z G d d	      Zdd
Zedk(  r e        yy)ue  end-to-end 推論（利用システム）。

入力: 動画ファイル ＋ 濃度(任意) ＋ 時間帯
フロー（開発環境＝学習時と同一の上流を再利用）:
    動画
     └ 上流 DensityResolver（local_batch_api/density_resolver.py）
          多フレーム抽出 → 湯気除外 → RF-DETRスープ抽出（可読性判定）
          → 最良フレーム選択 → 濃度確定（実測優先 / 無ければ濃度推定AI）
     └ 採点ゲート①: readable=False → 要確認（LLMに送らない）
     └ LLM画像評価（local_batch_api/batch_process.py / 学習時と同じプロンプト・同じAPI）
          最良フレーム + 濃度ノート → 固定JSON（visual/water/oil/boiling/photo/image_score）
     └ 採点ゲート②: assessable=0（4軸が判定不可）→ 要確認
     └ 後段スコアリング（scoring_engine：線形回帰 visual_plus_brix_slot）
出力: status / total・soup スコア・グレード ＋ 上流・LLM中間結果

※ GPU・ffmpeg・BytePlus APIキー（secrets/byteplus.key か 環境変数 ARK_API_KEY）が必要。
    )annotationsN)Pathlocal_batch_api)DensityResolverzconfig.test10.yamlc                  $    e Zd ZdZdddZdddZy)	FullPipelineua   動画1本を end-to-end で推論する。モデルは初期化時に一度だけ読み込む。Nc                   t        j                  t              | _        | j                  j	                  di       xs i }t        t        |j	                  dd            t        |j	                  dd            t        |j	                  dd            t        |j	                  dd	            t        |j	                  d
d            t        |j	                  dd            t        |j	                  dd                  | _	        t        j                  t         j                        | _        t        j                  |xs	 t        dz        | _        y )Ndensity	conf_keepg      ?crop_thresholdg?frames   	multi_min   vote_mingffffff?high_mean_confg
ףp=
?deviceauto)r   r   r   r   r   r   device_namemodels)Bload_configCONFIG_PATHconfiggetr   floatintstrresolverbuild_promptPOLICY_PATHpromptEload_modelsHEREr   )self	model_dirds      :/var/www/ramen.bs-engineer-server.com/app/pipeline_full.py__init__zFullPipeline.__init__(   s    mmK0KKOOIr*0b'AEE+t45 '7!>?quuXr*+!%%Q/0155T23 '7!>?AEE(F34
 nnQ]]3mmI$B$/C    c                   t        |      }i }|dvr||d<   | j                  j                  ||      }t        |j	                  d            }|j	                  d      xs d}|j	                  d      }	t        j                  || j                        \  }
}|
s|st        j                  ||xs d      }d}nt        j                  |      }t        j                  | j                  | j                  t        |      |      }t        j                  | j                  |      }t        j                  |      }d	}t        |t              st        j                  |d
      }d}t!        |      ||||	|	n|xs d |j	                  d      xs i j	                  d      |j	                  d      xs i j	                  d      |j	                  d      xs i j	                  d      |j	                  d      |j	                  d      |j	                  d      |d}t#        j$                  || j&                        }||j	                  d      |	|j	                  d      |j	                  d      ||j	                  d      |j	                  d      ||
r|nd|j	                  d      d|d<   |d   |d   |d   |d   |d   |d   d|d<   |S )N)N u   スープ濃度readablebest_frame_pathr-   valueu$   最良フレームが得られないFTu   LLM応答のパースに失敗visual_densitywater_levelstateoil_emulsificationboiling_heat_statephoto_qualityimage_condition_score)
video_path
frame_pathstoreslotbrix_rawr1   r2   r4   r5   r6   r7   r.   
assessablesource
confidence
steam_meanframes_usednote)r.   assessable_upstreamdensity_valuedensity_sourcedensity_confidencer/   r@   rA   llm_usedllm_skip_reasonrB   	_upstream)r1   r2   r4   r5   r6   r7   	_llm_eval)r   r   resolveboolr   r   decide_skip_llmr   synthetic_unassessabledensity_input_notebuild_request_payloadr"   call_byteplusparse_assessment
isinstancedictr   r#   score_recordr   )r&   r8   brixr;   r:   metaresr.   
best_framerD   skipreason
assessmentrG   rB   payloadapi_responserecordresults                      r)   runzFullPipeline.run7   s   *%
z!&*D"# mm##J5
+,WW./52
( ((dkk:fz11#v7gAghJH'',D--dkk4;;ZHXZ^_G??4;;@L++L9JHj$/55c;[\
  j/$)6)BQU)~~.>?E2JJ7S&NN=9?RDDWM#->>2F#G#M2"R"RSZ"[",..1E"F'^^O<%/^^4K%L 
 4 !#&77<#8*!ggh/"%'',"7)'',/77=1 )-v2GGFO
{ %%56!-0"()=">"()=">#O4%+,C%D
{ r+   )N)r'   zstr | Path | NonereturnNone)NNN)r8   z
str | Pathrb   rT   )__name__
__module____qualname____doc__r*   ra    r+   r)   r   r   %   s    kDBr+   r   c            
        dd l } dd l}| j                         }|j                  dd       |j                  dd        |j                  dd        |j                  dd        |j	                         }t               }t        |j                  |j                  |j                  |j                  |j                  |j                  	      d
d             y )Nr   z--videoT)requiredz--brix)defaultz--slotz--store)rV   r;   r:   F   )ensure_asciiindent)argparsejsonArgumentParseradd_argument
parse_argsr   printdumpsra   videorV   r;   r:   )ro   rp   apargspipes        r)   mainrz   |   s    		 	 	"BOOIO-OOHdO+OOHdO+OOItO,==?D>D	$**TXXdjjtyytyyPTPZPZX["'  3 4r+   __main__)rb   rc   )rg   
__future__r   syspathlibr   scoring_enginer#   __file__rK   parentr%   ROOTLBApathinsertr   batch_processr   density_resolverr   r   r   rz   rd   rh   r+   r)   <module>r      s   " # 
  H~&&{{
 3s8   ,((T Tn4 zF r+   