api:
  endpoint: "https://ark.ap-southeast.bytepluses.com/api/v3/responses"
  model: "seed-2-0-pro-260328"
  key_env: "ARK_API_KEY"
  key_file: "secrets/byteplus.key"
  timeout_seconds: 120
  max_retries: 4
  retry_base_seconds: 2.0

processing:
  extraction_strategy: "ffmpeg_middle"
  ffmpeg_path: "C:\\Users\\NX023286.NEXYZ\\AppData\\Local\\Microsoft\\WinGet\\Packages\\Gyan.FFmpeg_Microsoft.Winget.Source_8wekyb3d8bbwe\\ffmpeg-8.1.1-full_build\\bin\\ffmpeg.exe"
  ffprobe_path: "C:\\Users\\NX023286.NEXYZ\\AppData\\Local\\Microsoft\\WinGet\\Packages\\Gyan.FFmpeg_Microsoft.Winget.Source_8wekyb3d8bbwe\\ffmpeg-8.1.1-full_build\\bin\\ffprobe.exe"
  ffmpeg_position_ratio: 0.35
  fast_warmup_frames: 12
  sample_fps: 0.5
  max_candidates: 1
  jpeg_quality: 95
  use_opencl: true
  min_sharpness: 80.0
  sharpness_weight: 0.030

concurrency:
  frame_workers: 2
  api_workers: 4          # 同時送信スレッド数（並列でAPIへ）。律速=応答時間なのでここが効く
  requests_per_minute: 60 # 全スレッド共有の上限(1秒に1件相当)。429が出たら下げる

paths:
  output_dir: "local_batch_api/output_full"
  db_path: "local_batch_api/output_full/ramen_soup_evaluations.sqlite3"

# 濃度の条件分岐:
#   CSVに「スープ濃度」があればそのまま採用。無ければ画像モデルで推定し、
#   高信頼(high)のときだけLLMに数値を渡す。スープ表面が確認できない動画は判定不可。
density:
  enabled: true
  conf_keep: 0.50      # スープ抽出の信頼度がこの値以上のフレームのみ濃度推定に採用
  crop_threshold: 0.10 # RF-DETRの検出しきい値
  frames: 16           # 1動画あたりの抽出フレーム数
  multi_min: 4         # high判定に必要な可視フレーム数
  vote_min: 0.70       # high判定に必要な投票占有率
  high_mean_conf: 0.72 # high判定に必要な抽出信頼度の平均
  device: "auto"
  use_best_frame_for_llm: true  # LLMに送る画像を「最もスープが見えるフレーム」に差し替える
  # 不可読動画の扱い: skip_if_steamy(既定) / always_skip / always_send
  #   skip_if_steamy: 不可読かつ湯気が多い動画のみLLM送信せず判定不可で記録。
  #                   湯気が薄いのに不可読=構図未対応(OOD)の疑い→LLMで第二判断。
  unreadable_action: "skip_if_steamy"
  steam_skip_threshold: 0.80  # 不可読時、この湯気平均以上ならLLMをスキップ
  # ①前処理キャッシュ（prepare_densities.py で生成）。あれば②で再計算しない。
  cache_path: "local_batch_api/density_cache.jsonl"
