From 2cfd7de5d5c6e653ee4be11eddffe2643e078192 Mon Sep 17 00:00:00 2001 From: kang Date: Mon, 18 May 2026 14:34:36 +0800 Subject: [PATCH] chore: force gpt routing for vision and rewrite --- RULES.md | 7 ++++--- api/.env.example | 1 + api/main.py | 16 +++++++++++++--- deploy/.env.production.example | 1 + docs/source-analysis.html | 6 +++--- 5 files changed, 22 insertions(+), 9 deletions(-) diff --git a/RULES.md b/RULES.md index 0b15f4e..f02bd07 100644 --- a/RULES.md +++ b/RULES.md @@ -56,9 +56,10 @@ - `ASR_TIMEOUT_SECONDS`:远端 ASR / 音频分析单次请求超时,默认 45 秒,避免第一步长时间停在转录中 - `LOCAL_ASR_BIN` / `LOCAL_ASR_MODEL` / `LOCAL_ASR_TIMEOUT_SECONDS`:本机 ASR 兜底,默认使用 `/opt/homebrew/bin/mlx_whisper` + `mlx-community/whisper-tiny`,用于当前 SKG 网关 `/audio/transcriptions` 不可用时生成真实逐句时间轴 - `TRANSLATE_MODEL`:字幕翻译模型,默认 `gemini-2.5-flash` -- `REWRITE_MODEL`:通用改写/分镜描述模型,默认 `gpt-4o` -- `VISION_MODEL`:关键帧画面理解模型,默认 `gpt-4o` -- `AUDIO_REWRITE_MODEL`:后续音频口播改写模型,默认跟随 `REWRITE_MODEL`;当前第一步不默认调用口播改写,只保留原文案和声音分析 +- `GPT_TEXT_MODEL`:GPT 文本 / 视觉默认模型,默认 `gpt-4o`;用于兜底修正旧 Gemini 覆盖值 +- `REWRITE_MODEL`:通用改写/分镜描述模型,默认 `gpt-4o`;如果旧环境仍写 `gemini-*`,后端会自动改用 `GPT_TEXT_MODEL` +- `VISION_MODEL`:关键帧画面理解模型,默认 `gpt-4o`;如果旧环境仍写 `gemini-*`,后端会自动改用 `GPT_TEXT_MODEL` +- `AUDIO_REWRITE_MODEL`:后续音频口播改写模型,默认跟随 `REWRITE_MODEL`;如果旧环境仍写 `gemini-*`,后端会自动改用 `REWRITE_MODEL` - `AUDIO_PRODUCT_BRIEF`:音频口播改写时注入的 SKG 产品卖点 - `PRODUCT_VIEW_MODEL`:同一产品素材池的视角标注/自动识别模型;当前按项目要求强制使用 `gpt-image-2` - `IMAGE_BASE_URL` / `IMAGE_API_KEY` / `IMAGE_MODEL`:OpenAI 兼容生图网关;当前所有生图入口一律强制使用 `gpt-image-2`,不做其他图片模型 fallback diff --git a/api/.env.example b/api/.env.example index d6db7ab..dbc7e1e 100644 --- a/api/.env.example +++ b/api/.env.example @@ -17,6 +17,7 @@ LOCAL_ASR_BIN=/opt/homebrew/bin/mlx_whisper LOCAL_ASR_MODEL=mlx-community/whisper-tiny LOCAL_ASR_TIMEOUT_SECONDS=180 TRANSLATE_MODEL=gemini-2.5-flash +GPT_TEXT_MODEL=gpt-4o REWRITE_MODEL=gpt-4o VISION_MODEL=gpt-4o PRODUCT_VIEW_MODEL=gpt-image-2 diff --git a/api/main.py b/api/main.py index 72b1a8a..ee2d75a 100644 --- a/api/main.py +++ b/api/main.py @@ -48,8 +48,18 @@ LOCAL_ASR_BIN = os.getenv("LOCAL_ASR_BIN", "").strip() LOCAL_ASR_MODEL = os.getenv("LOCAL_ASR_MODEL", "mlx-community/whisper-tiny").strip() or "mlx-community/whisper-tiny" LOCAL_ASR_TIMEOUT_SECONDS = max(30, int(os.getenv("LOCAL_ASR_TIMEOUT_SECONDS", "180"))) TRANSLATE_MODEL = os.getenv("TRANSLATE_MODEL", "gemini-2.5-flash") -REWRITE_MODEL = os.getenv("REWRITE_MODEL", "gpt-4o") -VISION_MODEL = os.getenv("VISION_MODEL", "gpt-4o") +DEFAULT_GPT_TEXT_MODEL = os.getenv("GPT_TEXT_MODEL", "gpt-4o").strip() or "gpt-4o" + + +def gpt_model_env(name: str, default: str | None = None) -> str: + value = os.getenv(name, default or DEFAULT_GPT_TEXT_MODEL).strip() + if not value or value.lower().startswith("gemini-"): + return default or DEFAULT_GPT_TEXT_MODEL + return value + + +REWRITE_MODEL = gpt_model_env("REWRITE_MODEL") +VISION_MODEL = gpt_model_env("VISION_MODEL") IMAGE_BASE_URL = os.getenv("IMAGE_BASE_URL", LLM_BASE_URL).strip() IMAGE_API_KEY = os.getenv("IMAGE_API_KEY", LLM_API_KEY).strip() AI_HTTP_PROXY = ( @@ -77,7 +87,7 @@ AUDIO_PRODUCT_BRIEF = os.getenv( "AUDIO_PRODUCT_BRIEF", "SKG 智能按摩产品,主打日常肩颈、腰背、眼部、膝盖或足部放松;广告表达要高级、干净、可信,不做医疗疗效承诺。", ).strip() -AUDIO_REWRITE_MODEL = os.getenv("AUDIO_REWRITE_MODEL", REWRITE_MODEL).strip() or REWRITE_MODEL +AUDIO_REWRITE_MODEL = gpt_model_env("AUDIO_REWRITE_MODEL", REWRITE_MODEL) MINIMAX_API_KEY = os.getenv("MINIMAX_API_KEY", "").strip() MINIMAX_TTS_BASE_URL = os.getenv("MINIMAX_TTS_BASE_URL", "https://api.minimax.io").strip().rstrip("/") MINIMAX_TTS_MODEL = os.getenv("MINIMAX_TTS_MODEL", "speech-2.8-turbo").strip() or "speech-2.8-turbo" diff --git a/deploy/.env.production.example b/deploy/.env.production.example index c39bddd..ac8bfda 100644 --- a/deploy/.env.production.example +++ b/deploy/.env.production.example @@ -22,6 +22,7 @@ LLM_API_KEY= ASR_MODEL=whisper-1 ASR_FALLBACK_MODEL=gemini-2.5-flash TRANSLATE_MODEL=gemini-2.5-flash +GPT_TEXT_MODEL=gpt-4o REWRITE_MODEL=gpt-4o VISION_MODEL=gpt-4o PRODUCT_VIEW_MODEL=gpt-image-2 diff --git a/docs/source-analysis.html b/docs/source-analysis.html index 881d1be..db3877e 100644 --- a/docs/source-analysis.html +++ b/docs/source-analysis.html @@ -882,7 +882,7 @@ ProductRefStateItem { 网页登录POST /auth/loginGET /auth/checkPOST /auth/logoutweb/app/login/page.tsx、Nginx auth_request登录页提交账号密码到 /api/auth/login,后端设置 HttpOnly 会话 Cookie;生产 Nginx 对工作台和 /api//auth/check 做统一校验,未登录页面跳 /login/,API 返回 JSON 401。 - 运行配置 / 模型标注GET /healthgetRuntimeHealthModelTrace返回 models:ASR、本机 ASR、ASR fallback、翻译、GPT 改写、GPT 画面理解、产品视角识别 product_view、GPT 图像模型、主体 6 视图 GPT 图像模型、Azure OpenAI TTS、视频别名和 Seedance 服务商。当前 REWRITE_MODELAUDIO_REWRITE_MODELVISION_MODEL 默认使用 gpt-4o。前端所有当前主路径里会调用模型的按钮旁显示模型名,点击弹出小窗口查看模型链路和输入输出逻辑;不返回 API Key 或敏感凭证。 + 运行配置 / 模型标注GET /healthgetRuntimeHealthModelTrace返回 models:ASR、本机 ASR、ASR fallback、翻译、GPT 改写、GPT 画面理解、产品视角识别 product_view、GPT 图像模型、主体 6 视图 GPT 图像模型、Azure OpenAI TTS、视频别名和 Seedance 服务商。当前 REWRITE_MODELAUDIO_REWRITE_MODELVISION_MODEL 默认使用 gpt-4o;如果旧环境变量仍写 gemini-*,后端会归一化回 GPT_TEXT_MODEL / REWRITE_MODEL。前端所有当前主路径里会调用模型的按钮旁显示模型名,点击弹出小窗口查看模型链路和输入输出逻辑;不返回 API Key 或敏感凭证。 历史列表GET /jobslistJobs所有 job 精简列表(id/url/status/thumbnail/mtime…),按 state.json mtime 倒序。前端 URL 无 ?job= 时拉它回填全部历史;带 limit 可截断。 创建任务POST /jobscreateJob提交 TK 链接,后台开始下载;前端“开始”队列会在 downloaded 后自动触发音频解析。 上传视频POST /jobs/uploaduploadJob保存 source.mp4,然后同样进入下载完成状态;当前上传后也加入第一步队列,下载完成后自动解析音频。 @@ -1024,8 +1024,8 @@ ProductRefStateItem {

问题:关键帧画面理解和分镜/口播改写仍默认走 Gemini 模型,不符合后端模型分工要把这两类能力切到 GPT 的要求。

-

改动:api/main.py 默认 VISION_MODELREWRITE_MODELAUDIO_REWRITE_MODEL 改为 gpt-4oapi/.env.exampledeploy/.env.production.exampleRULES.md 同步补齐 GPT 默认模型说明。

-

影响:/healthmodels.visionmodels.rewritemodels.audio_rewrite 会向前端模型标注暴露 GPT 模型名;后续描述模型分工时,Gemini 仍保留在 ASR fallback / 翻译链路,画面理解和文案改写默认归 GPT。

+

改动:api/main.py 新增 GPT_TEXT_MODEL / gpt_model_env,默认 VISION_MODELREWRITE_MODELAUDIO_REWRITE_MODELgpt-4o;如果旧部署环境仍把这些变量写成 gemini-*,后端会自动归一化回 GPT。api/.env.exampledeploy/.env.production.exampleRULES.md 同步补齐 GPT 默认模型说明。

+

影响:/healthmodels.visionmodels.rewritemodels.audio_rewrite 会向前端模型标注暴露 GPT 模型名;后续描述模型分工时,Gemini 仍保留在 ASR fallback / 翻译链路,画面理解和文案改写默认归 GPT,并且不会被旧 Gemini 环境变量误覆盖。