From 73569912d17a40d6c423a0b0a2326822966d4821 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Mon, 6 Jul 2026 14:30:02 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20response=E6=A8=A1=E6=9D=BF=E5=85=A8?= =?UTF-8?q?=E9=83=A8=E4=BD=BF=E7=94=A8{%if=20error%}=E5=AE=B9=E9=94=99?= =?UTF-8?q?=E5=9D=97+=E8=A1=A5=E5=85=A8upappkey?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/ktv_uapi_migration.sql | 110 +++++++++---------------- scripts/ktv_uapi_migration_p2_uapi.sql | 110 +++++++++---------------- 2 files changed, 80 insertions(+), 140 deletions(-) diff --git a/scripts/ktv_uapi_migration.sql b/scripts/ktv_uapi_migration.sql index 1ca021f1..f2721add 100644 --- a/scripts/ktv_uapi_migration.sql +++ b/scripts/ktv_uapi_migration.sql @@ -88,132 +88,102 @@ INSERT INTO uapiio (id, name, description, input_fields) VALUES ( ) ON DUPLICATE KEY UPDATE description=VALUES(description), input_fields=VALUES(input_fields); -- ============================================================ -- KTV服务 uapi 补全 Part 2 --- data模板使用 _file命名(audio_file/image_file/video_file) --- response透传GPU返回的usage +-- data使用_file命名; response用{%if error%}容错透传GPU响应 +-- async: synth-generate(5s轮询), realesrgan-upscale(3s轮询) -- ============================================================ -- 1. ASR语音识别 (sync) UPDATE uapi SET stream='sync',headers='{"Content-Type":"application/json"}', - data='{"audio_file":"{{audio_file}}"{% 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'; + data='{"audio_file":"{{audio_file}}"{%if language%},"language":"{{language}}"{%endif%}}', + response='{%if error%}{"error":"{{error}}"}{%else%}{"status":"{{status}}","text":"{{text}}","segments":{{json.dumps(segments,ensure_ascii=False)}},"usage":{{json.dumps(usage,ensure_ascii=False)}}}{%endif%}', + 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_file":"{{audio_file}}"}', - 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'; + response='{%if error%}{"error":"{{error}}"}{%else%}{"status":"{{status}}","vocals_url":"{{vocals_url}}","accompaniment_url":"{{accompaniment_url}}","usage":{{json.dumps(usage,ensure_ascii=False)}}}{%endif%}', + 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_file":"{{image_file}}"}', - 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'; + response='{%if error%}{"error":"{{error}}"}{%else%}{"status":"{{status}}","faces":{{json.dumps(faces,ensure_ascii=False)}},"usage":{{json.dumps(usage,ensure_ascii=False)}}}{%endif%}', + 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_file":"{{image_file}}"{% 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'; + data='{"image_file":"{{image_file}}"{%if face_id%},"face_id":"{{face_id}}"{%endif%}}', + response='{%if error%}{"error":"{{error}}"}{%else%}{"status":"{{status}}","matches":{{json.dumps(matches,ensure_ascii=False)}},"usage":{{json.dumps(usage,ensure_ascii=False)}}}{%endif%}', + 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_file1":"{{image_file1}}","image_file2":"{{image_file2}}"}', - response='{"status":"{{status}}","similarity":{{similarity}},"usage":{{json.dumps(usage,ensure_ascii=False)}}}', - ioid='ktv_face_compare_io' -WHERE id='uapi_ktv_face_compare'; + response='{%if error%}{"error":"{{error}}"}{%else%}{"status":"{{status}}","similarity":{{similarity}},"usage":{{json.dumps(usage,ensure_ascii=False)}}}{%endif%}', + 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'; + data='{"lyrics_json":{{lyrics_json}}{%if width%},"width":{{width}}{%endif%}{%if height%},"height":{{height}}{%endif%}}', + response='{%if error%}{"error":"{{error}}"}{%else%}{"status":"{{status}}","ass_url":"{{ass_url}}","usage":{{json.dumps(usage,ensure_ascii=False)}}}{%endif%}', + 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 c=joiner(",")%}{{%if video_file%}{{c()}}"video_file":"{{video_file}}"{%endif%}{%if audio_file%}{{c()}}"audio_file":"{{audio_file}}"{%endif%}{%if subtitle_file%}{{c()}}"subtitle_file":"{{subtitle_file}}"{%endif%}{%if output_format%}{{c()}}"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'; + response='{%if error%}{"error":"{{error}}"}{%else%}{"status":"{{status}}","output_url":"{{output_url}}","duration":{{duration}},"usage":{{json.dumps(usage,ensure_ascii=False)}}}{%endif%}', + 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_file":"{{audio_file}}"{% 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'; + data='{"audio_file":"{{audio_file}}"{%if scene%},"scene":"{{scene}}"{%endif%}}', + response='{%if error%}{"error":"{{error}}"}{%else%}{"status":"{{status}}","score":{{score}},"details":{{json.dumps(details,ensure_ascii=False)}},"usage":{{json.dumps(usage,ensure_ascii=False)}}}{%endif%}', + ioid='ktv_songrate_evaluate_io' WHERE id='uapi_ktv_songrate_evaluate'; -- 9. 音乐合成 (async提交) UPDATE uapi SET stream='async',headers='{"Content-Type":"application/json"}', - data='{"lyrics":"{{lyrics}}"{% if style %},"style":"{{style}}"{% endif %}{% if audio_file %},"audio_file":"{{audio_file}}"{% endif %}}', + data='{"lyrics":"{{lyrics}}"{%if style%},"style":"{{style}}"{%endif%}{%if audio_file%},"audio_file":"{{audio_file}}"{%endif%}}', response='{"taskid":"{{task_id}}","taskstatus":"PENDING"}', - ioid='ktv_synth_generate_io' -WHERE id='uapi_ktv_synth_generate'; + ioid='ktv_synth_generate_io' WHERE id='uapi_ktv_synth_generate'; -- 10. 合成状态查询 (sync) 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'; + response='{%if error%}{"error":"{{error}}"}{%elif 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_file":"{{image_file}}"{% if scale %},"scale":{{scale}}{% endif %}}', + data='{"image_file":"{{image_file}}"{%if scale%},"scale":{{scale}}{%endif%}}', response='{"taskid":"{{task_id}}","taskstatus":"PENDING"}', - ioid='ktv_realesrgan_upscale_io' -WHERE id='uapi_ktv_realesrgan_upscale'; + ioid='ktv_realesrgan_upscale_io' WHERE id='uapi_ktv_realesrgan_upscale'; -- 12. 超分状态查询 (sync) 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'; + response='{%if error%}{"error":"{{error}}"}{%elif 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_file":"{{audio_file}}","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'; + response='{%if error%}{"error":"{{error}}"}{%else%}{"status":"{{status}}","output_url":"{{output_url}}","usage":{{json.dumps(usage,ensure_ascii=False)}}}{%endif%}', + 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_file":"{{video_file}}"}', - 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'; + response='{%if error%}{"error":"{{error}}"}{%else%}{"status":"{{status}}","score":{{score}},"details":{{json.dumps(details,ensure_ascii=False)}},"usage":{{json.dumps(usage,ensure_ascii=False)}}}{%endif%}', + 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'; +UPDATE llm_api_map SET query_apiname='synth-status',query_period=5 WHERE llmid='llm_ktv_synth_generate'; +UPDATE llm_api_map SET query_apiname='realesrgan-status',query_period=3 WHERE llmid='llm_ktv_realesrgan_upscale'; --- ============================================================ --- P2 补充: 设置 ppid(v1/models 查询要求 ppid IS NOT NULL) --- ============================================================ -UPDATE llm_api_map SET ppid = 'pp_ktv' WHERE llmid LIKE 'llm_ktv%' AND ppid IS NULL; - --- ============================================================ --- P2 补充: upappkey (API调用鉴权必需) --- ============================================================ -INSERT INTO upappkey (id, upappid, ownerid, apikey, orgid) -SELECT 'ktv_gateway_key', 'ktv-gateway', 'UiEi7hKqAmU1-jqQEVhZe', '', '0' -WHERE NOT EXISTS (SELECT 1 FROM upappkey WHERE upappid = 'ktv-gateway'); - --- ============================================================ --- P2 补充: response模板容错 — {% if error %} 处理GPU错误响应 --- 所有同步服务的response模板使用{% if error %}块,GPU返回 --- {"error":"..."}时直接透传,避免Jinja2 UndefinedError --- (tokentest已手动更新,此处为生产部署用SQL) --- ============================================================ +-- upappkey (API调用鉴权必需) +INSERT INTO upappkey (id,upappid,ownerid,apikey,orgid) +SELECT 'ktv_gateway_key','ktv-gateway','UiEi7hKqAmU1-jqQEVhZe','','0' +WHERE NOT EXISTS (SELECT 1 FROM upappkey WHERE upappid='ktv-gateway'); -- ============================================================ -- KTV Pipeline v1 API RBAC 权限配置 -- 新增 /v1/pipeline/submit 端点权限 diff --git a/scripts/ktv_uapi_migration_p2_uapi.sql b/scripts/ktv_uapi_migration_p2_uapi.sql index 34fa4cb9..e8ff0230 100644 --- a/scripts/ktv_uapi_migration_p2_uapi.sql +++ b/scripts/ktv_uapi_migration_p2_uapi.sql @@ -1,128 +1,98 @@ -- ============================================================ -- KTV服务 uapi 补全 Part 2 --- data模板使用 _file命名(audio_file/image_file/video_file) --- response透传GPU返回的usage +-- data使用_file命名; response用{%if error%}容错透传GPU响应 +-- async: synth-generate(5s轮询), realesrgan-upscale(3s轮询) -- ============================================================ -- 1. ASR语音识别 (sync) UPDATE uapi SET stream='sync',headers='{"Content-Type":"application/json"}', - data='{"audio_file":"{{audio_file}}"{% 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'; + data='{"audio_file":"{{audio_file}}"{%if language%},"language":"{{language}}"{%endif%}}', + response='{%if error%}{"error":"{{error}}"}{%else%}{"status":"{{status}}","text":"{{text}}","segments":{{json.dumps(segments,ensure_ascii=False)}},"usage":{{json.dumps(usage,ensure_ascii=False)}}}{%endif%}', + 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_file":"{{audio_file}}"}', - 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'; + response='{%if error%}{"error":"{{error}}"}{%else%}{"status":"{{status}}","vocals_url":"{{vocals_url}}","accompaniment_url":"{{accompaniment_url}}","usage":{{json.dumps(usage,ensure_ascii=False)}}}{%endif%}', + 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_file":"{{image_file}}"}', - 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'; + response='{%if error%}{"error":"{{error}}"}{%else%}{"status":"{{status}}","faces":{{json.dumps(faces,ensure_ascii=False)}},"usage":{{json.dumps(usage,ensure_ascii=False)}}}{%endif%}', + 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_file":"{{image_file}}"{% 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'; + data='{"image_file":"{{image_file}}"{%if face_id%},"face_id":"{{face_id}}"{%endif%}}', + response='{%if error%}{"error":"{{error}}"}{%else%}{"status":"{{status}}","matches":{{json.dumps(matches,ensure_ascii=False)}},"usage":{{json.dumps(usage,ensure_ascii=False)}}}{%endif%}', + 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_file1":"{{image_file1}}","image_file2":"{{image_file2}}"}', - response='{"status":"{{status}}","similarity":{{similarity}},"usage":{{json.dumps(usage,ensure_ascii=False)}}}', - ioid='ktv_face_compare_io' -WHERE id='uapi_ktv_face_compare'; + response='{%if error%}{"error":"{{error}}"}{%else%}{"status":"{{status}}","similarity":{{similarity}},"usage":{{json.dumps(usage,ensure_ascii=False)}}}{%endif%}', + 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'; + data='{"lyrics_json":{{lyrics_json}}{%if width%},"width":{{width}}{%endif%}{%if height%},"height":{{height}}{%endif%}}', + response='{%if error%}{"error":"{{error}}"}{%else%}{"status":"{{status}}","ass_url":"{{ass_url}}","usage":{{json.dumps(usage,ensure_ascii=False)}}}{%endif%}', + 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 c=joiner(",")%}{{%if video_file%}{{c()}}"video_file":"{{video_file}}"{%endif%}{%if audio_file%}{{c()}}"audio_file":"{{audio_file}}"{%endif%}{%if subtitle_file%}{{c()}}"subtitle_file":"{{subtitle_file}}"{%endif%}{%if output_format%}{{c()}}"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'; + response='{%if error%}{"error":"{{error}}"}{%else%}{"status":"{{status}}","output_url":"{{output_url}}","duration":{{duration}},"usage":{{json.dumps(usage,ensure_ascii=False)}}}{%endif%}', + 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_file":"{{audio_file}}"{% 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'; + data='{"audio_file":"{{audio_file}}"{%if scene%},"scene":"{{scene}}"{%endif%}}', + response='{%if error%}{"error":"{{error}}"}{%else%}{"status":"{{status}}","score":{{score}},"details":{{json.dumps(details,ensure_ascii=False)}},"usage":{{json.dumps(usage,ensure_ascii=False)}}}{%endif%}', + ioid='ktv_songrate_evaluate_io' WHERE id='uapi_ktv_songrate_evaluate'; -- 9. 音乐合成 (async提交) UPDATE uapi SET stream='async',headers='{"Content-Type":"application/json"}', - data='{"lyrics":"{{lyrics}}"{% if style %},"style":"{{style}}"{% endif %}{% if audio_file %},"audio_file":"{{audio_file}}"{% endif %}}', + data='{"lyrics":"{{lyrics}}"{%if style%},"style":"{{style}}"{%endif%}{%if audio_file%},"audio_file":"{{audio_file}}"{%endif%}}', response='{"taskid":"{{task_id}}","taskstatus":"PENDING"}', - ioid='ktv_synth_generate_io' -WHERE id='uapi_ktv_synth_generate'; + ioid='ktv_synth_generate_io' WHERE id='uapi_ktv_synth_generate'; -- 10. 合成状态查询 (sync) 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'; + response='{%if error%}{"error":"{{error}}"}{%elif 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_file":"{{image_file}}"{% if scale %},"scale":{{scale}}{% endif %}}', + data='{"image_file":"{{image_file}}"{%if scale%},"scale":{{scale}}{%endif%}}', response='{"taskid":"{{task_id}}","taskstatus":"PENDING"}', - ioid='ktv_realesrgan_upscale_io' -WHERE id='uapi_ktv_realesrgan_upscale'; + ioid='ktv_realesrgan_upscale_io' WHERE id='uapi_ktv_realesrgan_upscale'; -- 12. 超分状态查询 (sync) 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'; + response='{%if error%}{"error":"{{error}}"}{%elif 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_file":"{{audio_file}}","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'; + response='{%if error%}{"error":"{{error}}"}{%else%}{"status":"{{status}}","output_url":"{{output_url}}","usage":{{json.dumps(usage,ensure_ascii=False)}}}{%endif%}', + 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_file":"{{video_file}}"}', - 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'; + response='{%if error%}{"error":"{{error}}"}{%else%}{"status":"{{status}}","score":{{score}},"details":{{json.dumps(details,ensure_ascii=False)}},"usage":{{json.dumps(usage,ensure_ascii=False)}}}{%endif%}', + 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'; +UPDATE llm_api_map SET query_apiname='synth-status',query_period=5 WHERE llmid='llm_ktv_synth_generate'; +UPDATE llm_api_map SET query_apiname='realesrgan-status',query_period=3 WHERE llmid='llm_ktv_realesrgan_upscale'; --- ============================================================ --- P2 补充: 设置 ppid(v1/models 查询要求 ppid IS NOT NULL) --- ============================================================ -UPDATE llm_api_map SET ppid = 'pp_ktv' WHERE llmid LIKE 'llm_ktv%' AND ppid IS NULL; - --- ============================================================ --- P2 补充: upappkey (API调用鉴权必需) --- ============================================================ -INSERT INTO upappkey (id, upappid, ownerid, apikey, orgid) -SELECT 'ktv_gateway_key', 'ktv-gateway', 'UiEi7hKqAmU1-jqQEVhZe', '', '0' -WHERE NOT EXISTS (SELECT 1 FROM upappkey WHERE upappid = 'ktv-gateway'); - --- ============================================================ --- P2 补充: response模板容错 — {% if error %} 处理GPU错误响应 --- 所有同步服务的response模板使用{% if error %}块,GPU返回 --- {"error":"..."}时直接透传,避免Jinja2 UndefinedError --- (tokentest已手动更新,此处为生产部署用SQL) --- ============================================================ +-- upappkey (API调用鉴权必需) +INSERT INTO upappkey (id,upappid,ownerid,apikey,orgid) +SELECT 'ktv_gateway_key','ktv-gateway','UiEi7hKqAmU1-jqQEVhZe','','0' +WHERE NOT EXISTS (SELECT 1 FROM upappkey WHERE upappid='ktv-gateway');