-- ============================================================
-- KTV服务 uapi 补全迁移 Part 2
-- response 采用透传模式：GPU服务在响应中直接返回 usage
-- 模板只做最小加工，usage 字段原样传递给计费引擎
-- ============================================================

-- ============================================================
-- 1. ASR语音识别 (sync)
-- ============================================================
UPDATE uapi SET
  stream = 'sync',
  headers = '{"Content-Type": "application/json"}',
  data = '{"audio_url":"{{audio_url}}"{% if language %},"language":"{{language}}"{% endif %}}',
  response = '{"status":"{{status}}","text":"{{text}}","segments":{{json.dumps(segments, ensure_ascii=False)}},"usage":{{json.dumps(usage, ensure_ascii=False)}}}',
  ioid = 'ktv_asr_transcribe_io'
WHERE id = 'uapi_ktv_asr_transcribe';

-- ============================================================
-- 2. Demucs音频分离 (sync)
-- ============================================================
UPDATE uapi SET
  stream = 'sync',
  headers = '{"Content-Type": "application/json"}',
  data = '{"audio_url":"{{audio_url}}"}',
  response = '{"status":"{{status}}","vocals_url":"{{vocals_url}}","accompaniment_url":"{{accompaniment_url}}","usage":{{json.dumps(usage, ensure_ascii=False)}}}',
  ioid = 'ktv_demucs_separate_io'
WHERE id = 'uapi_ktv_demucs_separate';

-- ============================================================
-- 3. 人脸检测 (sync)
-- ============================================================
UPDATE uapi SET
  stream = 'sync',
  headers = '{"Content-Type": "application/json"}',
  data = '{"image_url":"{{image_url}}"}',
  response = '{"status":"{{status}}","faces":{{json.dumps(faces, ensure_ascii=False)}},"usage":{{json.dumps(usage, ensure_ascii=False)}}}',
  ioid = 'ktv_face_detect_io'
WHERE id = 'uapi_ktv_face_detect';

-- ============================================================
-- 4. 人脸识别 (sync)
-- ============================================================
UPDATE uapi SET
  stream = 'sync',
  headers = '{"Content-Type": "application/json"}',
  data = '{"image_url":"{{image_url}}"{% if face_id %},"face_id":"{{face_id}}"{% endif %}}',
  response = '{"status":"{{status}}","matches":{{json.dumps(matches, ensure_ascii=False)}},"usage":{{json.dumps(usage, ensure_ascii=False)}}}',
  ioid = 'ktv_face_recognize_io'
WHERE id = 'uapi_ktv_face_recognize';

-- ============================================================
-- 5. 人脸比对 (sync)
-- ============================================================
UPDATE uapi SET
  stream = 'sync',
  headers = '{"Content-Type": "application/json"}',
  data = '{"image_url1":"{{image_url1}}","image_url2":"{{image_url2}}"}',
  response = '{"status":"{{status}}","similarity":{{similarity}},"usage":{{json.dumps(usage, ensure_ascii=False)}}}',
  ioid = 'ktv_face_compare_io'
WHERE id = 'uapi_ktv_face_compare';

-- ============================================================
-- 6. 字幕渲染 (sync)
-- ============================================================
UPDATE uapi SET
  stream = 'sync',
  headers = '{"Content-Type": "application/json"}',
  data = '{"lyrics_json":{{lyrics_json}}{% if width %},"width":{{width}}{% endif %}{% if height %},"height":{{height}}{% endif %}}',
  response = '{"status":"{{status}}","ass_url":"{{ass_url}}","usage":{{json.dumps(usage, ensure_ascii=False)}}}',
  ioid = 'ktv_subtitle_render_io'
WHERE id = 'uapi_ktv_subtitle_render';

-- ============================================================
-- 7. 视频合并 (sync)
-- ============================================================
UPDATE uapi SET
  stream = 'sync',
  headers = '{"Content-Type": "application/json"}',
  data = '{% set comma = joiner(",") %}{{% if video_url %}{{comma()}}"video_url":"{{video_url}}"{% endif %}{% if audio_url %}{{comma()}}"audio_url":"{{audio_url}}"{% endif %}{% if subtitle_url %}{{comma()}}"subtitle_url":"{{subtitle_url}}"{% endif %}{% if output_format %}{{comma()}}"output_format":"{{output_format}}"{% endif %}}',
  response = '{"status":"{{status}}","output_url":"{{output_url}}","duration":{{duration}},"usage":{{json.dumps(usage, ensure_ascii=False)}}}',
  ioid = 'ktv_merge_video_io'
WHERE id = 'uapi_ktv_merge_video';

-- ============================================================
-- 8. 歌曲评分 (sync)
-- ============================================================
UPDATE uapi SET
  stream = 'sync',
  headers = '{"Content-Type": "application/json"}',
  data = '{"audio_url":"{{audio_url}}"{% if scene %},"scene":"{{scene}}"{% endif %}}',
  response = '{"status":"{{status}}","score":{{score}},"details":{{json.dumps(details, ensure_ascii=False)}},"usage":{{json.dumps(usage, ensure_ascii=False)}}}',
  ioid = 'ktv_songrate_evaluate_io'
WHERE id = 'uapi_ktv_songrate_evaluate';

-- ============================================================
-- 9. 音乐合成 (async 提交)
--    GPU 响应: {"task_id":"xxx","status":"ok"}
--    usage 在状态查询端点返回
-- ============================================================
UPDATE uapi SET
  stream = 'async',
  headers = '{"Content-Type": "application/json"}',
  data = '{"lyrics":"{{lyrics}}"{% if style %},"style":"{{style}}"{% endif %}{% if reference_audio %},"reference_audio":"{{reference_audio}}"{% endif %}}',
  response = '{"taskid":"{{task_id}}","taskstatus":"PENDING"}',
  ioid = 'ktv_synth_generate_io'
WHERE id = 'uapi_ktv_synth_generate';

-- ============================================================
-- 10. 合成状态查询 (sync)
--     GPU 须返回 usage
-- ============================================================
UPDATE uapi SET
  stream = 'sync',
  headers = '{"Content-Type": "application/json"}',
  data = '{"task_id":"{{task_id}}"}',
  response = '{% if status == "SUCCEEDED" %}{"taskstatus":"SUCCEEDED","output_url":"{{output_url}}","usage":{{json.dumps(usage, ensure_ascii=False)}}}{% elif status == "FAILED" %}{"taskstatus":"FAILED","error":"{{error}}"}{% else %}{"taskstatus":"PENDING"}{% endif %}',
  ioid = 'ktv_synth_status_io'
WHERE id = 'uapi_ktv_synth_status';

-- ============================================================
-- 11. 超分辨率 (async 提交)
-- ============================================================
UPDATE uapi SET
  stream = 'async',
  headers = '{"Content-Type": "application/json"}',
  data = '{"image_url":"{{image_url}}"{% if scale %},"scale":{{scale}}{% endif %}}',
  response = '{"taskid":"{{task_id}}","taskstatus":"PENDING"}',
  ioid = 'ktv_realesrgan_upscale_io'
WHERE id = 'uapi_ktv_realesrgan_upscale';

-- ============================================================
-- 12. 超分状态查询 (sync)
--     GPU 须返回 usage
-- ============================================================
UPDATE uapi SET
  stream = 'sync',
  headers = '{"Content-Type": "application/json"}',
  data = '{"task_id":"{{task_id}}"}',
  response = '{% if status == "SUCCEEDED" %}{"taskstatus":"SUCCEEDED","output_url":"{{output_url}}","usage":{{json.dumps(usage, ensure_ascii=False)}}}{% elif status == "FAILED" %}{"taskstatus":"FAILED","error":"{{error}}"}{% else %}{"taskstatus":"PENDING"}{% endif %}',
  ioid = 'ktv_realesrgan_status_io'
WHERE id = 'uapi_ktv_realesrgan_status';

-- ============================================================
-- 13. RVC声音转换 (sync)
-- ============================================================
UPDATE uapi SET
  stream = 'sync',
  headers = '{"Content-Type": "application/json"}',
  data = '{"audio_url":"{{audio_url}}","voice_model":"{{voice_model}}"}',
  response = '{"status":"{{status}}","output_url":"{{output_url}}","usage":{{json.dumps(usage, ensure_ascii=False)}}}',
  ioid = 'ktv_rvc_convert_io'
WHERE id = 'uapi_ktv_rvc_convert';

-- ============================================================
-- 14. 视频评估 (sync)
-- ============================================================
UPDATE uapi SET
  stream = 'sync',
  headers = '{"Content-Type": "application/json"}',
  data = '{"video_url":"{{video_url}}"}',
  response = '{"status":"{{status}}","score":{{score}},"details":{{json.dumps(details, ensure_ascii=False)}},"usage":{{json.dumps(usage, ensure_ascii=False)}}}',
  ioid = 'ktv_video_eval_evaluate_io'
WHERE id = 'uapi_ktv_video_eval_evaluate';

-- ============================================================
-- async 模型的 query_apiname 更新
-- ============================================================
UPDATE llm_api_map SET query_apiname = 'synth-status', query_period = 5
WHERE llmid = 'llm_ktv_synth_generate' AND llmcatelogid = 'ktv_pipeline';

UPDATE llm_api_map SET query_apiname = 'realesrgan-status', query_period = 3
WHERE llmid = 'llm_ktv_realesrgan_upscale' AND llmcatelogid = 'ktv_pipeline';
